Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
38.60% covered (danger)
38.60%
22 / 57
38.46% covered (danger)
38.46%
5 / 13
CRAP
0.00% covered (danger)
0.00%
0 / 1
Host
38.60% covered (danger)
38.60%
22 / 57
38.46% covered (danger)
38.46%
5 / 13
372.31
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_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 is a Newspack site.
45     *
46     * @return bool
47     */
48    public function is_newspack_site() {
49        return Constants::is_defined( 'NEWSPACK_PLUGIN_FILE' );
50    }
51
52    /**
53     * Determine if this is a VIP-hosted site.
54     *
55     * @return bool
56     */
57    public function is_vip_site() {
58        return Constants::is_defined( 'WPCOM_IS_VIP_ENV' ) && true === Constants::get_constant( 'WPCOM_IS_VIP_ENV' );
59    }
60
61    /**
62     * Determine if this is a Simple platform site.
63     *
64     * @return bool
65     */
66    public function is_wpcom_simple() {
67        return Constants::is_defined( 'IS_WPCOM' ) && true === Constants::get_constant( 'IS_WPCOM' );
68    }
69
70    /**
71     * Determine if this is a WordPress.com site.
72     *
73     * Includes both Simple and WoA platforms.
74     *
75     * @return bool
76     */
77    public function is_wpcom_platform() {
78        return $this->is_wpcom_simple() || $this->is_woa_site();
79    }
80
81    /**
82     * Determine if this is a P2 site.
83     * This covers both P2 and P2020 themes.
84     *
85     * @return bool
86     */
87    public function is_p2_site() {
88        $site_id = $this->get_wpcom_site_id();
89        if ( ! $site_id ) {
90            return false;
91        }
92        return str_contains( get_stylesheet(), 'pub/p2' ) || ( function_exists( '\WPForTeams\is_wpforteams_site' ) && \WPForTeams\is_wpforteams_site( $site_id ) );
93    }
94
95    /**
96     * Get the current site's WordPress.com ID.
97     *
98     * @return mixed The site's WordPress.com ID.
99     */
100    public function get_wpcom_site_id() {
101        if ( $this->is_wpcom_simple() ) {
102            return get_current_blog_id();
103        } elseif ( class_exists( 'Jetpack' ) && \Jetpack::is_connection_ready() ) {
104            return \Jetpack_Options::get_option( 'id' );
105        }
106        return false;
107    }
108
109    /**
110     * Add all wordpress.com environments to the safe redirect allowed list.
111     *
112     * To be used with a filter of allowed domains for a redirect.
113     *
114     * @param array $domains Allowed WP.com Environments.
115     */
116    public static function allow_wpcom_environments( $domains ) {
117        $domains[] = 'wordpress.com';
118        $domains[] = 'jetpack.wordpress.com';
119        $domains[] = 'wpcalypso.wordpress.com';
120        $domains[] = 'horizon.wordpress.com';
121        $domains[] = 'calypso.localhost';
122        return $domains;
123    }
124
125    /**
126     * Return Calypso environment value; used for developing Jetpack and pairing
127     * it with different Calypso environments, such as localhost.
128     *
129     * @since 1.18.0
130     *
131     * @return string Calypso environment
132     */
133    public function get_calypso_env() {
134        // phpcs:disable WordPress.Security.NonceVerification.Recommended -- Nonce is not required; only used for changing environments.
135        if ( isset( $_GET['calypso_env'] ) ) {
136            return sanitize_key( $_GET['calypso_env'] );
137        }
138        // phpcs:enable WordPress.Security.NonceVerification.Recommended
139
140        if ( getenv( 'CALYPSO_ENV' ) ) {
141            return sanitize_key( getenv( 'CALYPSO_ENV' ) );
142        }
143
144        if ( defined( 'CALYPSO_ENV' ) && CALYPSO_ENV ) {
145            return sanitize_key( CALYPSO_ENV );
146        }
147
148        return '';
149    }
150
151    /**
152     * Return source query param value from the URL if exists in the allowed sources list.
153     *
154     * @return string "source" query param value
155     */
156    public function get_source_query() {
157        // phpcs:disable WordPress.Security.NonceVerification.Recommended
158        $allowed_sources = array( 'jetpack-manage', 'a8c-for-agencies' );
159        if ( isset( $_GET['source'] ) && in_array( $_GET['source'], $allowed_sources, true ) ) {
160            return sanitize_key( $_GET['source'] );
161        }
162
163        return '';
164    }
165
166    /**
167     * Returns a guess of the hosting provider for the current site based on various checks.
168     *
169     * @since 5.0.4 Added $guess parameter.
170     * @since 6.0.0 Removed $guess parameter.
171     *
172     * @return string
173     */
174    public function get_known_host_guess() {
175        // First, let's check if we can recognize provider manually:
176        switch ( true ) {
177            case $this->is_woa_site():
178                $provider = 'woa';
179                break;
180            case $this->is_atomic_platform():
181                $provider = 'atomic';
182                break;
183            case $this->is_newspack_site():
184                $provider = 'newspack';
185                break;
186            case $this->is_vip_site():
187                $provider = 'vip';
188                break;
189            case $this->is_wpcom_simple():
190            case $this->is_wpcom_platform():
191                $provider = 'wpcom';
192                break;
193            default:
194                $provider = 'unknown';
195                break;
196        }
197
198        return $provider;
199    }
200
201    /**
202     * Add public-api.wordpress.com to the safe redirect allowed list - only added when someone allows API access.
203     *
204     * @since 3.0.2 Ported from Jetpack to the Status package.
205     *
206     * To be used with a filter of allowed domains for a redirect.
207     *
208     * @param array $domains Allowed WP.com Environments.
209     *
210     * @return array
211     */
212    public static function allow_wpcom_public_api_domain( $domains ) {
213        $domains[] = 'public-api.wordpress.com';
214        return $domains;
215    }
216}