PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / extensions / blocks / premium-content / _inc / subscription-service / class-wpcom-online-subscription-service.php
jetpack / extensions / blocks / premium-content / _inc / subscription-service Last commit date
class-abstract-token-subscription-service.php 6 days ago class-jetpack-token-subscription-service.php 2 months ago class-jwt.php 3 months ago class-unconfigured-subscription-service.php 9 months ago class-wpcom-offline-subscription-service.php 9 months ago class-wpcom-online-subscription-service.php 6 days ago include.php 9 months ago interface-subscription-service.php 9 months ago
class-wpcom-online-subscription-service.php
173 lines
1 <?php
2 /**
3 * This subscription service is used when a subscriber is online
4 *
5 * @package Automattic\Jetpack\Extensions\Premium_Content
6 */
7
8 namespace Automattic\Jetpack\Extensions\Premium_Content\Subscription_Service;
9
10 if ( ! defined( 'ABSPATH' ) ) {
11 exit( 0 );
12 }
13
14 /**
15 * Class WPCOM_Offline_Subscription_Service
16 *
17 * @package Automattic\Jetpack\Extensions\Premium_Content\Subscription_Service
18 */
19 class WPCOM_Online_Subscription_Service extends Jetpack_Token_Subscription_Service {
20
21 /**
22 * Is available()
23 *
24 * @return bool
25 */
26 public static function available() {
27 // Return available if the user is logged in and we are on WPCOM.
28 return defined( 'IS_WPCOM' ) && IS_WPCOM && is_user_logged_in();
29 }
30
31 /**
32 * Lookup users subscriptions for a site and determine if the user has a valid subscription to match the plan ID
33 *
34 * @param array $valid_plan_ids .
35 * @param string $access_level .
36 *
37 * @return bool
38 */
39 public function visitor_can_view_content( $valid_plan_ids, $access_level ) {
40 $is_blog_subscriber = $this->is_current_user_subscribed();
41
42 return $this->user_can_view_content( $valid_plan_ids, $access_level, $is_blog_subscriber, get_the_ID() );
43 }
44
45 /**
46 * Retrieves the email of the currently authenticated subscriber.
47 *
48 * This function checks if the current user has an active subscription. If the user is subscribed,
49 * their email is returned. Otherwise, it returns an empty string to indicate no active subscription.
50 *
51 * @return string The email address of the subscribed user or an empty string if not subscribed.
52 */
53 public function get_subscriber_email() {
54 if ( ! is_user_logged_in() ) {
55 return '';
56 }
57 return wp_get_current_user()->user_email;
58 }
59
60 /**
61 * Returns true if the current authenticated user is subscribed to the current site,
62 * either via an active email subscription or by following it in the Reader.
63 *
64 * @return bool
65 */
66 public function is_current_user_subscribed(): bool {
67 include_once WP_CONTENT_DIR . '/mu-plugins/email-subscriptions/subscriptions.php';
68 $email = wp_get_current_user()->user_email;
69 $subscriber_object = \Blog_Subscriber::get( $email );
70 $blog_id = $this->get_site_id();
71 $has_active_email_sub = false;
72 if ( ! empty( $subscriber_object ) ) {
73 $subscription_status = \Blog_Subscription::get_subscription_status_for_blog( $subscriber_object, $blog_id );
74 $has_active_email_sub = 'active' === $subscription_status;
75 }
76
77 $is_following = ! $has_active_email_sub && function_exists( 'wpcom_subs_is_subscribed' ) && wpcom_subs_is_subscribed(
78 array(
79 'user_id' => get_current_user_id(),
80 'blog_id' => $blog_id,
81 )
82 );
83
84 return $has_active_email_sub || $is_following;
85 }
86
87 /**
88 * Returns true if the current authenticated user has a pending subscription to the current site.
89 *
90 * @return bool
91 */
92 public function is_current_user_pending_subscriber(): bool {
93 include_once WP_CONTENT_DIR . '/mu-plugins/email-subscriptions/subscriptions.php';
94 $email = wp_get_current_user()->user_email;
95 $subscriber_object = \Blog_Subscriber::get( $email );
96 if ( empty( $subscriber_object ) ) {
97 return false;
98 }
99 $blog_id = $this->get_site_id();
100 $subscription_status = \Blog_Subscription::get_subscription_status_for_blog( $subscriber_object, $blog_id );
101 if ( self::BLOG_SUB_PENDING !== $subscription_status ) {
102 return false;
103 }
104 return true;
105 }
106
107 /**
108 * Lookup users subscriptions for a site and determine if the user has a valid subscription to match the plan ID
109 *
110 * @param array $valid_plan_ids .
111 * @param string $access_level .
112 * @param bool $is_blog_subscriber .
113 * @param int $post_id .
114 *
115 * @return bool
116 */
117 protected function user_can_view_content( $valid_plan_ids, $access_level, $is_blog_subscriber, $post_id ) {
118 $user_id = is_user_logged_in() ? wp_get_current_user()->ID : $this->user_id;
119 /**
120 * Filter the subscriptions attached to a specific user on a given site.
121 *
122 * @since 9.4.0
123 *
124 * @param array $subscriptions Array of subscriptions.
125 * @param int $user_id The user's ID.
126 * @param int $site_id ID of the current site.
127 */
128 $subscriptions = apply_filters( 'earn_get_user_subscriptions_for_site_id', array(), $user_id, $this->get_site_id() );
129 // format the subscriptions so that they can be validated.
130 $subscriptions = self::abbreviate_subscriptions( $subscriptions );
131 $is_paid_subscriber = static::validate_subscriptions( $valid_plan_ids, $subscriptions );
132
133 return $this->user_has_access( $access_level, $is_blog_subscriber, $is_paid_subscriber, $post_id, $subscriptions );
134 }
135
136 /**
137 * Report the subscriptions as an ID => [ 'end_date' => ]. mapping
138 *
139 * @param array $subscriptions_from_bd .
140 *
141 * @return array<int, object>
142 */
143 public static function abbreviate_subscriptions( $subscriptions_from_bd ) {
144 $subscriptions = array();
145 foreach ( $subscriptions_from_bd as $subscription ) {
146 // We are picking the expiry date that is the most in the future.
147 if (
148 'active' === $subscription['status'] && (
149 ! isset( $subscriptions[ $subscription['product_id'] ] ) ||
150 empty( $subscription['end_date'] ) || // Special condition when subscription has no expiry date - we will default to a year from now for the purposes of the token.
151 strtotime( $subscription['end_date'] ) > strtotime( (string) $subscriptions[ $subscription['product_id'] ]->end_date )
152 )
153 ) {
154 $subscriptions[ $subscription['product_id'] ] = new \stdClass();
155 $subscriptions[ $subscription['product_id'] ]->end_date = empty( $subscription['end_date'] ) ? gmdate( 'Y-m-d H:i:s', ( time() + 365 * 24 * 3600 ) ) : $subscription['end_date'];
156 if ( ! empty( $subscription['is_comp'] ) ) {
157 $subscriptions[ $subscription['product_id'] ]->is_comp = true;
158 }
159 }
160 }
161 return $subscriptions;
162 }
163
164 /**
165 * Get the site ID.
166 *
167 * @return int The site ID.
168 */
169 public function get_site_id() {
170 return get_current_blog_id();
171 }
172 }
173