GeoIP Detection - Version 2.9.0

Version Description

There have been changes to the reverse proxy logic. If you have enabled a reverse proxy, check if the detected IP is correct. New: Shortcode for showing/hiding content!

=

Download this release

Release Info

Developer benjamin4
Plugin Icon 128x128 GeoIP Detection
Version 2.9.0
Comparing to
See all releases

Code changes from version 2.8.2 to 2.9.0

Files changed (47) hide show
  1. CHANGELOG.md +184 -0
  2. admin-ui.php +37 -27
  3. api.php +45 -76
  4. changelog.txt +177 -0
  5. check_requirements.php +1 -1
  6. composer.lock +23 -24
  7. data-sources/auto.php +3 -3
  8. data-sources/header.php +1 -1
  9. data-sources/hostinfo.php +24 -24
  10. data-sources/manual.php +3 -4
  11. data-sources/precision.php +1 -1
  12. data-sources/registry.php +33 -26
  13. filter.php +10 -7
  14. geoip-detect-lib.php +62 -48
  15. geoip-detect.php +5 -4
  16. init.php +45 -20
  17. legacy-api.php +1 -1
  18. lib/geonames/geonames-country-info.php +1 -1
  19. lib/get-client-ip.php +87 -0
  20. readme.txt +17 -253
  21. shortcode.php +272 -67
  22. upgrade-plugin.php +1 -1
  23. vendor/composer/ca-bundle/composer.json +1 -1
  24. vendor/composer/ca-bundle/res/cacert.pem +211 -519
  25. vendor/composer/installed.json +69 -70
  26. vendor/geoip2/geoip2/.php_cs +1 -0
  27. vendor/geoip2/geoip2/CHANGELOG.md +12 -0
  28. vendor/geoip2/geoip2/README.md +3 -3
  29. vendor/geoip2/geoip2/composer.json +2 -3
  30. vendor/geoip2/geoip2/src/Record/Country.php +5 -1
  31. vendor/geoip2/geoip2/src/Record/RepresentedCountry.php +4 -0
  32. vendor/geoip2/geoip2/src/WebService/Client.php +8 -8
  33. vendor/maxmind-db/reader/CHANGELOG.md +14 -1
  34. vendor/maxmind-db/reader/README.md +18 -1
  35. vendor/maxmind-db/reader/autoload.php +44 -0
  36. vendor/maxmind-db/reader/composer.json +1 -1
  37. vendor/maxmind-db/reader/ext/maxminddb.c +4 -4
  38. vendor/maxmind-db/reader/ext/php_maxminddb.h +1 -1
  39. vendor/maxmind-db/reader/ext/tests/003-open-basedir.phpt +12 -0
  40. vendor/maxmind/web-service-common/CHANGELOG.md +6 -1
  41. vendor/maxmind/web-service-common/README.md +3 -3
  42. vendor/maxmind/web-service-common/dev-bin/release.sh +60 -0
  43. vendor/maxmind/web-service-common/src/WebService/Client.php +7 -5
  44. views/client-ip.php +58 -0
  45. views/footer.php +29 -1
  46. views/lookup.php +19 -35
  47. views/options.php +14 -32
CHANGELOG.md ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ## Old Changelog ##
2
+
3
+ # 2.9.0 =
4
+ * NEW: Wizard to get the right ip adress (in order to simplify reverse proxy configuration).
5
+ * The reverse proxy logic was heavily changed. If you run into configuration errors, try the wizard.
6
+ * NEW: The CSS classes that are added to the body-tag (if enabled in the options) now also include the most specific subdivisino (province).
7
+ * Maxmind vendor code was updated to the current version (2.8.0).
8
+
9
+ # 2.8.2 =
10
+ * Maxmind vendor code was updated to the current version (2.7.0).
11
+ * FIX: There was a fatal error when using PHP 7.2 (thx jj-dev)
12
+ * FIX: The automatic update of Maxmind Geoip2 Lite City database was fixed.
13
+ * FIX: Always try to fill in more information into the country information from the GeoNames-DB.
14
+
15
+ # 2.8.1 =
16
+
17
+ (Was not released on wordpress.org)
18
+
19
+ # 2.8.0 =
20
+
21
+ * FIX: Localhost now always is a trusted proxy (for standard reverse proxy configurations, however the checkbox "uses a reverse proxy" still needs to be activated.)
22
+ * FIX: Timezone was overwritten by country data even though the maxmind data had already detected a timezone.
23
+ * ADD: If the manual datasource is used, the file will continue to be found if the site is moved to another host
24
+ * Maxmind vendor code was updated to the current version (2.6.0).
25
+ * PHP 5.4 is now required (due to the maxmind library).
26
+
27
+ # 2.7.0 =
28
+
29
+ * ADD: The options array of `geoip_detect2_get_info_from_ip` now has a new parameter for overriding the current source for a single lookup. See [API usage examples](https://github.com/yellowtree/wp-geoip-detect/wiki/API-Usage-Examples)
30
+ * ADD: New filter `geoip_detect2_shortcode_country_select_countries` for the country list of `[geoip_detect2_countries]`
31
+ * ADD: New constant `GEOIP_DETECT_IP_EMPTY_CACHE_TIME` that can be used to specify a shorter cache time in case temporarily no external IP was found.
32
+ * FIX: Compatibility with CF 4.6 (remove deprecated function call)
33
+ * Maxmind vendor code was updated to the current version (2.4.5).
34
+
35
+ # 2.6.0 =
36
+
37
+ * ADD: New datasources for Cloudflare & Amazon AWS CloudFront (countries for current IP only).
38
+ * ADD: Country information (names, lat/lon, continent, localized in the different languages) are now filled in for sources that only detect the country code (Cloudflare, Amazon, hostip.info)
39
+ * ADD: 2 shortcodes for [Contact Form 7](https://wordpress.org/plugins/contact-form-7/) (a select with all countries `[geoip_detect2_countries mycountry]`, and tracking information for the email text `[geoip_detect2_user_info]`) - see [Documentation](https://github.com/yellowtree/wp-geoip-detect/wiki/API-Documentation#wp-contactform7-shortcodes)
40
+ * FIX: Cron scheduling is checked every time you visit the plugin page.
41
+ * FIX: Timezones of US & Canada are now detected more often (if country+state is known)
42
+ * FIX: Shortcode didn't use current sitelang as default, but always english
43
+ * Maxmind vendor code was updated to the current version (2.4.2).
44
+
45
+ # 2.5.7 =
46
+ * ADD: Shortcodes can now optionally specifiy the IP: `[geoip_detect2 property="country.isoCode" ip="(ipv4 or ipv6)"]`
47
+ * ADD: Plugin is now translated into German.
48
+ * FIX: `geoip_detect2_get_info_from_current_ip()` now also handles the case when REMOTE_ADDR contains multiple IP adresses
49
+
50
+ # 2.5.6 =
51
+ * FIX: Removed noticed concerning open_basedir.
52
+
53
+ # 2.5.5 =
54
+
55
+ * Clean-up changes to prepare plugin translation.
56
+ * FIX: Only show the "no database installed" admin notice to admins (props @meitar)
57
+
58
+ # 2.5.4 =
59
+
60
+ * FIX: Manual datasource filepath handling corrected.
61
+ * FIX: Potential incompability with BuddyPress removed.
62
+
63
+ # 2.5.3 =
64
+
65
+ * FIX: (Security) Add nonces to backend to avoid CSRF (thanks to Gerard Arall).
66
+ * FIX: Do not use PHP shortcode tags (<?=) as some servers do not support it with PHP 5.3
67
+ * Maxmind vendor code was updated to the current version (2.3.3).
68
+
69
+ # 2.5.2 =
70
+ * FIX: Also disallow proxy caching via HTTP header, if possible.
71
+ * NEW: Shortcodes for the other API functions: `[geoip_detect2_get_current_source_description]`, `[geoip_detect2_get_client_ip]`, and `[geoip_detect2_get_external_ip_adress]`
72
+ * FIX: geoip_detect2_get_external_ip_adress() : do not filter if $unfiltered is true.
73
+
74
+ # 2.5.1 =
75
+ * FIX: Upgrade script did change the source.
76
+ * FIX: Page caching is only disabled on upgrade when `set_css_country` is disabled.
77
+
78
+ # 2.5.0 =
79
+ * CHANGE: The parameter $skipCache is now $options['skipCache']. Using $skipCache is deprecated, but still works.
80
+ * NEW: $options['timeout'] for Web-API lookups can now be specified.
81
+ * FIX: Hostip.info did not set traits->ipAddress
82
+ * FIX: Hostip.info does not include data for IPv6. Add a lookup error message.
83
+ * NEW: Disable page caching if geoip-API was called (this is configurable in the options). (Supported plugins: WP Super Cache, W3 Total Cache, ZenCache, and possibly others)
84
+ * Maxmind vendor code was updated to the current version (2.3.1).
85
+
86
+ # 2.4.3 =
87
+ * FIX: Options Page: The checkboxes didn't show (even though the option was saved) since 2.4.0
88
+ * NEW: A fixed external IP can now be specified on the options page. (Useful in development scenarios without internet, or mixed internet/intranet cases. You can also use this to speed up things on the production server if you know the IP will not change.)
89
+ * NEW: Hidden feature/side-effect: Clicking on save in the General Options section also empties the external IP cache.
90
+
91
+ # 2.4.2 =
92
+ * FIX: Trim whitespace of IP adress.
93
+ * FIX: some PHP notices.
94
+ * FIX: The Installation message "No database installed" failed to install the Maxmind database since 2.4.0
95
+ * NEW: Show IPv6-not-supported notice.
96
+ * FIX: Add empty fallback functions in case the plugin requirements are not met. (To avoid fatal errors.)
97
+
98
+ # 2.4.1 =
99
+ * FIX: Revert IPv6 check. (Sorry for this. I thought PHP compiled without IPv6 would be esoteric.)
100
+
101
+ # 2.4.0 =
102
+ This is a major refactor in order to support multiple sources properly. The Lookup and the Options were seperated into 2 screens (accessible in the menu under `Tools` and `Options`, respectively.)
103
+
104
+ * NEW: Add a Cache for Web-API-Requests. Consequently, the function geoip_detect2_get_info_from_ip() received a new parameter "$skipCache" to skip this cache if not needed. You can check if the result is coming from the cache by checking $result->extra->cached (it is 0 when not cached, UNIX timestamp of cache event otherwise).
105
+ * This also applies to the shortcode API (`[geoip_detect2 property="extra.cached" skip_cache="true"]`)
106
+ * NEW: Error messages during lookup are now in `$record->extra->error`.
107
+ * NEW: Experimental support for the Maxmind Precision API.
108
+ * NEW: Shortcodes now also support fallback languages. (`[geoip_detect2 property="country" lang="fr,de"]`)
109
+ * FIX: Check for IPv6 support for PHP.
110
+ * FIX: Country data now also get timezones.
111
+
112
+ # 2.3.1 =
113
+ * NEW: API function geoip_detect2_get_current_source_description() (as there are different sources to choose from now)
114
+ * FIX: Show error message if PHP < 5.3 (instead of fatal error)
115
+
116
+ # 2.3.0 =
117
+ * NEW: Add HostIP.info-Support
118
+
119
+ # 2.2.0 =
120
+ * FIX: Update Maxmind Reader to 1.0.3 (fixing issues when the PHP extension mbstring was not installed)
121
+ * NEW: Commercial databases are now supported. You can specify a file path in the options.
122
+ * NEW: A country database (lite or commercial) database now works as well.
123
+ * NEW:
124
+ License is now displayed before install.
125
+
126
+ # 2.1.2 =
127
+ * FIX: Show error message if PHP < 5.3 (instead of fatal error)
128
+ * FIX: Support multiple proxies (but currently only one reverse proxy)
129
+
130
+ # 2.1.1 =
131
+ * FIX: Notice "Database missing" should not show during/right after database update.
132
+
133
+ # 2.1.0 =
134
+ * NEW: A nagging admin notice shows up on every wp-admin page when no database is installed (yet).
135
+
136
+ # 2.0.1 =
137
+ * NEW: Using v2 version of the API.
138
+ See Migration Guide at [Github](https://github.com/yellowtree/wp-geoip-detect/wiki/How-to-migrate-from-v1-to-v2)
139
+
140
+ Other changes:
141
+
142
+ * NEW: The v2-functions now support location names in other locales. By default, they return the current site language if possible.
143
+ * NEW: The new shortcode [geoip_detect2 ...] also supports a "lang"-Attribute.
144
+ * NEW: IPv6 addresses are now supported as well.
145
+ * Legacy function names and shortcode should work in most cases. For details check the guide above.
146
+
147
+ # 2.0.0 =
148
+
149
+ (Was not released on wordpress.org to make sure that development releases get this update as well.)
150
+
151
+ # 1.8 =
152
+ * NEW: Support reverse proxies (you have to enable it in the plugin options.)
153
+ * NEW: Shortcode now has a default value when no information for this IP found.
154
+
155
+ # 1.7.1 =
156
+ * FIX: Fatal error on cron run
157
+
158
+ # 1.7 =
159
+ * FIX: Schedule Database update to do in background immediately after plugin installation/re-activation.
160
+ * FIX: Longitude can be smaller than -90
161
+
162
+ # 1.6 =
163
+ * NEW: Can add a country- and continent-specific class on the body tag. You need to activate this in the options.
164
+ * FIX: Automatic weekly update. (Didn't work on all installations).
165
+ * FIX: Do not include Maxmind Libraries again if already included by another plugin/theme
166
+
167
+ # 1.5 =
168
+ * FIX: Automatic weekly update. Go to the plugin page (Tools menu) to verify that an update is planned.
169
+
170
+ # 1.4 =
171
+ * Feature: Add shortcode [geoip_detect property="(property name)"] for direct use in posts/pages
172
+
173
+ # 1.3 =
174
+ * FIX: Manual install works again (was broken since 1.2)
175
+
176
+ # 1.2 =
177
+ * FIX: property region_name is now filled again (was broken since 1.1)
178
+
179
+ # 1.1 =
180
+ * Add function `geoip_detect_get_external_ip_adress()`: Ask a webservice to tell me the external IP of the webserver.
181
+ * New filter: When developing locally, the external IP is used to determine the geographic location.
182
+
183
+ # 1.0 =
184
+ * First working release.
admin-ui.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
- Author: Benjamin Pick (info@yellowtree.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
@@ -50,7 +50,7 @@ function geoip_detect_lookup_page()
50
  {
51
  if (!is_admin())
52
  return;
53
-
54
  $ip_lookup_result = false;
55
  $message = '';
56
 
@@ -62,11 +62,11 @@ function geoip_detect_lookup_page()
62
  $request_ip = $_POST['ip'];
63
  $request_skipCache = !empty($_POST['skip_cache']);
64
  $options = array('skipCache' => $request_skipCache);
65
-
66
  $request_locales = null;
67
  if (!empty($_POST['locales']))
68
  $request_locales = explode(',', $_POST['locales']);
69
-
70
  $start = microtime(true);
71
  $ip_lookup_result = geoip_detect2_get_info_from_ip($request_ip, $request_locales, $options);
72
  $end = microtime(true);
@@ -75,45 +75,51 @@ function geoip_detect_lookup_page()
75
  break;
76
  }
77
  }
78
-
79
  include_once(GEOIP_PLUGIN_DIR . '/views/lookup.php');
80
  }
81
 
82
  function geoip_detect_option_page() {
83
  if (!is_admin() || !current_user_can('manage_options'))
84
  return;
85
-
 
 
 
 
 
 
86
  $registry = DataSourceRegistry::getInstance();
87
  $sources = $registry->getAllSources();
88
-
89
  $message = '';
90
-
91
  $numeric_options = array('set_css_country', 'has_reverse_proxy', 'disable_pagecache');
92
- $text_options = array('external_ip');
93
  $option_names = array_merge($numeric_options, $text_options);
94
-
95
- if (geoip_detect_verify_nonce()) {
96
  switch(@$_POST['action'])
97
  {
98
  case 'update':
99
  $registry->setCurrentSource('auto');
100
-
101
  $s = new \YellowTree\GeoipDetect\DataSources\Auto\AutoDataSource();
102
  $ret = $s->maxmindUpdate();
103
-
104
  if ($ret === true)
105
  $message .= __('Updated successfully.', 'geoip-detect');
106
  else
107
  $message .= __('File was not updated', 'geoip-detect') .': '. $ret;
108
-
109
  break;
110
-
111
  case 'choose':
112
  $registry->setCurrentSource($_POST['options']['source']);
113
  break;
114
-
115
-
116
- case 'options-source':
117
  $messages = array();
118
  foreach ($sources as $s) {
119
  $ret = $s->saveParameters($_POST);
@@ -123,13 +129,13 @@ function geoip_detect_option_page() {
123
  }
124
  if ($messages)
125
  $message .= implode('<br />', $messages);
126
-
127
  break;
128
-
129
- case 'options':
130
  // Empty IP Cache
131
  delete_transient('geoip_detect_external_ip');
132
-
133
  if (!empty($_POST['options']['external_ip'])) {
134
  if (!geoip_detect_is_ip($_POST['options']['external_ip'])) {
135
  $message .= 'The external IP "' . esc_html($_POST['options']['external_ip']) . '" is not a valid IP.';
@@ -138,8 +144,8 @@ function geoip_detect_option_page() {
138
  $message .= 'Warning: The external IP "' . esc_html($_POST['options']['external_ip']) . '" is not a public internet IP, so it will probably not work.';
139
  }
140
  }
141
-
142
-
143
  foreach ($option_names as $opt_name) {
144
  if (in_array($opt_name, $numeric_options))
145
  $opt_value = isset($_POST['options'][$opt_name]) ? (int) $_POST['options'][$opt_name] : 0;
@@ -152,13 +158,17 @@ function geoip_detect_option_page() {
152
  }
153
 
154
  $currentSource = $registry->getCurrentSource();
155
-
156
  $wp_options = array();
157
  foreach ($option_names as $opt_name) {
158
  $wp_options[$opt_name] = get_option('geoip-detect-'. $opt_name);
159
  }
160
-
161
  $ipv6_supported = GEOIP_DETECT_IPV6_SUPPORTED;
162
-
163
  include_once(GEOIP_PLUGIN_DIR . '/views/options.php');
164
  }
 
 
 
 
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
50
  {
51
  if (!is_admin())
52
  return;
53
+
54
  $ip_lookup_result = false;
55
  $message = '';
56
 
62
  $request_ip = $_POST['ip'];
63
  $request_skipCache = !empty($_POST['skip_cache']);
64
  $options = array('skipCache' => $request_skipCache);
65
+
66
  $request_locales = null;
67
  if (!empty($_POST['locales']))
68
  $request_locales = explode(',', $_POST['locales']);
69
+
70
  $start = microtime(true);
71
  $ip_lookup_result = geoip_detect2_get_info_from_ip($request_ip, $request_locales, $options);
72
  $end = microtime(true);
75
  break;
76
  }
77
  }
78
+
79
  include_once(GEOIP_PLUGIN_DIR . '/views/lookup.php');
80
  }
81
 
82
  function geoip_detect_option_page() {
83
  if (!is_admin() || !current_user_can('manage_options'))
84
  return;
85
+
86
+ switch (@$_GET['geoip_detect_part']) {
87
+ case 'client-ip':
88
+ return geoip_detect_option_client_ip_page();
89
+ break;
90
+ }
91
+
92
  $registry = DataSourceRegistry::getInstance();
93
  $sources = $registry->getAllSources();
94
+
95
  $message = '';
96
+
97
  $numeric_options = array('set_css_country', 'has_reverse_proxy', 'disable_pagecache');
98
+ $text_options = array('external_ip', 'trusted_proxy_ips');
99
  $option_names = array_merge($numeric_options, $text_options);
100
+
101
+ if (geoip_detect_verify_nonce()) {
102
  switch(@$_POST['action'])
103
  {
104
  case 'update':
105
  $registry->setCurrentSource('auto');
106
+
107
  $s = new \YellowTree\GeoipDetect\DataSources\Auto\AutoDataSource();
108
  $ret = $s->maxmindUpdate();
109
+
110
  if ($ret === true)
111
  $message .= __('Updated successfully.', 'geoip-detect');
112
  else
113
  $message .= __('File was not updated', 'geoip-detect') .': '. $ret;
114
+
115
  break;
116
+
117
  case 'choose':
118
  $registry->setCurrentSource($_POST['options']['source']);
119
  break;
120
+
121
+
122
+ case 'options-source':
123
  $messages = array();
124
  foreach ($sources as $s) {
125
  $ret = $s->saveParameters($_POST);
129
  }
130
  if ($messages)
131
  $message .= implode('<br />', $messages);
132
+
133
  break;
134
+
135
+ case 'options':
136
  // Empty IP Cache
137
  delete_transient('geoip_detect_external_ip');
138
+
139
  if (!empty($_POST['options']['external_ip'])) {
140
  if (!geoip_detect_is_ip($_POST['options']['external_ip'])) {
141
  $message .= 'The external IP "' . esc_html($_POST['options']['external_ip']) . '" is not a valid IP.';
144
  $message .= 'Warning: The external IP "' . esc_html($_POST['options']['external_ip']) . '" is not a public internet IP, so it will probably not work.';
145
  }
146
  }
147
+
148
+
149
  foreach ($option_names as $opt_name) {
150
  if (in_array($opt_name, $numeric_options))
151
  $opt_value = isset($_POST['options'][$opt_name]) ? (int) $_POST['options'][$opt_name] : 0;
158
  }
159
 
160
  $currentSource = $registry->getCurrentSource();
161
+
162
  $wp_options = array();
163
  foreach ($option_names as $opt_name) {
164
  $wp_options[$opt_name] = get_option('geoip-detect-'. $opt_name);
165
  }
166
+
167
  $ipv6_supported = GEOIP_DETECT_IPV6_SUPPORTED;
168
+
169
  include_once(GEOIP_PLUGIN_DIR . '/views/options.php');
170
  }
171
+
172
+ function geoip_detect_option_client_ip_page() {
173
+ include_once(GEOIP_PLUGIN_DIR . '/views/client-ip.php');
174
+ }
api.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
- Author: Benjamin Pick (info@yellowtree.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
@@ -19,6 +19,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
  */
20
 
21
  use YellowTree\GeoipDetect\DataSources\DataSourceRegistry;
 
22
 
23
  /**
24
  * Get Geo-Information for a specific IP
@@ -28,10 +29,10 @@ use YellowTree\GeoipDetect\DataSources\DataSourceRegistry;
28
  * @param array Property names with options.
29
  * @param boolean $skipCache TRUE: Do not use cache for this request. (Default: FALSE)
30
  * @param string $source Change the source for this request only. (Valid values: 'auto', 'manual', 'precision', 'header', 'hostinfo')
31
- * @param float $timeout Total transaction timeout in seconds (Precision+HostIP.info API only)
32
  * @param int $connectTimeout Initial connection timeout in seconds (Precision API only)
33
  * @return YellowTree\GeoipDetect\DataSources\City GeoInformation. (Actually, this is a subclass of \GeoIp2\Model\City)
34
- *
35
  * @see https://github.com/maxmind/GeoIP2-php API Usage
36
  * @see http://dev.maxmind.com/geoip/geoip2/web-services/ API Documentation
37
  *
@@ -43,34 +44,34 @@ use YellowTree\GeoipDetect\DataSources\DataSourceRegistry;
43
  function geoip_detect2_get_info_from_ip($ip, $locales = null, $options = array()) {
44
  _geoip_maybe_disable_pagecache();
45
  // 1) Processing the parameters.
46
-
47
  $options = _geoip_detect2_process_options($options);
48
 
49
  /**
50
  * Filter: geoip_detect2_locales
51
- *
52
- * @param array $locales The locales that were passed to the function
53
  */
54
  $locales = apply_filters('geoip_detect2_locales', $locales);
55
-
56
-
57
  // 2) Doing the Lookup
58
  $data = array();
59
-
60
  // Have a look at the cache first
61
  if (!$options['skipCache']) {
62
  $data = _geoip_detect2_get_data_from_cache($ip, $options['source']);
63
  }
64
-
65
  if (!$data) {
66
 
67
  $reader = _geoip_detect2_get_reader(array('en') /* will be replaced anyway */, true, $outSourceId, $options);
68
-
69
  $lookupError = '';
70
  $record = _geoip_detect2_get_record_from_reader($reader, $ip, $lookupError);
71
-
72
  $data = _geoip_detect2_record_enrich_data($record, $ip, $outSourceId, $lookupError);
73
-
74
  if (WP_DEBUG && !GEOIP_DETECT_DOING_UNIT_TESTS && $lookupError) {
75
  trigger_error($lookupError, E_USER_NOTICE);
76
  }
@@ -79,17 +80,17 @@ function geoip_detect2_get_info_from_ip($ip, $locales = null, $options = array()
79
  if (!$lookupError)
80
  _geoip_detect2_add_data_to_cache($data, $ip);
81
  }
82
-
83
-
84
  // 3) Returning the data
85
-
86
  // Always return a city record for API compatability. City attributes etc. return empty values.
87
  $record = new \YellowTree\GeoipDetect\DataSources\City($data, $locales);
88
-
89
  /**
90
  * Filter: geoip_detect2_record_information
91
  * Use geoip_detect2_record_data instead if you want to modify the data.
92
- *
93
  * @return \YellowTree\GeoipDetect\DataSources\City
94
  */
95
  $record = apply_filters('geoip_detect2_record_information', $record, $ip, $locales);
@@ -105,7 +106,7 @@ function geoip_detect2_get_info_from_ip($ip, $locales = null, $options = array()
105
  * @param array Property names with options.
106
  * @param boolean $skipCache TRUE: Do not use cache for this request. (Default: FALSE)
107
  * @param string $source Change the source for this request only. (Valid values: 'auto', 'manual', 'precision', 'header', 'hostinfo')
108
- * @param float $timeout Total transaction timeout in seconds (Precision+HostIP.info API only)
109
  * @param int $connectTimeout Initial connection timeout in seconds (Precision API only)
110
  * @return YellowTree\GeoipDetect\DataSources\City GeoInformation.
111
  *
@@ -122,14 +123,14 @@ function geoip_detect2_get_info_from_current_ip($locales = null, $options = arra
122
  /**
123
  * Get the Reader class of the currently chosen source.
124
  * (Use this if you want to use other methods than "city" or otherwise customize behavior.)
125
- *
126
  * @param array(string) List of locale codes to use in name property
127
  * from most preferred to least preferred. (Default: Site language, en)
128
  * @param array Property names with options.
129
  * @param string $source Change the source for this request only. (Valid values: 'auto', 'manual', 'precision', 'header', 'hostinfo')
130
- * @param float $timeout Total transaction timeout in seconds (Precision+HostIP.info API only)
131
  * @param int $connectTimeout Initial connection timeout in seconds (Precision API only)
132
- *
133
  * @since 2.0.0
134
  * @since 2.5.0 new parameter $options
135
  * @since 2.7.0 Parameter $options['source'] has been introduced
@@ -145,7 +146,7 @@ function geoip_detect2_get_reader($locales = null, $options = array()) {
145
  * Return a human-readable label of the currently chosen source.
146
  * @param string|\YellowTree\GeoipDetect\DataSources\City Id of the source or the returned record
147
  * @return string The label.
148
- *
149
  * @since 2.3.1
150
  * @since 2.4.0 new parameter $source
151
  */
@@ -159,7 +160,7 @@ function geoip_detect2_get_current_source_description($source = null) {
159
  } else {
160
  $source = $registry->getSource($source);
161
  }
162
-
163
  if ($source) {
164
  return $source->getShortLabel();
165
  }
@@ -169,88 +170,56 @@ function geoip_detect2_get_current_source_description($source = null) {
169
  /**
170
  * Get client IP (even if it is behind a reverse proxy)
171
  * For security reasons, the reverse proxy usage has to be enabled on the settings page.
172
- *
173
  * @return string Client Ip (IPv4 or IPv6)
174
- *
175
  * @since 2.0.0
176
  */
177
  function geoip_detect2_get_client_ip() {
178
  _geoip_maybe_disable_pagecache();
179
-
180
- $ip = '';
181
-
182
- if (isset($_SERVER['REMOTE_ADDR']))
183
- $ip = $_SERVER['REMOTE_ADDR'];
184
-
185
- // REMOTE_ADDR may contain multiple adresses? https://wordpress.org/support/topic/php-fatal-error-uncaught-exception-invalidargumentexception?replies=2#post-8128737
186
- $ip_list = explode(',', $ip);
187
-
188
- if (get_option('geoip-detect-has_reverse_proxy', 0) && isset($_SERVER["HTTP_X_FORWARDED_FOR"]))
189
- {
190
- $ip_list = explode(',', @$_SERVER["HTTP_X_FORWARDED_FOR"]);
191
- $ip_list = array_map('geoip_detect_normalize_ip', $ip_list);
192
-
193
- // TODO: Expose option to UI. comma-seperated list of IPv4 and v6 adresses.
194
- $trusted_proxies = explode(',', get_option('geoip-detect-trusted_proxy_ips'));
195
-
196
- // Always trust localhost
197
- $trusted_proxies[] = '';
198
- $trusted_proxies[] = '::1';
199
- $trusted_proxies[] = '127.0.0.1';
200
-
201
- $trusted_proxies = array_map('geoip_detect_normalize_ip', $trusted_proxies);
202
- $ip_list[] = $ip;
203
-
204
- $ip_list = array_diff($ip_list, $trusted_proxies);
205
- }
206
- // Fallback IP
207
- array_unshift($ip_list, '::1');
208
-
209
- // Each Proxy server append their information at the end, so the last IP is most trustworthy.
210
- $ip = end($ip_list);
211
- $ip = geoip_detect_normalize_ip($ip);
212
-
213
- if (!$ip)
214
- $ip = '::1'; // By default, use localhost
215
-
216
- // @deprecated: this filter was added by mistake
217
- $ip = apply_filters('geoip2_detect2_client_ip', $ip, $ip_list);
218
- // this is the correct one!
219
- $ip = apply_filters('geoip_detect2_client_ip', $ip, $ip_list);
220
-
221
- return $ip;
222
  }
223
 
224
  /**
225
  * Sometimes we can only see an local IP adress (local development environment.)
226
  * In this case we need to ask an internet server which IP adress our internet connection has.
227
- *
228
  * @param boolean $unfiltered If true, do not check the options for an external adress. (Default: false)
229
  * @return string The detected IPv4 Adress. If none is found, '0.0.0.0' is returned instead.
230
- *
231
  * @since 2.0.0
232
  * @since 2.4.3 Reading option 'external_ip' first.
233
  * @since 2.5.2 New param $unfiltered that can bypass the option.
234
  */
235
  function geoip_detect2_get_external_ip_adress($unfiltered = false) {
236
  $ip_cache = '';
237
-
238
  if (!$unfiltered)
239
  $ip_cache = get_option('geoip-detect-external_ip');
240
-
241
  if (!$ip_cache)
242
  $ip_cache = get_transient('geoip_detect_external_ip');
243
 
244
  if (!$ip_cache) {
245
  $ip_cache = _geoip_detect_get_external_ip_adress_without_cache();
246
-
247
  $expiryTime = GEOIP_DETECT_IP_CACHE_TIME;
248
  if (empty($ip_cache) || $ip_cache === '0.0.0.0')
249
  $expiryTime = GEOIP_DETECT_IP_EMPTY_CACHE_TIME;
250
-
251
  set_transient('geoip_detect_external_ip', $ip_cache, $expiryTime);
252
  }
253
-
254
  $ip_cache = apply_filters('geoip_detect_get_external_ip_adress', $ip_cache);
255
 
256
  return $ip_cache;
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
19
  */
20
 
21
  use YellowTree\GeoipDetect\DataSources\DataSourceRegistry;
22
+ use YellowTree\GeoipDetect\Lib\GetClientIp;
23
 
24
  /**
25
  * Get Geo-Information for a specific IP
29
  * @param array Property names with options.
30
  * @param boolean $skipCache TRUE: Do not use cache for this request. (Default: FALSE)
31
  * @param string $source Change the source for this request only. (Valid values: 'auto', 'manual', 'precision', 'header', 'hostinfo')
32
+ * @param float $timeout Total transaction timeout in seconds (Precision+HostIP.info API only)
33
  * @param int $connectTimeout Initial connection timeout in seconds (Precision API only)
34
  * @return YellowTree\GeoipDetect\DataSources\City GeoInformation. (Actually, this is a subclass of \GeoIp2\Model\City)
35
+ *
36
  * @see https://github.com/maxmind/GeoIP2-php API Usage
37
  * @see http://dev.maxmind.com/geoip/geoip2/web-services/ API Documentation
38
  *
44
  function geoip_detect2_get_info_from_ip($ip, $locales = null, $options = array()) {
45
  _geoip_maybe_disable_pagecache();
46
  // 1) Processing the parameters.
47
+
48
  $options = _geoip_detect2_process_options($options);
49
 
50
  /**
51
  * Filter: geoip_detect2_locales
52
+ *
53
+ * @param array $locales The locales that were passed to the function
54
  */
55
  $locales = apply_filters('geoip_detect2_locales', $locales);
56
+
57
+
58
  // 2) Doing the Lookup
59
  $data = array();
60
+
61
  // Have a look at the cache first
62
  if (!$options['skipCache']) {
63
  $data = _geoip_detect2_get_data_from_cache($ip, $options['source']);
64
  }
65
+
66
  if (!$data) {
67
 
68
  $reader = _geoip_detect2_get_reader(array('en') /* will be replaced anyway */, true, $outSourceId, $options);
69
+
70
  $lookupError = '';
71
  $record = _geoip_detect2_get_record_from_reader($reader, $ip, $lookupError);
72
+
73
  $data = _geoip_detect2_record_enrich_data($record, $ip, $outSourceId, $lookupError);
74
+
75
  if (WP_DEBUG && !GEOIP_DETECT_DOING_UNIT_TESTS && $lookupError) {
76
  trigger_error($lookupError, E_USER_NOTICE);
77
  }
80
  if (!$lookupError)
81
  _geoip_detect2_add_data_to_cache($data, $ip);
82
  }
83
+
84
+
85
  // 3) Returning the data
86
+
87
  // Always return a city record for API compatability. City attributes etc. return empty values.
88
  $record = new \YellowTree\GeoipDetect\DataSources\City($data, $locales);
89
+
90
  /**
91
  * Filter: geoip_detect2_record_information
92
  * Use geoip_detect2_record_data instead if you want to modify the data.
93
+ *
94
  * @return \YellowTree\GeoipDetect\DataSources\City
95
  */
96
  $record = apply_filters('geoip_detect2_record_information', $record, $ip, $locales);
106
  * @param array Property names with options.
107
  * @param boolean $skipCache TRUE: Do not use cache for this request. (Default: FALSE)
108
  * @param string $source Change the source for this request only. (Valid values: 'auto', 'manual', 'precision', 'header', 'hostinfo')
109
+ * @param float $timeout Total transaction timeout in seconds (Precision+HostIP.info API only)
110
  * @param int $connectTimeout Initial connection timeout in seconds (Precision API only)
111
  * @return YellowTree\GeoipDetect\DataSources\City GeoInformation.
112
  *
123
  /**
124
  * Get the Reader class of the currently chosen source.
125
  * (Use this if you want to use other methods than "city" or otherwise customize behavior.)
126
+ *
127
  * @param array(string) List of locale codes to use in name property
128
  * from most preferred to least preferred. (Default: Site language, en)
129
  * @param array Property names with options.
130
  * @param string $source Change the source for this request only. (Valid values: 'auto', 'manual', 'precision', 'header', 'hostinfo')
131
+ * @param float $timeout Total transaction timeout in seconds (Precision+HostIP.info API only)
132
  * @param int $connectTimeout Initial connection timeout in seconds (Precision API only)
133
+ *
134
  * @since 2.0.0
135
  * @since 2.5.0 new parameter $options
136
  * @since 2.7.0 Parameter $options['source'] has been introduced
146
  * Return a human-readable label of the currently chosen source.
147
  * @param string|\YellowTree\GeoipDetect\DataSources\City Id of the source or the returned record
148
  * @return string The label.
149
+ *
150
  * @since 2.3.1
151
  * @since 2.4.0 new parameter $source
152
  */
160
  } else {
161
  $source = $registry->getSource($source);
162
  }
163
+
164
  if ($source) {
165
  return $source->getShortLabel();
166
  }
170
  /**
171
  * Get client IP (even if it is behind a reverse proxy)
172
  * For security reasons, the reverse proxy usage has to be enabled on the settings page.
173
+ *
174
  * @return string Client Ip (IPv4 or IPv6)
175
+ *
176
  * @since 2.0.0
177
  */
178
  function geoip_detect2_get_client_ip() {
179
  _geoip_maybe_disable_pagecache();
180
+
181
+ static $helper = null;
182
+ if (is_null($helper) || defined('GEOIP_DETECT_DOING_UNIT_TESTS')) {
183
+ $helper = new GetClientIp();
184
+
185
+ // TODO: Expose option to UI. comma-seperated list of IPv4 and v6 adresses.
186
+ $trusted_proxies = explode(',', (string) get_option('geoip-detect-trusted_proxy_ips', ''));
187
+ $helper->addProxiesToWhitelist($trusted_proxies);
188
+ }
189
+ $useReverseProxy = get_option('geoip-detect-has_reverse_proxy', 0);
190
+ return $helper->getIp( $useReverseProxy );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
191
  }
192
 
193
  /**
194
  * Sometimes we can only see an local IP adress (local development environment.)
195
  * In this case we need to ask an internet server which IP adress our internet connection has.
196
+ *
197
  * @param boolean $unfiltered If true, do not check the options for an external adress. (Default: false)
198
  * @return string The detected IPv4 Adress. If none is found, '0.0.0.0' is returned instead.
199
+ *
200
  * @since 2.0.0
201
  * @since 2.4.3 Reading option 'external_ip' first.
202
  * @since 2.5.2 New param $unfiltered that can bypass the option.
203
  */
204
  function geoip_detect2_get_external_ip_adress($unfiltered = false) {
205
  $ip_cache = '';
206
+
207
  if (!$unfiltered)
208
  $ip_cache = get_option('geoip-detect-external_ip');
209
+
210
  if (!$ip_cache)
211
  $ip_cache = get_transient('geoip_detect_external_ip');
212
 
213
  if (!$ip_cache) {
214
  $ip_cache = _geoip_detect_get_external_ip_adress_without_cache();
215
+
216
  $expiryTime = GEOIP_DETECT_IP_CACHE_TIME;
217
  if (empty($ip_cache) || $ip_cache === '0.0.0.0')
218
  $expiryTime = GEOIP_DETECT_IP_EMPTY_CACHE_TIME;
219
+
220
  set_transient('geoip_detect_external_ip', $ip_cache, $expiryTime);
221
  }
222
+
223
  $ip_cache = apply_filters('geoip_detect_get_external_ip_adress', $ip_cache);
224
 
225
  return $ip_cache;
changelog.txt ADDED
@@ -0,0 +1,177 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ == Old Changelog ==
2
+
3
+ = 2.8.2 =
4
+ * Maxmind vendor code was updated to the current version (2.7.0).
5
+ * FIX: There was a fatal error when using PHP 7.2 (thx jj-dev)
6
+ * FIX: The automatic update of Maxmind Geoip2 Lite City database was fixed.
7
+ * FIX: Always try to fill in more information into the country information from the GeoNames-DB.
8
+
9
+ = 2.8.1 =
10
+
11
+ (Was not released on wordpress.org)
12
+
13
+ = 2.8.0 =
14
+
15
+ * FIX: Localhost now always is a trusted proxy (for standard reverse proxy configurations, however the checkbox "uses a reverse proxy" still needs to be activated.)
16
+ * FIX: Timezone was overwritten by country data even though the maxmind data had already detected a timezone.
17
+ * ADD: If the manual datasource is used, the file will continue to be found if the site is moved to another host
18
+ * Maxmind vendor code was updated to the current version (2.6.0).
19
+ * PHP 5.4 is now required (due to the maxmind library).
20
+
21
+ = 2.7.0 =
22
+
23
+ * ADD: The options array of `geoip_detect2_get_info_from_ip` now has a new parameter for overriding the current source for a single lookup. See [API usage examples](https://github.com/yellowtree/wp-geoip-detect/wiki/API-Usage-Examples)
24
+ * ADD: New filter `geoip_detect2_shortcode_country_select_countries` for the country list of `[geoip_detect2_countries]`
25
+ * ADD: New constant `GEOIP_DETECT_IP_EMPTY_CACHE_TIME` that can be used to specify a shorter cache time in case temporarily no external IP was found.
26
+ * FIX: Compatibility with CF 4.6 (remove deprecated function call)
27
+ * Maxmind vendor code was updated to the current version (2.4.5).
28
+
29
+ = 2.6.0 =
30
+
31
+ * ADD: New datasources for Cloudflare & Amazon AWS CloudFront (countries for current IP only).
32
+ * ADD: Country information (names, lat/lon, continent, localized in the different languages) are now filled in for sources that only detect the country code (Cloudflare, Amazon, hostip.info)
33
+ * ADD: 2 shortcodes for [Contact Form 7](https://wordpress.org/plugins/contact-form-7/) (a select with all countries `[geoip_detect2_countries mycountry]`, and tracking information for the email text `[geoip_detect2_user_info]`) - see [Documentation](https://github.com/yellowtree/wp-geoip-detect/wiki/API-Documentation#wp-contactform7-shortcodes)
34
+ * FIX: Cron scheduling is checked every time you visit the plugin page.
35
+ * FIX: Timezones of US & Canada are now detected more often (if country+state is known)
36
+ * FIX: Shortcode didn't use current sitelang as default, but always english
37
+ * Maxmind vendor code was updated to the current version (2.4.2).
38
+
39
+ = 2.5.7 =
40
+ * ADD: Shortcodes can now optionally specifiy the IP: `[geoip_detect2 property="country.isoCode" ip="(ipv4 or ipv6)"]`
41
+ * ADD: Plugin is now translated into German.
42
+ * FIX: `geoip_detect2_get_info_from_current_ip()` now also handles the case when REMOTE_ADDR contains multiple IP adresses
43
+
44
+ = 2.5.6 =
45
+ * FIX: Removed noticed concerning open_basedir.
46
+
47
+ = 2.5.5 =
48
+
49
+ * Clean-up changes to prepare plugin translation.
50
+ * FIX: Only show the "no database installed" admin notice to admins (props @meitar)
51
+
52
+ = 2.5.4 =
53
+
54
+ * FIX: Manual datasource filepath handling corrected.
55
+ * FIX: Potential incompability with BuddyPress removed.
56
+
57
+ = 2.5.3 =
58
+
59
+ * FIX: (Security) Add nonces to backend to avoid CSRF (thanks to Gerard Arall).
60
+ * FIX: Do not use PHP shortcode tags (<?=) as some servers do not support it with PHP 5.3
61
+ * Maxmind vendor code was updated to the current version (2.3.3).
62
+
63
+ = 2.5.2 =
64
+ * FIX: Also disallow proxy caching via HTTP header, if possible.
65
+ * NEW: Shortcodes for the other API functions: `[geoip_detect2_get_current_source_description]`, `[geoip_detect2_get_client_ip]`, and `[geoip_detect2_get_external_ip_adress]`
66
+ * FIX: geoip_detect2_get_external_ip_adress() : do not filter if $unfiltered is true.
67
+
68
+ = 2.5.1 =
69
+ * FIX: Upgrade script did change the source.
70
+ * FIX: Page caching is only disabled on upgrade when `set_css_country` is disabled.
71
+
72
+ = 2.5.0 =
73
+ * CHANGE: The parameter $skipCache is now $options['skipCache']. Using $skipCache is deprecated, but still works.
74
+ * NEW: $options['timeout'] for Web-API lookups can now be specified.
75
+ * FIX: Hostip.info did not set traits->ipAddress
76
+ * FIX: Hostip.info does not include data for IPv6. Add a lookup error message.
77
+ * NEW: Disable page caching if geoip-API was called (this is configurable in the options). (Supported plugins: WP Super Cache, W3 Total Cache, ZenCache, and possibly others)
78
+ * Maxmind vendor code was updated to the current version (2.3.1).
79
+
80
+ = 2.4.3 =
81
+ * FIX: Options Page: The checkboxes didn't show (even though the option was saved) since 2.4.0
82
+ * NEW: A fixed external IP can now be specified on the options page. (Useful in development scenarios without internet, or mixed internet/intranet cases. You can also use this to speed up things on the production server if you know the IP will not change.)
83
+ * NEW: Hidden feature/side-effect: Clicking on save in the General Options section also empties the external IP cache.
84
+
85
+ = 2.4.2 =
86
+ * FIX: Trim whitespace of IP adress.
87
+ * FIX: some PHP notices.
88
+ * FIX: The Installation message "No database installed" failed to install the Maxmind database since 2.4.0
89
+ * NEW: Show IPv6-not-supported notice.
90
+ * FIX: Add empty fallback functions in case the plugin requirements are not met. (To avoid fatal errors.)
91
+
92
+ = 2.4.1 =
93
+ * FIX: Revert IPv6 check. (Sorry for this. I thought PHP compiled without IPv6 would be esoteric.)
94
+
95
+ = 2.4.0 =
96
+ This is a major refactor in order to support multiple sources properly. The Lookup and the Options were seperated into 2 screens (accessible in the menu under `Tools` and `Options`, respectively.)
97
+
98
+ * NEW: Add a Cache for Web-API-Requests. Consequently, the function geoip_detect2_get_info_from_ip() received a new parameter "$skipCache" to skip this cache if not needed. You can check if the result is coming from the cache by checking $result->extra->cached (it is 0 when not cached, UNIX timestamp of cache event otherwise).
99
+ * This also applies to the shortcode API (`[geoip_detect2 property="extra.cached" skip_cache="true"]`)
100
+ * NEW: Error messages during lookup are now in `$record->extra->error`.
101
+ * NEW: Experimental support for the Maxmind Precision API.
102
+ * NEW: Shortcodes now also support fallback languages. (`[geoip_detect2 property="country" lang="fr,de"]`)
103
+ * FIX: Check for IPv6 support for PHP.
104
+ * FIX: Country data now also get timezones.
105
+
106
+ = 2.3.1 =
107
+ * NEW: API function geoip_detect2_get_current_source_description() (as there are different sources to choose from now)
108
+ * FIX: Show error message if PHP < 5.3 (instead of fatal error)
109
+
110
+ = 2.3.0 =
111
+ * NEW: Add HostIP.info-Support
112
+
113
+ = 2.2.0 =
114
+ * FIX: Update Maxmind Reader to 1.0.3 (fixing issues when the PHP extension mbstring was not installed)
115
+ * NEW: Commercial databases are now supported. You can specify a file path in the options.
116
+ * NEW: A country database (lite or commercial) database now works as well.
117
+ * NEW: License is now displayed before install.
118
+
119
+ = 2.1.2 =
120
+ * FIX: Show error message if PHP < 5.3 (instead of fatal error)
121
+ * FIX: Support multiple proxies (but currently only one reverse proxy)
122
+
123
+ = 2.1.1 =
124
+ * FIX: Notice "Database missing" should not show during/right after database update.
125
+
126
+ = 2.1.0 =
127
+ * NEW: A nagging admin notice shows up on every wp-admin page when no database is installed (yet).
128
+
129
+ = 2.0.1 =
130
+ * NEW: Using v2 version of the API.
131
+ See Migration Guide at [Github](https://github.com/yellowtree/wp-geoip-detect/wiki/How-to-migrate-from-v1-to-v2)
132
+
133
+ Other changes:
134
+
135
+ * NEW: The v2-functions now support location names in other locales. By default, they return the current site language if possible.
136
+ * NEW: The new shortcode [geoip_detect2 ...] also supports a "lang"-Attribute.
137
+ * NEW: IPv6 addresses are now supported as well.
138
+ * Legacy function names and shortcode should work in most cases. For details check the guide above.
139
+
140
+ = 2.0.0 =
141
+
142
+ (Was not released on wordpress.org to make sure that development releases get this update as well.)
143
+
144
+ = 1.8 =
145
+ * NEW: Support reverse proxies (you have to enable it in the plugin options.)
146
+ * NEW: Shortcode now has a default value when no information for this IP found.
147
+
148
+ = 1.7.1 =
149
+ * FIX: Fatal error on cron run
150
+
151
+ = 1.7 =
152
+ * FIX: Schedule Database update to do in background immediately after plugin installation/re-activation.
153
+ * FIX: Longitude can be smaller than -90
154
+
155
+ = 1.6 =
156
+ * NEW: Can add a country- and continent-specific class on the body tag. You need to activate this in the options.
157
+ * FIX: Automatic weekly update. (Didn't work on all installations).
158
+ * FIX: Do not include Maxmind Libraries again if already included by another plugin/theme
159
+
160
+ = 1.5 =
161
+ * FIX: Automatic weekly update. Go to the plugin page (Tools menu) to verify that an update is planned.
162
+
163
+ = 1.4 =
164
+ * Feature: Add shortcode [geoip_detect property="(property name)"] for direct use in posts/pages
165
+
166
+ = 1.3 =
167
+ * FIX: Manual install works again (was broken since 1.2)
168
+
169
+ = 1.2 =
170
+ * FIX: property region_name is now filled again (was broken since 1.1)
171
+
172
+ = 1.1 =
173
+ * Add function `geoip_detect_get_external_ip_adress()`: Ask a webservice to tell me the external IP of the webserver.
174
+ * New filter: When developing locally, the external IP is used to determine the geographic location.
175
+
176
+ = 1.0 =
177
+ * First working release.
check_requirements.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
- Author: Benjamin Pick (info@yellowtree.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
composer.lock CHANGED
@@ -8,16 +8,16 @@
8
  "packages": [
9
  {
10
  "name": "composer/ca-bundle",
11
- "version": "1.1.0",
12
  "source": {
13
  "type": "git",
14
  "url": "https://github.com/composer/ca-bundle.git",
15
- "reference": "943b2c4fcad1ef178d16a713c2468bf7e579c288"
16
  },
17
  "dist": {
18
  "type": "zip",
19
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/943b2c4fcad1ef178d16a713c2468bf7e579c288",
20
- "reference": "943b2c4fcad1ef178d16a713c2468bf7e579c288",
21
  "shasum": ""
22
  },
23
  "require": {
@@ -26,7 +26,7 @@
26
  "php": "^5.3.2 || ^7.0"
27
  },
28
  "require-dev": {
29
- "phpunit/phpunit": "^4.8.35",
30
  "psr/log": "^1.0",
31
  "symfony/process": "^2.5 || ^3.0 || ^4.0"
32
  },
@@ -60,29 +60,28 @@
60
  "ssl",
61
  "tls"
62
  ],
63
- "time": "2017-11-29T09:37:33+00:00"
64
  },
65
  {
66
  "name": "geoip2/geoip2",
67
- "version": "v2.7.0",
68
  "source": {
69
  "type": "git",
70
  "url": "https://github.com/maxmind/GeoIP2-php.git",
71
- "reference": "ca9f9a244474d97eac1ef542aaced7cc944bafbe"
72
  },
73
  "dist": {
74
  "type": "zip",
75
- "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/ca9f9a244474d97eac1ef542aaced7cc944bafbe",
76
- "reference": "ca9f9a244474d97eac1ef542aaced7cc944bafbe",
77
  "shasum": ""
78
  },
79
  "require": {
80
  "maxmind-db/reader": "~1.0",
81
- "maxmind/web-service-common": "~0.4",
82
  "php": ">=5.4"
83
  },
84
  "require-dev": {
85
- "apigen/apigen": "*",
86
  "friendsofphp/php-cs-fixer": "2.*",
87
  "phpunit/phpunit": "4.*",
88
  "squizlabs/php_codesniffer": "3.*"
@@ -113,20 +112,20 @@
113
  "geolocation",
114
  "maxmind"
115
  ],
116
- "time": "2017-10-27T19:20:22+00:00"
117
  },
118
  {
119
  "name": "maxmind-db/reader",
120
- "version": "v1.2.0",
121
  "source": {
122
  "type": "git",
123
  "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
124
- "reference": "1647820dfbcb552222fb5feb3a8387e2636394c9"
125
  },
126
  "dist": {
127
  "type": "zip",
128
- "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/1647820dfbcb552222fb5feb3a8387e2636394c9",
129
- "reference": "1647820dfbcb552222fb5feb3a8387e2636394c9",
130
  "shasum": ""
131
  },
132
  "require": {
@@ -134,7 +133,7 @@
134
  },
135
  "require-dev": {
136
  "friendsofphp/php-cs-fixer": "2.*",
137
- "phpunit/phpunit": "4.*",
138
  "satooshi/php-coveralls": "1.0.*",
139
  "squizlabs/php_codesniffer": "3.*"
140
  },
@@ -169,20 +168,20 @@
169
  "geolocation",
170
  "maxmind"
171
  ],
172
- "time": "2017-10-27T19:15:33+00:00"
173
  },
174
  {
175
  "name": "maxmind/web-service-common",
176
- "version": "v0.4.0",
177
  "source": {
178
  "type": "git",
179
  "url": "https://github.com/maxmind/web-service-common-php.git",
180
- "reference": "622f7c732a7f9c4c62497fc103939e042b6bdb88"
181
  },
182
  "dist": {
183
  "type": "zip",
184
- "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/622f7c732a7f9c4c62497fc103939e042b6bdb88",
185
- "reference": "622f7c732a7f9c4c62497fc103939e042b6bdb88",
186
  "shasum": ""
187
  },
188
  "require": {
@@ -215,7 +214,7 @@
215
  ],
216
  "description": "Internal MaxMind Web Service API",
217
  "homepage": "https://github.com/maxmind/web-service-common-php",
218
- "time": "2017-07-06T17:48:21+00:00"
219
  }
220
  ],
221
  "packages-dev": [],
8
  "packages": [
9
  {
10
  "name": "composer/ca-bundle",
11
+ "version": "1.1.1",
12
  "source": {
13
  "type": "git",
14
  "url": "https://github.com/composer/ca-bundle.git",
15
+ "reference": "d2c0a83b7533d6912e8d516756ebd34f893e9169"
16
  },
17
  "dist": {
18
  "type": "zip",
19
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/d2c0a83b7533d6912e8d516756ebd34f893e9169",
20
+ "reference": "d2c0a83b7533d6912e8d516756ebd34f893e9169",
21
  "shasum": ""
22
  },
23
  "require": {
26
  "php": "^5.3.2 || ^7.0"
27
  },
28
  "require-dev": {
29
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5",
30
  "psr/log": "^1.0",
31
  "symfony/process": "^2.5 || ^3.0 || ^4.0"
32
  },
60
  "ssl",
61
  "tls"
62
  ],
63
+ "time": "2018-03-29T19:57:20+00:00"
64
  },
65
  {
66
  "name": "geoip2/geoip2",
67
+ "version": "v2.9.0",
68
  "source": {
69
  "type": "git",
70
  "url": "https://github.com/maxmind/GeoIP2-php.git",
71
+ "reference": "a807fbf65212eef5d8d2db1a1b31082b53633d77"
72
  },
73
  "dist": {
74
  "type": "zip",
75
+ "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/a807fbf65212eef5d8d2db1a1b31082b53633d77",
76
+ "reference": "a807fbf65212eef5d8d2db1a1b31082b53633d77",
77
  "shasum": ""
78
  },
79
  "require": {
80
  "maxmind-db/reader": "~1.0",
81
+ "maxmind/web-service-common": "~0.5",
82
  "php": ">=5.4"
83
  },
84
  "require-dev": {
 
85
  "friendsofphp/php-cs-fixer": "2.*",
86
  "phpunit/phpunit": "4.*",
87
  "squizlabs/php_codesniffer": "3.*"
112
  "geolocation",
113
  "maxmind"
114
  ],
115
+ "time": "2018-04-10T15:32:59+00:00"
116
  },
117
  {
118
  "name": "maxmind-db/reader",
119
+ "version": "v1.3.0",
120
  "source": {
121
  "type": "git",
122
  "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
123
+ "reference": "e042b4f8a2dff41e19019faf16427178b07fbd58"
124
  },
125
  "dist": {
126
  "type": "zip",
127
+ "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/e042b4f8a2dff41e19019faf16427178b07fbd58",
128
+ "reference": "e042b4f8a2dff41e19019faf16427178b07fbd58",
129
  "shasum": ""
130
  },
131
  "require": {
133
  },
134
  "require-dev": {
135
  "friendsofphp/php-cs-fixer": "2.*",
136
+ "phpunit/phpunit": "4.* || 5.*",
137
  "satooshi/php-coveralls": "1.0.*",
138
  "squizlabs/php_codesniffer": "3.*"
139
  },
168
  "geolocation",
169
  "maxmind"
170
  ],
171
+ "time": "2018-02-21T21:23:33+00:00"
172
  },
173
  {
174
  "name": "maxmind/web-service-common",
175
+ "version": "v0.5.0",
176
  "source": {
177
  "type": "git",
178
  "url": "https://github.com/maxmind/web-service-common-php.git",
179
+ "reference": "61a9836fa3bb1743ab89752bae5005d71e78c73b"
180
  },
181
  "dist": {
182
  "type": "zip",
183
+ "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/61a9836fa3bb1743ab89752bae5005d71e78c73b",
184
+ "reference": "61a9836fa3bb1743ab89752bae5005d71e78c73b",
185
  "shasum": ""
186
  },
187
  "require": {
214
  ],
215
  "description": "Internal MaxMind Web Service API",
216
  "homepage": "https://github.com/maxmind/web-service-common-php",
217
+ "time": "2018-02-12T22:31:54+00:00"
218
  }
219
  ],
220
  "packages-dev": [],
data-sources/auto.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
- Author: Benjamin Pick (info@yellowtree.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
@@ -97,7 +97,7 @@ HTML;
97
 
98
  $tmpfname = wp_tempnam( $url_filename );
99
  if ( ! $tmpfname )
100
- return new \WP_Error('http_no_file', __('Could not create Temporary file.'));
101
 
102
  $headers = array();
103
  $headers['User-Agent'] = GEOIP_DETECT_USER_AGENT;
@@ -108,7 +108,7 @@ HTML;
108
  $response = wp_safe_remote_get( $url, array('timeout' => 300, 'stream' => true, 'filename' => $tmpfname, 'headers' => $headers ) );
109
  $http_response_code = wp_remote_retrieve_response_code( $response );
110
  if (304 === $http_response_code) {
111
- return new \WP_Error( 'http_304', __('It has not changed since last update.', 'geoip-detect') );
112
  }
113
  if (is_wp_error( $response ) || 200 != $http_response_code) {
114
  unlink($tmpfname);
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
97
 
98
  $tmpfname = wp_tempnam( $url_filename );
99
  if ( ! $tmpfname )
100
+ return new \WP_Error('http_no_file', __('Could not create temporary file.', 'geoip-detect'));
101
 
102
  $headers = array();
103
  $headers['User-Agent'] = GEOIP_DETECT_USER_AGENT;
108
  $response = wp_safe_remote_get( $url, array('timeout' => 300, 'stream' => true, 'filename' => $tmpfname, 'headers' => $headers ) );
109
  $http_response_code = wp_remote_retrieve_response_code( $response );
110
  if (304 === $http_response_code) {
111
+ return new \WP_Error( 'http_304', __('It has not changed since the last update.', 'geoip-detect') );
112
  }
113
  if (is_wp_error( $response ) || 200 != $http_response_code) {
114
  unlink($tmpfname);
data-sources/header.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
- Author: Benjamin Pick (info@yellowtree.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
data-sources/hostinfo.php CHANGED
@@ -6,52 +6,52 @@ use YellowTree\GeoipDetect\DataSources\AbstractDataSource;
6
  use YellowTree\GeoipDetect\DataSources\DataSourceRegistry;
7
 
8
  class Reader implements \YellowTree\GeoipDetect\DataSources\ReaderInterface {
9
-
10
  const URL = 'http://api.hostip.info/get_json.php?ip=';
11
  protected $options;
12
-
13
  function __construct($options) {
14
  $default_options = array(
15
- 'timeout' => 1,
16
  );
17
  $this->options = $options + $default_options;
18
  }
19
-
20
  public function city($ip) {
21
  if (!geoip_detect_is_ip($ip, true))
22
  throw new \Exception('The Hostip.info-Database only contains IPv4 adresses.');
23
-
24
  $data = $this->api_call($ip);
25
-
26
  if (!$data)
27
  return null;
28
-
29
  $r = array();
30
-
31
  if ($data['country_name'])
32
  $r['country']['names'] = array('en' => $data['country_name']);
33
  if ($data['country_code'])
34
  $r['country']['iso_code'] = strtoupper($data['country_code']);
35
-
36
  if ($data['city']) {
37
  $r['city']['names'] = array('en' => $data['city']);
38
  }
39
-
40
  $r['traits']['ip_address'] = $ip;
41
-
42
  $record = new \GeoIp2\Model\City($r, array('en'));
43
-
44
  return $record;
45
  }
46
-
47
  public function country($ip) {
48
  return $this->city($ip); // too much info shouldn't hurt ...
49
  }
50
-
51
  public function close() {
52
-
53
  }
54
-
55
  private function api_call($ip) {
56
  try {
57
  // Setting timeout limit to speed up sites
@@ -66,7 +66,7 @@ class Reader implements \YellowTree\GeoipDetect\DataSources\ReaderInterface {
66
  // Example output: {"country_name":"UNITED STATES","country_code":"US","city":"Aurora, TX","ip":"12.215.42.19"}
67
  $body = @file_get_contents(self::URL . $ip, false, $context);
68
  $data = json_decode($body);
69
-
70
  $hasInfo = false;
71
  if ($data) {
72
  $data = get_object_vars($data);
@@ -80,11 +80,11 @@ class Reader implements \YellowTree\GeoipDetect\DataSources\ReaderInterface {
80
  }
81
  $hasInfo = $data['country_name'] || $data['country_code'] || $data['city'];
82
  }
83
-
84
  if ($hasInfo)
85
  return $data;
86
  return null;
87
- } catch (Exception $e) {
88
  // If the API isn't available, we have to do this
89
  return null;
90
  }
@@ -95,15 +95,15 @@ class Reader implements \YellowTree\GeoipDetect\DataSources\ReaderInterface {
95
  class HostInfoDataSource extends AbstractDataSource {
96
  public function getId() { return 'hostinfo'; }
97
  public function getLabel() { return __('HostIP.info Web-API', 'geoip-detect'); }
98
-
99
  public function getDescriptionHTML() { return __('Free (Licence: GPL)<br />(only English names, does only have the following fields: country name, country ID and city name)', 'geoip-detect'); }
100
  public function getStatusInformationHTML() { return __('You can choose a Maxmind database below.', 'geoip-detect'); }
101
  public function getParameterHTML() { return ''; }
102
-
103
  public function getReader($locales = array('en'), $options = array()) { return new Reader($options); }
104
-
105
  public function isWorking() { return true; }
106
-
107
  }
108
 
109
- geoip_detect2_register_source(new HostInfoDataSource());
6
  use YellowTree\GeoipDetect\DataSources\DataSourceRegistry;
7
 
8
  class Reader implements \YellowTree\GeoipDetect\DataSources\ReaderInterface {
9
+
10
  const URL = 'http://api.hostip.info/get_json.php?ip=';
11
  protected $options;
12
+
13
  function __construct($options) {
14
  $default_options = array(
15
+ 'timeout' => 1,
16
  );
17
  $this->options = $options + $default_options;
18
  }
19
+
20
  public function city($ip) {
21
  if (!geoip_detect_is_ip($ip, true))
22
  throw new \Exception('The Hostip.info-Database only contains IPv4 adresses.');
23
+
24
  $data = $this->api_call($ip);
25
+
26
  if (!$data)
27
  return null;
28
+
29
  $r = array();
30
+
31
  if ($data['country_name'])
32
  $r['country']['names'] = array('en' => $data['country_name']);
33
  if ($data['country_code'])
34
  $r['country']['iso_code'] = strtoupper($data['country_code']);
35
+
36
  if ($data['city']) {
37
  $r['city']['names'] = array('en' => $data['city']);
38
  }
39
+
40
  $r['traits']['ip_address'] = $ip;
41
+
42
  $record = new \GeoIp2\Model\City($r, array('en'));
43
+
44
  return $record;
45
  }
46
+
47
  public function country($ip) {
48
  return $this->city($ip); // too much info shouldn't hurt ...
49
  }
50
+
51
  public function close() {
52
+
53
  }
54
+
55
  private function api_call($ip) {
56
  try {
57
  // Setting timeout limit to speed up sites
66
  // Example output: {"country_name":"UNITED STATES","country_code":"US","city":"Aurora, TX","ip":"12.215.42.19"}
67
  $body = @file_get_contents(self::URL . $ip, false, $context);
68
  $data = json_decode($body);
69
+
70
  $hasInfo = false;
71
  if ($data) {
72
  $data = get_object_vars($data);
80
  }
81
  $hasInfo = $data['country_name'] || $data['country_code'] || $data['city'];
82
  }
83
+
84
  if ($hasInfo)
85
  return $data;
86
  return null;
87
+ } catch (\Exception $e) {
88
  // If the API isn't available, we have to do this
89
  return null;
90
  }
95
  class HostInfoDataSource extends AbstractDataSource {
96
  public function getId() { return 'hostinfo'; }
97
  public function getLabel() { return __('HostIP.info Web-API', 'geoip-detect'); }
98
+
99
  public function getDescriptionHTML() { return __('Free (Licence: GPL)<br />(only English names, does only have the following fields: country name, country ID and city name)', 'geoip-detect'); }
100
  public function getStatusInformationHTML() { return __('You can choose a Maxmind database below.', 'geoip-detect'); }
101
  public function getParameterHTML() { return ''; }
102
+
103
  public function getReader($locales = array('en'), $options = array()) { return new Reader($options); }
104
+
105
  public function isWorking() { return true; }
106
+
107
  }
108
 
109
+ geoip_detect2_register_source(new HostInfoDataSource());
data-sources/manual.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
- Author: Benjamin Pick (info@yellowtree.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
@@ -108,7 +108,7 @@ HTML;
108
  $reader = new \GeoIp2\Database\Reader ( $data_file, $locales );
109
  } catch ( \Exception $e ) {
110
  if (WP_DEBUG)
111
- echo printf(__('Error while creating reader for "%s": %s', 'geoip-detect'), $filename, $e->getMessage ());
112
  }
113
  }
114
 
@@ -154,8 +154,7 @@ HTML;
154
  $metadata = $reader->metadata();
155
  $reader->close();
156
  } catch ( \Exception $e ) {
157
- if (WP_DEBUG)
158
- echo printf(__('Error while creating reader for "%s": %s', 'geoip-detect'), $filename, $e->getMessage ());
159
  return '';
160
  }
161
 
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
108
  $reader = new \GeoIp2\Database\Reader ( $data_file, $locales );
109
  } catch ( \Exception $e ) {
110
  if (WP_DEBUG)
111
+ printf(__('Error while creating reader for "%s": %s', 'geoip-detect'), $data_file, $e->getMessage());
112
  }
113
  }
114
 
154
  $metadata = $reader->metadata();
155
  $reader->close();
156
  } catch ( \Exception $e ) {
157
+ // Not readable, so do not accept this filename
 
158
  return '';
159
  }
160
 
data-sources/precision.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
- Author: Benjamin Pick (info@yellowtree.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
data-sources/registry.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
- Author: Benjamin Pick (info@yellowtree.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
@@ -21,22 +21,22 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
  namespace YellowTree\GeoipDetect\DataSources;
22
 
23
  class DataSourceRegistry {
24
-
25
  private static $instance;
26
  /* singleton */
27
- private function __construct() {
28
  $this->sources = array();
29
  }
30
- public static function getInstance() {
31
- if (!self::$instance) {
32
- self::$instance = new static();
33
- }
34
  return self::$instance;
35
  }
36
 
37
-
38
  protected $sources;
39
-
40
  /**
41
  * Register a Data source
42
  * @param \YellowTree\GeoipDetect\DataSources\AbstractDataSource $source
@@ -45,20 +45,23 @@ class DataSourceRegistry {
45
  $id = $source->getId();
46
  $this->sources[$id] = $source;
47
  }
48
-
49
-
50
  const DEFAULT_SOURCE = 'hostinfo';
51
-
 
 
 
 
52
  /**
53
  * Returns the currently chosen source.
54
  * @deprecated Use getSource() instead
55
  * @return \YellowTree\GeoipDetect\DataSources\AbstractDataSource
56
  */
57
  public function getCurrentSource() {
58
- $currentSource = get_option('geoip-detect-source', self::DEFAULT_SOURCE);
59
- return $this->getSource($currentSource);
60
  }
61
-
62
  /**
63
  * Returns the source known by this id.
64
  * @param string Source id
@@ -67,16 +70,16 @@ class DataSourceRegistry {
67
  public function getSource($id) {
68
  if (isset($this->sources[$id]))
69
  return $this->sources[$id];
70
-
71
  if (WP_DEBUG)
72
  trigger_error('The source with id "' . $id . '" was requested, but no such source was found. Using default source instead.', E_USER_NOTICE);
73
-
74
  if (isset($this->sources[self::DEFAULT_SOURCE]))
75
  return $this->sources[self::DEFAULT_SOURCE];
76
-
77
  return null;
78
  }
79
-
80
  /**
81
  * Check if a source named $id exists.
82
  * @param string $id
@@ -85,7 +88,7 @@ class DataSourceRegistry {
85
  public function sourceExists($id) {
86
  return isset($this->sources[$id]);
87
  }
88
-
89
  /**
90
  * Choose a new source as "current source".
91
  * @param string $id
@@ -93,28 +96,32 @@ class DataSourceRegistry {
93
  public function setCurrentSource($id) {
94
  $oldSource = $this->getCurrentSource();
95
  $newSource = $this->getSource($id);
96
-
97
  if ($oldSource->getId() != $newSource->getId()) {
98
  $oldSource->deactivate();
99
  update_option('geoip-detect-source', $newSource->getId());
100
  $newSource->activate();
101
  }
102
-
103
  update_option('geoip-detect-ui-has-chosen-source', true);
104
  }
105
-
106
  /**
107
  * Returns all registered sources.
108
- *
109
  * @return array(\YellowTree\GeoipDetect\DataSources\AbstractDataSource)
110
  */
111
  public function getAllSources() {
112
  return $this->sources;
113
  }
114
-
115
  public function isSourceCachable($source) {
116
  // Don't cache for file access based sources (not worth the effort/time)
117
- $sources_not_cachable = apply_filters('geoip2_detect_sources_not_cachable', array('auto', 'manual', 'header'));
118
  return !in_array($source, $sources_not_cachable);
119
  }
 
 
 
 
120
  }
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
21
  namespace YellowTree\GeoipDetect\DataSources;
22
 
23
  class DataSourceRegistry {
24
+
25
  private static $instance;
26
  /* singleton */
27
+ private function __construct() {
28
  $this->sources = array();
29
  }
30
+ public static function getInstance() {
31
+ if (!self::$instance) {
32
+ self::$instance = new static();
33
+ }
34
  return self::$instance;
35
  }
36
 
37
+
38
  protected $sources;
39
+
40
  /**
41
  * Register a Data source
42
  * @param \YellowTree\GeoipDetect\DataSources\AbstractDataSource $source
45
  $id = $source->getId();
46
  $this->sources[$id] = $source;
47
  }
48
+
49
+
50
  const DEFAULT_SOURCE = 'hostinfo';
51
+
52
+ public function getCurrentSourceId() {
53
+ return get_option('geoip-detect-source', self::DEFAULT_SOURCE);
54
+ }
55
+
56
  /**
57
  * Returns the currently chosen source.
58
  * @deprecated Use getSource() instead
59
  * @return \YellowTree\GeoipDetect\DataSources\AbstractDataSource
60
  */
61
  public function getCurrentSource() {
62
+ return $this->getSource($this->getCurrentSourceId());
 
63
  }
64
+
65
  /**
66
  * Returns the source known by this id.
67
  * @param string Source id
70
  public function getSource($id) {
71
  if (isset($this->sources[$id]))
72
  return $this->sources[$id];
73
+
74
  if (WP_DEBUG)
75
  trigger_error('The source with id "' . $id . '" was requested, but no such source was found. Using default source instead.', E_USER_NOTICE);
76
+
77
  if (isset($this->sources[self::DEFAULT_SOURCE]))
78
  return $this->sources[self::DEFAULT_SOURCE];
79
+
80
  return null;
81
  }
82
+
83
  /**
84
  * Check if a source named $id exists.
85
  * @param string $id
88
  public function sourceExists($id) {
89
  return isset($this->sources[$id]);
90
  }
91
+
92
  /**
93
  * Choose a new source as "current source".
94
  * @param string $id
96
  public function setCurrentSource($id) {
97
  $oldSource = $this->getCurrentSource();
98
  $newSource = $this->getSource($id);
99
+
100
  if ($oldSource->getId() != $newSource->getId()) {
101
  $oldSource->deactivate();
102
  update_option('geoip-detect-source', $newSource->getId());
103
  $newSource->activate();
104
  }
105
+
106
  update_option('geoip-detect-ui-has-chosen-source', true);
107
  }
108
+
109
  /**
110
  * Returns all registered sources.
111
+ *
112
  * @return array(\YellowTree\GeoipDetect\DataSources\AbstractDataSource)
113
  */
114
  public function getAllSources() {
115
  return $this->sources;
116
  }
117
+
118
  public function isSourceCachable($source) {
119
  // Don't cache for file access based sources (not worth the effort/time)
120
+ $sources_not_cachable = apply_filters('geoip2_detect_sources_not_cachable', array('auto', 'manual', 'header'));
121
  return !in_array($source, $sources_not_cachable);
122
  }
123
+
124
+ public function isCachingUsed() {
125
+ return $this->isSourceCachable($this->getCurrentSourceId());
126
+ }
127
  }
filter.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
- Author: Benjamin Pick (info@yellowtree.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
@@ -21,15 +21,18 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
  function geoip_detect2_add_body_classes($classes) {
22
  if (!get_option('geoip-detect-set_css_country'))
23
  return $classes;
24
-
25
  $info = geoip_detect2_get_info_from_current_ip();
26
 
27
  if ($info->country->isoCode)
28
  $classes[] = 'geoip-country-' . $info->country->isoCode;
29
-
30
  if ($info->continent->code)
31
  $classes[] = 'geoip-continent-' . $info->continent->code;
32
 
 
 
 
33
  return $classes;
34
  }
35
  add_filter('body_class', 'geoip_detect2_add_body_classes');
@@ -39,7 +42,7 @@ function geoip_detect2_convert_locale_format($locales) {
39
  if (is_string($locales)) {
40
  $locales = explode(',', $locales);
41
  $locales = array_map('trim', $locales);
42
-
43
  $locales = array_unique($locales);
44
  }
45
  return $locales;
@@ -49,12 +52,12 @@ add_filter('geoip_detect2_locales', 'geoip_detect2_convert_locale_format', 7);
49
  function geoip_detect2_add_default_locales($locales) {
50
  if (is_null($locales) || $locales === false) {
51
  $locales = array();
52
-
53
  /* Needed? should be in get_locale()
54
  if (defined('ICL_LANGUAGE_CODE'))
55
  $locales[] = ICL_LANGUAGE_CODE;
56
  */
57
-
58
  $site_locale = get_locale();
59
  if ($site_locale) {
60
  $translate = array(
@@ -65,7 +68,7 @@ function geoip_detect2_add_default_locales($locales) {
65
  $site_locale = $translate[$site_locale];
66
  else
67
  $site_locale = substr($site_locale, 0, 2);
68
-
69
  $locales[] = $site_locale;
70
  }
71
  $locales[] = 'en';
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
21
  function geoip_detect2_add_body_classes($classes) {
22
  if (!get_option('geoip-detect-set_css_country'))
23
  return $classes;
24
+
25
  $info = geoip_detect2_get_info_from_current_ip();
26
 
27
  if ($info->country->isoCode)
28
  $classes[] = 'geoip-country-' . $info->country->isoCode;
29
+
30
  if ($info->continent->code)
31
  $classes[] = 'geoip-continent-' . $info->continent->code;
32
 
33
+ if ($info->mostSpecificSubdivision->isoCode)
34
+ $classes[] = 'geoip-province-' . $info->mostSpecificSubdivision->isoCode;
35
+
36
  return $classes;
37
  }
38
  add_filter('body_class', 'geoip_detect2_add_body_classes');
42
  if (is_string($locales)) {
43
  $locales = explode(',', $locales);
44
  $locales = array_map('trim', $locales);
45
+
46
  $locales = array_unique($locales);
47
  }
48
  return $locales;
52
  function geoip_detect2_add_default_locales($locales) {
53
  if (is_null($locales) || $locales === false) {
54
  $locales = array();
55
+
56
  /* Needed? should be in get_locale()
57
  if (defined('ICL_LANGUAGE_CODE'))
58
  $locales[] = ICL_LANGUAGE_CODE;
59
  */
60
+
61
  $site_locale = get_locale();
62
  if ($site_locale) {
63
  $translate = array(
68
  $site_locale = $translate[$site_locale];
69
  else
70
  $site_locale = substr($site_locale, 0, 2);
71
+
72
  $locales[] = $site_locale;
73
  }
74
  $locales[] = 'en';
geoip-detect-lib.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
- Author: Benjamin Pick (info@yellowtree.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
@@ -30,7 +30,7 @@ use YellowTree\GeoipDetect\DataSources\DataSourceRegistry;
30
  */
31
 
32
  function _geoip_detect2_process_options($options) {
33
-
34
  // For backwards compat 2.4.0-2.5.0
35
  if (is_bool($options)) {
36
  _doing_it_wrong('GeoIP Detection Plugin: geoip_detect2_get_info_from_ip()', '$skipCache has been renamed to $options. Instead of TRUE, now use "array(\'skipCache\' => TRUE)".', '2.5.0');
@@ -38,14 +38,14 @@ function _geoip_detect2_process_options($options) {
38
  $options = array();
39
  $options['skipCache'] = $value;
40
  }
41
-
42
  // Check if source exists
43
  if (isset($options['source'])) {
44
  $registry = DataSourceRegistry::getInstance();
45
  if (!$registry->sourceExists($options['source']))
46
  unset($options['source']);
47
  }
48
-
49
  /**
50
  * Filter: geoip_detect2_options
51
  * You can programmatically change the defaults etc.
@@ -53,14 +53,14 @@ function _geoip_detect2_process_options($options) {
53
  * @param array $options The options array
54
  */
55
  $options = apply_filters('geoip_detect2_options', $options);
56
-
57
-
58
  $defaultOptions = array(
59
  'skipCache' => false,
60
  'source' => get_option('geoip-detect-source', DataSourceRegistry::DEFAULT_SOURCE),
61
  );
62
  $options = $options + $defaultOptions;
63
-
64
  return $options;
65
  }
66
 
@@ -84,14 +84,14 @@ function _geoip_detect2_get_reader($locales = null, $skipLocaleFilter = false, &
84
  */
85
  $locales = apply_filters ( 'geoip_detect2_locales', $locales );
86
  }
87
-
88
  $reader = null;
89
  $source = DataSourceRegistry::getInstance()->getSource($options['source']);
90
  if ($source) {
91
  $reader = $source->getReader($locales, $options);
92
  $sourceId = $source->getId();
93
  }
94
-
95
  /**
96
  * Filter: geoip_detect2_reader
97
  * You can customize your reader here.
@@ -123,9 +123,9 @@ function _geoip_detect2_get_data_from_cache($ip, $source) {
123
  if (!$ip_s) {
124
  return null;
125
  }
126
-
127
  $data = get_transient('geoip_detect_c_' . $source . '_' . $ip_s);
128
-
129
  return $data;
130
  }
131
 
@@ -134,16 +134,20 @@ function _geoip_detect2_add_data_to_cache($data, $ip) {
134
  if (!DataSourceRegistry::getInstance()->isSourceCachable($source)) {
135
  return null;
136
  }
137
-
 
 
 
 
138
  $data['extra']['cached'] = time();
139
  unset($data['maxmind']['queries_remaining']);
140
-
141
  $ip_s = _ip_to_s($ip);
142
  // Do not cache invalid IPs
143
  if (!$ip_s) {
144
  return;
145
  }
146
-
147
  // Do not cache error lookups (they might be temporary)
148
  if (!empty($data['extra']['error'])) {
149
  return;
@@ -154,9 +158,9 @@ function _geoip_detect2_add_data_to_cache($data, $ip) {
154
 
155
  function _geoip_detect2_get_record_from_reader($reader, $ip, &$error) {
156
  $record = null;
157
-
158
  $ip = trim($ip);
159
-
160
  if ($reader) {
161
  // When plugin installed on development boxes:
162
  // If the client IP is not a public IP, use the public IP of the server instead.
@@ -164,7 +168,7 @@ function _geoip_detect2_get_record_from_reader($reader, $ip, &$error) {
164
  if ($ip == 'me' || (geoip_detect_is_ip($ip) && !geoip_detect_is_public_ip($ip))) {
165
  $ip = geoip_detect2_get_external_ip_adress();
166
  }
167
-
168
  try {
169
  try {
170
  $record = $reader->city($ip);
@@ -174,12 +178,12 @@ function _geoip_detect2_get_record_from_reader($reader, $ip, &$error) {
174
  } catch(\Exception $e) {
175
  $error = 'Lookup Error: ' . $e->getMessage();
176
  }
177
-
178
  $reader->close();
179
  } else {
180
  $error = 'No reader was found. Check if the configuration is complete and correct.';
181
  }
182
-
183
  return $record;
184
  }
185
 
@@ -209,7 +213,7 @@ function _geoip_detect2_record_enrich_data($record, $ip, $sourceId, $error) {
209
  /**
210
  * GeoIPv2 doesn't always include a timezone when v1 did.
211
  * Region ids have changed, so countries with several time zones are out of luck.
212
- *
213
  * @param array $record
214
  */
215
  function _geoip_detect2_try_to_fix_timezone($data) {
@@ -234,7 +238,7 @@ function _geoip_detect2_add_geonames_data($data) {
234
  static $countryInfo = null;
235
  if (is_null($countryInfo))
236
  $countryInfo = new \YellowTree\GeoipDetect\Geonames\CountryInformation;
237
-
238
  if (!empty($data['country']['iso_code'])) {
239
  $geonamesData = $countryInfo->getInformationAboutCountry($data['country']['iso_code']);
240
  $data = array_replace_recursive($geonamesData, $data);
@@ -253,7 +257,7 @@ function geoip_detect_normalize_ip($ip) {
253
  $binary = @inet_pton($ip);
254
  if (empty($binary))
255
  return $ip; // Probably an IPv6 adress & IPv6 is not supported. Or not a valid IP.
256
-
257
  $ip = inet_ntop($binary);
258
  return $ip;
259
  }
@@ -261,16 +265,16 @@ function geoip_detect_normalize_ip($ip) {
261
  function geoip_detect_is_ip_equal($ip1, $ip2) {
262
  $one = @inet_pton($ip1);
263
  $two = @inet_pton($ip2);
264
-
265
  return !empty($one) && $one == $two;
266
  }
267
 
268
  function geoip_detect_is_ip($ip, $noIpv6 = false) {
269
  $flags = FILTER_FLAG_IPV4;
270
-
271
  if (GEOIP_DETECT_IPV6_SUPPORTED && !$noIpv6)
272
  $flags = $flags | FILTER_FLAG_IPV6;
273
-
274
  return filter_var($ip, FILTER_VALIDATE_IP, $flags) !== false;
275
  }
276
 
@@ -299,37 +303,47 @@ function geoip_detect_is_public_ip($ip) {
299
  $flags = FILTER_FLAG_IPV4 // IP can be v4 or v6
300
  | FILTER_FLAG_NO_PRIV_RANGE // It may not be in the RFC private range
301
  | FILTER_FLAG_NO_RES_RANGE; // It may not be in the RFC reserved range
302
-
303
  if (GEOIP_DETECT_IPV6_SUPPORTED)
304
  $flags = $flags | FILTER_FLAG_IPV6;
305
-
306
  $is_public = filter_var($ip, FILTER_VALIDATE_IP, $flags) !== false;
307
-
308
  return $is_public;
309
  }
310
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
311
  /**
312
  * Sometimes we can only see an local IP adress (local development environment.)
313
  * In this case we need to ask an internet server which IP adress our internet connection has.
314
  * (This function is not cached. Some providers may throttle our requests, that's why caching is enabled by default.)
315
- *
316
  * @return string The detected IPv4 Adress. If none is found, '0.0.0.0' is returned instead.
317
  */
318
  function _geoip_detect_get_external_ip_adress_without_cache()
319
  {
320
- $ipservices = array(
321
- 'http://ipv4.icanhazip.com',
322
- // 'http://ifconfig.me/ip', // seems to be slow
323
- 'http://ipecho.net/plain',
324
- 'http://v4.ident.me',
325
- 'http://bot.whatismyipaddress.com',
326
- // 'http://ip.appspot.com', // overloaded, 503 Out of Quota
327
- );
328
-
329
- // Randomizing to avoid querying the same service each time
330
- shuffle($ipservices);
331
- $ipservices = apply_filters('geiop_detect_ipservices', $ipservices);
332
- $ipservices = array_slice($ipservices, 0, 3);
333
 
334
  foreach ($ipservices as $url)
335
  {
@@ -342,7 +356,7 @@ function _geoip_detect_get_external_ip_adress_without_cache()
342
  } else if (isset($ret['response']['code']) && $ret['response']['code'] != 200) {
343
  if (WP_DEBUG || defined('WP_TESTS_TITLE')) {
344
  trigger_error('_geoip_detect_get_external_ip_adress_without_cache(): HTTP error (' . $url . '): Returned code ' . $ret['response']['code'], E_USER_NOTICE);
345
- }
346
  } else {
347
  if (isset($ret['body'])) {
348
  $ip = trim($ret['body']);
@@ -394,20 +408,20 @@ function geoip_detect_get_relative_path($from, $to)
394
  function _geoip_maybe_disable_pagecache() {
395
  if (!get_option('geoip-detect-disable_pagecache'))
396
  return false;
397
-
398
  // WP Super Cache, W3 Total Cache
399
  if (!defined('DONOTCACHEPAGE'))
400
  define('DONOTCACHEPAGE', true);
401
-
402
  if (!defined('DONOTCACHEOBJECT'))
403
  define('DONOTCACHEOBJECT', true);
404
-
405
  if (!defined('DONOTCACHEDB'))
406
  define('DONOTCACHEDB', true);
407
-
408
  if (!headers_sent() && !is_user_logged_in()) {
409
  header('Cache-Control: private, proxy-revalidate, s-maxage=0');
410
  }
411
-
412
  return true;
413
  }
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
30
  */
31
 
32
  function _geoip_detect2_process_options($options) {
33
+
34
  // For backwards compat 2.4.0-2.5.0
35
  if (is_bool($options)) {
36
  _doing_it_wrong('GeoIP Detection Plugin: geoip_detect2_get_info_from_ip()', '$skipCache has been renamed to $options. Instead of TRUE, now use "array(\'skipCache\' => TRUE)".', '2.5.0');
38
  $options = array();
39
  $options['skipCache'] = $value;
40
  }
41
+
42
  // Check if source exists
43
  if (isset($options['source'])) {
44
  $registry = DataSourceRegistry::getInstance();
45
  if (!$registry->sourceExists($options['source']))
46
  unset($options['source']);
47
  }
48
+
49
  /**
50
  * Filter: geoip_detect2_options
51
  * You can programmatically change the defaults etc.
53
  * @param array $options The options array
54
  */
55
  $options = apply_filters('geoip_detect2_options', $options);
56
+
57
+
58
  $defaultOptions = array(
59
  'skipCache' => false,
60
  'source' => get_option('geoip-detect-source', DataSourceRegistry::DEFAULT_SOURCE),
61
  );
62
  $options = $options + $defaultOptions;
63
+
64
  return $options;
65
  }
66
 
84
  */
85
  $locales = apply_filters ( 'geoip_detect2_locales', $locales );
86
  }
87
+
88
  $reader = null;
89
  $source = DataSourceRegistry::getInstance()->getSource($options['source']);
90
  if ($source) {
91
  $reader = $source->getReader($locales, $options);
92
  $sourceId = $source->getId();
93
  }
94
+
95
  /**
96
  * Filter: geoip_detect2_reader
97
  * You can customize your reader here.
123
  if (!$ip_s) {
124
  return null;
125
  }
126
+
127
  $data = get_transient('geoip_detect_c_' . $source . '_' . $ip_s);
128
+
129
  return $data;
130
  }
131
 
134
  if (!DataSourceRegistry::getInstance()->isSourceCachable($source)) {
135
  return null;
136
  }
137
+ if (GEOIP_DETECT_READER_CACHE_TIME === 0) {
138
+ // Caching is disabled
139
+ return null;
140
+ }
141
+
142
  $data['extra']['cached'] = time();
143
  unset($data['maxmind']['queries_remaining']);
144
+
145
  $ip_s = _ip_to_s($ip);
146
  // Do not cache invalid IPs
147
  if (!$ip_s) {
148
  return;
149
  }
150
+
151
  // Do not cache error lookups (they might be temporary)
152
  if (!empty($data['extra']['error'])) {
153
  return;
158
 
159
  function _geoip_detect2_get_record_from_reader($reader, $ip, &$error) {
160
  $record = null;
161
+
162
  $ip = trim($ip);
163
+
164
  if ($reader) {
165
  // When plugin installed on development boxes:
166
  // If the client IP is not a public IP, use the public IP of the server instead.
168
  if ($ip == 'me' || (geoip_detect_is_ip($ip) && !geoip_detect_is_public_ip($ip))) {
169
  $ip = geoip_detect2_get_external_ip_adress();
170
  }
171
+
172
  try {
173
  try {
174
  $record = $reader->city($ip);
178
  } catch(\Exception $e) {
179
  $error = 'Lookup Error: ' . $e->getMessage();
180
  }
181
+
182
  $reader->close();
183
  } else {
184
  $error = 'No reader was found. Check if the configuration is complete and correct.';
185
  }
186
+
187
  return $record;
188
  }
189
 
213
  /**
214
  * GeoIPv2 doesn't always include a timezone when v1 did.
215
  * Region ids have changed, so countries with several time zones are out of luck.
216
+ *
217
  * @param array $record
218
  */
219
  function _geoip_detect2_try_to_fix_timezone($data) {
238
  static $countryInfo = null;
239
  if (is_null($countryInfo))
240
  $countryInfo = new \YellowTree\GeoipDetect\Geonames\CountryInformation;
241
+
242
  if (!empty($data['country']['iso_code'])) {
243
  $geonamesData = $countryInfo->getInformationAboutCountry($data['country']['iso_code']);
244
  $data = array_replace_recursive($geonamesData, $data);
257
  $binary = @inet_pton($ip);
258
  if (empty($binary))
259
  return $ip; // Probably an IPv6 adress & IPv6 is not supported. Or not a valid IP.
260
+
261
  $ip = inet_ntop($binary);
262
  return $ip;
263
  }
265
  function geoip_detect_is_ip_equal($ip1, $ip2) {
266
  $one = @inet_pton($ip1);
267
  $two = @inet_pton($ip2);
268
+
269
  return !empty($one) && $one == $two;
270
  }
271
 
272
  function geoip_detect_is_ip($ip, $noIpv6 = false) {
273
  $flags = FILTER_FLAG_IPV4;
274
+
275
  if (GEOIP_DETECT_IPV6_SUPPORTED && !$noIpv6)
276
  $flags = $flags | FILTER_FLAG_IPV6;
277
+
278
  return filter_var($ip, FILTER_VALIDATE_IP, $flags) !== false;
279
  }
280
 
303
  $flags = FILTER_FLAG_IPV4 // IP can be v4 or v6
304
  | FILTER_FLAG_NO_PRIV_RANGE // It may not be in the RFC private range
305
  | FILTER_FLAG_NO_RES_RANGE; // It may not be in the RFC reserved range
306
+
307
  if (GEOIP_DETECT_IPV6_SUPPORTED)
308
  $flags = $flags | FILTER_FLAG_IPV6;
309
+
310
  $is_public = filter_var($ip, FILTER_VALIDATE_IP, $flags) !== false;
311
+
312
  return $is_public;
313
  }
314
 
315
+ function _geoip_detect2_get_external_ip_services($nb = 3, $needsCORS = false) {
316
+ $ipservicesThatAllowCORS = array(
317
+ 'http://ipv4.icanhazip.com',
318
+ 'http://v4.ident.me',
319
+ );
320
+ $ipservicesWithoutCORS = array(
321
+ 'http://ipecho.net/plain',
322
+ 'http://bot.whatismyipaddress.com',
323
+ );
324
+
325
+ $ipservices = $ipservicesThatAllowCORS;
326
+ if (!$needsCORS) {
327
+ $ipservices = array_merge($ipservices, $ipservicesWithoutCORS);
328
+ }
329
+
330
+ // Randomizing to avoid querying the same service each time
331
+ shuffle($ipservices);
332
+ $ipservices = apply_filters('geiop_detect_ipservices', $ipservices);
333
+ $ipservices = array_slice($ipservices, 0, $nb);
334
+ return $ipservices;
335
+ }
336
+
337
  /**
338
  * Sometimes we can only see an local IP adress (local development environment.)
339
  * In this case we need to ask an internet server which IP adress our internet connection has.
340
  * (This function is not cached. Some providers may throttle our requests, that's why caching is enabled by default.)
341
+ *
342
  * @return string The detected IPv4 Adress. If none is found, '0.0.0.0' is returned instead.
343
  */
344
  function _geoip_detect_get_external_ip_adress_without_cache()
345
  {
346
+ $ipservices = _geoip_detect2_get_external_ip_services();
 
 
 
 
 
 
 
 
 
 
 
 
347
 
348
  foreach ($ipservices as $url)
349
  {
356
  } else if (isset($ret['response']['code']) && $ret['response']['code'] != 200) {
357
  if (WP_DEBUG || defined('WP_TESTS_TITLE')) {
358
  trigger_error('_geoip_detect_get_external_ip_adress_without_cache(): HTTP error (' . $url . '): Returned code ' . $ret['response']['code'], E_USER_NOTICE);
359
+ }
360
  } else {
361
  if (isset($ret['body'])) {
362
  $ip = trim($ret['body']);
408
  function _geoip_maybe_disable_pagecache() {
409
  if (!get_option('geoip-detect-disable_pagecache'))
410
  return false;
411
+
412
  // WP Super Cache, W3 Total Cache
413
  if (!defined('DONOTCACHEPAGE'))
414
  define('DONOTCACHEPAGE', true);
415
+
416
  if (!defined('DONOTCACHEOBJECT'))
417
  define('DONOTCACHEOBJECT', true);
418
+
419
  if (!defined('DONOTCACHEDB'))
420
  define('DONOTCACHEDB', true);
421
+
422
  if (!headers_sent() && !is_user_logged_in()) {
423
  header('Cache-Control: private, proxy-revalidate, s-maxage=0');
424
  }
425
+
426
  return true;
427
  }
geoip-detect.php CHANGED
@@ -5,22 +5,22 @@ Plugin URI: http://www.yellowtree.de
5
  Description: Retrieving Geo-Information using the Maxmind GeoIP (Lite) Database.
6
  Author: Yellow Tree (Benjamin Pick)
7
  Author URI: http://www.yellowtree.de
8
- Version: 2.8.2
9
  License: GPLv3 or later
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
  Text Domain: geoip-detect
12
  Domain Path: /languages
13
  GitHub Plugin URI: https://github.com/yellowtree/wp-geoip-detect
14
- GitHub Branch: geoipv2
15
  Requires WP: 3.5
16
  Requires PHP: 5.4
17
  */
18
 
19
- define('GEOIP_DETECT_VERSION', '2.8.2');
20
 
21
  /*
22
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
23
- Author: Benjamin Pick (info@yellowtree.de)
24
 
25
  This program is free software; you can redistribute it and/or modify
26
  it under the terms of the GNU General Public License as published by
@@ -57,6 +57,7 @@ require_once(GEOIP_PLUGIN_DIR . '/init.php');
57
 
58
  require_once(GEOIP_PLUGIN_DIR . '/geoip-detect-lib.php');
59
  require_once(GEOIP_PLUGIN_DIR . '/lib/geonames/geonames-country-info.php');
 
60
 
61
  require_once(GEOIP_PLUGIN_DIR . '/upgrade-plugin.php');
62
  require_once(GEOIP_PLUGIN_DIR . '/api.php');
5
  Description: Retrieving Geo-Information using the Maxmind GeoIP (Lite) Database.
6
  Author: Yellow Tree (Benjamin Pick)
7
  Author URI: http://www.yellowtree.de
8
+ Version: 2.9.0
9
  License: GPLv3 or later
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
  Text Domain: geoip-detect
12
  Domain Path: /languages
13
  GitHub Plugin URI: https://github.com/yellowtree/wp-geoip-detect
14
+ GitHub Branch: master
15
  Requires WP: 3.5
16
  Requires PHP: 5.4
17
  */
18
 
19
+ define('GEOIP_DETECT_VERSION', '2.9.0');
20
 
21
  /*
22
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
23
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
24
 
25
  This program is free software; you can redistribute it and/or modify
26
  it under the terms of the GNU General Public License as published by
57
 
58
  require_once(GEOIP_PLUGIN_DIR . '/geoip-detect-lib.php');
59
  require_once(GEOIP_PLUGIN_DIR . '/lib/geonames/geonames-country-info.php');
60
+ require_once(GEOIP_PLUGIN_DIR . '/lib/get-client-ip.php');
61
 
62
  require_once(GEOIP_PLUGIN_DIR . '/upgrade-plugin.php');
63
  require_once(GEOIP_PLUGIN_DIR . '/api.php');
init.php CHANGED
@@ -1,21 +1,24 @@
1
  <?php
 
 
 
2
  function geoip_detect_defines() {
3
  if (!defined('GEOIP_DETECT_IP_CACHE_TIME'))
4
  define('GEOIP_DETECT_IP_CACHE_TIME', 2 * HOUR_IN_SECONDS);
5
  if (!defined('GEOIP_DETECT_IP_EMPTY_CACHE_TIME'))
6
  define('GEOIP_DETECT_IP_EMPTY_CACHE_TIME', GEOIP_DETECT_IP_CACHE_TIME);
7
-
8
-
9
  if (!defined('GEOIP_DETECT_READER_CACHE_TIME'))
10
  define('GEOIP_DETECT_READER_CACHE_TIME', 7 * DAY_IN_SECONDS);
11
  if (!defined('GEOIP_DETECT_DOING_UNIT_TESTS'))
12
  define('GEOIP_DETECT_DOING_UNIT_TESTS', false);
13
-
14
-
15
  if (!defined('GEOIP_DETECT_IPV6_SUPPORTED'))
16
  define('GEOIP_DETECT_IPV6_SUPPORTED', defined('AF_INET6'));
17
-
18
- if (!defined('GEOIP_DETECT_USER_AGENT'))
19
  define('GEOIP_DETECT_USER_AGENT', 'GeoIP Detect ' . GEOIP_DETECT_VERSION);
20
  }
21
  add_action('plugins_loaded', 'geoip_detect_defines');
@@ -23,21 +26,21 @@ add_action('plugins_loaded', 'geoip_detect_defines');
23
 
24
  // Load Locales
25
  function geoip_detect_load_textdomain() {
26
- load_plugin_textdomain( 'geoip-detect', false, GEOIP_PLUGIN_DIR . '/languages' );
27
  }
28
  add_action( 'plugins_loaded', 'geoip_detect_load_textdomain' );
29
 
30
 
31
  function geoip_detect_enqueue_admin_notices() {
32
  // Nobody would see them anyway.
33
- if (!is_admin() ||
34
  !is_user_logged_in() ||
35
- (defined('DOING_CRON') && DOING_CRON) ||
36
  (defined('DOING_AJAX') && DOING_AJAX) )
37
  return;
38
 
39
  global $plugin_page;
40
-
41
  if (get_option('geoip-detect-source') == 'hostinfo' && get_option('geoip-detect-ui-has-chosen-source', false) == false) {
42
  if ($plugin_page == GEOIP_PLUGIN_BASENAME && isset($_POST['action']) && $_POST['action'] == 'update') {
43
  // Skip because maybe he is currently updating the database
@@ -58,14 +61,14 @@ function geoip_detect_admin_notice_database_missing() {
58
  <div class="error notice is-dismissible">
59
  <p style="float: right">
60
  <a href="tools.php?page=<?php echo GEOIP_PLUGIN_BASENAME ?>&geoip_detect_dismiss_notice=hostinfo_used"><?php _e('Dismiss notice', 'geoip-detect'); ?></a>
61
-
62
-
63
  <h3><?php _e( 'GeoIP Detection: No database installed', 'geoip-detect' ); ?></h3>
64
  <p><?php printf(__('The Plugin %s is currently using the Webservice <a href="http://hostip.info" target="_blank">hostip.info</a> as data source. <br />You can click on the button below to download and install Maxmind GeoIPv2 Lite City now.', 'geoip-detect' ), $url); ?></p>
65
  <p><?php printf(__('This database is licenced <a href="http://creativecommons.org/licenses/by-sa/3.0/">CC BY-SA</a>. See <a href="http://dev.maxmind.com/geoip/geoip2/geolite2/#License">License</a> for details.', 'geoip-detect')); ?>
66
-
67
-
68
-
69
  <form action="options-general.php?page=<?php echo GEOIP_PLUGIN_BASENAME; ?>" method="post">
70
  <?php wp_nonce_field( 'geoip_detect_update' ); ?>
71
  <input type="hidden" name="source" value="auto" />
@@ -82,21 +85,43 @@ function geoip_detect_admin_notice_database_missing() {
82
  function geoip_detect_dismiss_message() {
83
  if (!is_admin() || !is_user_logged_in())
84
  return;
85
-
86
  if (!isset($_GET['geoip_detect_dismiss_notice']))
87
  return;
88
-
89
  $dismiss = $_GET['geoip_detect_dismiss_notice'];
90
  if ($dismiss) {
91
  $ignored_notices = (array) get_user_meta(get_current_user_id(), 'geoip_detect_dismissed_notices', true);
92
-
93
  if ($dismiss == '-1') { // Undocumented feature: reset dismissed messages
94
  $ignored_notices = array();
95
  } else if (!in_array($dismiss, $ignored_notices)) {
96
  $ignored_notices[] = $dismiss;
97
  }
98
-
99
- update_user_meta(get_current_user_id(), 'geoip_detect_dismissed_notices', $ignored_notices);
100
  }
101
  }
102
  add_action('admin_init', 'geoip_detect_dismiss_message');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
+
3
+ use YellowTree\GeoipDetect\DataSources\DataSourceRegistry;
4
+
5
  function geoip_detect_defines() {
6
  if (!defined('GEOIP_DETECT_IP_CACHE_TIME'))
7
  define('GEOIP_DETECT_IP_CACHE_TIME', 2 * HOUR_IN_SECONDS);
8
  if (!defined('GEOIP_DETECT_IP_EMPTY_CACHE_TIME'))
9
  define('GEOIP_DETECT_IP_EMPTY_CACHE_TIME', GEOIP_DETECT_IP_CACHE_TIME);
10
+
11
+
12
  if (!defined('GEOIP_DETECT_READER_CACHE_TIME'))
13
  define('GEOIP_DETECT_READER_CACHE_TIME', 7 * DAY_IN_SECONDS);
14
  if (!defined('GEOIP_DETECT_DOING_UNIT_TESTS'))
15
  define('GEOIP_DETECT_DOING_UNIT_TESTS', false);
16
+
17
+
18
  if (!defined('GEOIP_DETECT_IPV6_SUPPORTED'))
19
  define('GEOIP_DETECT_IPV6_SUPPORTED', defined('AF_INET6'));
20
+
21
+ if (!defined('GEOIP_DETECT_USER_AGENT'))
22
  define('GEOIP_DETECT_USER_AGENT', 'GeoIP Detect ' . GEOIP_DETECT_VERSION);
23
  }
24
  add_action('plugins_loaded', 'geoip_detect_defines');
26
 
27
  // Load Locales
28
  function geoip_detect_load_textdomain() {
29
+ load_plugin_textdomain( 'geoip-detect', false, GEOIP_PLUGIN_DIR . '/languages' );
30
  }
31
  add_action( 'plugins_loaded', 'geoip_detect_load_textdomain' );
32
 
33
 
34
  function geoip_detect_enqueue_admin_notices() {
35
  // Nobody would see them anyway.
36
+ if (!is_admin() ||
37
  !is_user_logged_in() ||
38
+ (defined('DOING_CRON') && DOING_CRON) ||
39
  (defined('DOING_AJAX') && DOING_AJAX) )
40
  return;
41
 
42
  global $plugin_page;
43
+
44
  if (get_option('geoip-detect-source') == 'hostinfo' && get_option('geoip-detect-ui-has-chosen-source', false) == false) {
45
  if ($plugin_page == GEOIP_PLUGIN_BASENAME && isset($_POST['action']) && $_POST['action'] == 'update') {
46
  // Skip because maybe he is currently updating the database
61
  <div class="error notice is-dismissible">
62
  <p style="float: right">
63
  <a href="tools.php?page=<?php echo GEOIP_PLUGIN_BASENAME ?>&geoip_detect_dismiss_notice=hostinfo_used"><?php _e('Dismiss notice', 'geoip-detect'); ?></a>
64
+
65
+
66
  <h3><?php _e( 'GeoIP Detection: No database installed', 'geoip-detect' ); ?></h3>
67
  <p><?php printf(__('The Plugin %s is currently using the Webservice <a href="http://hostip.info" target="_blank">hostip.info</a> as data source. <br />You can click on the button below to download and install Maxmind GeoIPv2 Lite City now.', 'geoip-detect' ), $url); ?></p>
68
  <p><?php printf(__('This database is licenced <a href="http://creativecommons.org/licenses/by-sa/3.0/">CC BY-SA</a>. See <a href="http://dev.maxmind.com/geoip/geoip2/geolite2/#License">License</a> for details.', 'geoip-detect')); ?>
69
+
70
+
71
+
72
  <form action="options-general.php?page=<?php echo GEOIP_PLUGIN_BASENAME; ?>" method="post">
73
  <?php wp_nonce_field( 'geoip_detect_update' ); ?>
74
  <input type="hidden" name="source" value="auto" />
85
  function geoip_detect_dismiss_message() {
86
  if (!is_admin() || !is_user_logged_in())
87
  return;
88
+
89
  if (!isset($_GET['geoip_detect_dismiss_notice']))
90
  return;
91
+
92
  $dismiss = $_GET['geoip_detect_dismiss_notice'];
93
  if ($dismiss) {
94
  $ignored_notices = (array) get_user_meta(get_current_user_id(), 'geoip_detect_dismissed_notices', true);
95
+
96
  if ($dismiss == '-1') { // Undocumented feature: reset dismissed messages
97
  $ignored_notices = array();
98
  } else if (!in_array($dismiss, $ignored_notices)) {
99
  $ignored_notices[] = $dismiss;
100
  }
101
+
102
+ update_user_meta(get_current_user_id(), 'geoip_detect_dismissed_notices', $ignored_notices);
103
  }
104
  }
105
  add_action('admin_init', 'geoip_detect_dismiss_message');
106
+
107
+ // --------------------------------------- Privacy -------------------------------
108
+
109
+ function geoip_detect_add_privacy_policy_content() {
110
+ if ( ! function_exists( 'wp_add_privacy_policy_content' ) ) {
111
+ return;
112
+ }
113
+
114
+ $caching = '';
115
+ if (GEOIP_DETECT_READER_CACHE_TIME > 0 && !DataSourceRegistry::getInstance()->isCachingUsed()) {
116
+ $caching = sprintf(__('This site is saving the IP of the visitors of the last %s for performance reasons.', 'geoip-detect'), human_time_diff(0, GEOIP_DETECT_READER_CACHE_TIME));
117
+ }
118
+ $source = geoip_detect2_get_current_source_description();
119
+ $content = sprintf(__( 'This site is using %s to identify the geographic location of your IP adress. %s (Add here: how this information is used, how long it is retained. Be especially careful when using this information to change prices or selling options, as this might not be legal.)', 'geoip-detect' ),
120
+ $source, $caching);
121
+
122
+ wp_add_privacy_policy_content(
123
+ 'GeoIP Detection',
124
+ wp_kses_post( wpautop( $content, false ) )
125
+ );
126
+ }
127
+ add_action( 'admin_init', 'geoip_detect_add_privacy_policy_content' );
legacy-api.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
- Author: Benjamin Pick (info@yellowtree.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
lib/geonames/geonames-country-info.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
- Author: Benjamin Pick (info@yellowtree.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
lib/get-client-ip.php ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /*
4
+ Copyright 2013-2018 Yellow Tree, Siegen, Germany
5
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
6
+
7
+ This program is free software; you can redistribute it and/or modify
8
+ it under the terms of the GNU General Public License as published by
9
+ the Free Software Foundation; either version 3 of the License, or
10
+ (at your option) any later version.
11
+
12
+ This program is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with this program; if not, write to the Free Software
19
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
+ */
21
+
22
+ namespace YellowTree\GeoipDetect\Lib;
23
+
24
+ class GetClientIp {
25
+ protected $proxyWhitelist = [];
26
+ protected $useProxyWhitelist = false;
27
+
28
+ public function __construct() {
29
+ $this->proxyWhitelist[] = '';
30
+ $this->proxyWhitelist[] = '::1';
31
+ $this->proxyWhitelist[] = '127.0.0.1';
32
+ }
33
+
34
+ public function addProxiesToWhitelist($trusted_proxies) {
35
+ foreach ($trusted_proxies as $proxy) {
36
+ $proxy = geoip_detect_normalize_ip($proxy);
37
+ if ($proxy) {
38
+ $this->proxyWhitelist[] = $proxy;
39
+ $this->useProxyWhitelist = true;
40
+ }
41
+ }
42
+ }
43
+
44
+ protected function getIpsFromRemoteAddr() {
45
+ if (!isset($_SERVER['REMOTE_ADDR']))
46
+ return ['::1'];
47
+
48
+ // REMOTE_ADDR may contain multiple adresses
49
+ $ip_list = explode(',', $_SERVER['REMOTE_ADDR']);
50
+
51
+ return $ip_list;
52
+ }
53
+
54
+ protected function getIpsFromForwardedFor($currentIpList) {
55
+ $ip_list_reverse = explode(',', @$_SERVER["HTTP_X_FORWARDED_FOR"]);
56
+
57
+ if ($this->useProxyWhitelist) {
58
+ // Add the REMOTE_ADDR to the available IP pool
59
+ $ip_list_reverse = array_merge($ip_list_reverse, $currentIpList);
60
+ $ip_list_reverse = array_map('geoip_detect_normalize_ip', $ip_list_reverse);
61
+ $ip_list_reverse = array_diff($ip_list_reverse, $this->proxyWhitelist);
62
+ }
63
+
64
+ return $ip_list_reverse;
65
+ }
66
+
67
+ public function getIp($useReverseProxy = false) {
68
+ $ip_list = $this->getIpsFromRemoteAddr();
69
+
70
+ if ($useReverseProxy)
71
+ {
72
+ $ip_list = $this->getIpsFromForwardedFor($ip_list);
73
+ }
74
+
75
+ // Each Proxy server append their information at the end, so the last IP is most trustworthy.
76
+ $ip = end($ip_list);
77
+ $ip = geoip_detect_normalize_ip($ip);
78
+
79
+ if (!geoip_detect_is_ip($ip))
80
+ $ip = '::1'; // By default, use localhost
81
+
82
+ // this is the correct one!
83
+ $ip = apply_filters('geoip_detect2_client_ip', $ip, $ip_list);
84
+
85
+ return $ip;
86
+ }
87
+ }
readme.txt CHANGED
@@ -18,8 +18,8 @@ as a shortcode, or via CSS body classes. The city & country names are translated
18
 
19
  = Features: =
20
 
21
- * Provides these 5 functions (see [API Documentation](https://github.com/yellowtree/wp-geoip-detect/wiki/API-Documentation)):
22
- * `geoip_detect2_get_info_from_ip($ip, $locales = array('en'), $options = array())`: Lookup Geo-Information of the specified IP
23
  * `geoip_detect2_get_info_from_current_ip($locales = array('en'), $options = array())`: Lookup Geo-Information of the current website user
24
  * `geoip_detect2_get_current_source_description(...)`: Return a human-readable label of the currently chosen source.
25
  * `geoip_detect2_get_external_ip_adress()`: Fetch the internet adress of the webserver
@@ -32,7 +32,8 @@ as a shortcode, or via CSS body classes. The city & country names are translated
32
  * Hosting-Provider dependent: [Cloudflare](https://support.cloudflare.com/hc/en-us/articles/200168236-What-does-CloudFlare-IP-Geolocation-do-) or [Amazon AWS CloudFront](https://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/) (Country)
33
  * For the property names, see the results of a specific IP in the wordpress backend (under *Tools > GeoIP Detection*).
34
  * You can include these properties into your posts and pages by using the shortcode `[geoip_detect2 property="country.name" default="(country could not be detected)" lang="en"]` (where 'country.name' can be one of the other property names as well, and 'default' and 'lang' are optional).
35
- * When enabled on the options page, it adds CSS classes to the body tag such as `geoip-country-DE` and `geoip-continent-EU`.
 
36
  * When enabled on the options page, the client IP respects a reverse proxy of the server.
37
  * If you are using [Contact Form 7](https://wordpress.org/plugins/contact-form-7/), you can use these shortcodes:
38
  * A select input with all countries, the detected country being selected by default `[geoip_detect2_countries mycountry]`
@@ -95,259 +96,22 @@ Does `geoip_detect2_get_info_from_current_ip()` return the same country, regardl
95
  1. Lookup page (under Tools > GeoIP Lookup)
96
  2. Options page (under Preferences > GeoIP Detection)
97
 
98
- == Upgrade Notice ==
99
 
100
- = 2.8.2 =
101
-
102
- This plugin version is compatible with PHP 7.2 and adapted the automatic update code.
103
-
104
- = 2.8.0 =
105
-
106
- Warning: This bugfix version of the plugin requires PHP 5.4.
107
-
108
- = 2.6.0 =
109
-
110
- Support for Cloudflare & AWS. 2 shortcodes for Contact Form 7.
111
-
112
- = 2.5.6 =
113
-
114
- Some users reported problems with open_basedir-notices - if that's you, this update will help. Otherwise there are no changes.
115
-
116
- = 2.5.3 =
117
-
118
- This is a security update (please update).
119
-
120
- = 2.5.1 =
121
-
122
- Hotfix: If you upgraded to 2.5.0, please verify that the correct datasource is still chosen. Sorry for any inconvenience caused.
123
-
124
- = 2.5.0 =
125
-
126
- If you use a caching plugin, you don't need to exempt geo-content pages manually anymore. When the API of this plugin is called, then this plugin signals to the caching plugin that this page should not be cached. You can disable this behavior on the options page.
127
-
128
- = 2.4.2 =
129
-
130
- You don't need to upgrade to this version, this release is mainly to fix installation behavior.
131
-
132
- = 2.4.1 =
133
-
134
- Reverting Requirements check to behavior before 2.4.0
135
-
136
- = 2.4.0 =
137
-
138
- Maxmind Precision API support is here ... Try it out, I would tag it "experimental" at the moment.
139
-
140
- = 2.3.1 =
141
-
142
- The plugin was down for licensing issues.
143
- All users must now opt in to use the database because it is licensed CC BY-SA.
144
- Otherwise, the Web-API of HostIP.info is used.
145
-
146
- = 2.3.0 =
147
-
148
- The plugin was down for licensing issues.
149
- All users must now opt in to use the database because it is licensed CC BY-SA.
150
- Otherwise, the Web-API of HostIP.info is used.
151
-
152
- = 2.1.1 =
153
-
154
- Update to v2.x is a major update.
155
- At least PHP 5.3.1 is required now.
156
- See Migration Guide at https://github.com/yellowtree/wp-geoip-detect/wiki/How-to-migrate-from-v1-to-v2
157
-
158
- = 2.0.1 =
159
-
160
- This major update uses the new Maxmind API (v2).
161
- At least PHP 5.3.1 is required now.
162
- See Migration Guide at https://github.com/yellowtree/wp-geoip-detect/wiki/How-to-migrate-from-v1-to-v2
163
-
164
- = 1.7.1 =
165
-
166
- Cron update was broken again ...
167
-
168
- = 1.6 =
169
-
170
- Automatic weekly update didn't work in all installations.
171
-
172
- = 1.5 =
173
-
174
- Fixing automatic weekly updates.
175
 
 
 
176
 
177
  == Changelog ==
178
 
179
- = 2.8.2 =
180
- * Maxmind vendor code was updated to the current version (2.7.0).
181
- * FIX: There was a fatal error when using PHP 7.2 (thx jj-dev)
182
- * FIX: The automatic update of Maxmind Geoip2 Lite City database was fixed.
183
- * FIX: Always try to fill in more information into the country information from the GeoNames-DB.
184
-
185
- = 2.8.1 =
186
-
187
- (Was not released on wordpress.org)
188
-
189
- = 2.8.0 =
190
-
191
- * FIX: Localhost now always is a trusted proxy (for standard reverse proxy configurations, however the checkbox "uses a reverse proxy" still needs to be activated.)
192
- * FIX: Timezone was overwritten by country data even though the maxmind data had already detected a timezone.
193
- * ADD: If the manual datasource is used, the file will continue to be found if the site is moved to another host
194
- * Maxmind vendor code was updated to the current version (2.6.0).
195
- * PHP 5.4 is now required (due to the maxmind library).
196
-
197
- = 2.7.0 =
198
-
199
- * ADD: The options array of `geoip_detect2_get_info_from_ip` now has a new parameter for overriding the current source for a single lookup. See [API usage examples](https://github.com/yellowtree/wp-geoip-detect/wiki/API-Usage-Examples)
200
- * ADD: New filter `geoip_detect2_shortcode_country_select_countries` for the country list of `[geoip_detect2_countries]`
201
- * ADD: New constant `GEOIP_DETECT_IP_EMPTY_CACHE_TIME` that can be used to specify a shorter cache time in case temporarily no external IP was found.
202
- * FIX: Compatibility with CF 4.6 (remove deprecated function call)
203
- * Maxmind vendor code was updated to the current version (2.4.5).
204
-
205
- = 2.6.0 =
206
-
207
- * ADD: New datasources for Cloudflare & Amazon AWS CloudFront (countries for current IP only).
208
- * ADD: Country information (names, lat/lon, continent, localized in the different languages) are now filled in for sources that only detect the country code (Cloudflare, Amazon, hostip.info)
209
- * ADD: 2 shortcodes for [Contact Form 7](https://wordpress.org/plugins/contact-form-7/) (a select with all countries `[geoip_detect2_countries mycountry]`, and tracking information for the email text `[geoip_detect2_user_info]`) - see [Documentation](https://github.com/yellowtree/wp-geoip-detect/wiki/API-Documentation#wp-contactform7-shortcodes)
210
- * FIX: Cron scheduling is checked every time you visit the plugin page.
211
- * FIX: Timezones of US & Canada are now detected more often (if country+state is known)
212
- * FIX: Shortcode didn't use current sitelang as default, but always english
213
- * Maxmind vendor code was updated to the current version (2.4.2).
214
-
215
- = 2.5.7 =
216
- * ADD: Shortcodes can now optionally specifiy the IP: `[geoip_detect2 property="country.isoCode" ip="(ipv4 or ipv6)"]`
217
- * ADD: Plugin is now translated into German.
218
- * FIX: `geoip_detect2_get_info_from_current_ip()` now also handles the case when REMOTE_ADDR contains multiple IP adresses
219
-
220
- = 2.5.6 =
221
- * FIX: Removed noticed concerning open_basedir.
222
-
223
- = 2.5.5 =
224
-
225
- * Clean-up changes to prepare plugin translation.
226
- * FIX: Only show the "no database installed" admin notice to admins (props @meitar)
227
-
228
- = 2.5.4 =
229
-
230
- * FIX: Manual datasource filepath handling corrected.
231
- * FIX: Potential incompability with BuddyPress removed.
232
-
233
- = 2.5.3 =
234
-
235
- * FIX: (Security) Add nonces to backend to avoid CSRF (thanks to Gerard Arall).
236
- * FIX: Do not use PHP shortcode tags (<?=) as some servers do not support it with PHP 5.3
237
- * Maxmind vendor code was updated to the current version (2.3.3).
238
-
239
- = 2.5.2 =
240
- * FIX: Also disallow proxy caching via HTTP header, if possible.
241
- * NEW: Shortcodes for the other API functions: `[geoip_detect2_get_current_source_description]`, `[geoip_detect2_get_client_ip]`, and `[geoip_detect2_get_external_ip_adress]`
242
- * FIX: geoip_detect2_get_external_ip_adress() : do not filter if $unfiltered is true.
243
-
244
- = 2.5.1 =
245
- * FIX: Upgrade script did change the source.
246
- * FIX: Page caching is only disabled on upgrade when `set_css_country` is disabled.
247
-
248
- = 2.5.0 =
249
- * CHANGE: The parameter $skipCache is now $options['skipCache']. Using $skipCache is deprecated, but still works.
250
- * NEW: $options['timeout'] for Web-API lookups can now be specified.
251
- * FIX: Hostip.info did not set traits->ipAddress
252
- * FIX: Hostip.info does not include data for IPv6. Add a lookup error message.
253
- * NEW: Disable page caching if geoip-API was called (this is configurable in the options). (Supported plugins: WP Super Cache, W3 Total Cache, ZenCache, and possibly others)
254
- * Maxmind vendor code was updated to the current version (2.3.1).
255
-
256
- = 2.4.3 =
257
- * FIX: Options Page: The checkboxes didn't show (even though the option was saved) since 2.4.0
258
- * NEW: A fixed external IP can now be specified on the options page. (Useful in development scenarios without internet, or mixed internet/intranet cases. You can also use this to speed up things on the production server if you know the IP will not change.)
259
- * NEW: Hidden feature/side-effect: Clicking on save in the General Options section also empties the external IP cache.
260
-
261
- = 2.4.2 =
262
- * FIX: Trim whitespace of IP adress.
263
- * FIX: some PHP notices.
264
- * FIX: The Installation message "No database installed" failed to install the Maxmind database since 2.4.0
265
- * NEW: Show IPv6-not-supported notice.
266
- * FIX: Add empty fallback functions in case the plugin requirements are not met. (To avoid fatal errors.)
267
-
268
- = 2.4.1 =
269
- * FIX: Revert IPv6 check. (Sorry for this. I thought PHP compiled without IPv6 would be esoteric.)
270
-
271
- = 2.4.0 =
272
- This is a major refactor in order to support multiple sources properly. The Lookup and the Options were seperated into 2 screens (accessible in the menu under `Tools` and `Options`, respectively.)
273
-
274
- * NEW: Add a Cache for Web-API-Requests. Consequently, the function geoip_detect2_get_info_from_ip() received a new parameter "$skipCache" to skip this cache if not needed. You can check if the result is coming from the cache by checking $result->extra->cached (it is 0 when not cached, UNIX timestamp of cache event otherwise).
275
- * This also applies to the shortcode API (`[geoip_detect2 property="extra.cached" skip_cache="true"]`)
276
- * NEW: Error messages during lookup are now in `$record->extra->error`.
277
- * NEW: Experimental support for the Maxmind Precision API.
278
- * NEW: Shortcodes now also support fallback languages. (`[geoip_detect2 property="country" lang="fr,de"]`)
279
- * FIX: Check for IPv6 support for PHP.
280
- * FIX: Country data now also get timezones.
281
-
282
- = 2.3.1 =
283
- * NEW: API function geoip_detect2_get_current_source_description() (as there are different sources to choose from now)
284
- * FIX: Show error message if PHP < 5.3 (instead of fatal error)
285
-
286
- = 2.3.0 =
287
- * NEW: Add HostIP.info-Support
288
-
289
- = 2.2.0 =
290
- * FIX: Update Maxmind Reader to 1.0.3 (fixing issues when the PHP extension mbstring was not installed)
291
- * NEW: Commercial databases are now supported. You can specify a file path in the options.
292
- * NEW: A country database (lite or commercial) database now works as well.
293
- * NEW: License is now displayed before install.
294
-
295
- = 2.1.2 =
296
- * FIX: Show error message if PHP < 5.3 (instead of fatal error)
297
- * FIX: Support multiple proxies (but currently only one reverse proxy)
298
-
299
- = 2.1.1 =
300
- * FIX: Notice "Database missing" should not show during/right after database update.
301
-
302
- = 2.1.0 =
303
- * NEW: A nagging admin notice shows up on every wp-admin page when no database is installed (yet).
304
-
305
- = 2.0.1 =
306
- * NEW: Using v2 version of the API.
307
- See Migration Guide at [Github](https://github.com/yellowtree/wp-geoip-detect/wiki/How-to-migrate-from-v1-to-v2)
308
-
309
- Other changes:
310
-
311
- * NEW: The v2-functions now support location names in other locales. By default, they return the current site language if possible.
312
- * NEW: The new shortcode [geoip_detect2 ...] also supports a "lang"-Attribute.
313
- * NEW: IPv6 addresses are now supported as well.
314
- * Legacy function names and shortcode should work in most cases. For details check the guide above.
315
-
316
- = 2.0.0 =
317
-
318
- (Was not released on wordpress.org to make sure that development releases get this update as well.)
319
-
320
- = 1.8 =
321
- * NEW: Support reverse proxies (you have to enable it in the plugin options.)
322
- * NEW: Shortcode now has a default value when no information for this IP found.
323
-
324
- = 1.7.1 =
325
- * FIX: Fatal error on cron run
326
-
327
- = 1.7 =
328
- * FIX: Schedule Database update to do in background immediately after plugin installation/re-activation.
329
- * FIX: Longitude can be smaller than -90
330
-
331
- = 1.6 =
332
- * NEW: Can add a country- and continent-specific class on the body tag. You need to activate this in the options.
333
- * FIX: Automatic weekly update. (Didn't work on all installations).
334
- * FIX: Do not include Maxmind Libraries again if already included by another plugin/theme
335
-
336
- = 1.5 =
337
- * FIX: Automatic weekly update. Go to the plugin page (Tools menu) to verify that an update is planned.
338
-
339
- = 1.4 =
340
- * Feature: Add shortcode [geoip_detect property="(property name)"] for direct use in posts/pages
341
-
342
- = 1.3 =
343
- * FIX: Manual install works again (was broken since 1.2)
344
-
345
- = 1.2 =
346
- * FIX: property region_name is now filled again (was broken since 1.1)
347
-
348
- = 1.1 =
349
- * Add function `geoip_detect_get_external_ip_adress()`: Ask a webservice to tell me the external IP of the webserver.
350
- * New filter: When developing locally, the external IP is used to determine the geographic location.
351
 
352
- = 1.0 =
353
- * First working release.
18
 
19
  = Features: =
20
 
21
+ * Provides these 5 functions (see [API Documentation](https://github.com/yellowtree/wp-geoip-detect/wiki/API-Documentation)):
22
+ * `geoip_detect2_get_info_from_ip($ip, $locales = array('en'), $options = array())`: Lookup Geo-Information of the specified IP
23
  * `geoip_detect2_get_info_from_current_ip($locales = array('en'), $options = array())`: Lookup Geo-Information of the current website user
24
  * `geoip_detect2_get_current_source_description(...)`: Return a human-readable label of the currently chosen source.
25
  * `geoip_detect2_get_external_ip_adress()`: Fetch the internet adress of the webserver
32
  * Hosting-Provider dependent: [Cloudflare](https://support.cloudflare.com/hc/en-us/articles/200168236-What-does-CloudFlare-IP-Geolocation-do-) or [Amazon AWS CloudFront](https://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/) (Country)
33
  * For the property names, see the results of a specific IP in the wordpress backend (under *Tools > GeoIP Detection*).
34
  * You can include these properties into your posts and pages by using the shortcode `[geoip_detect2 property="country.name" default="(country could not be detected)" lang="en"]` (where 'country.name' can be one of the other property names as well, and 'default' and 'lang' are optional).
35
+ * You can show or hide content by using a shortcode `[geoip_detect2_show_if country="FR, DE" not_city="Berlin"]TEXT[/geoip_detect2_show_if]`. See [API Documentation](https://github.com/yellowtree/wp-geoip-detect/wiki/API-Documentation#show-or-hide-content-depending-on-the-location).
36
+ * When enabled on the options page, it adds CSS classes to the body tag such as `geoip-province-HE`, `geoip-country-DE` and `geoip-continent-EU`.
37
  * When enabled on the options page, the client IP respects a reverse proxy of the server.
38
  * If you are using [Contact Form 7](https://wordpress.org/plugins/contact-form-7/), you can use these shortcodes:
39
  * A select input with all countries, the detected country being selected by default `[geoip_detect2_countries mycountry]`
96
  1. Lookup page (under Tools > GeoIP Lookup)
97
  2. Options page (under Preferences > GeoIP Detection)
98
 
99
+ == Upgrade Notice ==
100
 
101
+ = 2.9.0 =
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
102
 
103
+ There have been changes to the reverse proxy logic. If you have enabled a reverse proxy, check if the detected IP is correct.
104
+ New: Shortcode for showing/hiding content!
105
 
106
  == Changelog ==
107
 
108
+ = 2.9.0 =
109
+ * Add default Privacy text for GDPR compliance.
110
+ * The reverse proxy logic was heavily changed. If you run into configuration errors, try the debug panel (see link after the reverse proxy option).
111
+ * NEW: Reverse proxies can now be whitelisted - all non-whitelisted proxies are treated as user IP.
112
+ * NEW: Shortcode to show/hide content dynamically. (`[geoip_detect2_show_if country="US" not_state="Texas"]TEXT[/geoip_detect2_show_if]`) (Thanks to @DynAggelos!)
113
+ * NEW: All shortcodes now support multiple subdivisions (`[geoip_detect2 property="subdivisions.0.isoCode"]`)
114
+ * NEW: The CSS classes that are added to the body-tag (if enabled in the options) now also include the most specific subdivision (`geoip-province-HE`).
115
+ * Maxmind vendor code was updated to the current version (2.9.0).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
 
117
+ [Older changelog](https://github.com/yellowtree/wp-geoip-detect/blob/master/CHANGELOG.md)
 
shortcode.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
- Author: Benjamin Pick (info@yellowtree.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
@@ -19,112 +19,145 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
  */
20
 
21
  /**
22
- * @deprecated
23
  */
24
  function geoip_detect_shortcode($attr)
25
  {
26
  $userInfo = geoip_detect_get_info_from_current_ip();
27
 
28
- $defaultValue = isset($attr['default']) ? $attr['default'] : '';
29
-
30
  if (!is_object($userInfo))
31
  return $defaultValue . '<!-- GeoIP Detect: No info found for this IP. -->';
32
 
33
  $propertyName = $attr['property'];
34
-
35
-
36
  if (property_exists($userInfo, $propertyName)) {
37
  if ($userInfo->$propertyName)
38
  return $userInfo->$propertyName;
39
  else
40
  return $defaultValue;
41
  }
42
-
43
  return $defaultValue . '<!-- GeoIP Detect: Invalid property name. -->';
44
  }
45
  add_shortcode('geoip_detect', 'geoip_detect_shortcode');
46
 
47
  /**
48
  * Short Code
49
- *
50
  * Examples:
51
  * `[geoip_detect2 property="country"]` -> Germany
52
  * `[geoip_detect2 property="country.isoCode"]` -> DE
53
  * `[geoip_detect2 property="country.isoCode" ip="8.8.8.8"]` -> US
54
- *
55
  * `[geoip_detect2 property="country" lang="de"]` -> Deutschland
56
  * `[geoip_detect2 property="country" lang="fr,de"]` -> Allemagne
57
- * `[geoip_detect2 property="country.confidence" default="default value"]` -> default value
58
- *
59
  * @param string $property Property to read. Instead of '->', use '.'
60
  * @param string $lang Language(s) (optional. If not set, current site language is used.)
61
  * @param string $default Default Value that will be shown if value not set (optional)
62
- * @param string $skipCache if 'true': Do not cache value
63
  *
64
  * @since 2.5.7 New attribute `ip`
65
  */
66
- function geoip_detect2_shortcode($attr)
67
  {
68
- $skipCache = isset($attr['skip_cache']) && (strtolower($attr['skip_cache']) == 'true' || $attr['skip_cache'] == '1');
69
-
 
 
 
 
 
 
 
 
70
  $locales = isset($attr['lang']) ? $attr['lang'] . ',en' : null;
71
  $locales = apply_filters('geoip_detect2_locales', $locales);
72
 
73
- $defaultValue = isset($attr['default']) ? $attr['default'] : '';
74
-
75
- $properties = explode('.', $attr['property']);
76
-
77
  $options = array('skipCache' => $skipCache);
78
-
79
- $ip = isset($attr['ip']) ? $attr['ip'] : geoip_detect2_get_client_ip();
80
-
81
  $userInfo = geoip_detect2_get_info_from_ip($ip, $locales, $options);
82
 
83
  if ($userInfo->isEmpty)
84
- return $defaultValue . '<!-- GeoIP Detect: No information found for this IP (' . geoip_detect2_get_client_ip() . ') -->';
85
-
86
- $return = '';
87
  try {
88
- if (count($properties) == 1) {
89
- $return = $userInfo->{$properties[0]};
90
- } else if (count($properties) == 2) {
91
- $return = $userInfo->{$properties[0]};
92
- if (!is_object($return))
93
- throw new \RuntimeException('Invalid property name.');
94
- $return = $return->{$properties[1]};
95
- } else {
96
- throw new \RuntimeException('Only 1 dot supported. Please send a bug report to show me the shortcode you used if you need it ...');
97
- }
98
  } catch (\RuntimeException $e) {
99
  return $defaultValue . '<!-- GeoIP Detect: Invalid property name. -->';
100
  }
101
 
102
- if (is_object($return) && $return instanceof \GeoIp2\Record\AbstractPlaceRecord)
103
  $return = $return->name;
104
-
 
105
  if (is_object($return) || is_array($return)) {
106
  return $defaultValue . '<!-- GeoIP Detect: Invalid property name (sub-property missing). -->';
107
  }
108
-
109
  if ($return)
110
  return (string) $return;
111
  else
112
  return $defaultValue;
113
-
114
  }
115
  add_shortcode('geoip_detect2', 'geoip_detect2_shortcode');
116
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
117
  function geoip_detect2_shortcode_client_ip($attr) {
118
  $client_ip = geoip_detect2_get_client_ip();
119
  geoip_detect_normalize_ip($client_ip);
120
-
121
  return $client_ip;
122
  }
123
  add_shortcode('geoip_detect2_get_client_ip', 'geoip_detect2_shortcode_client_ip');
124
 
125
  function geoip_detect2_shortcode_get_external_ip_adress($attr) {
126
  $external_ip = geoip_detect2_get_external_ip_adress();
127
-
128
  return $external_ip;
129
  }
130
  add_shortcode('geoip_detect2_get_external_ip_adress', 'geoip_detect2_shortcode_get_external_ip_adress');
@@ -138,23 +171,23 @@ add_shortcode('geoip_detect2_get_current_source_description', 'geoip_detect2_sho
138
 
139
  /**
140
  * Create a <select>-Input element with all countries.
141
- *
142
  * Examples:
143
  * `[geoip_detect2_countries_select name="mycountry" lang="fr"]`
144
  * A list of all country names in French, the visitor's country is preselected.
145
- *
146
  * `[geoip_detect2_countries_select id="id" class="class" name="mycountry" lang="fr"]`
147
  * As above, with CSS id "#id" and class ".class"
148
- *
149
  * `[geoip_detect2_countries_select name="mycountry" include_blank="true"]`
150
  * Country names are in the current site language. User can also choose '---' for no country at all.
151
- *
152
  * `[geoip_detect2_countries_select name="mycountry" selected="US"]`
153
  * "United States" is preselected, there is no visitor IP detection going on here
154
- *
155
  * `[geoip_detect2_countries_select name="mycountry" default="US"]`
156
  * Visitor's country is preselected, but in case the country is unknown, use "United States"
157
- *
158
  * @param string $name Name of the form element
159
  * @param string $id CSS Id of element
160
  * @param string $class CSS Class of element
@@ -162,7 +195,7 @@ add_shortcode('geoip_detect2_get_current_source_description', 'geoip_detect2_sho
162
  * @param string $selected Which country to select by default (2-letter ISO code.) (optional. If not set, the country will be detected by client ip.)
163
  * @param string $default Default Value that will be used if country cannot be detected (optional)
164
  * @param string $include_blank If this value contains 'true', a empty value will be prepended ('---', i.e. no country) (optional)
165
- *
166
  * @return string The generated HTML
167
  */
168
  function geoip_detect2_shortcode_country_select($attr) {
@@ -177,7 +210,7 @@ function geoip_detect2_shortcode_country_select($attr) {
177
  if (isset($attr['default']))
178
  $selected = $attr['default'];
179
  }
180
-
181
  $locales = !empty($attr['lang']) ? $attr['lang'] : null;
182
  $locales = apply_filters('geoip_detect2_locales', $locales);
183
 
@@ -201,7 +234,7 @@ function geoip_detect2_shortcode_country_select($attr) {
201
  * Filter: geoip_detect2_shortcode_country_select_countries
202
  * Change the list of countries that should show up in the select box.
203
  * You can add, remove, reorder countries at will.
204
- * If you want to add a blank value (for seperators or so), use a key name that starts with 'blank_'
205
  * and then something at will in case you need several of them.
206
  *
207
  * @param array $countries List of localized country names
@@ -209,22 +242,22 @@ function geoip_detect2_shortcode_country_select($attr) {
209
  * @return array
210
  */
211
  $countries = apply_filters('geoip_detect2_shortcode_country_select_countries', $countries, $attr);
212
-
213
  $html = '<select ' . $select_attrs_html . '>';
214
- if (!empty($attr['include_blank']) && $attr['include_blank'] !== 'false')
215
  $html .= '<option value="">---</option>';
216
  foreach ($countries as $code => $label) {
217
  if (substr($code, 0, 6) == 'blank_')
218
  {
219
- $html .= '<option value="">' . esc_html($label) . '</option>';
220
  }
221
  else
222
  {
223
- $html .= '<option' . ($code == $selected ? ' selected="selected"' : '') . '>' . esc_html($label) . '</option>';
224
  }
225
  }
226
  $html .= '</select>';
227
-
228
  return $html;
229
  }
230
  add_shortcode('geoip_detect2_countries_select', 'geoip_detect2_shortcode_country_select');
@@ -233,32 +266,32 @@ add_shortcode('geoip_detect2_countries', 'geoip_detect2_shortcode_country_select
233
  /**
234
  *
235
  * Examples:
236
- *
237
  * `[geoip_detect2_countries mycountry id:id class:class lang:fr]`
238
  * A list of all country names in French (with CSS id "#id" and class ".class"), the visitor's country is preselected.
239
- *
240
  * `[geoip_detect2_countries mycountry include_blank]`
241
  * Country names are in the current site language. User can also choose '---' for no country at all.
242
- *
243
  * `[geoip_detect2_countries mycountry "US"]`
244
  * "United States" is preselected, there is no visitor IP detection going on here
245
- *
246
  * `[geoip_detect2_countries mycountry default:US]`
247
  * Visitor's country is preselected, but in case the country is unknown, use "United States"
248
  *
249
  */
250
  function geoip_detect2_shortcode_country_select_wpcf7($tag) {
251
  $tag = new WPCF7_FormTag( $tag );
252
-
253
  $default = (string) reset( $tag->values );
254
  $default = $tag->get_default_option($default, array('multiple' => false));
255
  $default = wpcf7_get_hangover( $tag->name, $default ); // Get from $_POST if available
256
-
257
  $class = wpcf7_form_controls_class( $tag->type );
258
  $validation_error = wpcf7_get_validation_error( $tag->name );
259
  if ($validation_error)
260
  $class .= ' wpcf7-not-valid';
261
-
262
  $attr = array(
263
  'name' => $tag->name,
264
  'include_blank' => $tag->has_option( 'include_blank' ),
@@ -271,22 +304,22 @@ function geoip_detect2_shortcode_country_select_wpcf7($tag) {
271
  'default' => $tag->get_option('default', '', true),
272
  );
273
  $html = geoip_detect2_shortcode_country_select($attr);
274
-
275
  $html = sprintf(
276
  '<span class="wpcf7-form-control-wrap %1$s">%2$s %3$s</span>',
277
  sanitize_html_class( $tag->name ), $html, $validation_error );
278
-
279
  return $html;
280
  }
281
 
282
  add_action( 'wpcf7_init', 'geoip_detect2_add_shortcodes' );
283
  function geoip_detect2_add_shortcodes() {
284
  if (function_exists('wpcf7_add_form_tag')) {
285
- // >=CF 4.6
286
  wpcf7_add_form_tag(array('geoip_detect2_countries', 'geoip_detect2_countries*'), 'geoip_detect2_shortcode_country_select_wpcf7', true);
287
  } else if (function_exists('wpcf7_add_shortcode')) {
288
  // < CF 4.6
289
- wpcf7_add_shortcode(array('geoip_detect2_countries', 'geoip_detect2_countries*'), 'geoip_detect2_shortcode_country_select_wpcf7', true);
290
  }
291
  }
292
 
@@ -316,4 +349,176 @@ add_filter( 'wpcf7_special_mail_tags', 'geoip_detect2_shortcode_user_info_wpcf7'
316
  function geoip_detect_shortcode_user_info($attr) {
317
  return geoip_detect2_shortcode_user_info_wpcf7('', 'geoip_detect2_user_info', true);
318
  }
319
- add_shortcode('geoip_detect2_user_info', 'geoip_detect_shortcode_user_info');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
19
  */
20
 
21
  /**
22
+ * @deprecated
23
  */
24
  function geoip_detect_shortcode($attr)
25
  {
26
  $userInfo = geoip_detect_get_info_from_current_ip();
27
 
28
+ $defaultValue = isset($attr['default']) ? $attr['default'] : '';
29
+
30
  if (!is_object($userInfo))
31
  return $defaultValue . '<!-- GeoIP Detect: No info found for this IP. -->';
32
 
33
  $propertyName = $attr['property'];
34
+
35
+
36
  if (property_exists($userInfo, $propertyName)) {
37
  if ($userInfo->$propertyName)
38
  return $userInfo->$propertyName;
39
  else
40
  return $defaultValue;
41
  }
42
+
43
  return $defaultValue . '<!-- GeoIP Detect: Invalid property name. -->';
44
  }
45
  add_shortcode('geoip_detect', 'geoip_detect_shortcode');
46
 
47
  /**
48
  * Short Code
49
+ *
50
  * Examples:
51
  * `[geoip_detect2 property="country"]` -> Germany
52
  * `[geoip_detect2 property="country.isoCode"]` -> DE
53
  * `[geoip_detect2 property="country.isoCode" ip="8.8.8.8"]` -> US
54
+ *
55
  * `[geoip_detect2 property="country" lang="de"]` -> Deutschland
56
  * `[geoip_detect2 property="country" lang="fr,de"]` -> Allemagne
57
+ * `[geoip_detect2 property="country.confidence" skip_cache="true" default="default value"]` -> default value
58
+ *
59
  * @param string $property Property to read. Instead of '->', use '.'
60
  * @param string $lang Language(s) (optional. If not set, current site language is used.)
61
  * @param string $default Default Value that will be shown if value not set (optional)
62
+ * @param string $skip_cache if 'true': Do not cache value
63
  *
64
  * @since 2.5.7 New attribute `ip`
65
  */
66
+ function geoip_detect2_shortcode($attr, $content, $shortcodeName)
67
  {
68
+ $attr = shortcode_atts(array(
69
+ 'skip_cache' => 'false',
70
+ 'lang' => null,
71
+ 'default' => '',
72
+ 'property' => '',
73
+ 'ip' => null,
74
+ ), $attr, $shortcodeName);
75
+
76
+ $skipCache = filter_var($attr['skip_cache'], FILTER_VALIDATE_BOOLEAN );
77
+
78
  $locales = isset($attr['lang']) ? $attr['lang'] . ',en' : null;
79
  $locales = apply_filters('geoip_detect2_locales', $locales);
80
 
81
+ $defaultValue = $attr['default'];
82
+
 
 
83
  $options = array('skipCache' => $skipCache);
84
+
85
+ $ip = $attr['ip'] ?: geoip_detect2_get_client_ip();
86
+
87
  $userInfo = geoip_detect2_get_info_from_ip($ip, $locales, $options);
88
 
89
  if ($userInfo->isEmpty)
90
+ return $defaultValue . '<!-- GeoIP Detect: No information found for this IP (' . geoip_detect2_get_client_ip() . ') -->';
91
+
 
92
  try {
93
+ $return = geoip_detect2_shortcode_get_property($userInfo, $attr['property']);
 
 
 
 
 
 
 
 
 
94
  } catch (\RuntimeException $e) {
95
  return $defaultValue . '<!-- GeoIP Detect: Invalid property name. -->';
96
  }
97
 
98
+ if (is_object($return) && $return instanceof \GeoIp2\Record\AbstractPlaceRecord) {
99
  $return = $return->name;
100
+ }
101
+
102
  if (is_object($return) || is_array($return)) {
103
  return $defaultValue . '<!-- GeoIP Detect: Invalid property name (sub-property missing). -->';
104
  }
105
+
106
  if ($return)
107
  return (string) $return;
108
  else
109
  return $defaultValue;
110
+
111
  }
112
  add_shortcode('geoip_detect2', 'geoip_detect2_shortcode');
113
 
114
+ /**
115
+ * [geoip_detect2_shortcode_get_property description]
116
+ * @param [type] $userInfo [description]
117
+ * @param [type] $propertyName [description]
118
+ * @return [type] [description]
119
+ * @throws \RuntimeException (if Property name invalid)
120
+ */
121
+ function geoip_detect2_shortcode_get_property($userInfo, $propertyName) {
122
+ $return = '';
123
+ $properties = explode('.', $propertyName);
124
+ if (count($properties) == 1) {
125
+ $return = $userInfo->{$properties[0]};
126
+ } else if ($properties[0] == 'subdivisions' && (count($properties) == 2 || count($properties) == 3)) {
127
+ $return = $userInfo->{$properties[0]};
128
+ if (!is_array($return))
129
+ throw new \RuntimeException('Invalid property name.');
130
+ if (!is_numeric($properties[1]))
131
+ throw new \RuntimeException('Invalid property name (must be numeric, e.g. "subdivisions.0").');
132
+ $return = $return[(int) $properties[1]];
133
+
134
+ if (isset($properties[2])) {
135
+ if (!is_object($return))
136
+ throw new \RuntimeException('Invalid property name.');
137
+ $return = $return->{$properties[2]};
138
+ }
139
+ } else if (count($properties) == 2) {
140
+ $return = $userInfo->{$properties[0]};
141
+ if (!is_object($return))
142
+ throw new \RuntimeException('Invalid property name.');
143
+ $return = $return->{$properties[1]};
144
+ } else {
145
+ throw new \RuntimeException('Only 1 dot supported. Please send a bug report to show me the shortcode you used if you need it ...');
146
+ }
147
+ return $return;
148
+ }
149
+
150
  function geoip_detect2_shortcode_client_ip($attr) {
151
  $client_ip = geoip_detect2_get_client_ip();
152
  geoip_detect_normalize_ip($client_ip);
153
+
154
  return $client_ip;
155
  }
156
  add_shortcode('geoip_detect2_get_client_ip', 'geoip_detect2_shortcode_client_ip');
157
 
158
  function geoip_detect2_shortcode_get_external_ip_adress($attr) {
159
  $external_ip = geoip_detect2_get_external_ip_adress();
160
+
161
  return $external_ip;
162
  }
163
  add_shortcode('geoip_detect2_get_external_ip_adress', 'geoip_detect2_shortcode_get_external_ip_adress');
171
 
172
  /**
173
  * Create a <select>-Input element with all countries.
174
+ *
175
  * Examples:
176
  * `[geoip_detect2_countries_select name="mycountry" lang="fr"]`
177
  * A list of all country names in French, the visitor's country is preselected.
178
+ *
179
  * `[geoip_detect2_countries_select id="id" class="class" name="mycountry" lang="fr"]`
180
  * As above, with CSS id "#id" and class ".class"
181
+ *
182
  * `[geoip_detect2_countries_select name="mycountry" include_blank="true"]`
183
  * Country names are in the current site language. User can also choose '---' for no country at all.
184
+ *
185
  * `[geoip_detect2_countries_select name="mycountry" selected="US"]`
186
  * "United States" is preselected, there is no visitor IP detection going on here
187
+ *
188
  * `[geoip_detect2_countries_select name="mycountry" default="US"]`
189
  * Visitor's country is preselected, but in case the country is unknown, use "United States"
190
+ *
191
  * @param string $name Name of the form element
192
  * @param string $id CSS Id of element
193
  * @param string $class CSS Class of element
195
  * @param string $selected Which country to select by default (2-letter ISO code.) (optional. If not set, the country will be detected by client ip.)
196
  * @param string $default Default Value that will be used if country cannot be detected (optional)
197
  * @param string $include_blank If this value contains 'true', a empty value will be prepended ('---', i.e. no country) (optional)
198
+ *
199
  * @return string The generated HTML
200
  */
201
  function geoip_detect2_shortcode_country_select($attr) {
210
  if (isset($attr['default']))
211
  $selected = $attr['default'];
212
  }
213
+
214
  $locales = !empty($attr['lang']) ? $attr['lang'] : null;
215
  $locales = apply_filters('geoip_detect2_locales', $locales);
216
 
234
  * Filter: geoip_detect2_shortcode_country_select_countries
235
  * Change the list of countries that should show up in the select box.
236
  * You can add, remove, reorder countries at will.
237
+ * If you want to add a blank value (for seperators or so), use a key name that starts with 'blank_'
238
  * and then something at will in case you need several of them.
239
  *
240
  * @param array $countries List of localized country names
242
  * @return array
243
  */
244
  $countries = apply_filters('geoip_detect2_shortcode_country_select_countries', $countries, $attr);
245
+
246
  $html = '<select ' . $select_attrs_html . '>';
247
+ if (!empty($attr['include_blank']) && $attr['include_blank'] !== 'false')
248
  $html .= '<option value="">---</option>';
249
  foreach ($countries as $code => $label) {
250
  if (substr($code, 0, 6) == 'blank_')
251
  {
252
+ $html .= '<option value="">' . esc_html($label) . '</option>';
253
  }
254
  else
255
  {
256
+ $html .= '<option' . ($code == $selected ? ' selected="selected"' : '') . '>' . esc_html($label) . '</option>';
257
  }
258
  }
259
  $html .= '</select>';
260
+
261
  return $html;
262
  }
263
  add_shortcode('geoip_detect2_countries_select', 'geoip_detect2_shortcode_country_select');
266
  /**
267
  *
268
  * Examples:
269
+ *
270
  * `[geoip_detect2_countries mycountry id:id class:class lang:fr]`
271
  * A list of all country names in French (with CSS id "#id" and class ".class"), the visitor's country is preselected.
272
+ *
273
  * `[geoip_detect2_countries mycountry include_blank]`
274
  * Country names are in the current site language. User can also choose '---' for no country at all.
275
+ *
276
  * `[geoip_detect2_countries mycountry "US"]`
277
  * "United States" is preselected, there is no visitor IP detection going on here
278
+ *
279
  * `[geoip_detect2_countries mycountry default:US]`
280
  * Visitor's country is preselected, but in case the country is unknown, use "United States"
281
  *
282
  */
283
  function geoip_detect2_shortcode_country_select_wpcf7($tag) {
284
  $tag = new WPCF7_FormTag( $tag );
285
+
286
  $default = (string) reset( $tag->values );
287
  $default = $tag->get_default_option($default, array('multiple' => false));
288
  $default = wpcf7_get_hangover( $tag->name, $default ); // Get from $_POST if available
289
+
290
  $class = wpcf7_form_controls_class( $tag->type );
291
  $validation_error = wpcf7_get_validation_error( $tag->name );
292
  if ($validation_error)
293
  $class .= ' wpcf7-not-valid';
294
+
295
  $attr = array(
296
  'name' => $tag->name,
297
  'include_blank' => $tag->has_option( 'include_blank' ),
304
  'default' => $tag->get_option('default', '', true),
305
  );
306
  $html = geoip_detect2_shortcode_country_select($attr);
307
+
308
  $html = sprintf(
309
  '<span class="wpcf7-form-control-wrap %1$s">%2$s %3$s</span>',
310
  sanitize_html_class( $tag->name ), $html, $validation_error );
311
+
312
  return $html;
313
  }
314
 
315
  add_action( 'wpcf7_init', 'geoip_detect2_add_shortcodes' );
316
  function geoip_detect2_add_shortcodes() {
317
  if (function_exists('wpcf7_add_form_tag')) {
318
+ // >=CF 4.6
319
  wpcf7_add_form_tag(array('geoip_detect2_countries', 'geoip_detect2_countries*'), 'geoip_detect2_shortcode_country_select_wpcf7', true);
320
  } else if (function_exists('wpcf7_add_shortcode')) {
321
  // < CF 4.6
322
+ wpcf7_add_shortcode(array('geoip_detect2_countries', 'geoip_detect2_countries*'), 'geoip_detect2_shortcode_country_select_wpcf7', true);
323
  }
324
  }
325
 
349
  function geoip_detect_shortcode_user_info($attr) {
350
  return geoip_detect2_shortcode_user_info_wpcf7('', 'geoip_detect2_user_info', true);
351
  }
352
+ add_shortcode('geoip_detect2_user_info', 'geoip_detect_shortcode_user_info');
353
+
354
+ /**
355
+ *
356
+ * Geo-Dependent Content Hiding
357
+ *
358
+ * Uses an enclosing shortcode to selectively show or hide content. Use either
359
+ * [geoip_detect2_show_if][/geoip_detect2_show_if] or [geoip_detect2_hide_if][/geoip_detect2_hide_if] at your
360
+ * discretion, as they can both be used to accomplish the same thing.
361
+ *
362
+ * Shortcode attributes can be as follows:
363
+ *
364
+ * Inclusive Attributes (note that `hide_if` makes them exclusive):
365
+ * "continent", "country", "most_specific_subdivision"/"region"/"state"*, "city"
366
+ *
367
+ * * most_specific_subdivision, region, and state are aliases (use the one that makes the most sense to you)
368
+ *
369
+ * Exclusive Attributes (note that `hide_if` makes them inclusive):
370
+ * "not_country", "not_most_specific_subdivision"/"not_region"/"not_state"*, "not_city"
371
+ *
372
+ * * most_specific_subdivision, region, and state are aliases (use the one that makes the most sense to you)
373
+ *
374
+ * Each attribute may only appear once in a shortcode!
375
+ * The location attributes can take each take full names, ISO abbreviations (e.g., US), or the GeonamesId.
376
+ * All attributes may take multiple values seperated by comma (,).
377
+ *
378
+ * You can use custom property names with the attribute "property" and "property_value" / "not_property_value".
379
+ *
380
+ * Examples:
381
+ *
382
+ * Display TEXT if the visitor is in the US and in Texas.
383
+ * `[geoip_detect2_show_if country="US" state="TX"]TEXT[/geoip_detect2_show_if]`
384
+ * - OR -
385
+ * `[geoip_detect2_show_if country="US" region="TX"]TEXT[/geoip_detect2_show_if]`
386
+ * - OR -
387
+ * `[geoip_detect2_show_if country="US" region="Texas"]TEXT[/geoip_detect2_show_if]`
388
+ * - OR -
389
+ * `[geoip_detect2_show_if country="US" most_specific_subdivision="TX"]TEXT[/geoip_detect2_show_if]`
390
+ *
391
+ * Display TEXT if the visitor is in the US, and in either Texas or Louisiana, but hide this content
392
+ * from visitors with IP addresses from cities named Houston.
393
+ * `[geoip_detect2_show_if country="US" state="TX, LA" not_city="Houston"]TEXT[/geoip_detect2_show_if]`
394
+ *
395
+ * Display TEXT if the visitor is from North America.
396
+ * `[geoip_detect2_show_if continent="North America"]TEXT[/geoip_detect2_show_if]`
397
+ * - OR -
398
+ * `[geoip_detect2_hide_if not_continent="North America"]TEXT[/geoip_detect2_hide_if]`
399
+ *
400
+ * Hide TEXT if the visitor is from the US.
401
+ * `[geoip_detect2_hide_if country="US"]TEXT[/geoip_detect2_hide_if]`
402
+ * - OR -
403
+ * `[geoip_detect2_show_if not_country="US"]TEXT[/geoip_detect2_show_if]`
404
+ *
405
+ * Show TEXT if the visitor is within the timezone Europe/Berlin
406
+ * `[geoip_detect2_show_if property="location.timeZone" property_value="Europe/Berlin"]TEXT[/geoip_detect2_show_if]`
407
+ *
408
+ * LIMITATIONS:
409
+ * - You cannot nest several of these shortcodes within one another. Instead, seperate them into several blocks of shortcodes.
410
+ * - City names can be ambigous. For example, [geoip_detect2_show_if country="US,FR" not_city="Paris"] will exclude both Paris in France and Paris in Texas, US. Instead, you can find out the geoname_id or seperate the shortcode to make it more specific.
411
+ *
412
+ */
413
+ function geoip_detect2_shortcode_show_if($attr, $content = null, $shortcodeName = '') {
414
+ $showContentIfMatch = ($shortcodeName == 'geoip_detect2_show_if') ? true : false;
415
+
416
+ $attr = shortcode_atts(array(
417
+ 'lang' => null,
418
+ 'skip_cache' => 'false',
419
+ 'property' => null,
420
+ 'property_value' => null,
421
+ 'not_property_value' => null,
422
+ 'continent' => null,
423
+ 'country' => null,
424
+ 'most_specific_subdivision' => null,
425
+ 'region' => null,
426
+ 'state' => null,
427
+ 'city' => null,
428
+ 'not_country' => null,
429
+ 'not_most_specific_subdivision' => null,
430
+ 'not_region' => null,
431
+ 'not_state' => null,
432
+ 'not_city' => null,),
433
+ $attr, $shortcodeName);
434
+
435
+ $skipCache = filter_var($attr['skip_cache'], FILTER_VALIDATE_BOOLEAN );
436
+
437
+ $locales = isset($attr['lang']) ? $attr['lang'] . ',en' : null;
438
+ $locales = apply_filters('geoip_detect2_locales', $locales);
439
+
440
+ $options = array('skipCache' => $skipCache);
441
+
442
+ $info = geoip_detect2_get_info_from_current_ip($locales, $options);
443
+ $isConditionMatching = true;
444
+
445
+ /* Attribute Conditions. Order is not important, as they are combined with an transitive AND condition */
446
+ $attributeNames = array(
447
+ 'continent' => 'continent',
448
+ 'not_continent' => 'continent',
449
+ 'country' => 'country',
450
+ 'not_country' => 'country',
451
+ 'most_specific_subdivision' => 'mostSpecificSubdivision',
452
+ 'region' => 'mostSpecificSubdivision',
453
+ 'state' => 'mostSpecificSubdivision',
454
+ 'not_most_specific_subdivision' => 'mostSpecificSubdivision',
455
+ 'not_region' => 'mostSpecificSubdivision',
456
+ 'not_state' => 'mostSpecificSubdivision',
457
+ 'city' => 'city',
458
+ 'not_city' => 'city',
459
+ );
460
+
461
+ foreach ($attributeNames as $shortcodeParamName => $maxmindName) {
462
+ if (!empty($attr[$shortcodeParamName])) {
463
+ // Determine Actual MaxMind Value(s) for Attribute
464
+ $actualValues = array();
465
+ $alternativePropertyNames = array(
466
+ 'name',
467
+ 'isoCode',
468
+ 'code',
469
+ 'geonameId',
470
+ );
471
+ foreach ($alternativePropertyNames as $p) {
472
+ if (isset($info->{$maxmindName}->{$p})) {
473
+ $actualValues[] = $info->{$maxmindName}->{$p};
474
+ }
475
+ }
476
+
477
+ $subConditionMatching = geoip_detect2_shortcode_check_subcondition($attr[$shortcodeParamName], $actualValues);
478
+
479
+ if (substr($shortcodeParamName, 0, 4) == 'not_') {
480
+ $subConditionMatching = !$subConditionMatching;
481
+ }
482
+ $isConditionMatching = $isConditionMatching && $subConditionMatching;
483
+ }
484
+ }
485
+
486
+ if (!empty($attr['property']) && (!empty($attr['property_value']) || !empty($attr['not_property_value'])) ) {
487
+ try {
488
+ $actualValue = geoip_detect2_shortcode_get_property($info, $attr['property']);
489
+
490
+ if (!empty($attr['property_value'])) {
491
+ $subConditionMatching = geoip_detect2_shortcode_check_subcondition($attr['property_value'], $actualValue);
492
+ }
493
+ if (!empty($attr['not_property_value'])) {
494
+ $subConditionMatching = ! geoip_detect2_shortcode_check_subcondition($attr['not_property_value'], $actualValue);
495
+ }
496
+ } catch (\Exception $e) {
497
+ $subConditionMatching = false;
498
+ }
499
+
500
+ $isConditionMatching = $isConditionMatching && $subConditionMatching;
501
+ }
502
+
503
+ // All Criteria Passed?
504
+ if ($isConditionMatching === $showContentIfMatch) {
505
+ return do_shortcode($content);
506
+ }
507
+ return '';
508
+ }
509
+ add_shortcode('geoip_detect2_show_if', 'geoip_detect2_shortcode_show_if');
510
+ add_shortcode('geoip_detect2_hide_if', 'geoip_detect2_shortcode_show_if');
511
+
512
+ function geoip_detect2_shortcode_check_subcondition($expectedValuesRaw, $actualValues) {
513
+ // Parse User Input Values of Attribute
514
+ $attributeValuesArray = explode(',', $expectedValuesRaw);
515
+ $attributeValuesArray = array_map('trim', $attributeValuesArray);
516
+
517
+ $actualValues = (array) $actualValues;
518
+
519
+ // Compare case-insensitively
520
+ $attributeValuesArray = array_map('mb_strtolower', $attributeValuesArray);
521
+ $actualValues = array_map('mb_strtolower', $actualValues);
522
+
523
+ return count(array_intersect($actualValues, $attributeValuesArray)) > 0;
524
+ }
upgrade-plugin.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
- Author: Benjamin Pick (info@yellowtree.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
1
  <?php
2
  /*
3
  Copyright 2013-2018 Yellow Tree, Siegen, Germany
4
+ Author: Benjamin Pick (wp-geoip-detect| |posteo.de)
5
 
6
  This program is free software; you can redistribute it and/or modify
7
  it under the terms of the GNU General Public License as published by
vendor/composer/ca-bundle/composer.json CHANGED
@@ -27,7 +27,7 @@
27
  "php": "^5.3.2 || ^7.0"
28
  },
29
  "require-dev": {
30
- "phpunit/phpunit": "^4.8.35",
31
  "psr/log": "^1.0",
32
  "symfony/process": "^2.5 || ^3.0 || ^4.0"
33
  },
27
  "php": "^5.3.2 || ^7.0"
28
  },
29
  "require-dev": {
30
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5",
31
  "psr/log": "^1.0",
32
  "symfony/process": "^2.5 || ^3.0 || ^4.0"
33
  },
vendor/composer/ca-bundle/res/cacert.pem CHANGED
@@ -1,7 +1,7 @@
1
  ##
2
  ## Bundle of CA Root Certificates
3
  ##
4
- ## Certificate data from Mozilla as of: Wed Sep 20 03:12:05 2017 GMT
5
  ##
6
  ## This is a bundle of X.509 certificates of public Certificate Authorities
7
  ## (CA). These were automatically extracted from Mozilla's root certificates
@@ -14,7 +14,7 @@
14
  ## Just configure this file as the SSLCACertificateFile.
15
  ##
16
  ## Conversion done with mk-ca-bundle.pl version 1.27.
17
- ## SHA256: 2b2dbe5244e0047e088c597998883a913f6c5fffd1cb5c0fe5a368c8466cb2ec
18
  ##
19
 
20
 
@@ -283,25 +283,6 @@ YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
283
  398znM/jra6O1I7mT1GvFpLgXPYHDw==
284
  -----END CERTIFICATE-----
285
 
286
- Certum Root CA
287
- ==============
288
- -----BEGIN CERTIFICATE-----
289
- MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
290
- ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
291
- Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
292
- by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
293
- wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
294
- kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
295
- 89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
296
- Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
297
- NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
298
- hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
299
- GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
300
- GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
301
- 0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
302
- qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
303
- -----END CERTIFICATE-----
304
-
305
  Comodo AAA Services root
306
  ========================
307
  -----BEGIN CERTIFICATE-----
@@ -465,60 +446,6 @@ EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
465
  llpwrN9M
466
  -----END CERTIFICATE-----
467
 
468
- Camerfirma Chambers of Commerce Root
469
- ====================================
470
- -----BEGIN CERTIFICATE-----
471
- MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
472
- QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
473
- ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
474
- NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
475
- cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
476
- MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
477
- AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
478
- xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
479
- NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
480
- DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
481
- d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
482
- EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
483
- cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
484
- AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
485
- bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
486
- VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
487
- aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
488
- fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
489
- L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
490
- UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
491
- ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
492
- erfutGWaIZDgqtCYvDi1czyL+Nw=
493
- -----END CERTIFICATE-----
494
-
495
- Camerfirma Global Chambersign Root
496
- ==================================
497
- -----BEGIN CERTIFICATE-----
498
- MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
499
- QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
500
- ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
501
- NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
502
- YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
503
- MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
504
- ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
505
- 1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
506
- by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
507
- 6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
508
- 8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
509
- BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
510
- aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
511
- Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
512
- aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
513
- ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
514
- bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
515
- PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
516
- gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
517
- PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
518
- IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
519
- t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
520
- -----END CERTIFICATE-----
521
-
522
  XRamp Global CA Root
523
  ====================
524
  -----BEGIN CERTIFICATE-----
@@ -591,47 +518,6 @@ KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
591
  QBFGmh95DmK/D5fs4C8fF5Q=
592
  -----END CERTIFICATE-----
593
 
594
- StartCom Certification Authority
595
- ================================
596
- -----BEGIN CERTIFICATE-----
597
- MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
598
- U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
599
- ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
600
- NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
601
- LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
602
- U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
603
- ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
604
- o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
605
- Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
606
- eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
607
- 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
608
- 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
609
- osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
610
- untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
611
- UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
612
- 37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
613
- FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
614
- Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
615
- YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
616
- AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
617
- Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
618
- U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
619
- LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
620
- cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
621
- cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
622
- dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
623
- AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
624
- 3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
625
- vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
626
- fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
627
- fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
628
- EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
629
- yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
630
- 1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
631
- lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
632
- g14=
633
- -----END CERTIFICATE-----
634
-
635
  Taiwan GRCA
636
  ===========
637
  -----BEGIN CERTIFICATE-----
@@ -770,30 +656,6 @@ RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
770
  fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
771
  -----END CERTIFICATE-----
772
 
773
- DST ACES CA X6
774
- ==============
775
- -----BEGIN CERTIFICATE-----
776
- MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
777
- EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
778
- MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
779
- MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
780
- CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
781
- AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
782
- DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
783
- pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
784
- GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
785
- MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
786
- EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
787
- Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
788
- dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
789
- CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
790
- 5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
791
- Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
792
- nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
793
- vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
794
- oKfN5XozNmr6mis=
795
- -----END CERTIFICATE-----
796
-
797
  SwissSign Gold CA - G2
798
  ======================
799
  -----BEGIN CERTIFICATE-----
@@ -1036,27 +898,6 @@ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
1036
  U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
1037
  -----END CERTIFICATE-----
1038
 
1039
- Security Communication EV RootCA1
1040
- =================================
1041
- -----BEGIN CERTIFICATE-----
1042
- MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
1043
- U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
1044
- dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
1045
- BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
1046
- Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
1047
- AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
1048
- /VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
1049
- WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
1050
- ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
1051
- bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
1052
- 9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
1053
- SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
1054
- iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
1055
- Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
1056
- mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
1057
- T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
1058
- -----END CERTIFICATE-----
1059
-
1060
  OISTE WISeKey Global Root GA CA
1061
  ===============================
1062
  -----BEGIN CERTIFICATE-----
@@ -1177,34 +1018,6 @@ sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
1177
  BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
1178
  -----END CERTIFICATE-----
1179
 
1180
- T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
1181
- =============================================================================================================================
1182
- -----BEGIN CERTIFICATE-----
1183
- MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
1184
- DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
1185
- aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
1186
- b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
1187
- BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
1188
- S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
1189
- MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
1190
- IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
1191
- n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
1192
- IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
1193
- dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
1194
- cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
1195
- AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
1196
- Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
1197
- xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
1198
- 6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
1199
- hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
1200
- BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
1201
- MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
1202
- N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
1203
- y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
1204
- LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
1205
- dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
1206
- -----END CERTIFICATE-----
1207
-
1208
  certSIGN ROOT CA
1209
  ================
1210
  -----BEGIN CERTIFICATE-----
@@ -1452,37 +1265,6 @@ y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
1452
  lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
1453
  -----END CERTIFICATE-----
1454
 
1455
- ACEDICOM Root
1456
- =============
1457
- -----BEGIN CERTIFICATE-----
1458
- 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
- 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
- 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
- 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
- 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
- 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
- YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
1465
- 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
- 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
- HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
1468
- 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
- 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
- 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
- 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
- 4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
1473
- 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
- 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
- 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
- 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
- zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
1478
- 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
- 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
- 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
- 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
- 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
- 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
1484
- -----END CERTIFICATE-----
1485
-
1486
  Microsec e-Szigno Root CA 2009
1487
  ==============================
1488
  -----BEGIN CERTIFICATE-----
@@ -1843,37 +1625,6 @@ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
1843
  03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
1844
  -----END CERTIFICATE-----
1845
 
1846
- Certinomis - Autorité Racine
1847
- ============================
1848
- -----BEGIN CERTIFICATE-----
1849
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
1869
- 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
- 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
- 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
- WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
1873
- 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
1874
- vgt2Fl43N+bYdJeimUV5
1875
- -----END CERTIFICATE-----
1876
-
1877
  TWCA Root Certification Authority
1878
  =================================
1879
  -----BEGIN CERTIFICATE-----
@@ -2022,75 +1773,6 @@ l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
2022
  iB6XzCGcKQENZetX2fNXlrtIzYE=
2023
  -----END CERTIFICATE-----
2024
 
2025
- StartCom Certification Authority
2026
- ================================
2027
- -----BEGIN CERTIFICATE-----
2028
- MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
2029
- U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
2030
- ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
2031
- NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
2032
- LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
2033
- U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
2034
- ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
2035
- o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
2036
- Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
2037
- eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
2038
- 2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
2039
- 6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
2040
- osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
2041
- untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
2042
- UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
2043
- 37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
2044
- VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
2045
- Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
2046
- dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
2047
- c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
2048
- bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
2049
- aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
2050
- aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
2051
- L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
2052
- cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
2053
- fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
2054
- N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
2055
- Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
2056
- tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
2057
- e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
2058
- 2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
2059
- HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
2060
- JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
2061
- D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
2062
- -----END CERTIFICATE-----
2063
-
2064
- StartCom Certification Authority G2
2065
- ===================================
2066
- -----BEGIN CERTIFICATE-----
2067
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
2091
- obp573PYtlNXLfbQ4ddI
2092
- -----END CERTIFICATE-----
2093
-
2094
  Buypass Class 2 Root CA
2095
  =======================
2096
  -----BEGIN CERTIFICATE-----
@@ -2197,31 +1879,6 @@ uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
2197
  dcGWxZ0=
2198
  -----END CERTIFICATE-----
2199
 
2200
- TURKTRUST Certificate Services Provider Root 2007
2201
- =================================================
2202
- -----BEGIN CERTIFICATE-----
2203
- MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
2204
- bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
2205
- MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
2206
- QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
2207
- DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
2208
- a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
2209
- BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
2210
- bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
2211
- DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
2212
- YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
2213
- KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
2214
- KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
2215
- rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
2216
- AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
2217
- BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
2218
- Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
2219
- aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
2220
- Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
2221
- BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
2222
- poRq0Tl9
2223
- -----END CERTIFICATE-----
2224
-
2225
  D-TRUST Root Class 3 CA 2 2009
2226
  ==============================
2227
  -----BEGIN CERTIFICATE-----
@@ -2271,84 +1928,6 @@ NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
2271
  w9y4AyHqnxbxLFS1
2272
  -----END CERTIFICATE-----
2273
 
2274
- PSCProcert
2275
- ==========
2276
- -----BEGIN CERTIFICATE-----
2277
- MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk
2278
- ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ
2279
- MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz
2280
- dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl
2281
- cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw
2282
- IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw
2283
- MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w
2284
- DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD
2285
- ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp
2286
- Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw
2287
- DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC
2288
- wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA
2289
- 3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh
2290
- RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO
2291
- EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2
2292
- 0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
2293
- 0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU
2294
- td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw
2295
- Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp
2296
- r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/
2297
- AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz
2298
- Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId
2299
- xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp
2300
- ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH
2301
- EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h
2302
- Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k
2303
- ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG
2304
- 9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG
2305
- MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG
2306
- LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52
2307
- ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy
2308
- YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
2309
- Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o
2310
- dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq
2311
- T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN
2312
- g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q
2313
- uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1
2314
- n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn
2315
- FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo
2316
- 5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq
2317
- 3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5
2318
- poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y
2319
- eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
2320
- -----END CERTIFICATE-----
2321
-
2322
- CA Disig Root R1
2323
- ================
2324
- -----BEGIN CERTIFICATE-----
2325
- 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
- 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
- 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
- EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
2329
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
2349
- a7+h89n07eLw4+1knj0vllJPgFOL
2350
- -----END CERTIFICATE-----
2351
-
2352
  CA Disig Root R2
2353
  ================
2354
  -----BEGIN CERTIFICATE-----
@@ -2752,66 +2331,6 @@ G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP
2752
  82Z+
2753
  -----END CERTIFICATE-----
2754
 
2755
- WoSign
2756
- ======
2757
- -----BEGIN CERTIFICATE-----
2758
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq
2775
- 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
- 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
- 2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes
2778
- 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
- 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
- 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
- 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
- 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
2783
- -----END CERTIFICATE-----
2784
-
2785
- WoSign China
2786
- ============
2787
- -----BEGIN CERTIFICATE-----
2788
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5
2796
- 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
- b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc
2798
- 76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m
2799
- +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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO
2812
- kI26oQ==
2813
- -----END CERTIFICATE-----
2814
-
2815
  COMODO RSA Certification Authority
2816
  ==================================
2817
  -----BEGIN CERTIFICATE-----
@@ -3193,42 +2712,6 @@ HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
3193
  Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
3194
  -----END CERTIFICATE-----
3195
 
3196
- Certification Authority of WoSign G2
3197
- ====================================
3198
- -----BEGIN CERTIFICATE-----
3199
- MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG
3200
- EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g
3201
- QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx
3202
- CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm
3203
- aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
3204
- CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai
3205
- XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du
3206
- W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9
3207
- 5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK
3208
- v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
3209
- AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI
3210
- hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY
3211
- P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3
3212
- TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu
3213
- +sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+
3214
- 7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg=
3215
- -----END CERTIFICATE-----
3216
-
3217
- CA WoSign ECC Root
3218
- ==================
3219
- -----BEGIN CERTIFICATE-----
3220
- MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD
3221
- TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v
3222
- dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK
3223
- ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI
3224
- zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU
3225
- t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw
3226
- QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R
3227
- MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0
3228
- Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu
3229
- a/GRspBl9JrmkO5K
3230
- -----END CERTIFICATE-----
3231
-
3232
  SZAFIR ROOT CA2
3233
  ===============
3234
  -----BEGIN CERTIFICATE-----
@@ -3644,3 +3127,212 @@ lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R
3644
  e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j
3645
  q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
3646
  -----END CERTIFICATE-----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ##
2
  ## Bundle of CA Root Certificates
3
  ##
4
+ ## Certificate data from Mozilla as of: Wed Mar 7 04:12:06 2018 GMT
5
  ##
6
  ## This is a bundle of X.509 certificates of public Certificate Authorities
7
  ## (CA). These were automatically extracted from Mozilla's root certificates
14
  ## Just configure this file as the SSLCACertificateFile.
15
  ##
16
  ## Conversion done with mk-ca-bundle.pl version 1.27.
17
+ ## SHA256: 704f02707ec6b4c4a7597a8c6039b020def11e64f3ef0605a9c3543d48038a57
18
  ##
19
 
20
 
283
  398znM/jra6O1I7mT1GvFpLgXPYHDw==
284
  -----END CERTIFICATE-----
285
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
286
  Comodo AAA Services root
287
  ========================
288
  -----BEGIN CERTIFICATE-----
446
  llpwrN9M
447
  -----END CERTIFICATE-----
448
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
449
  XRamp Global CA Root
450
  ====================
451
  -----BEGIN CERTIFICATE-----
518
  QBFGmh95DmK/D5fs4C8fF5Q=
519
  -----END CERTIFICATE-----
520
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
521
  Taiwan GRCA
522
  ===========
523
  -----BEGIN CERTIFICATE-----
656
  fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
657
  -----END CERTIFICATE-----
658
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
659
  SwissSign Gold CA - G2
660
  ======================
661
  -----BEGIN CERTIFICATE-----
898
  U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
899
  -----END CERTIFICATE-----
900
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
901
  OISTE WISeKey Global Root GA CA
902
  ===============================
903
  -----BEGIN CERTIFICATE-----
1018
  BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
1019
  -----END CERTIFICATE-----
1020
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1021
  certSIGN ROOT CA
1022
  ================
1023
  -----BEGIN CERTIFICATE-----
1265
  lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
1266
  -----END CERTIFICATE-----
1267
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1268
  Microsec e-Szigno Root CA 2009
1269
  ==============================
1270
  -----BEGIN CERTIFICATE-----
1625
  03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
1626
  -----END CERTIFICATE-----
1627
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1628
  TWCA Root Certification Authority
1629
  =================================
1630
  -----BEGIN CERTIFICATE-----
1773
  iB6XzCGcKQENZetX2fNXlrtIzYE=
1774
  -----END CERTIFICATE-----
1775
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1776
  Buypass Class 2 Root CA
1777
  =======================
1778
  -----BEGIN CERTIFICATE-----
1879
  dcGWxZ0=
1880
  -----END CERTIFICATE-----
1881
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1882
  D-TRUST Root Class 3 CA 2 2009
1883
  ==============================
1884
  -----BEGIN CERTIFICATE-----
1928
  w9y4AyHqnxbxLFS1
1929
  -----END CERTIFICATE-----
1930
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1931
  CA Disig Root R2
1932
  ================
1933
  -----BEGIN CERTIFICATE-----
2331
  82Z+
2332
  -----END CERTIFICATE-----
2333
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2334
  COMODO RSA Certification Authority
2335
  ==================================
2336
  -----BEGIN CERTIFICATE-----
2712
  Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
2713
  -----END CERTIFICATE-----
2714
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2715
  SZAFIR ROOT CA2
2716
  ===============
2717
  -----BEGIN CERTIFICATE-----
3127
  e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j
3128
  q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM=
3129
  -----END CERTIFICATE-----
3130
+
3131
+ GDCA TrustAUTH R5 ROOT
3132
+ ======================
3133
+ -----BEGIN CERTIFICATE-----
3134
+ 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
3159
+ -----END CERTIFICATE-----
3160
+
3161
+ TrustCor RootCert CA-1
3162
+ ======================
3163
+ -----BEGIN CERTIFICATE-----
3164
+ MIIEMDCCAxigAwIBAgIJANqb7HHzA7AZMA0GCSqGSIb3DQEBCwUAMIGkMQswCQYDVQQGEwJQQTEP
3165
+ MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
3166
+ U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
3167
+ dHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0IENBLTEwHhcNMTYwMjA0MTIzMjE2WhcNMjkx
3168
+ MjMxMTcyMzE2WjCBpDELMAkGA1UEBhMCUEExDzANBgNVBAgMBlBhbmFtYTEUMBIGA1UEBwwLUGFu
3169
+ YW1hIENpdHkxJDAiBgNVBAoMG1RydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLjEnMCUGA1UECwwe
3170
+ VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MR8wHQYDVQQDDBZUcnVzdENvciBSb290Q2Vy
3171
+ dCBDQS0xMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv463leLCJhJrMxnHQFgKq1mq
3172
+ jQCj/IDHUHuO1CAmujIS2CNUSSUQIpidRtLByZ5OGy4sDjjzGiVoHKZaBeYei0i/mJZ0PmnK6bV4
3173
+ pQa81QBeCQryJ3pS/C3Vseq0iWEk8xoT26nPUu0MJLq5nux+AHT6k61sKZKuUbS701e/s/OojZz0
3174
+ JEsq1pme9J7+wH5COucLlVPat2gOkEz7cD+PSiyU8ybdY2mplNgQTsVHCJCZGxdNuWxu72CVEY4h
3175
+ gLW9oHPY0LJ3xEXqWib7ZnZ2+AYfYW0PVcWDtxBWcgYHpfOxGgMFZA6dWorWhnAbJN7+KIor0Gqw
3176
+ /Hqi3LJ5DotlDwIDAQABo2MwYTAdBgNVHQ4EFgQU7mtJPHo/DeOxCbeKyKsZn3MzUOcwHwYDVR0j
3177
+ BBgwFoAU7mtJPHo/DeOxCbeKyKsZn3MzUOcwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
3178
+ AYYwDQYJKoZIhvcNAQELBQADggEBACUY1JGPE+6PHh0RU9otRCkZoB5rMZ5NDp6tPVxBb5UrJKF5
3179
+ mDo4Nvu7Zp5I/5CQ7z3UuJu0h3U/IJvOcs+hVcFNZKIZBqEHMwwLKeXx6quj7LUKdJDHfXLy11yf
3180
+ ke+Ri7fc7Waiz45mO7yfOgLgJ90WmMCV1Aqk5IGadZQ1nJBfiDcGrVmVCrDRZ9MZyonnMlo2HD6C
3181
+ qFqTvsbQZJG2z9m2GM/bftJlo6bEjhcxwft+dtvTheNYsnd6djtsL1Ac59v2Z3kf9YKVmgenFK+P
3182
+ 3CghZwnS1k1aHBkcjndcw5QkPTJrS37UeJSDvjdNzl/HHk484IkzlQsPpTLWPFp5LBk=
3183
+ -----END CERTIFICATE-----
3184
+
3185
+ TrustCor RootCert CA-2
3186
+ ======================
3187
+ -----BEGIN CERTIFICATE-----
3188
+ MIIGLzCCBBegAwIBAgIIJaHfyjPLWQIwDQYJKoZIhvcNAQELBQAwgaQxCzAJBgNVBAYTAlBBMQ8w
3189
+ DQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5MSQwIgYDVQQKDBtUcnVzdENvciBT
3190
+ eXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0
3191
+ eTEfMB0GA1UEAwwWVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMjAeFw0xNjAyMDQxMjMyMjNaFw0zNDEy
3192
+ MzExNzI2MzlaMIGkMQswCQYDVQQGEwJQQTEPMA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5h
3193
+ bWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5U
3194
+ cnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxHzAdBgNVBAMMFlRydXN0Q29yIFJvb3RDZXJ0
3195
+ IENBLTIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnIG7CKqJiJJWQdsg4foDSq8Gb
3196
+ ZQWU9MEKENUCrO2fk8eHyLAnK0IMPQo+QVqedd2NyuCb7GgypGmSaIwLgQ5WoD4a3SwlFIIvl9Nk
3197
+ RvRUqdw6VC0xK5mC8tkq1+9xALgxpL56JAfDQiDyitSSBBtlVkxs1Pu2YVpHI7TYabS3OtB0PAx1
3198
+ oYxOdqHp2yqlO/rOsP9+aij9JxzIsekp8VduZLTQwRVtDr4uDkbIXvRR/u8OYzo7cbrPb1nKDOOb
3199
+ XUm4TOJXsZiKQlecdu/vvdFoqNL0Cbt3Nb4lggjEFixEIFapRBF37120Hapeaz6LMvYHL1cEksr1
3200
+ /p3C6eizjkxLAjHZ5DxIgif3GIJ2SDpxsROhOdUuxTTCHWKF3wP+TfSvPd9cW436cOGlfifHhi5q
3201
+ jxLGhF5DUVCcGZt45vz27Ud+ez1m7xMTiF88oWP7+ayHNZ/zgp6kPwqcMWmLmaSISo5uZk3vFsQP
3202
+ eSghYA2FFn3XVDjxklb9tTNMg9zXEJ9L/cb4Qr26fHMC4P99zVvh1Kxhe1fVSntb1IVYJ12/+Ctg
3203
+ rKAmrhQhJ8Z3mjOAPF5GP/fDsaOGM8boXg25NSyqRsGFAnWAoOsk+xWq5Gd/bnc/9ASKL3x74xdh
3204
+ 8N0JqSDIvgmk0H5Ew7IwSjiqqewYmgeCK9u4nBit2uBGF6zPXQIDAQABo2MwYTAdBgNVHQ4EFgQU
3205
+ 2f4hQG6UnrybPZx9mCAZ5YwwYrIwHwYDVR0jBBgwFoAU2f4hQG6UnrybPZx9mCAZ5YwwYrIwDwYD
3206
+ VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQADggIBAJ5Fngw7tu/h
3207
+ Osh80QA9z+LqBrWyOrsGS2h60COXdKcs8AjYeVrXWoSK2BKaG9l9XE1wxaX5q+WjiYndAfrs3fnp
3208
+ kpfbsEZC89NiqpX+MWcUaViQCqoL7jcjx1BRtPV+nuN79+TMQjItSQzL/0kMmx40/W5ulop5A7Zv
3209
+ 2wnL/V9lFDfhOPXzYRZY5LVtDQsEGz9QLX+zx3oaFoBg+Iof6Rsqxvm6ARppv9JYx1RXCI/hOWB3
3210
+ S6xZhBqI8d3LT3jX5+EzLfzuQfogsL7L9ziUwOHQhQ+77Sxzq+3+knYaZH9bDTMJBzN7Bj8RpFxw
3211
+ PIXAz+OQqIN3+tvmxYxoZxBnpVIt8MSZj3+/0WvitUfW2dCFmU2Umw9Lje4AWkcdEQOsQRivh7dv
3212
+ DDqPys/cA8GiCcjl/YBeyGBCARsaU1q7N6a3vLqE6R5sGtRk2tRD/pOLS/IseRYQ1JMLiI+h2IYU
3213
+ RpFHmygk71dSTlxCnKr3Sewn6EAes6aJInKc9Q0ztFijMDvd1GpUk74aTfOTlPf8hAs/hCBcNANE
3214
+ xdqtvArBAs8e5ZTZ845b2EzwnexhF7sUMlQMAimTHpKG9n/v55IFDlndmQguLvqcAFLTxWYp5KeX
3215
+ RKQOKIETNcX2b2TmQcTVL8w0RSXPQQCWPUouwpaYT05KnJe32x+SMsj/D1Fu1uwJ
3216
+ -----END CERTIFICATE-----
3217
+
3218
+ TrustCor ECA-1
3219
+ ==============
3220
+ -----BEGIN CERTIFICATE-----
3221
+ MIIEIDCCAwigAwIBAgIJAISCLF8cYtBAMA0GCSqGSIb3DQEBCwUAMIGcMQswCQYDVQQGEwJQQTEP
3222
+ MA0GA1UECAwGUGFuYW1hMRQwEgYDVQQHDAtQYW5hbWEgQ2l0eTEkMCIGA1UECgwbVHJ1c3RDb3Ig
3223
+ U3lzdGVtcyBTLiBkZSBSLkwuMScwJQYDVQQLDB5UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3Jp
3224
+ dHkxFzAVBgNVBAMMDlRydXN0Q29yIEVDQS0xMB4XDTE2MDIwNDEyMzIzM1oXDTI5MTIzMTE3Mjgw
3225
+ N1owgZwxCzAJBgNVBAYTAlBBMQ8wDQYDVQQIDAZQYW5hbWExFDASBgNVBAcMC1BhbmFtYSBDaXR5
3226
+ MSQwIgYDVQQKDBtUcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4xJzAlBgNVBAsMHlRydXN0Q29y
3227
+ IENlcnRpZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAwwOVHJ1c3RDb3IgRUNBLTEwggEiMA0GCSqG
3228
+ SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDPj+ARtZ+odnbb3w9U73NjKYKtR8aja+3+XzP4Q1HpGjOR
3229
+ MRegdMTUpwHmspI+ap3tDvl0mEDTPwOABoJA6LHip1GnHYMma6ve+heRK9jGrB6xnhkB1Zem6g23
3230
+ xFUfJ3zSCNV2HykVh0A53ThFEXXQmqc04L/NyFIduUd+Dbi7xgz2c1cWWn5DkR9VOsZtRASqnKmc
3231
+ p0yJF4OuowReUoCLHhIlERnXDH19MURB6tuvsBzvgdAsxZohmz3tQjtQJvLsznFhBmIhVE5/wZ0+
3232
+ fyCMgMsq2JdiyIMzkX2woloPV+g7zPIlstR8L+xNxqE6FXrntl019fZISjZFZtS6mFjBAgMBAAGj
3233
+ YzBhMB0GA1UdDgQWBBREnkj1zG1I1KBLf/5ZJC+Dl5mahjAfBgNVHSMEGDAWgBREnkj1zG1I1KBL
3234
+ f/5ZJC+Dl5mahjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
3235
+ AAOCAQEABT41XBVwm8nHc2FvcivUwo/yQ10CzsSUuZQRg2dd4mdsdXa/uwyqNsatR5Nj3B5+1t4u
3236
+ /ukZMjgDfxT2AHMsWbEhBuH7rBiVDKP/mZb3Kyeb1STMHd3BOuCYRLDE5D53sXOpZCz2HAF8P11F
3237
+ hcCF5yWPldwX8zyfGm6wyuMdKulMY/okYWLW2n62HGz1Ah3UKt1VkOsqEUc8Ll50soIipX1TH0Xs
3238
+ J5F95yIW6MBoNtjG8U+ARDL54dHRHareqKucBK+tIA5kmE2la8BIWJZpTdwHjFGTot+fDz2LYLSC
3239
+ jaoITmJF4PkL0uDgPFveXHEnJcLmA4GLEFPjx1WitJ/X5g==
3240
+ -----END CERTIFICATE-----
3241
+
3242
+ SSL.com Root Certification Authority RSA
3243
+ ========================================
3244
+ -----BEGIN CERTIFICATE-----
3245
+ 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
3271
+ WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k=
3272
+ -----END CERTIFICATE-----
3273
+
3274
+ SSL.com Root Certification Authority ECC
3275
+ ========================================
3276
+ -----BEGIN CERTIFICATE-----
3277
+ MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV
3278
+ BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv
3279
+ BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy
3280
+ MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO
3281
+ BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv
3282
+ bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
3283
+ BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+
3284
+ 8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR
3285
+ hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT
3286
+ jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW
3287
+ e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z
3288
+ 5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl
3289
+ -----END CERTIFICATE-----
3290
+
3291
+ SSL.com EV Root Certification Authority RSA R2
3292
+ ==============================================
3293
+ -----BEGIN CERTIFICATE-----
3294
+ MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w
3295
+ DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u
3296
+ MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy
3297
+ MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI
3298
+ DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD
3299
+ VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN
3300
+ BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh
3301
+ hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w
3302
+ cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO
3303
+ Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+
3304
+ B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh
3305
+ CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim
3306
+ 9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto
3307
+ RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm
3308
+ JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48
3309
+ +qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV
3310
+ HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp
3311
+ qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1
3312
+ ++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx
3313
+ Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G
3314
+ guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz
3315
+ OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7
3316
+ CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq
3317
+ lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR
3318
+ rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1
3319
+ hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX
3320
+ 9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w==
3321
+ -----END CERTIFICATE-----
3322
+
3323
+ SSL.com EV Root Certification Authority ECC
3324
+ ===========================================
3325
+ -----BEGIN CERTIFICATE-----
3326
+ MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV
3327
+ BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy
3328
+ BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw
3329
+ MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx
3330
+ EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM
3331
+ LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB
3332
+ BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy
3333
+ 3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O
3334
+ BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe
3335
+ 5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ
3336
+ N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm
3337
+ m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg==
3338
+ -----END CERTIFICATE-----
vendor/composer/installed.json CHANGED
@@ -1,17 +1,17 @@
1
  [
2
  {
3
  "name": "maxmind/web-service-common",
4
- "version": "v0.4.0",
5
- "version_normalized": "0.4.0.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/maxmind/web-service-common-php.git",
9
- "reference": "622f7c732a7f9c4c62497fc103939e042b6bdb88"
10
  },
11
  "dist": {
12
  "type": "zip",
13
- "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/622f7c732a7f9c4c62497fc103939e042b6bdb88",
14
- "reference": "622f7c732a7f9c4c62497fc103939e042b6bdb88",
15
  "shasum": ""
16
  },
17
  "require": {
@@ -25,7 +25,7 @@
25
  "phpunit/phpunit": "4.*",
26
  "squizlabs/php_codesniffer": "3.*"
27
  },
28
- "time": "2017-07-06T17:48:21+00:00",
29
  "type": "library",
30
  "installation-source": "dist",
31
  "autoload": {
@@ -49,17 +49,17 @@
49
  },
50
  {
51
  "name": "maxmind-db/reader",
52
- "version": "v1.2.0",
53
- "version_normalized": "1.2.0.0",
54
  "source": {
55
  "type": "git",
56
  "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
57
- "reference": "1647820dfbcb552222fb5feb3a8387e2636394c9"
58
  },
59
  "dist": {
60
  "type": "zip",
61
- "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/1647820dfbcb552222fb5feb3a8387e2636394c9",
62
- "reference": "1647820dfbcb552222fb5feb3a8387e2636394c9",
63
  "shasum": ""
64
  },
65
  "require": {
@@ -67,7 +67,7 @@
67
  },
68
  "require-dev": {
69
  "friendsofphp/php-cs-fixer": "2.*",
70
- "phpunit/phpunit": "4.*",
71
  "satooshi/php-coveralls": "1.0.*",
72
  "squizlabs/php_codesniffer": "3.*"
73
  },
@@ -76,7 +76,7 @@
76
  "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
77
  "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
78
  },
79
- "time": "2017-10-27T19:15:33+00:00",
80
  "type": "library",
81
  "installation-source": "dist",
82
  "autoload": {
@@ -106,116 +106,115 @@
106
  ]
107
  },
108
  {
109
- "name": "geoip2/geoip2",
110
- "version": "v2.7.0",
111
- "version_normalized": "2.7.0.0",
112
  "source": {
113
  "type": "git",
114
- "url": "https://github.com/maxmind/GeoIP2-php.git",
115
- "reference": "ca9f9a244474d97eac1ef542aaced7cc944bafbe"
116
  },
117
  "dist": {
118
  "type": "zip",
119
- "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/ca9f9a244474d97eac1ef542aaced7cc944bafbe",
120
- "reference": "ca9f9a244474d97eac1ef542aaced7cc944bafbe",
121
  "shasum": ""
122
  },
123
  "require": {
124
- "maxmind-db/reader": "~1.0",
125
- "maxmind/web-service-common": "~0.4",
126
- "php": ">=5.4"
127
  },
128
  "require-dev": {
129
- "apigen/apigen": "*",
130
- "friendsofphp/php-cs-fixer": "2.*",
131
- "phpunit/phpunit": "4.*",
132
- "squizlabs/php_codesniffer": "3.*"
133
  },
134
- "time": "2017-10-27T19:20:22+00:00",
135
  "type": "library",
 
 
 
 
 
136
  "installation-source": "dist",
137
  "autoload": {
138
  "psr-4": {
139
- "GeoIp2\\": "src"
140
  }
141
  },
142
  "notification-url": "https://packagist.org/downloads/",
143
  "license": [
144
- "Apache-2.0"
145
  ],
146
  "authors": [
147
  {
148
- "name": "Gregory J. Oschwald",
149
- "email": "goschwald@maxmind.com",
150
- "homepage": "http://www.maxmind.com/"
151
  }
152
  ],
153
- "description": "MaxMind GeoIP2 PHP API",
154
- "homepage": "https://github.com/maxmind/GeoIP2-php",
155
  "keywords": [
156
- "IP",
157
- "geoip",
158
- "geoip2",
159
- "geolocation",
160
- "maxmind"
161
  ]
162
  },
163
  {
164
- "name": "composer/ca-bundle",
165
- "version": "1.1.0",
166
- "version_normalized": "1.1.0.0",
167
  "source": {
168
  "type": "git",
169
- "url": "https://github.com/composer/ca-bundle.git",
170
- "reference": "943b2c4fcad1ef178d16a713c2468bf7e579c288"
171
  },
172
  "dist": {
173
  "type": "zip",
174
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/943b2c4fcad1ef178d16a713c2468bf7e579c288",
175
- "reference": "943b2c4fcad1ef178d16a713c2468bf7e579c288",
176
  "shasum": ""
177
  },
178
  "require": {
179
- "ext-openssl": "*",
180
- "ext-pcre": "*",
181
- "php": "^5.3.2 || ^7.0"
182
  },
183
  "require-dev": {
184
- "phpunit/phpunit": "^4.8.35",
185
- "psr/log": "^1.0",
186
- "symfony/process": "^2.5 || ^3.0 || ^4.0"
187
  },
188
- "time": "2017-11-29T09:37:33+00:00",
189
  "type": "library",
190
- "extra": {
191
- "branch-alias": {
192
- "dev-master": "1.x-dev"
193
- }
194
- },
195
  "installation-source": "dist",
196
  "autoload": {
197
  "psr-4": {
198
- "Composer\\CaBundle\\": "src"
199
  }
200
  },
201
  "notification-url": "https://packagist.org/downloads/",
202
  "license": [
203
- "MIT"
204
  ],
205
  "authors": [
206
  {
207
- "name": "Jordi Boggiano",
208
- "email": "j.boggiano@seld.be",
209
- "homepage": "http://seld.be"
210
  }
211
  ],
212
- "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
 
213
  "keywords": [
214
- "cabundle",
215
- "cacert",
216
- "certificate",
217
- "ssl",
218
- "tls"
219
  ]
220
  }
221
  ]
1
  [
2
  {
3
  "name": "maxmind/web-service-common",
4
+ "version": "v0.5.0",
5
+ "version_normalized": "0.5.0.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/maxmind/web-service-common-php.git",
9
+ "reference": "61a9836fa3bb1743ab89752bae5005d71e78c73b"
10
  },
11
  "dist": {
12
  "type": "zip",
13
+ "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/61a9836fa3bb1743ab89752bae5005d71e78c73b",
14
+ "reference": "61a9836fa3bb1743ab89752bae5005d71e78c73b",
15
  "shasum": ""
16
  },
17
  "require": {
25
  "phpunit/phpunit": "4.*",
26
  "squizlabs/php_codesniffer": "3.*"
27
  },
28
+ "time": "2018-02-12T22:31:54+00:00",
29
  "type": "library",
30
  "installation-source": "dist",
31
  "autoload": {
49
  },
50
  {
51
  "name": "maxmind-db/reader",
52
+ "version": "v1.3.0",
53
+ "version_normalized": "1.3.0.0",
54
  "source": {
55
  "type": "git",
56
  "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
57
+ "reference": "e042b4f8a2dff41e19019faf16427178b07fbd58"
58
  },
59
  "dist": {
60
  "type": "zip",
61
+ "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/e042b4f8a2dff41e19019faf16427178b07fbd58",
62
+ "reference": "e042b4f8a2dff41e19019faf16427178b07fbd58",
63
  "shasum": ""
64
  },
65
  "require": {
67
  },
68
  "require-dev": {
69
  "friendsofphp/php-cs-fixer": "2.*",
70
+ "phpunit/phpunit": "4.* || 5.*",
71
  "satooshi/php-coveralls": "1.0.*",
72
  "squizlabs/php_codesniffer": "3.*"
73
  },
76
  "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
77
  "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
78
  },
79
+ "time": "2018-02-21T21:23:33+00:00",
80
  "type": "library",
81
  "installation-source": "dist",
82
  "autoload": {
106
  ]
107
  },
108
  {
109
+ "name": "composer/ca-bundle",
110
+ "version": "1.1.1",
111
+ "version_normalized": "1.1.1.0",
112
  "source": {
113
  "type": "git",
114
+ "url": "https://github.com/composer/ca-bundle.git",
115
+ "reference": "d2c0a83b7533d6912e8d516756ebd34f893e9169"
116
  },
117
  "dist": {
118
  "type": "zip",
119
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/d2c0a83b7533d6912e8d516756ebd34f893e9169",
120
+ "reference": "d2c0a83b7533d6912e8d516756ebd34f893e9169",
121
  "shasum": ""
122
  },
123
  "require": {
124
+ "ext-openssl": "*",
125
+ "ext-pcre": "*",
126
+ "php": "^5.3.2 || ^7.0"
127
  },
128
  "require-dev": {
129
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5",
130
+ "psr/log": "^1.0",
131
+ "symfony/process": "^2.5 || ^3.0 || ^4.0"
 
132
  },
133
+ "time": "2018-03-29T19:57:20+00:00",
134
  "type": "library",
135
+ "extra": {
136
+ "branch-alias": {
137
+ "dev-master": "1.x-dev"
138
+ }
139
+ },
140
  "installation-source": "dist",
141
  "autoload": {
142
  "psr-4": {
143
+ "Composer\\CaBundle\\": "src"
144
  }
145
  },
146
  "notification-url": "https://packagist.org/downloads/",
147
  "license": [
148
+ "MIT"
149
  ],
150
  "authors": [
151
  {
152
+ "name": "Jordi Boggiano",
153
+ "email": "j.boggiano@seld.be",
154
+ "homepage": "http://seld.be"
155
  }
156
  ],
157
+ "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
 
158
  "keywords": [
159
+ "cabundle",
160
+ "cacert",
161
+ "certificate",
162
+ "ssl",
163
+ "tls"
164
  ]
165
  },
166
  {
167
+ "name": "geoip2/geoip2",
168
+ "version": "v2.9.0",
169
+ "version_normalized": "2.9.0.0",
170
  "source": {
171
  "type": "git",
172
+ "url": "https://github.com/maxmind/GeoIP2-php.git",
173
+ "reference": "a807fbf65212eef5d8d2db1a1b31082b53633d77"
174
  },
175
  "dist": {
176
  "type": "zip",
177
+ "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/a807fbf65212eef5d8d2db1a1b31082b53633d77",
178
+ "reference": "a807fbf65212eef5d8d2db1a1b31082b53633d77",
179
  "shasum": ""
180
  },
181
  "require": {
182
+ "maxmind-db/reader": "~1.0",
183
+ "maxmind/web-service-common": "~0.5",
184
+ "php": ">=5.4"
185
  },
186
  "require-dev": {
187
+ "friendsofphp/php-cs-fixer": "2.*",
188
+ "phpunit/phpunit": "4.*",
189
+ "squizlabs/php_codesniffer": "3.*"
190
  },
191
+ "time": "2018-04-10T15:32:59+00:00",
192
  "type": "library",
 
 
 
 
 
193
  "installation-source": "dist",
194
  "autoload": {
195
  "psr-4": {
196
+ "GeoIp2\\": "src"
197
  }
198
  },
199
  "notification-url": "https://packagist.org/downloads/",
200
  "license": [
201
+ "Apache-2.0"
202
  ],
203
  "authors": [
204
  {
205
+ "name": "Gregory J. Oschwald",
206
+ "email": "goschwald@maxmind.com",
207
+ "homepage": "http://www.maxmind.com/"
208
  }
209
  ],
210
+ "description": "MaxMind GeoIP2 PHP API",
211
+ "homepage": "https://github.com/maxmind/GeoIP2-php",
212
  "keywords": [
213
+ "IP",
214
+ "geoip",
215
+ "geoip2",
216
+ "geolocation",
217
+ "maxmind"
218
  ]
219
  }
220
  ]
vendor/geoip2/geoip2/.php_cs CHANGED
@@ -9,6 +9,7 @@ return PhpCsFixer\Config::create()
9
  'combine_consecutive_unsets' => true,
10
  'concat_space' => [ 'spacing' => 'one'],
11
  'heredoc_to_nowdoc' => true,
 
12
  'list_syntax' => ['syntax' => 'long'],
13
  'no_extra_consecutive_blank_lines' => ['break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block'],
14
  'no_short_echo_tag' => true,
9
  'combine_consecutive_unsets' => true,
10
  'concat_space' => [ 'spacing' => 'one'],
11
  'heredoc_to_nowdoc' => true,
12
+ 'increment_style' => false,
13
  'list_syntax' => ['syntax' => 'long'],
14
  'no_extra_consecutive_blank_lines' => ['break', 'continue', 'extra', 'return', 'throw', 'use', 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block'],
15
  'no_short_echo_tag' => true,
vendor/geoip2/geoip2/CHANGELOG.md CHANGED
@@ -1,6 +1,18 @@
1
  CHANGELOG
2
  =========
3
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  2.7.0 (2017-10-27)
5
  ------------------
6
 
1
  CHANGELOG
2
  =========
3
 
4
+ 2.9.0 (2018-04-10)
5
+ ------------------
6
+
7
+ * Refer to account IDs using the terminology "account" rather than "user".
8
+
9
+ 2.8.0 (2018-01-18)
10
+ ------------------
11
+
12
+ * The `isInEuropeanUnion` property was added to `GeoIp2\Record\Country`
13
+ and `GeoIp2\Record\RepresentedCountry`. This property is `true` if the
14
+ country is a member state of the European Union.
15
+
16
  2.7.0 (2017-10-27)
17
  ------------------
18
 
vendor/geoip2/geoip2/README.md CHANGED
@@ -257,7 +257,7 @@ print($record->ipAddress . "\n"); // '128.101.101.101'
257
  ### Usage ###
258
 
259
  To use this API, you must create a new `\GeoIp2\WebService\Client`
260
- object with your `$userId` and `$licenseKey`, then you call the method
261
  corresponding to a specific end point, passing it the IP address you want to
262
  look up.
263
 
@@ -277,7 +277,7 @@ require_once 'vendor/autoload.php';
277
  use GeoIp2\WebService\Client;
278
 
279
  // This creates a Client object that can be reused across requests.
280
- // Replace "42" with your user ID and "license_key" with your license
281
  // key.
282
  $client = new Client(42, 'abcdef123456');
283
 
@@ -395,7 +395,7 @@ The GeoIP2 PHP API uses [Semantic Versioning](http://semver.org/).
395
 
396
  ## Copyright and License ##
397
 
398
- This software is Copyright (c) 2013-2017 by MaxMind, Inc.
399
 
400
  This is free software, licensed under the Apache License, Version 2.0.
401
 
257
  ### Usage ###
258
 
259
  To use this API, you must create a new `\GeoIp2\WebService\Client`
260
+ object with your `$accountId` and `$licenseKey`, then you call the method
261
  corresponding to a specific end point, passing it the IP address you want to
262
  look up.
263
 
277
  use GeoIp2\WebService\Client;
278
 
279
  // This creates a Client object that can be reused across requests.
280
+ // Replace "42" with your account ID and "license_key" with your license
281
  // key.
282
  $client = new Client(42, 'abcdef123456');
283
 
395
 
396
  ## Copyright and License ##
397
 
398
+ This software is Copyright (c) 2013-2018 by MaxMind, Inc.
399
 
400
  This is free software, licensed under the Apache License, Version 2.0.
401
 
vendor/geoip2/geoip2/composer.json CHANGED
@@ -14,14 +14,13 @@
14
  ],
15
  "require": {
16
  "maxmind-db/reader": "~1.0",
17
- "maxmind/web-service-common": "~0.4",
18
  "php": ">=5.4"
19
  },
20
  "require-dev": {
21
  "friendsofphp/php-cs-fixer": "2.*",
22
  "phpunit/phpunit": "4.*",
23
- "squizlabs/php_codesniffer": "3.*",
24
- "apigen/apigen": "*"
25
  },
26
  "autoload": {
27
  "psr-4": {
14
  ],
15
  "require": {
16
  "maxmind-db/reader": "~1.0",
17
+ "maxmind/web-service-common": "~0.5",
18
  "php": ">=5.4"
19
  },
20
  "require-dev": {
21
  "friendsofphp/php-cs-fixer": "2.*",
22
  "phpunit/phpunit": "4.*",
23
+ "squizlabs/php_codesniffer": "3.*"
 
24
  },
25
  "autoload": {
26
  "psr-4": {
vendor/geoip2/geoip2/src/Record/Country.php CHANGED
@@ -11,7 +11,10 @@ namespace GeoIp2\Record;
11
  * confidence that the country is correct. This attribute is only available
12
  * from the Insights service and the GeoIP2 Enterprise database.
13
  * @property-read int|null $geonameId The GeoName ID for the country. This
14
- * attribute is returned by location services and databases.
 
 
 
15
  * @property-read string|null $isoCode The
16
  * {@link * http://en.wikipedia.org/wiki/ISO_3166-1 two-character ISO 3166-1 alpha
17
  * code} for the country. This attribute is returned by all location services
@@ -31,6 +34,7 @@ class Country extends AbstractPlaceRecord
31
  protected $validAttributes = [
32
  'confidence',
33
  'geonameId',
 
34
  'isoCode',
35
  'names',
36
  ];
11
  * confidence that the country is correct. This attribute is only available
12
  * from the Insights service and the GeoIP2 Enterprise database.
13
  * @property-read int|null $geonameId The GeoName ID for the country. This
14
+ * attribute is returned by all location services and databases.
15
+ * @property-read bool $isInEuropeanUnion This is true if the country is a
16
+ * member state of the European Union. This attribute is returned by all
17
+ * location services and databases.
18
  * @property-read string|null $isoCode The
19
  * {@link * http://en.wikipedia.org/wiki/ISO_3166-1 two-character ISO 3166-1 alpha
20
  * code} for the country. This attribute is returned by all location services
34
  protected $validAttributes = [
35
  'confidence',
36
  'geonameId',
37
+ 'isInEuropeanUnion',
38
  'isoCode',
39
  'names',
40
  ];
vendor/geoip2/geoip2/src/Record/RepresentedCountry.php CHANGED
@@ -13,6 +13,9 @@ namespace GeoIp2\Record;
13
  * confidence that the country is correct. This attribute is only available
14
  * from the Insights service and the GeoIP2 Enterprise database.
15
  * @property-read int|null $geonameId The GeoName ID for the country.
 
 
 
16
  * @property-read string|null $isoCode The {@link http://en.wikipedia.org/wiki/ISO_3166-1
17
  * two-character ISO 3166-1 alpha code} for the country.
18
  * @property-read string|null $name The name of the country based on the locales list
@@ -28,6 +31,7 @@ class RepresentedCountry extends Country
28
  protected $validAttributes = [
29
  'confidence',
30
  'geonameId',
 
31
  'isoCode',
32
  'names',
33
  'type',
13
  * confidence that the country is correct. This attribute is only available
14
  * from the Insights service and the GeoIP2 Enterprise database.
15
  * @property-read int|null $geonameId The GeoName ID for the country.
16
+ * @property-read bool $isInEuropeanUnion This is true if the country is a
17
+ * member state of the European Union. This attribute is returned by all
18
+ * location services and databases.
19
  * @property-read string|null $isoCode The {@link http://en.wikipedia.org/wiki/ISO_3166-1
20
  * two-character ISO 3166-1 alpha code} for the country.
21
  * @property-read string|null $name The name of the country based on the locales list
31
  protected $validAttributes = [
32
  'confidence',
33
  'geonameId',
34
+ 'isInEuropeanUnion',
35
  'isoCode',
36
  'names',
37
  'type',
vendor/geoip2/geoip2/src/WebService/Client.php CHANGED
@@ -30,7 +30,7 @@ use MaxMind\WebService\Client as WsClient;
30
  * ## Usage ##
31
  *
32
  * The basic API for this class is the same for all of the web service end
33
- * points. First you create a web service object with your MaxMind `$userId`
34
  * and `$licenseKey`, then you call the method corresponding to a specific end
35
  * point, passing it the IP address you want to look up.
36
  *
@@ -47,12 +47,12 @@ class Client implements ProviderInterface
47
  private $client;
48
  private static $basePath = '/geoip/v2.1';
49
 
50
- const VERSION = 'v2.7.0';
51
 
52
  /**
53
  * Constructor.
54
  *
55
- * @param int $userId your MaxMind user ID
56
  * @param string $licenseKey your MaxMind license key
57
  * @param array $locales list of locale codes to use in name property
58
  * from most preferred to least preferred
@@ -65,7 +65,7 @@ class Client implements ProviderInterface
65
  * `http://username:password@127.0.0.1:10`.
66
  */
67
  public function __construct(
68
- $userId,
69
  $licenseKey,
70
  $locales = ['en'],
71
  $options = []
@@ -84,7 +84,7 @@ class Client implements ProviderInterface
84
 
85
  $options['userAgent'] = $this->userAgent();
86
 
87
- $this->client = new WsClient($userId, $licenseKey, $options);
88
  }
89
 
90
  private function userAgent()
@@ -102,7 +102,7 @@ class Client implements ProviderInterface
102
  * @throws \GeoIp2\Exception\AddressNotFoundException if the address you
103
  * provided is not in our database (e.g., a private address).
104
  * @throws \GeoIp2\Exception\AuthenticationException if there is a problem
105
- * with the user ID or license key that you provided
106
  * @throws \GeoIp2\Exception\OutOfQueriesException if your account is out
107
  * of queries
108
  * @throws \GeoIp2\Exception\InvalidRequestException} if your request was received by the web service but is
@@ -133,7 +133,7 @@ class Client implements ProviderInterface
133
  * @throws \GeoIp2\Exception\AddressNotFoundException if the address you provided is not in our database (e.g.,
134
  * a private address).
135
  * @throws \GeoIp2\Exception\AuthenticationException if there is a problem
136
- * with the user ID or license key that you provided
137
  * @throws \GeoIp2\Exception\OutOfQueriesException if your account is out of queries
138
  * @throws \GeoIp2\Exception\InvalidRequestException} if your request was received by the web service but is
139
  * invalid for some other reason. This may indicate an
@@ -164,7 +164,7 @@ class Client implements ProviderInterface
164
  * @throws \GeoIp2\Exception\AddressNotFoundException if the address you
165
  * provided is not in our database (e.g., a private address).
166
  * @throws \GeoIp2\Exception\AuthenticationException if there is a problem
167
- * with the user ID or license key that you provided
168
  * @throws \GeoIp2\Exception\OutOfQueriesException if your account is out
169
  * of queries
170
  * @throws \GeoIp2\Exception\InvalidRequestException} if your request was received by the web service but is
30
  * ## Usage ##
31
  *
32
  * The basic API for this class is the same for all of the web service end
33
+ * points. First you create a web service object with your MaxMind `$accountId`
34
  * and `$licenseKey`, then you call the method corresponding to a specific end
35
  * point, passing it the IP address you want to look up.
36
  *
47
  private $client;
48
  private static $basePath = '/geoip/v2.1';
49
 
50
+ const VERSION = 'v2.9.0';
51
 
52
  /**
53
  * Constructor.
54
  *
55
+ * @param int $accountId your MaxMind account ID
56
  * @param string $licenseKey your MaxMind license key
57
  * @param array $locales list of locale codes to use in name property
58
  * from most preferred to least preferred
65
  * `http://username:password@127.0.0.1:10`.
66
  */
67
  public function __construct(
68
+ $accountId,
69
  $licenseKey,
70
  $locales = ['en'],
71
  $options = []
84
 
85
  $options['userAgent'] = $this->userAgent();
86
 
87
+ $this->client = new WsClient($accountId, $licenseKey, $options);
88
  }
89
 
90
  private function userAgent()
102
  * @throws \GeoIp2\Exception\AddressNotFoundException if the address you
103
  * provided is not in our database (e.g., a private address).
104
  * @throws \GeoIp2\Exception\AuthenticationException if there is a problem
105
+ * with the account ID or license key that you provided
106
  * @throws \GeoIp2\Exception\OutOfQueriesException if your account is out
107
  * of queries
108
  * @throws \GeoIp2\Exception\InvalidRequestException} if your request was received by the web service but is
133
  * @throws \GeoIp2\Exception\AddressNotFoundException if the address you provided is not in our database (e.g.,
134
  * a private address).
135
  * @throws \GeoIp2\Exception\AuthenticationException if there is a problem
136
+ * with the account ID or license key that you provided
137
  * @throws \GeoIp2\Exception\OutOfQueriesException if your account is out of queries
138
  * @throws \GeoIp2\Exception\InvalidRequestException} if your request was received by the web service but is
139
  * invalid for some other reason. This may indicate an
164
  * @throws \GeoIp2\Exception\AddressNotFoundException if the address you
165
  * provided is not in our database (e.g., a private address).
166
  * @throws \GeoIp2\Exception\AuthenticationException if there is a problem
167
+ * with the account ID or license key that you provided
168
  * @throws \GeoIp2\Exception\OutOfQueriesException if your account is out
169
  * of queries
170
  * @throws \GeoIp2\Exception\InvalidRequestException} if your request was received by the web service but is
vendor/maxmind-db/reader/CHANGELOG.md CHANGED
@@ -1,10 +1,23 @@
1
  CHANGELOG
2
  =========
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  1.2.0 (2017-10-27)
5
  ------------------
6
 
7
- * PHP 5.4 is now required.
8
  * The `Reader` class for the `maxminddb` extension is no longer final.
9
  This was change to match the behavior of the pure PHP class.
10
  Reported and fixed by venyii. GitHub #52 & #54.
1
  CHANGELOG
2
  =========
3
 
4
+ 1.3.0 (2018-02-21)
5
+ ------------------
6
+
7
+ * IMPORTANT: The `maxminddb` extension now obeys `open_basedir`. If
8
+ `open_basedir` is set, you _must_ store the database within the
9
+ specified directory. Placing the file outside of this directory
10
+ will result in an exception. Please test your integration before
11
+ upgrading the extension. This does not affect the pure PHP
12
+ implementation, which has always had this restriction. Reported
13
+ by Benoît Burnichon. GitHub #61.
14
+ * A custom `autoload.php` file is provided for installations without
15
+ Composer. GitHub #56.
16
+
17
  1.2.0 (2017-10-27)
18
  ------------------
19
 
20
+ * PHP 5.4 or greater is now required.
21
  * The `Reader` class for the `maxminddb` extension is no longer final.
22
  This was change to match the behavior of the pure PHP class.
23
  Reported and fixed by venyii. GitHub #52 & #54.
vendor/maxmind-db/reader/README.md CHANGED
@@ -5,7 +5,7 @@
5
  This is the PHP API for reading MaxMind DB files. MaxMind DB is a binary file
6
  format that stores data indexed by IP address subnets (IPv4 or IPv6).
7
 
8
- ## Installation ##
9
 
10
  We recommend installing this package with [Composer](http://getcomposer.org/).
11
 
@@ -40,6 +40,23 @@ from your code:
40
  require 'vendor/autoload.php';
41
  ```
42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
  ## Usage ##
44
 
45
  ## Example ##
5
  This is the PHP API for reading MaxMind DB files. MaxMind DB is a binary file
6
  format that stores data indexed by IP address subnets (IPv4 or IPv6).
7
 
8
+ ## Installation (Composer) ##
9
 
10
  We recommend installing this package with [Composer](http://getcomposer.org/).
11
 
40
  require 'vendor/autoload.php';
41
  ```
42
 
43
+ ## Installation (Standalone) ##
44
+
45
+ If you don't want to use Composer for some reason, a custom
46
+ `autoload.php` is provided for you in the project root. To use the
47
+ library, simply include that file,
48
+
49
+ ```php
50
+ require('/path/to/MaxMind-DB-Reader-php/autoload.php');
51
+ ```
52
+
53
+ and then instantiate the reader class normally:
54
+
55
+ ```php
56
+ use MaxMind\Db\Reader;
57
+ $reader = new Reader('example.mmdb');
58
+ ```
59
+
60
  ## Usage ##
61
 
62
  ## Example ##
vendor/maxmind-db/reader/autoload.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * PSR-4 autoloader implementation for the MaxMind\DB namespace.
5
+ * First we define the 'mmdb_autoload' function, and then we register
6
+ * it with 'spl_autoload_register' so that PHP knows to use it.
7
+ */
8
+
9
+ /**
10
+ * Automatically include the file that defines <code>class</code>.
11
+ *
12
+ * @param string $class
13
+ * the name of the class to load
14
+ *
15
+ * @return void
16
+ */
17
+ function mmdb_autoload($class)
18
+ {
19
+ /*
20
+ * A project-specific mapping between the namespaces and where
21
+ * they're located. By convention, we include the trailing
22
+ * slashes. The one-element array here simply makes things easy
23
+ * to extend in the future if (for example) the test classes
24
+ * begin to use one another.
25
+ */
26
+ $namespace_map = array('MaxMind\\Db\\' => __DIR__ . '/src/MaxMind/Db/');
27
+
28
+ foreach ($namespace_map as $prefix => $dir)
29
+ {
30
+ /* First swap out the namespace prefix with a directory... */
31
+ $path = str_replace($prefix, $dir, $class);
32
+
33
+ /* replace the namespace separator with a directory separator... */
34
+ $path = str_replace('\\', '/', $path);
35
+
36
+ /* and finally, add the PHP file extension to the result. */
37
+ $path = $path . '.php';
38
+
39
+ /* $path should now contain the path to a PHP file defining $class */
40
+ @include $path;
41
+ }
42
+ }
43
+
44
+ spl_autoload_register('mmdb_autoload');
vendor/maxmind-db/reader/composer.json CHANGED
@@ -22,7 +22,7 @@
22
  },
23
  "require-dev": {
24
  "friendsofphp/php-cs-fixer": "2.*",
25
- "phpunit/phpunit": "4.*",
26
  "satooshi/php-coveralls": "1.0.*",
27
  "squizlabs/php_codesniffer": "3.*"
28
  },
22
  },
23
  "require-dev": {
24
  "friendsofphp/php-cs-fixer": "2.*",
25
+ "phpunit/phpunit": "4.* || 5.*",
26
  "satooshi/php-coveralls": "1.0.*",
27
  "squizlabs/php_codesniffer": "3.*"
28
  },
vendor/maxmind-db/reader/ext/maxminddb.c CHANGED
@@ -120,14 +120,14 @@ PHP_METHOD(MaxMind_Db_Reader, __construct){
120
  strsize_t name_len;
121
  zval * _this_zval = NULL;
122
 
123
- if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
124
  &_this_zval, maxminddb_ce, &db_file, &name_len) == FAILURE) {
125
  THROW_EXCEPTION("InvalidArgumentException",
126
  "The constructor takes exactly one argument.");
127
  return;
128
  }
129
 
130
- if (0 != access(db_file, R_OK)) {
131
  THROW_EXCEPTION("InvalidArgumentException",
132
  "The file \"%s\" does not exist or is not readable.",
133
  db_file);
@@ -155,7 +155,7 @@ PHP_METHOD(MaxMind_Db_Reader, get){
155
  strsize_t name_len;
156
  zval * _this_zval = NULL;
157
 
158
- if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
159
  &_this_zval, maxminddb_ce, &ip_address, &name_len) == FAILURE) {
160
  THROW_EXCEPTION("InvalidArgumentException",
161
  "Method takes exactly one argument.");
@@ -284,7 +284,7 @@ PHP_METHOD(MaxMind_Db_Reader, close){
284
  return;
285
  }
286
 
287
- maxminddb_obj *mmdb_obj =
288
  (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
289
 
290
  if (NULL == mmdb_obj->mmdb) {
120
  strsize_t name_len;
121
  zval * _this_zval = NULL;
122
 
123
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
124
  &_this_zval, maxminddb_ce, &db_file, &name_len) == FAILURE) {
125
  THROW_EXCEPTION("InvalidArgumentException",
126
  "The constructor takes exactly one argument.");
127
  return;
128
  }
129
 
130
+ if (0 != php_check_open_basedir(db_file TSRMLS_CC) || 0 != access(db_file, R_OK)) {
131
  THROW_EXCEPTION("InvalidArgumentException",
132
  "The file \"%s\" does not exist or is not readable.",
133
  db_file);
155
  strsize_t name_len;
156
  zval * _this_zval = NULL;
157
 
158
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
159
  &_this_zval, maxminddb_ce, &ip_address, &name_len) == FAILURE) {
160
  THROW_EXCEPTION("InvalidArgumentException",
161
  "Method takes exactly one argument.");
284
  return;
285
  }
286
 
287
+ maxminddb_obj *mmdb_obj =
288
  (maxminddb_obj *)Z_MAXMINDDB_P(getThis());
289
 
290
  if (NULL == mmdb_obj->mmdb) {
vendor/maxmind-db/reader/ext/php_maxminddb.h CHANGED
@@ -15,7 +15,7 @@
15
 
16
  #ifndef PHP_MAXMINDDB_H
17
  #define PHP_MAXMINDDB_H 1
18
- #define PHP_MAXMINDDB_VERSION "1.2.0"
19
  #define PHP_MAXMINDDB_EXTNAME "maxminddb"
20
 
21
  extern zend_module_entry maxminddb_module_entry;
15
 
16
  #ifndef PHP_MAXMINDDB_H
17
  #define PHP_MAXMINDDB_H 1
18
+ #define PHP_MAXMINDDB_VERSION "1.3.0"
19
  #define PHP_MAXMINDDB_EXTNAME "maxminddb"
20
 
21
  extern zend_module_entry maxminddb_module_entry;
vendor/maxmind-db/reader/ext/tests/003-open-basedir.phpt ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ --TEST--
2
+ openbase_dir is followed
3
+ --INI--
4
+ open_basedir=/--dne--
5
+ --FILE--
6
+ <?php
7
+ use MaxMind\Db\Reader;
8
+
9
+ $reader = new Reader('/usr/local/share/GeoIP/GeoIP2-City.mmdb');
10
+ ?>
11
+ --EXPECTREGEX--
12
+ .*open_basedir restriction in effect.*
vendor/maxmind/web-service-common/CHANGELOG.md CHANGED
@@ -1,7 +1,12 @@
1
  CHANGELOG
2
  =========
3
 
4
- 0.4.0 (2017-XX-XX)
 
 
 
 
 
5
  ------------------
6
 
7
  * PHP 5.4 is now required.
1
  CHANGELOG
2
  =========
3
 
4
+ 0.5.0 (2018-02-12)
5
+ ------------------
6
+
7
+ * Refer to account IDs using the terminology "account" rather than "user".
8
+
9
+ 0.4.0 (2017-07-10)
10
  ------------------
11
 
12
  * PHP 5.4 is now required.
vendor/maxmind/web-service-common/README.md CHANGED
@@ -1,7 +1,7 @@
1
- # MaxMind Web Service Common #
2
 
3
  This is _not_ intended for direct use by third parties. Rather, it is for
4
- shared code between MaxMind's various web service APIs.
5
 
6
  ## Requirements ##
7
 
@@ -21,6 +21,6 @@ This API uses [Semantic Versioning](http://semver.org/).
21
 
22
  ## Copyright and License ##
23
 
24
- This software is Copyright (c) 2015-2017 by MaxMind, Inc.
25
 
26
  This is free software, licensed under the Apache License, Version 2.0.
1
+ # Common Code for MaxMind Web Service Clients #
2
 
3
  This is _not_ intended for direct use by third parties. Rather, it is for
4
+ shared code between MaxMind's various web service client APIs.
5
 
6
  ## Requirements ##
7
 
21
 
22
  ## Copyright and License ##
23
 
24
+ This software is Copyright (c) 2015-2018 by MaxMind, Inc.
25
 
26
  This is free software, licensed under the Apache License, Version 2.0.
vendor/maxmind/web-service-common/dev-bin/release.sh ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ set -eu -o pipefail
4
+
5
+
6
+ changelog=$(cat CHANGELOG.md)
7
+
8
+ regex='
9
+ ([0-9]+\.[0-9]+\.[0-9]+) \(([0-9]{4}-[0-9]{2}-[0-9]{2})\)
10
+ -*
11
+
12
+ ((.|
13
+ )*)
14
+ '
15
+
16
+ if [[ ! $changelog =~ $regex ]]; then
17
+ echo "Could not find date line in change log!"
18
+ exit 1
19
+ fi
20
+
21
+ version="${BASH_REMATCH[1]}"
22
+ date="${BASH_REMATCH[2]}"
23
+ notes="$(echo "${BASH_REMATCH[3]}" | sed -n -e '/^[0-9]\+\.[0-9]\+\.[0-9]\+/,$!p')"
24
+
25
+ if [[ "$date" != $(date +"%Y-%m-%d") ]]; then
26
+ echo "$date is not today!"
27
+ exit 1
28
+ fi
29
+
30
+ tag="v$version"
31
+
32
+ if [ -n "$(git status --porcelain)" ]; then
33
+ echo ". is not clean." >&2
34
+ exit 1
35
+ fi
36
+
37
+ php composer.phar self-update
38
+ php composer.phar update
39
+
40
+ ./vendor/bin/phpunit
41
+
42
+ echo "Release notes for $tag:"
43
+ echo "$notes"
44
+
45
+ read -e -p "Commit changes and push to origin? " should_push
46
+
47
+ if [ "$should_push" != "y" ]; then
48
+ echo "Aborting"
49
+ exit 1
50
+ fi
51
+
52
+ git push
53
+
54
+ message="$version
55
+
56
+ $notes"
57
+
58
+ hub release create -m "$message" "$tag"
59
+
60
+ git push --tags
vendor/maxmind/web-service-common/src/WebService/Client.php CHANGED
@@ -32,10 +32,10 @@ class Client
32
  private $proxy;
33
  private $timeout;
34
  private $userAgentPrefix;
35
- private $userId;
36
 
37
  /**
38
- * @param int $userId your MaxMind user ID
39
  * @param string $licenseKey your MaxMind license key
40
  * @param array $options an array of options. Possible keys:
41
  * * `host` - The host to use when connecting to the web service.
@@ -47,11 +47,11 @@ class Client
47
  * username, and password, e.g., `http://username:password@127.0.0.1:10`.
48
  */
49
  public function __construct(
50
- $userId,
51
  $licenseKey,
52
  $options = []
53
  ) {
54
- $this->userId = $userId;
55
  $this->licenseKey = $licenseKey;
56
 
57
  $this->httpRequestFactory = isset($options['httpRequestFactory'])
@@ -152,7 +152,7 @@ class Client
152
  array_push(
153
  $headers,
154
  'Authorization: Basic '
155
- . base64_encode($this->userId . ':' . $this->licenseKey),
156
  'Accept: application/json'
157
  );
158
 
@@ -325,6 +325,8 @@ class Client
325
  $statusCode,
326
  $this->urlFor($path)
327
  );
 
 
328
  case 'AUTHORIZATION_INVALID':
329
  case 'LICENSE_KEY_REQUIRED':
330
  case 'USER_ID_REQUIRED':
32
  private $proxy;
33
  private $timeout;
34
  private $userAgentPrefix;
35
+ private $accountId;
36
 
37
  /**
38
+ * @param int $accountId your MaxMind account ID
39
  * @param string $licenseKey your MaxMind license key
40
  * @param array $options an array of options. Possible keys:
41
  * * `host` - The host to use when connecting to the web service.
47
  * username, and password, e.g., `http://username:password@127.0.0.1:10`.
48
  */
49
  public function __construct(
50
+ $accountId,
51
  $licenseKey,
52
  $options = []
53
  ) {
54
+ $this->accountId = $accountId;
55
  $this->licenseKey = $licenseKey;
56
 
57
  $this->httpRequestFactory = isset($options['httpRequestFactory'])
152
  array_push(
153
  $headers,
154
  'Authorization: Basic '
155
+ . base64_encode($this->accountId . ':' . $this->licenseKey),
156
  'Accept: application/json'
157
  );
158
 
325
  $statusCode,
326
  $this->urlFor($path)
327
  );
328
+ case 'ACCOUNT_ID_REQUIRED':
329
+ case 'ACCOUNT_ID_UNKNOWN':
330
  case 'AUTHORIZATION_INVALID':
331
  case 'LICENSE_KEY_REQUIRED':
332
  case 'USER_ID_REQUIRED':
views/client-ip.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="wrap geoip-detect-wrap">
2
+ <!-- This page cannot be translated yet, as I am not sure how it will look like in the long-term.
3
+ The goal is to have wizard helping to set all the relevant options semi-automatically. -->
4
+ <h1><?php _e('GeoIP Detection', 'geoip-detect');?> - Client IP Debug Panel</h1>
5
+ <p>
6
+ <a href="tools.php?page=<?php echo GEOIP_PLUGIN_BASENAME ?>"><?php _e('Test IP Detection Lookup', 'geoip-detect')?></a>
7
+ |
8
+ <a href="options-general.php?page=<?php echo GEOIP_PLUGIN_BASENAME ?>"><?php _e('Options', 'geoip-detect');?></a>
9
+ </p>
10
+ <pre>This debug panel is listing all relevant informations to debug when the detected client ip is wrong (in case of reverse proxies etc.)
11
+ Sometimes, there are proxies between your user and the wordpress server application (e.g. a <abbr title="Content Delivery Network: Amazon, Cloudflare, etc.">CDN</abbr>, reverse proxies).
12
+ This needs to be known to the plugin to choose the correct IP adress.
13
+ </pre>
14
+ <h2>Current IP informations (as detected by the plugin)</h2>
15
+ <p>
16
+ Detected client IP: <b><?php echo geoip_detect2_get_client_ip(); ?></b><br>
17
+ <span class="detail-box">This IP is used for detecting the geo-information of the user. It should be the same as the real client IP below.</span>
18
+ Real client IP (detected without the plugin): <b><span id="ajax_get_client_ip"><i>Detecting ...</i></span></b>
19
+ <span class="detail-box">This IP is detected within the browser, so reverse proxies of the server are not affected.<br></span>
20
+ External Server IP: <b><?php echo geoip_detect2_get_external_ip_adress(); ?></b><br>
21
+ <span class="detail-box">In some cases, the server is in the same network as the client (e.g. testing server). As the connection does not use Internet, this plugin uses the IP adress of the server as seen from the internet.<br>
22
+ For performance reasons, this IP is cached for <?php echo human_time_diff(0, GEOIP_DETECT_IP_CACHE_TIME); ?>.<br>
23
+ Also, for servers without internet access, this IP can be set in the options.
24
+ </span>
25
+ </p>
26
+ <p>
27
+ REMOTE_ADDR: <b><?php echo $_SERVER['REMOTE_ADDR']; ?></b><br>
28
+ <span class="detail-box">In server configurations without reverse proxy, this will equal to the "detected client IP". Otherwise, this is the IP of the reverse proxy.</span>
29
+ HTTP_X_FORWARDED_FOR: <b><?php echo isset($_SERVER["HTTP_X_FORWARDED_FOR"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : __('(unset)', 'geoip-detect'); ?></b><br>
30
+ <span class="detail-box">Reverse proxies usually add this header to indicate the original IP. If several IPs are given here (seperated by a comma), the correct user IP usually is the leftmost one.</span>
31
+ <?php if (isset($_SERVER["HTTP_X_FORWARDED_FOR"]) && !get_option('geoip-detect-has_reverse_proxy')): ?>
32
+ <i>(Probably you should enable the reverse proxy option.)</i>
33
+ <?php endif; ?>
34
+ </p>
35
+ <h3>Settings of the plugin</h3>
36
+ <ul>
37
+ <li>Use reverse proxy: <b><?php echo get_option('geoip-detect-has_reverse_proxy', 0) ? 'yes' : 'no' ?></b>
38
+ <span class="detail-box">Enable this option if REMOTE_ADDR is not the correct client IP.</span>
39
+ </li>
40
+
41
+ <li>Whitelist for known reverse proxies (optional if only one): <b><?php echo get_option('geoip-detect-trusted_proxy_ips') ?: '(none)'; ?></b>
42
+ <span class="detail-box">All IPs in HTTP_X_FORWARDED_FOR that are not the correct client IP are probably known reverse proxies.<br>(For security reasons, this is not assumed by default: maybe the reverse proxy is not of the server, but a Man-In-The-Middle-Attack ... not very probable but possible.)</span>
43
+ </li>
44
+ </ul>
45
+
46
+ <script>
47
+ jQuery.ajax(<?php echo json_encode(_geoip_detect2_get_external_ip_services(1, true)[0]); ?>, {
48
+ type: 'GET',
49
+ dataType: 'text',
50
+ }).done(function(ret) {
51
+ jQuery('#ajax_get_client_ip').text(ret);
52
+ }).fail(function(xhr, status, ret) {
53
+ jQuery('#ajax_get_client_ip').text('Failed: ' + status + ret);
54
+ });
55
+ </script>
56
+
57
+ <?php require(GEOIP_PLUGIN_DIR . '/views/footer.php'); ?>
58
+ </div>
views/footer.php CHANGED
@@ -9,9 +9,37 @@
9
  <p class="legal_notices">
10
  <?php _e('This product includes GeoLite2 data created by MaxMind, available from <a href="http://www.maxmind.com/">http://www.maxmind.com</a>.', 'geoip-detect'); ?>
11
  </p>
 
12
  <style>
13
  .legal_notices {
14
  font-size: 80%;
15
  font-style: italic;
16
  }
17
- </style>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  <p class="legal_notices">
10
  <?php _e('This product includes GeoLite2 data created by MaxMind, available from <a href="http://www.maxmind.com/">http://www.maxmind.com</a>.', 'geoip-detect'); ?>
11
  </p>
12
+
13
  <style>
14
  .legal_notices {
15
  font-size: 80%;
16
  font-style: italic;
17
  }
18
+ .geoip_detect_error {
19
+ display:block;
20
+ clear: both;
21
+ background-color: rgb(255, 255, 255);
22
+ border-left: rgb(255, 0, 0) solid 4px;
23
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
24
+ display: inline-block;
25
+ font-size: 14px;
26
+ line-height: 19px;
27
+ margin-bottom: 0;
28
+ margin-left: 2px;
29
+ margin-right: 20px;
30
+ margin-top: 25px;
31
+ padding-bottom: 11px;
32
+ padding-left: 15px;
33
+ padding-right: 15px;
34
+ padding-top: 11px;
35
+ text-align: left;
36
+ }
37
+ .detail-box {
38
+ display: block;
39
+ margin-left: 50px;
40
+ color: #777;
41
+ }
42
+ .geoip-detect-wrap select {
43
+ max-width: 100%;
44
+ }
45
+ </style>
views/lookup.php CHANGED
@@ -1,4 +1,4 @@
1
- <?php
2
  use YellowTree\GeoipDetect\DataSources\DataSourceRegistry;
3
  $date_format = get_option('date_format') . ' ' . get_option('time_format');
4
 
@@ -17,24 +17,31 @@ if ($shortcode_options) {
17
  ?>
18
  <div class="wrap geoip-detect-wrap">
19
  <h1><?php _e('GeoIP Detection', 'geoip-detect');?></h1>
20
- <a href="options-general.php?page=<?php echo GEOIP_PLUGIN_BASENAME ?>"><?php _e('Options', 'geoip-detect');?></a>
21
-
 
 
22
  <p>
23
  <?php printf(__('<b>Selected data source:</b> %s', 'geoip-detect'), geoip_detect2_get_current_source_description() ); ?>
24
  </p>
25
-
26
  <p>
27
  <?php echo $current_source->getStatusInformationHTML(); ?>
28
  <br />
29
  <br />
30
- </p>
31
-
 
 
 
 
 
32
  <h2><?php _e('Test IP Detection Lookup ', 'geoip-detect');?></h2>
33
  <form method="post" action="#">
34
  <?php wp_nonce_field( 'geoip_detect_lookup' ); ?>
35
  <input type="hidden" name="action" value="lookup" />
36
  <?php _e('IP', 'geoip-detect')?>: <input type="text" placeholder="<?php _e('Enter an IP (v4 or v6)', 'geoip-detect')?>" name="ip" value="<?php echo isset($_REQUEST['ip']) ? esc_attr($_REQUEST['ip']) : esc_attr(geoip_detect2_get_client_ip()); ?>" /><br />
37
- <label><?php _e('Use these locales:', 'geoip-detect'); ?>
38
  <select name="locales">
39
  <option value="" <?php if (empty($_POST['locales'])) echo 'selected="selected"'?>><?php _e('Default (Current site language, English otherwise)', 'geoip-detect')?></option>
40
  <option value="en" <?php if (!empty($_POST['locales']) && $_POST['locales'] == 'en') echo 'selected="selected"'?>><?php _e('English only', 'geoip-detect')?></option>
@@ -46,7 +53,7 @@ if ($shortcode_options) {
46
  </form>
47
  <?php if ($ip_lookup_result !== false) :
48
  if (is_object($ip_lookup_result)) :
49
- $record = $ip_lookup_result;
50
 
51
  ?>
52
  <h3><?php _e('Lookup Result', 'geoip-detect'); ?></h3>
@@ -57,20 +64,20 @@ if ($shortcode_options) {
57
  <br /><?php printf(__('(Served from cache. Was cached %s ago)', 'geoip-detect'), human_time_diff($record->extra->cached));?>
58
  <?php endif; ?>
59
  </p>
60
-
61
  <?php if ($record->extra->error) : ?>
62
  <p class="geoip_detect_error">
63
  <?php echo nl2br(esc_html($record->extra->error)); ?>
64
  </p>
65
  <?php endif; ?>
66
-
67
  <table>
68
  <tr>
69
  <th><?php _e('Key', 'geoip-detect'); ?></th>
70
  <th><?php _e('Value', 'geoip-detect'); ?></th>
71
  <th><?php _e('Shortcode equivalent', 'geoip-detect'); ?></th>
72
  </tr>
73
-
74
  <tr>
75
  <td><code>$record-&gt;city-&gt;name</code></td>
76
  <td><?php echo esc_html($record->city->name);?></td>
@@ -129,27 +136,4 @@ if ($shortcode_options) {
129
  <?php printf(__('See %s for more documentation.', 'geoip-detect'), '<a href="http://dev.maxmind.com/geoip/geoip2/web-services/" target="_blank">http://dev.maxmind.com/geoip/geoip2/web-services/</a>');?>
130
  </p>
131
  <?php require(GEOIP_PLUGIN_DIR . '/views/footer.php'); ?>
132
- </div>
133
- <style>
134
- .geoip-detect-wrap select {
135
- max-width: 100%;
136
- }
137
-
138
- .geoip_detect_error {
139
- background-color: rgb(255, 255, 255);
140
- border-left: rgb(255, 0, 0) solid 4px;
141
- box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
142
- display: inline-block;
143
- font-size: 14px;
144
- line-height: 19px;
145
- margin-bottom: 0;
146
- margin-left: 2px;
147
- margin-right: 20px;
148
- margin-top: 25px;
149
- padding-bottom: 11px;
150
- padding-left: 15px;
151
- padding-right: 15px;
152
- padding-top: 11px;
153
- text-align: left;
154
- }
155
- </style>
1
+ <?php
2
  use YellowTree\GeoipDetect\DataSources\DataSourceRegistry;
3
  $date_format = get_option('date_format') . ' ' . get_option('time_format');
4
 
17
  ?>
18
  <div class="wrap geoip-detect-wrap">
19
  <h1><?php _e('GeoIP Detection', 'geoip-detect');?></h1>
20
+ <p>
21
+ <a href="options-general.php?page=<?php echo GEOIP_PLUGIN_BASENAME ?>"><?php _e('Options', 'geoip-detect');?></a>
22
+ </p>
23
+
24
  <p>
25
  <?php printf(__('<b>Selected data source:</b> %s', 'geoip-detect'), geoip_detect2_get_current_source_description() ); ?>
26
  </p>
27
+
28
  <p>
29
  <?php echo $current_source->getStatusInformationHTML(); ?>
30
  <br />
31
  <br />
32
+ </p>
33
+
34
+ <p>
35
+ <b><?php _e('Your current IP:', 'geoip-detect');?></b> <?php echo geoip_detect2_get_client_ip(); ?>
36
+ <a href="options-general.php?page=<?php echo GEOIP_PLUGIN_BASENAME ?>&geoip_detect_part=client-ip">(<?php _e('Not correct?', 'geoip-detect');?>)</a>
37
+ </p>
38
+
39
  <h2><?php _e('Test IP Detection Lookup ', 'geoip-detect');?></h2>
40
  <form method="post" action="#">
41
  <?php wp_nonce_field( 'geoip_detect_lookup' ); ?>
42
  <input type="hidden" name="action" value="lookup" />
43
  <?php _e('IP', 'geoip-detect')?>: <input type="text" placeholder="<?php _e('Enter an IP (v4 or v6)', 'geoip-detect')?>" name="ip" value="<?php echo isset($_REQUEST['ip']) ? esc_attr($_REQUEST['ip']) : esc_attr(geoip_detect2_get_client_ip()); ?>" /><br />
44
+ <label><?php _e('Use these locales:', 'geoip-detect'); ?>
45
  <select name="locales">
46
  <option value="" <?php if (empty($_POST['locales'])) echo 'selected="selected"'?>><?php _e('Default (Current site language, English otherwise)', 'geoip-detect')?></option>
47
  <option value="en" <?php if (!empty($_POST['locales']) && $_POST['locales'] == 'en') echo 'selected="selected"'?>><?php _e('English only', 'geoip-detect')?></option>
53
  </form>
54
  <?php if ($ip_lookup_result !== false) :
55
  if (is_object($ip_lookup_result)) :
56
+ $record = $ip_lookup_result;
57
 
58
  ?>
59
  <h3><?php _e('Lookup Result', 'geoip-detect'); ?></h3>
64
  <br /><?php printf(__('(Served from cache. Was cached %s ago)', 'geoip-detect'), human_time_diff($record->extra->cached));?>
65
  <?php endif; ?>
66
  </p>
67
+
68
  <?php if ($record->extra->error) : ?>
69
  <p class="geoip_detect_error">
70
  <?php echo nl2br(esc_html($record->extra->error)); ?>
71
  </p>
72
  <?php endif; ?>
73
+
74
  <table>
75
  <tr>
76
  <th><?php _e('Key', 'geoip-detect'); ?></th>
77
  <th><?php _e('Value', 'geoip-detect'); ?></th>
78
  <th><?php _e('Shortcode equivalent', 'geoip-detect'); ?></th>
79
  </tr>
80
+
81
  <tr>
82
  <td><code>$record-&gt;city-&gt;name</code></td>
83
  <td><?php echo esc_html($record->city->name);?></td>
136
  <?php printf(__('See %s for more documentation.', 'geoip-detect'), '<a href="http://dev.maxmind.com/geoip/geoip2/web-services/" target="_blank">http://dev.maxmind.com/geoip/geoip2/web-services/</a>');?>
137
  </p>
138
  <?php require(GEOIP_PLUGIN_DIR . '/views/footer.php'); ?>
139
+ </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
views/options.php CHANGED
@@ -1,4 +1,4 @@
1
- <?php
2
  $options = $currentSource->getParameterHTML();
3
  ?>
4
 
@@ -10,7 +10,7 @@ $options = $currentSource->getParameterHTML();
10
  <?php echo $message; ?>
11
  </p>
12
  <?php endif; ?>
13
-
14
  <p>
15
  <?php printf(__('<b>Selected data source:</b> %s', 'geoip-detect'), geoip_detect2_get_current_source_description() ); ?>
16
  </p>
@@ -26,7 +26,7 @@ $options = $currentSource->getParameterHTML();
26
  <p><?php echo $options; ?></p>
27
  <p>
28
  <input type="submit" class="button button-primary" value="<?php _e('Save', 'geoip-detect'); ?>" />
29
- </p>
30
  </form>
31
  </p>
32
  <?php endif; ?>
@@ -58,14 +58,15 @@ $options = $currentSource->getParameterHTML();
58
  <label><input type="checkbox" name="options[disable_pagecache]" value="1" <?php if (!empty($wp_options['disable_pagecache'])) { echo 'checked="checked"'; } ?>>&nbsp;<?php _e('Disable caching a page that contains a shortcode or API call to geo-dependent functions.', 'geoip-detect'); ?></label><br />
59
  <span class="detail-box">
60
  <?php _e('At least WP SuperCache, W3TotalCache and ZenCache are supported.', 'geoip-detect'); ?>
61
- </span>
62
  <?php if (!empty($wp_options['set_css_country']) && !empty($wp_options['disable_pagecache'])): ?>
63
  <span class="geoip_detect_error"><?php _e('Warning: As the CSS option above is active, this means that all pages are not cached.', 'geoip-detect'); ?></span>
64
  <?php endif; ?>
65
  </p>
66
-
67
  <p>
68
  <label><input type="checkbox" name="options[has_reverse_proxy]" value="1" <?php if (!empty($wp_options['has_reverse_proxy'])) { echo 'checked="checked"'; } ?>>&nbsp;<?php _e('The server is behind a reverse proxy', 'geoip-detect')?></label>
 
69
  <span class="detail-box">
70
  <?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) : ?>
71
  <?php printf(__('(With Proxy: %s - Without Proxy: %s - Client IP with current configuration: %s)', 'geoip-detect'), $_SERVER['HTTP_X_FORWARDED_FOR'], $_SERVER['REMOTE_ADDR'], geoip_detect2_get_client_ip()); ?><br />
@@ -74,6 +75,14 @@ $options = $currentSource->getParameterHTML();
74
  <?php endif; ?>
75
  </span>
76
  </p>
 
 
 
 
 
 
 
 
77
  <p>
78
  <label><?php _e('External IP of this server:', 'geoip-detect'); ?> <input type="text" name="options[external_ip]" value="<?php echo esc_attr($wp_options['external_ip']); ?>" placeholder="<?php _e('detect automatically', 'geoip-detect'); ?>" /></label>
79
  <span class="detail-box">
@@ -98,30 +107,3 @@ $options = $currentSource->getParameterHTML();
98
  <?php endif; ?>
99
  <?php require(GEOIP_PLUGIN_DIR . '/views/footer.php'); ?>
100
  </div>
101
- <style>
102
- .geoip_detect_error {
103
- display:block;
104
- clear: both;
105
- background-color: rgb(255, 255, 255);
106
- border-left: rgb(255, 0, 0) solid 4px;
107
- box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
108
- display: inline-block;
109
- font-size: 14px;
110
- line-height: 19px;
111
- margin-bottom: 0;
112
- margin-left: 2px;
113
- margin-right: 20px;
114
- margin-top: 25px;
115
- padding-bottom: 11px;
116
- padding-left: 15px;
117
- padding-right: 15px;
118
- padding-top: 11px;
119
- text-align: left;
120
- }
121
- .detail-box {
122
- display: block;
123
- margin-left: 50px;
124
- color: #777;
125
- }
126
-
127
- </style>
1
+ <?php
2
  $options = $currentSource->getParameterHTML();
3
  ?>
4
 
10
  <?php echo $message; ?>
11
  </p>
12
  <?php endif; ?>
13
+
14
  <p>
15
  <?php printf(__('<b>Selected data source:</b> %s', 'geoip-detect'), geoip_detect2_get_current_source_description() ); ?>
16
  </p>
26
  <p><?php echo $options; ?></p>
27
  <p>
28
  <input type="submit" class="button button-primary" value="<?php _e('Save', 'geoip-detect'); ?>" />
29
+ </p>
30
  </form>
31
  </p>
32
  <?php endif; ?>
58
  <label><input type="checkbox" name="options[disable_pagecache]" value="1" <?php if (!empty($wp_options['disable_pagecache'])) { echo 'checked="checked"'; } ?>>&nbsp;<?php _e('Disable caching a page that contains a shortcode or API call to geo-dependent functions.', 'geoip-detect'); ?></label><br />
59
  <span class="detail-box">
60
  <?php _e('At least WP SuperCache, W3TotalCache and ZenCache are supported.', 'geoip-detect'); ?>
61
+ </span>
62
  <?php if (!empty($wp_options['set_css_country']) && !empty($wp_options['disable_pagecache'])): ?>
63
  <span class="geoip_detect_error"><?php _e('Warning: As the CSS option above is active, this means that all pages are not cached.', 'geoip-detect'); ?></span>
64
  <?php endif; ?>
65
  </p>
66
+
67
  <p>
68
  <label><input type="checkbox" name="options[has_reverse_proxy]" value="1" <?php if (!empty($wp_options['has_reverse_proxy'])) { echo 'checked="checked"'; } ?>>&nbsp;<?php _e('The server is behind a reverse proxy', 'geoip-detect')?></label>
69
+ <a href="options-general.php?page=<?php echo GEOIP_PLUGIN_BASENAME ?>&geoip_detect_part=client-ip">(<?php _e('Client IP debug panel', 'geoip-detect');?>)</a>
70
  <span class="detail-box">
71
  <?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) : ?>
72
  <?php printf(__('(With Proxy: %s - Without Proxy: %s - Client IP with current configuration: %s)', 'geoip-detect'), $_SERVER['HTTP_X_FORWARDED_FOR'], $_SERVER['REMOTE_ADDR'], geoip_detect2_get_client_ip()); ?><br />
75
  <?php endif; ?>
76
  </span>
77
  </p>
78
+ <p>
79
+ <label><?php _e('IPs of trusted proxies:', 'geoip-detect'); ?><input type="text" name="options[trusted_proxy_ips]" <?php echo esc_attr($wp_options['trusted_proxy_ips']); ?>" placeholder="<?php _e('IPs comma-seperated', 'geoip-detect'); ?>" />
80
+ <span class="detail-box">
81
+ <?php _e('If specified, only IPs in this list will be treated as proxy.', 'geoip-detect'); ?><br>
82
+ <?php _e('Make sure to add both IPv4 and IPv6 adresses of the proxy!', 'geoip-detect'); ?>
83
+ </span>
84
+ </p>
85
+
86
  <p>
87
  <label><?php _e('External IP of this server:', 'geoip-detect'); ?> <input type="text" name="options[external_ip]" value="<?php echo esc_attr($wp_options['external_ip']); ?>" placeholder="<?php _e('detect automatically', 'geoip-detect'); ?>" /></label>
88
  <span class="detail-box">
107
  <?php endif; ?>
108
  <?php require(GEOIP_PLUGIN_DIR . '/views/footer.php'); ?>
109
  </div>