PluginProbe
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions / 260909
s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions v260909
260917 260913 260909 260829 260814 260805 110710 110731 110812 110815 110912 110913 110915 110926 110927 111002 111003 111011 111017 111029 111105 111206 111216 111220 120213 All 189 releases
s2member / src / includes / hooks.inc.php

hooks.inc.php in s2Member – Excellent for All Kinds of Memberships, Content Restriction Paywalls & Member Access Subscriptions 260909, at src/includes/hooks.inc.php

269 lines 20.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 // @codingStandardsIgnoreFile
3 /**
4 * Primary Hooks/Filters used by the s2Member plugin.
5 *
6 * Copyright: © 2009-2011
7 * {@link http://websharks-inc.com/ WebSharks, Inc.}
8 * (coded in the USA)
9 *
10 * Released under the terms of the GNU General Public License.
11 * You should have received a copy of the GNU General Public License,
12 * along with this software. In the main directory, see: /licensing/
13 * If not, see: {@link http://www.gnu.org/licenses/}.
14 *
15 * @package s2Member
16 * @since 3.0
17 */
18 if(!defined('WPINC')) // MUST have WordPress.
19 exit('Do not access this file directly.');
20 /*
21 Add the plugin Actions/Filters here.
22 */
23
24 //250506 Translations loaded at init to avoid PHP Notice since WP 6.7.
25 //260320 Run at priority 0 so translations are available as early as possible on `init`.
26 add_action('init', 'c_ws_plugin__s2member_translations::load', 0);
27
28 add_action('set_current_user', 'c_ws_plugin__s2member_user_securities::set_current_user', 2);
29
30 add_action('init', 'c_ws_plugin__s2member_ssl::check_force_ssl', 3);
31 add_action('init', 'c_ws_plugin__s2member_user_securities::initialize', 3);
32 add_action('init', 'c_ws_plugin__s2member_database::wait_timeout', 3);
33
34 //260307 No-cache headers behavior mode is selected at runtime (options load after this file is included).
35 add_action('init', 'c_ws_plugin__s2member_no_cache::setup_no_cache_headers_mode', 3);
36
37 add_action('init', 'c_ws_plugin__s2member_register::register', 4);
38 add_action('init', 'c_ws_plugin__s2member_paypal_notify::paypal_notify', 4);
39 add_action('init', 'c_ws_plugin__s2member_files::check_file_download_access', 4);
40 add_action('init', 'c_ws_plugin__s2member_profile_mods::handle_profile_modifications', 4);
41 add_action('init', 'c_ws_plugin__s2member_tracking_cookies::delete_sp_tracking_cookie', 4);
42 add_action('init', 'c_ws_plugin__s2member_tracking_cookies::delete_tracking_cookie', 4);
43 add_action('init', 'c_ws_plugin__s2member_cron_jobs::auto_eot_system_via_cron', 4);
44 add_action('init', 'c_ws_plugin__s2member_mo_page::membership_options_page', 4);
45 add_action('init', 'c_ws_plugin__s2member_s_badge_status::s_badge_status', 4);
46
47 add_action('init', 'c_ws_plugin__s2member_admin_css_js::menu_pages_css', 5);
48 add_action('init', 'c_ws_plugin__s2member_admin_css_js::menu_pages_js', 5);
49 add_action('init', 'c_ws_plugin__s2member_css_js::css', 5);
50
51 add_action('init', 'c_ws_plugin__s2member_constants::constants', 6);
52
53 add_action('init', 'c_ws_plugin__s2member_css_js::js_w_globals', 7);
54 add_action('init', 'c_ws_plugin__s2member_paypal_return::paypal_return', 7);
55 add_action('init', 'c_ws_plugin__s2member_paypal_checkout::paypal_checkout', 6); //260106
56 add_action('init', 'c_ws_plugin__s2member_paypal_webhook::paypal_webhook', 6); //260112
57 add_action('init', 'c_ws_plugin__s2member_profile::profile', 7);
58
59 add_action('init', 'c_ws_plugin__s2member_labels::config_label_translations', 10);
60
61 add_action('init', 'c_ws_plugin__s2member_login_redirects_r::remove_login_redirect_filters', 11);
62
63 add_action('init', 'c_ws_plugin__s2member_login_checks::monitor_simultaneous_logins', 10);
64
65 add_action('admin_init', 'c_ws_plugin__s2member_menu_pages::log_file_downloader');
66 add_action('admin_init', 'c_ws_plugin__s2member_menu_pages::logs_zip_downloader');
67
68 add_filter('bbp_has_replies_query', 'c_ws_plugin__s2member_querys::_bbp_flag_has_replies');
69 add_action('pre_get_posts', 'c_ws_plugin__s2member_security::security_gate_query', 100);
70 add_filter('wp_list_pages_excludes', 'c_ws_plugin__s2member_querys::_query_level_access_list_pages', 100);
71
72 add_action('wp', 'c_ws_plugin__s2member_ssl::check_force_ssl', 1);
73 add_action('wp', 'c_ws_plugin__s2member_security::security_gate', 1);
74 //240315 Apply s2 restrictions to WP REST API
75 add_filter('rest_pre_dispatch', 'c_ws_plugin__s2member_security_rest::security_gate', 10, 3);
76
77 add_filter('wp_mail', 'c_ws_plugin__s2member_email_configs::email_filter');
78
79 add_filter('widget_text', 'do_shortcode'); // Shortcodes in widgets.
80
81 add_action('wp_print_styles', 'c_ws_plugin__s2member_css_js_themes::add_css');
82 add_action('wp_print_scripts', 'c_ws_plugin__s2member_css_js_themes::add_js_w_globals');
83 add_filter('script_loader_tag', 'c_ws_plugin__s2member_css_js_themes::script_loader_tag', 10, 2);
84
85 //260904.0300 Fresh activation can update options before funcs.inc.php installs s2Member's class autoloader, so defer this callback until s2Member is fully loaded.
86 add_action('ws_plugin__s2member_loaded', function() {
87 add_action('updated_option', 'c_ws_plugin__s2member_utils_assets::maybe_invalidate_after_wp_option_update', 10, 3);
88 });
89 add_action('activated_plugin', 'c_ws_plugin__s2member_utils_assets::invalidate_after_plugin_change');
90 add_action('deactivated_plugin', 'c_ws_plugin__s2member_utils_assets::invalidate_after_plugin_change');
91 add_action('upgrader_process_complete', 'c_ws_plugin__s2member_utils_assets::maybe_invalidate_after_upgrade', 10, 2);
92 add_action('ws_plugin__s2member_after_activation', 'c_ws_plugin__s2member_utils_assets::invalidate_static_assets', 10, 0);
93 add_action('wp_ajax_ws_plugin__s2member_refresh_static_assets', 'c_ws_plugin__s2member_utils_assets::ajax_refresh_static_assets');
94 add_action('wp_ajax_ws_plugin__s2member_asset_http_health', 'c_ws_plugin__s2member_utils_assets::ajax_asset_http_health_report');
95 add_action('wp_ajax_ws_plugin__s2member_asset_runtime_suspect', 'c_ws_plugin__s2member_utils_assets::ajax_asset_runtime_suspicion');
96 add_action('wp_ajax_nopriv_ws_plugin__s2member_asset_runtime_suspect', 'c_ws_plugin__s2member_utils_assets::ajax_asset_runtime_suspicion');
97 add_action('admin_notices', 'c_ws_plugin__s2member_utils_assets::static_assets_admin_notice');
98 add_action('admin_footer', 'c_ws_plugin__s2member_utils_assets::asset_http_health_probe', 900);
99 add_action('wp_footer', 'c_ws_plugin__s2member_utils_assets::asset_http_health_probe', 900);
100 add_action('wp_footer', 'c_ws_plugin__s2member_utils_assets::page_asset_runtime_monitor', 1000);
101
102 add_action('wp_login_failed', 'c_ws_plugin__s2member_brute_force::track_failed_logins');
103 add_filter('authenticate', 'c_ws_plugin__s2member_brute_force::stop_brute_force_logins', 100);
104
105 add_filter('wp_authenticate_user', 'c_ws_plugin__s2member_login_checks::ms_wp_authenticate_user', 100);
106 add_filter('wp_authenticate_user', 'c_ws_plugin__s2member_login_checks::stop_simultaneous_logins', 100);
107 add_action('wp_login', 'c_ws_plugin__s2member_login_checks::update_simultaneous_logins', 1);
108 add_action('clear_auth_cookie', 'c_ws_plugin__s2member_login_checks::simultaneous_logout', 1);
109
110 add_action('delete_user', 'c_ws_plugin__s2member_user_deletions::handle_user_deletions');
111 add_action('wpmu_delete_user', 'c_ws_plugin__s2member_user_deletions::handle_ms_user_deletions');
112 add_action('remove_user_from_blog', 'c_ws_plugin__s2member_user_deletions::handle_ms_user_deletions', 10, 2);
113
114 add_filter('enable_edit_any_user_configuration', 'c_ws_plugin__s2member_user_securities::ms_allow_edits');
115
116 add_filter('pre_option_default_role', 'c_ws_plugin__s2member_option_forces::force_default_role');
117 add_filter('pre_site_option_default_user_role', 'c_ws_plugin__s2member_option_forces::force_mms_default_role');
118 add_filter('pre_site_option_add_new_users', 'c_ws_plugin__s2member_option_forces::mms_allow_new_users');
119 add_filter('pre_site_option_dashboard_blog', 'c_ws_plugin__s2member_option_forces::mms_dashboard_blog');
120 add_filter('pre_option_users_can_register', 'c_ws_plugin__s2member_option_forces::check_register_access');
121 add_filter('pre_site_option_registration', 'c_ws_plugin__s2member_option_forces::check_mms_register_access');
122 add_filter('bp_core_get_root_options', 'c_ws_plugin__s2member_option_forces::check_bp_mms_register_access');
123 add_filter('bp_core_get_site_options', 'c_ws_plugin__s2member_option_forces::check_bp_mms_register_access');
124
125 add_filter('random_password', 'c_ws_plugin__s2member_registrations::generate_password');
126 add_action('user_register', 'c_ws_plugin__s2member_registrations::configure_user_registration');
127 add_action('register_form', 'c_ws_plugin__s2member_custom_reg_fields::custom_registration_fields');
128 add_filter('registration_errors', 'c_ws_plugin__s2member_registrations::custom_registration_field_errors', 10, 3);
129 add_filter('send_password_change_email', '__return_false'); // Turn this off in favor of s2Member.
130
131 add_filter('add_signup_meta', 'c_ws_plugin__s2member_registrations::ms_process_signup_meta');
132 add_filter('bp_signup_usermeta', 'c_ws_plugin__s2member_registrations::ms_process_signup_meta');
133 add_filter('bp_core_activated_user', 'c_ws_plugin__s2member_registrations::bp_user_activation');
134 add_filter('wpmu_validate_user_signup', 'c_ws_plugin__s2member_registrations::ms_validate_user_signup');
135 add_action('signup_hidden_fields', 'c_ws_plugin__s2member_registrations::ms_process_signup_hidden_fields');
136 add_filter('registration_errors', 'c_ws_plugin__s2member_registrations::ms_register_existing_user', 11, 3);
137 add_filter('wpmu_signup_user_notification_email', 'c_ws_plugin__s2member_email_configs::ms_nice_email_roles', 11);
138 add_filter('_wpmu_activate_existing_error_', 'c_ws_plugin__s2member_registrations::ms_activate_existing_user', 10, 2);
139 add_action('wpmu_activate_user', 'c_ws_plugin__s2member_registrations::configure_user_on_ms_user_activation', 10, 3);
140 add_action('wpmu_activate_blog', 'c_ws_plugin__s2member_registrations::configure_user_on_ms_blog_activation', 10, 5);
141 add_action('signup_extra_fields', 'c_ws_plugin__s2member_custom_reg_fields::ms_custom_registration_fields');
142
143 add_action('plugins_loaded', 'c_ws_plugin__s2member_custom_reg_fields::add_filters_get_user_option', 1);
144
145 add_action('bp_after_signup_profile_fields', 'c_ws_plugin__s2member_custom_reg_fields_4bp::custom_registration_fields_4bp');
146 add_action('bp_signup_validate', 'c_ws_plugin__s2member_registrations::custom_registration_field_errors_4bp');
147 add_action('bp_after_profile_field_content', 'c_ws_plugin__s2member_custom_reg_fields_4bp::custom_profile_fields_4bp');
148 add_action('bp_profile_field_item', 'c_ws_plugin__s2member_custom_reg_fields_4bp::custom_profile_field_items_4bp');
149 add_action('xprofile_updated_profile', 'c_ws_plugin__s2member_profile_mods_4bp::handle_profile_modifications_4bp', 1000);
150
151 add_action('wp_login', 'c_ws_plugin__s2member_login_redirects::login_redirect', 10, 2);
152 add_action('login_head', 'c_ws_plugin__s2member_login_customizations::login_header_styles');
153 add_filter('login_headerurl', 'c_ws_plugin__s2member_login_customizations::login_header_url');
154 add_filter('login_headertext', 'c_ws_plugin__s2member_login_customizations::login_header_title');
155 add_action('login_footer', 'c_ws_plugin__s2member_login_customizations::login_footer_design');
156 add_filter("lostpassword_url", "c_ws_plugin__s2member_login_customizations::lost_password_url", 10, 2);
157
158 add_action('login_footer', 'c_ws_plugin__s2member_tracking_codes::display_signup_tracking_codes');
159 add_action('wp_footer', 'c_ws_plugin__s2member_tracking_codes::display_signup_tracking_codes');
160
161 add_action('login_footer', 'c_ws_plugin__s2member_tracking_codes::display_modification_tracking_codes');
162 add_action('wp_footer', 'c_ws_plugin__s2member_tracking_codes::display_modification_tracking_codes');
163
164 add_action('login_footer', 'c_ws_plugin__s2member_tracking_codes::display_ccap_tracking_codes');
165 add_action('wp_footer', 'c_ws_plugin__s2member_tracking_codes::display_ccap_tracking_codes');
166
167 add_action('login_footer', 'c_ws_plugin__s2member_tracking_codes::display_sp_tracking_codes');
168 add_action('wp_footer', 'c_ws_plugin__s2member_tracking_codes::display_sp_tracking_codes');
169
170 add_action('wp_footer', 'c_ws_plugin__s2member_wp_footer::wp_footer_code');
171
172 add_action('admin_init', 'c_ws_plugin__s2member_admin_lockouts::admin_lockout', 1);
173 add_action('admin_init', 'c_ws_plugin__s2member_check_activation::check');
174
175 add_action('load-settings.php', 'c_ws_plugin__s2member_op_notices::multisite_ops_notice');
176 add_action('load-options-general.php', 'c_ws_plugin__s2member_op_notices::general_ops_notice');
177 add_action('load-options-reading.php', 'c_ws_plugin__s2member_op_notices::reading_ops_notice');
178 add_action('load-user-new.php', 'c_ws_plugin__s2member_user_new::admin_user_new_fields');
179
180 add_action('add_meta_boxes', 'c_ws_plugin__s2member_meta_boxes::add_meta_boxes');
181 add_action('save_post', 'c_ws_plugin__s2member_meta_box_saves::save_meta_boxes');
182 add_action('admin_menu', 'c_ws_plugin__s2member_menu_pages::add_admin_options');
183 add_action('network_admin_menu', 'c_ws_plugin__s2member_menu_pages::add_network_admin_options');
184 add_action('admin_bar_menu', 'c_ws_plugin__s2member_admin_lockouts::filter_admin_menu_bar', 100);
185 add_action('admin_print_scripts', 'c_ws_plugin__s2member_menu_pages::add_admin_scripts');
186 add_action('admin_print_styles', 'c_ws_plugin__s2member_menu_pages::add_admin_styles');
187 add_action('admin_menu', 'c_ws_plugin__s2member_menu_pages::get_help_panel', 12); //250824
188
189 //260813 Warn administrators when shortcodes request user fields that have not been explicitly approved.
190 add_action('admin_init', 'c_ws_plugin__s2member_admin_notices::dismiss_shortcode_user_fields_notice');
191 add_action('admin_notices', 'c_ws_plugin__s2member_admin_notices::shortcode_user_fields_notice', 11);
192
193 //260820.0149 Escalate materially unhealthy Auto-EOT processing beyond its settings panel.
194 add_action('admin_notices', 'c_ws_plugin__s2member_auto_eots::auto_eot_system_admin_notice', 12);
195 add_action('user_admin_notices', 'c_ws_plugin__s2member_auto_eots::auto_eot_system_admin_notice', 12);
196 add_action('network_admin_notices', 'c_ws_plugin__s2member_auto_eots::auto_eot_system_admin_notice', 12);
197
198 add_action('admin_notices', 'c_ws_plugin__s2member_admin_notices::admin_notices');
199 add_action('user_admin_notices', 'c_ws_plugin__s2member_admin_notices::admin_notices');
200 add_action('network_admin_notices', 'c_ws_plugin__s2member_admin_notices::admin_notices');
201
202 add_action('pre_user_query', 'c_ws_plugin__s2member_users_list::users_list_query');
203 add_filter('views_users', 'c_ws_plugin__s2member_users_list::users_list_views'); //260828.0231 Reuse WordPress' native Users views for separate Current and Previous End-of-Term reports.
204 add_filter('manage_users_columns', 'c_ws_plugin__s2member_users_list::users_list_cols');
205 add_filter('manage_users_columns', 'c_ws_plugin__s2member_users_list::users_list_required_eot_cols', PHP_INT_MAX); //260828.0231 Preserve each EOT review view's required columns after Users-table customization plugins apply saved layouts.
206 add_filter('default_hidden_columns', 'c_ws_plugin__s2member_users_list::users_list_default_hidden_cols', 10, 2); //260822.1509 Keep optional EOT history columns available without widening the normal Users table by default.
207 add_filter('hidden_columns', 'c_ws_plugin__s2member_users_list::users_list_hidden_cols', PHP_INT_MAX, 2); //260828.0231 Enforce each EOT review view's primary timestamps after other plugins filter Screen Options; normal Users views remain untouched.
208 add_filter('manage_users_custom_column', 'c_ws_plugin__s2member_users_list::users_list_display_cols', 10, 3);
209 add_filter('manage_users_sortable_columns', 'c_ws_plugin__s2member_users_list::users_list_add_sortable');
210 add_filter('pre_user_query', 'c_ws_plugin__s2member_users_list::users_list_make_sortable');
211 add_action('admin_notices', 'c_ws_plugin__s2member_users_list::users_list_eot_notice', 13); //260828.0231 Explain the Current and Previous End-of-Term reports directly on their Users views.
212 add_action('admin_notices', 'c_ws_plugin__s2member_users_list::users_list_pending_deletion_notice', 13); //260822.1519 Explain the native Pending Deletion review queue directly on that role-filtered Users page.
213 add_action('edit_user_profile', 'c_ws_plugin__s2member_users_list::users_list_edit_cols');
214 add_action('show_user_profile', 'c_ws_plugin__s2member_users_list::users_list_edit_cols');
215 add_action('edit_user_profile_update', 'c_ws_plugin__s2member_users_list::users_list_update_cols');
216 add_action('personal_options_update', 'c_ws_plugin__s2member_users_list::users_list_update_cols');
217 add_action('set_user_role', 'c_ws_plugin__s2member_registration_times::synchronize_paid_reg_times', 10, 2);
218 add_filter('show_password_fields', 'c_ws_plugin__s2member_user_securities::hide_password_fields', 10, 2);
219
220 add_action('add_user_meta', 'c_ws_plugin__s2member_access_cap_times::get_user_caps_before_update_on_add', 10, 3);
221 add_action('update_user_meta', 'c_ws_plugin__s2member_access_cap_times::get_user_caps_before_update', 10, 4);
222
223 add_action('added_user_meta', 'c_ws_plugin__s2member_access_cap_times::log_access_cap_times', 10, 4);
224 add_action('updated_user_meta', 'c_ws_plugin__s2member_access_cap_times::log_access_cap_times', 10, 4);
225 add_action('deleted_user_meta', 'c_ws_plugin__s2member_access_cap_times::log_access_cap_times_on_delete', 10, 3);
226
227 add_filter('cron_schedules', 'c_ws_plugin__s2member_cron_jobs::extend_cron_schedules');
228 add_action('ws_plugin__s2member_auto_eot_system__schedule', 'c_ws_plugin__s2member_auto_eots::auto_eot_system');
229 //260820.0056 Keep catch-up work on a separate one-off hook so it can process only overdue EOTs without repeatedly invoking collective Pro cron consumers.
230 add_action('ws_plugin__s2member_auto_eot_system__continuation', 'c_ws_plugin__s2member_auto_eots::auto_eot_system_continuation');
231 add_action('ws_plugin__s2member_eot_processed_time_backfill', 'c_ws_plugin__s2member_auto_eots::backfill_eot_processed_times'); //260822.2048 Recover historical EOT processing times from legacy Administrative Notes after upgrade.
232 //260819.0613 Repair a missing recurring Auto-EOT event during normal requests, and immediately after an EOT run if WordPress failed to reschedule it.
233 add_action('init', 'c_ws_plugin__s2member_auto_eots::ensure_auto_eot_system', 3);
234 add_action('init', 'c_ws_plugin__s2member_auto_eots::ensure_eot_processed_time_backfill', 4); //260822.2048 Self-heal only while the temporary upgrade backfill cursor exists.
235 add_action('ws_plugin__s2member_after_auto_eot_system', 'c_ws_plugin__s2member_auto_eots::ensure_auto_eot_system', 999);
236
237 add_action('wp_ajax_ws_plugin__s2member_update_roles_via_ajax', 'c_ws_plugin__s2member_roles_caps::update_roles_via_ajax');
238
239 add_action('wp_ajax_ws_plugin__s2member_sp_access_link_via_ajax', 'c_ws_plugin__s2member_sp_access::sp_access_link_via_ajax');
240 add_action('wp_ajax_ws_plugin__s2member_reg_access_link_via_ajax', 'c_ws_plugin__s2member_register_access::reg_access_link_via_ajax');
241
242 add_action('wp_ajax_ws_plugin__s2member_delete_reset_all_ip_restrictions_via_ajax', 'c_ws_plugin__s2member_ip_restrictions::delete_reset_all_ip_restrictions_via_ajax');
243 add_action('wp_ajax_ws_plugin__s2member_delete_reset_specific_ip_restrictions_via_ajax', 'c_ws_plugin__s2member_ip_restrictions::delete_reset_specific_ip_restrictions_via_ajax');
244
245 add_action('ws_plugin__s2member_during_collective_mods', 'c_ws_plugin__s2member_list_servers::auto_process_list_server_removals', 10, 7);
246 add_action('ws_plugin__s2member_during_collective_eots', 'c_ws_plugin__s2member_list_servers::auto_process_list_server_removals', 10, 4);
247
248 add_action('init', 'c_ws_plugin__s2member_utils_urls::short_link_redirect', 1); //260612
249
250 add_filter('ws_plugin__s2member_content_redirect_status', 'c_ws_plugin__s2member_utils_urls::redirect_browsers_using_302_status');
251
252 add_filter('bbp_get_caps_for_role', 'c_ws_plugin__s2member_roles_caps::bbp_dynamic_role_caps', 10, 2);
253 add_action('bbp_activation', 'c_ws_plugin__s2member_roles_caps::config_roles', 11);
254
255 add_action('http_api_debug', 'c_ws_plugin__s2member_utils_logs::http_api_debug', 1000, 5);
256
257 add_action('plugins_loaded', 'c_ws_plugin__s2member_mo_page::back_compat_mop_vars', -(PHP_INT_MAX - 10));
258
259 remove_filter('the_content', 'wptexturize'); // Bug fix; see: <https://github.com/websharks/s2member/issues/349>
260 // See also, this WP core bug report for further details: <https://core.trac.wordpress.org/ticket/29608>
261 /*
262 Register the activation | de-activation routines.
263 */
264 register_activation_hook($GLOBALS['WS_PLUGIN__']['s2member']['c']['plugin_basename'], 'c_ws_plugin__s2member_installation::activate');
265 register_deactivation_hook($GLOBALS['WS_PLUGIN__']['s2member']['c']['plugin_basename'], 'c_ws_plugin__s2member_installation::deactivate');
266 register_uninstall_hook($GLOBALS['WS_PLUGIN__']['s2member']['c']['plugin_basename'], 'c_ws_plugin__s2member_installation::uninstall');
267 //221024 Now that Pro add-on doesn't have to match Framework's version to remain active, it's safer to auto-update Framework.
268 // add_filter('auto_update_plugin', 'c_ws_plugin__s2member_installation::auto_update_filter', PHP_INT_MAX-10, 2); // Disallow s2Member update.
269