Initial Commit
This commit is contained in:
179
inc/domain-mapping/class-helper.php
Normal file
179
inc/domain-mapping/class-helper.php
Normal file
@ -0,0 +1,179 @@
|
||||
<?php
|
||||
/**
|
||||
* Helper class for domain mapping functionality.
|
||||
*
|
||||
* @package WP_Ultimo
|
||||
* @subpackage Domain_Mapping
|
||||
* @since 2.0.0
|
||||
*/
|
||||
|
||||
namespace WP_Ultimo\Domain_Mapping;
|
||||
|
||||
use WP_Ultimo\Dependencies\Spatie\SslCertificate\SslCertificate;
|
||||
use WP_Ultimo\Dependencies\Psr\Log\LogLevel;
|
||||
|
||||
// Exit if accessed directly
|
||||
defined('ABSPATH') || exit;
|
||||
|
||||
/**
|
||||
* Helper class for domain mapping functionality.
|
||||
*
|
||||
* @since 2.0.0
|
||||
*/
|
||||
class Helper {
|
||||
|
||||
/**
|
||||
* List of API endpoints we can use to check the remote IP address.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
static $providers = array(
|
||||
'https://ipv4.canihazip.com/s',
|
||||
'https://ipv4.icanhazip.com/',
|
||||
'https://api.ipify.org/',
|
||||
);
|
||||
|
||||
/**
|
||||
* Static-only class.
|
||||
*/
|
||||
private function __construct() {} // end __construct;
|
||||
|
||||
/**
|
||||
* Checks if we are in development mode.
|
||||
*
|
||||
* @todo this needs to be migrate somewhere else, where it can be accessed by everyone.
|
||||
* @since 2.0.0
|
||||
* @return boolean
|
||||
*/
|
||||
public static function is_development_mode() {
|
||||
|
||||
$site_url = site_url();
|
||||
|
||||
$is_development_mode = preg_match('#(localhost|staging.*\.|\.local|\.test)#', $site_url);
|
||||
|
||||
/**
|
||||
* Allow plugin developers to add additional tests
|
||||
* for development mode.
|
||||
*
|
||||
* @since 2.0.0
|
||||
*
|
||||
* @param bool $is_development_mode The current development status.
|
||||
* @param string $site_url The site URL.
|
||||
* @return bool
|
||||
*/
|
||||
return apply_filters('wu_is_development_mode', $is_development_mode, $site_url);
|
||||
|
||||
} // end is_development_mode;
|
||||
/**
|
||||
* Gets the local IP address of the network.
|
||||
*
|
||||
* Sometimes, this will be the same address as the public one, but we need different methods.
|
||||
*
|
||||
* @since 2.0.0
|
||||
* @return string|bool
|
||||
*/
|
||||
public static function get_local_network_ip() {
|
||||
|
||||
return isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : false;
|
||||
|
||||
} // end get_local_network_ip;
|
||||
|
||||
/**
|
||||
* Gets the public IP address of the network using an external HTTP call.
|
||||
*
|
||||
* The reason why this IP can't be determined locally is because proxies like
|
||||
* Cloudflare and others will mask the real domain address.
|
||||
* By default, we cache the values in a transient for 10 days.
|
||||
*
|
||||
* @since 2.0.0
|
||||
* @return string
|
||||
*/
|
||||
public static function get_network_public_ip() {
|
||||
|
||||
if (self::is_development_mode()) {
|
||||
|
||||
$local_ip = self::get_local_network_ip();
|
||||
|
||||
/**
|
||||
* See more about this filter below, on this same method.
|
||||
*/
|
||||
return apply_filters('wu_get_network_public_ip', $local_ip, true);
|
||||
|
||||
} // end if;
|
||||
|
||||
$_ip_address = get_site_transient('wu_public_network_ip');
|
||||
|
||||
if (!$_ip_address) {
|
||||
|
||||
$ip_address = false;
|
||||
|
||||
foreach (self::$providers as $provider_url) {
|
||||
|
||||
$response = wp_remote_get($provider_url, array(
|
||||
'timeout' => 5,
|
||||
));
|
||||
|
||||
if (!is_wp_error($response)) {
|
||||
|
||||
$ip_address = trim(wp_remote_retrieve_body($response));
|
||||
|
||||
continue;
|
||||
|
||||
} // end if;
|
||||
|
||||
} // end foreach;
|
||||
|
||||
set_site_transient('wu_public_network_ip', $ip_address, 10 * DAY_IN_SECONDS);
|
||||
|
||||
$_ip_address = $ip_address;
|
||||
|
||||
} // end if;
|
||||
|
||||
/**
|
||||
* Allow developers to change the public IP address of the network.
|
||||
*
|
||||
* This is displayed to the customer/users when new domains are mapped
|
||||
* and need DNS records configured.
|
||||
*
|
||||
* This is useful in cases where a load balancer might be present and IP might vary.
|
||||
*
|
||||
* @see https://wpultimo.feedbear.com/boards/bug-reports/posts/network-ip-filter-required
|
||||
*
|
||||
* @param string $_ip_address The public IP address.
|
||||
* @param bool $local True if this is a local network (localhost, .dev, etc.), false otherwise.
|
||||
* @return string The new IP address.
|
||||
*/
|
||||
return apply_filters('wu_get_network_public_ip', $_ip_address, false);
|
||||
|
||||
} // end get_network_public_ip;
|
||||
|
||||
/**
|
||||
* Checks if a given domain name has a valid associated SSL certificate.
|
||||
*
|
||||
* @since 2.0.0
|
||||
*
|
||||
* @param string $domain Domain name, e.g. google.com.
|
||||
* @return boolean
|
||||
*/
|
||||
public static function has_valid_ssl_certificate($domain = '') {
|
||||
|
||||
$is_valid = false;
|
||||
|
||||
try {
|
||||
|
||||
$certificate = SslCertificate::createForHostName($domain);
|
||||
|
||||
$is_valid = $certificate->isValid($domain); // returns bool;
|
||||
|
||||
} catch (\Exception $e) {
|
||||
|
||||
// translators: %s is the error message returned by the checker.
|
||||
wu_log_add('domain-ssl-checks', sprintf(__('Certificate Invalid: %s', 'wp-ultimo'), $e->getMessage()), LogLevel::ERROR);
|
||||
|
||||
} // end try;
|
||||
|
||||
return $is_valid;
|
||||
|
||||
} // end has_valid_ssl_certificate;
|
||||
|
||||
} // end class Helper;
|
Reference in New Issue
Block a user