Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
39.66% covered (danger)
39.66%
23 / 58
42.86% covered (danger)
42.86%
6 / 14
CRAP
0.00% covered (danger)
0.00%
0 / 1
Host
39.66% covered (danger)
39.66%
23 / 58
42.86% covered (danger)
42.86%
6 / 14
373.23
0.00% covered (danger)
0.00%
0 / 1
 is_woa_site
100.00% covered (success)
100.00%
5 / 5
100.00% covered (success)
100.00%
1 / 1
3
 is_atomic_platform
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 is_pressable
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 is_newspack_site
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 is_vip_site
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
6
 is_wpcom_simple
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 is_wpcom_platform
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 is_p2_site
75.00% covered (warning)
75.00%
3 / 4
0.00% covered (danger)
0.00%
0 / 1
4.25
 get_wpcom_site_id
40.00% covered (danger)
40.00%
2 / 5
0.00% covered (danger)
0.00%
0 / 1
7.46
 allow_wpcom_environments
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 get_calypso_env
71.43% covered (warning)
71.43%
5 / 7
0.00% covered (danger)
0.00%
0 / 1
5.58
 get_source_query
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
3
 get_known_host_guess
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 1
72
 allow_wpcom_public_api_domain
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * A hosting provide class for Jetpack.
4 *
5 * @package automattic/jetpack-status
6 */
7
8namespace Automattic\Jetpack\Status;
9
10use Automattic\Jetpack\Constants;
11
12/**
13 * Hosting provider class.
14 */
15class Host {
16    /**
17     * Determine if this site is an WordPress.com on Atomic site or not by looking for presence of the wpcomsh plugin.
18     *
19     * @since 1.9.0
20     *
21     * @return bool
22     */
23    public function is_woa_site() {
24        $ret = Cache::get( 'is_woa_site' );
25        if ( null === $ret ) {
26            $ret = $this->is_atomic_platform() && Constants::is_true( 'WPCOMSH__PLUGIN_FILE' );
27            Cache::set( 'is_woa_site', $ret );
28        }
29        return $ret;
30    }
31
32    /**
33     * Determine if the site is hosted on the Atomic hosting platform.
34     *
35     * @since 1.9.0
36     *
37     * @return bool
38     */
39    public function is_atomic_platform() {
40        return Constants::is_true( 'ATOMIC_SITE_ID' ) && Constants::is_true( 'ATOMIC_CLIENT_ID' );
41    }
42
43    /**
44     * Determine if this site is hosted on the Pressable platform.
45     *
46     * Relies on the `IS_PRESSABLE` platform constant rather than URL or
47     * domain matching, which can be spoofed and changes across environments.
48     *
49     * @since $$next-version$$
50     *
51     * @return bool
52     */
53    public function is_pressable() {
54        return Constants::is_true( 'IS_PRESSABLE' );
55    }
56
57    /**
58     * Determine if this is a Newspack site.
59     *
60     * @return bool
61     */
62    public function is_newspack_site() {
63        return Constants::is_defined( 'NEWSPACK_PLUGIN_FILE' );
64    }
65
66    /**
67     * Determine if this is a VIP-hosted site.
68     *
69     * @return bool
70     */
71    public function is_vip_site() {
72        return Constants::is_defined( 'WPCOM_IS_VIP_ENV' ) && true === Constants::get_constant( 'WPCOM_IS_VIP_ENV' );
73    }
74
75    /**
76     * Determine if this is a Simple platform site.
77     *
78     * @return bool
79     */
80    public function is_wpcom_simple() {
81        return Constants::is_defined( 'IS_WPCOM' ) && true === Constants::get_constant( 'IS_WPCOM' );
82    }
83
84    /**
85     * Determine if this is a WordPress.com site.
86     *
87     * Includes both Simple and WoA platforms.
88     *
89     * @return bool
90     */
91    public function is_wpcom_platform() {
92        return $this->is_wpcom_simple() || $this->is_woa_site();
93    }
94
95    /**
96     * Determine if this is a P2 site.
97     * This covers both P2 and P2020 themes.
98     *
99     * @return bool
100     */
101    public function is_p2_site() {
102        $site_id = $this->get_wpcom_site_id();
103        if ( ! $site_id ) {
104            return false;
105        }
106        return str_contains( get_stylesheet(), 'pub/p2' ) || ( function_exists( '\WPForTeams\is_wpforteams_site' ) && \WPForTeams\is_wpforteams_site( $site_id ) );
107    }
108
109    /**
110     * Get the current site's WordPress.com ID.
111     *
112     * @return mixed The site's WordPress.com ID.
113     */
114    public function get_wpcom_site_id() {
115        if ( $this->is_wpcom_simple() ) {
116            return get_current_blog_id();
117        } elseif ( class_exists( 'Jetpack' ) && \Jetpack::is_connection_ready() ) {
118            return \Jetpack_Options::get_option( 'id' );
119        }
120        return false;
121    }
122
123    /**
124     * Add all wordpress.com environments to the safe redirect allowed list.
125     *
126     * To be used with a filter of allowed domains for a redirect.
127     *
128     * @param array $domains Allowed WP.com Environments.
129     */
130    public static function allow_wpcom_environments( $domains ) {
131        $domains[] = 'wordpress.com';
132        $domains[] = 'jetpack.wordpress.com';
133        $domains[] = 'wpcalypso.wordpress.com';
134        $domains[] = 'horizon.wordpress.com';
135        $domains[] = 'calypso.localhost';
136        return $domains;
137    }
138
139    /**
140     * Return Calypso environment value; used for developing Jetpack and pairing
141     * it with different Calypso environments, such as localhost.
142     *
143     * @since 1.18.0
144     *
145     * @return string Calypso environment
146     */
147    public function get_calypso_env() {
148        // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Nonce is not required; only used for changing environments.
149        if ( isset( $_GET['calypso_env'] ) ) {
150            return sanitize_key( $_GET['calypso_env'] );
151        }
152        // phpcs:enable WordPress.Security.NonceVerification.Recommended
153
154        if ( getenv( 'CALYPSO_ENV' ) ) {
155            return sanitize_key( getenv( 'CALYPSO_ENV' ) );
156        }
157
158        if ( defined( 'CALYPSO_ENV' ) && CALYPSO_ENV ) {
159            return sanitize_key( CALYPSO_ENV );
160        }
161
162        return '';
163    }
164
165    /**
166     * Return source query param value from the URL if exists in the allowed sources list.
167     *
168     * @return string "source" query param value
169     */
170    public function get_source_query() {
171        // phpcs:disable WordPress.Security.NonceVerification.Recommended
172        $allowed_sources = array( 'jetpack-manage', 'a8c-for-agencies' );
173        if ( isset( $_GET['source'] ) && in_array( $_GET['source'], $allowed_sources, true ) ) {
174            return sanitize_key( $_GET['source'] );
175        }
176
177        return '';
178    }
179
180    /**
181     * Returns a guess of the hosting provider for the current site based on various checks.
182     *
183     * @since 5.0.4 Added $guess parameter.
184     * @since 6.0.0 Removed $guess parameter.
185     *
186     * @return string
187     */
188    public function get_known_host_guess() {
189        // First, let's check if we can recognize provider manually:
190        switch ( true ) {
191            case $this->is_woa_site():
192                $provider = 'woa';
193                break;
194            case $this->is_atomic_platform():
195                $provider = 'atomic';
196                break;
197            case $this->is_newspack_site():
198                $provider = 'newspack';
199                break;
200            case $this->is_vip_site():
201                $provider = 'vip';
202                break;
203            case $this->is_wpcom_simple():
204            case $this->is_wpcom_platform():
205                $provider = 'wpcom';
206                break;
207            default:
208                $provider = 'unknown';
209                break;
210        }
211
212        return $provider;
213    }
214
215    /**
216     * Add public-api.wordpress.com to the safe redirect allowed list - only added when someone allows API access.
217     *
218     * @since 3.0.2 Ported from Jetpack to the Status package.
219     *
220     * To be used with a filter of allowed domains for a redirect.
221     *
222     * @param array $domains Allowed WP.com Environments.
223     *
224     * @return array
225     */
226    public static function allow_wpcom_public_api_domain( $domains ) {
227        $domains[] = 'public-api.wordpress.com';
228        return $domains;
229    }
230}