@@ -309,48 +309,68 @@ public function process_membership_after_registration( $success_params, $valid_f
309309 }
310310
311311 // Validate that the submitted membership ID is one the form is actually configured to offer.
312- // This prevents an attacker from supplying an off-form tier (e.g. Administrator-role) in members_data.
313- if ( $ membership_field_data ) {
314- $ listing_option = isset ( $ membership_field_data ->general_setting ->membership_listing_option )
315- ? $ membership_field_data ->general_setting ->membership_listing_option
316- : 'all ' ;
317- $ allowed_membership_ids = array ();
318-
319- if ( 'group ' === $ listing_option ) {
320- $ group_id = isset ( $ membership_field_data ->general_setting ->membership_group )
321- ? absint ( $ membership_field_data ->general_setting ->membership_group )
322- : 0 ;
323- if ( $ group_id ) {
324- $ group_service = new MembershipGroupService ();
325- $ group_memberships = $ group_service ->get_group_memberships ( $ group_id );
326- foreach ( $ group_memberships as $ m ) {
327- $ id = isset ( $ m ['ID ' ] ) ? (int ) $ m ['ID ' ] : ( isset ( $ m ['id ' ] ) ? (int ) $ m ['id ' ] : 0 );
328- if ( $ id ) {
329- $ allowed_membership_ids [] = $ id ;
312+ // Read field config from the stored form definition (post_content), not the runtime
313+ // submission object — submission objects do not carry general_setting at this point.
314+ $ stored_membership_config = null ;
315+ $ form_post = get_post ( absint ( $ form_id ) );
316+ if ( $ form_post && ! empty ( $ form_post ->post_content ) ) {
317+ $ form_rows = json_decode ( $ form_post ->post_content );
318+ foreach ( (array ) $ form_rows as $ row ) {
319+ foreach ( (array ) $ row as $ grid ) {
320+ foreach ( (array ) $ grid as $ field ) {
321+ if ( isset ( $ field ->field_key ) && 'membership ' === $ field ->field_key ) {
322+ $ stored_membership_config = $ field ;
323+ break 3 ;
330324 }
331325 }
332326 }
333- } elseif ( 'selected ' === $ listing_option ) {
334- $ selected_ids = isset ( $ membership_field_data ->general_setting ->membership_active_memberships )
335- ? $ membership_field_data ->general_setting ->membership_active_memberships
336- : array ();
337- $ selected_ids = is_array ( $ selected_ids ) ? $ selected_ids : (array ) maybe_unserialize ( $ selected_ids );
338- $ allowed_membership_ids = array_values ( array_filter ( array_map ( 'absint ' , $ selected_ids ) ) );
339- } else {
340- $ membership_service_temp = new MembershipService ();
341- foreach ( $ membership_service_temp ->list_active_memberships () as $ m ) {
327+ }
328+ }
329+
330+ if ( ! $ stored_membership_config ) {
331+ wp_delete_user ( absint ( $ member_id ) );
332+ wp_send_json_error ( array ( 'message ' => esc_html__ ( 'Invalid membership selection. ' , 'user-registration ' ) ) );
333+ }
334+
335+ $ listing_option = isset ( $ stored_membership_config ->general_setting ->membership_listing_option )
336+ ? $ stored_membership_config ->general_setting ->membership_listing_option
337+ : 'all ' ;
338+ $ allowed_membership_ids = array ();
339+
340+ if ( 'group ' === $ listing_option ) {
341+ $ group_id = isset ( $ stored_membership_config ->general_setting ->membership_group )
342+ ? absint ( $ stored_membership_config ->general_setting ->membership_group )
343+ : 0 ;
344+ if ( $ group_id ) {
345+ $ group_service = new MembershipGroupService ();
346+ $ group_memberships = $ group_service ->get_group_memberships ( $ group_id );
347+ foreach ( $ group_memberships as $ m ) {
342348 $ id = isset ( $ m ['ID ' ] ) ? (int ) $ m ['ID ' ] : ( isset ( $ m ['id ' ] ) ? (int ) $ m ['id ' ] : 0 );
343349 if ( $ id ) {
344350 $ allowed_membership_ids [] = $ id ;
345351 }
346352 }
347353 }
348-
349- if ( empty ( $ allowed_membership_ids ) || ! in_array ( absint ( $ data ['membership ' ] ), $ allowed_membership_ids , true ) ) {
350- wp_delete_user ( absint ( $ member_id ) );
351- wp_send_json_error ( array ( 'message ' => esc_html__ ( 'Invalid membership selection. ' , 'user-registration ' ) ) );
354+ } elseif ( 'selected ' === $ listing_option ) {
355+ $ selected_ids = isset ( $ stored_membership_config ->general_setting ->membership_active_memberships )
356+ ? $ stored_membership_config ->general_setting ->membership_active_memberships
357+ : array ();
358+ $ selected_ids = is_array ( $ selected_ids ) ? $ selected_ids : (array ) maybe_unserialize ( $ selected_ids );
359+ $ allowed_membership_ids = array_values ( array_filter ( array_map ( 'absint ' , $ selected_ids ) ) );
360+ } else {
361+ $ membership_service_temp = new MembershipService ();
362+ foreach ( $ membership_service_temp ->list_active_memberships () as $ m ) {
363+ $ id = isset ( $ m ['ID ' ] ) ? (int ) $ m ['ID ' ] : ( isset ( $ m ['id ' ] ) ? (int ) $ m ['id ' ] : 0 );
364+ if ( $ id ) {
365+ $ allowed_membership_ids [] = $ id ;
366+ }
352367 }
353368 }
369+
370+ if ( empty ( $ allowed_membership_ids ) || ! in_array ( absint ( $ data ['membership ' ] ), $ allowed_membership_ids , true ) ) {
371+ wp_delete_user ( absint ( $ member_id ) );
372+ wp_send_json_error ( array ( 'message ' => esc_html__ ( 'Invalid membership selection. ' , 'user-registration ' ) ) );
373+ }
354374 $ data ['username ' ] = $ member ->user_login ;
355375 $ data ['email ' ] = $ member ->user_email ;
356376
0 commit comments