Inconsistent 2FA enforcement for subgroups
## Summary
There's an inconsistency between turning on 2FA for a group vs adding a new group member.
* Turning on 2FA for a group only considers direct members while adding a new group member will consider 2FA requirement from the whole group hierarchy, both approaches are wrong.
* Turning on 2FA for a group in `Group#update_two_factor_requirement` should propagate to subgroups.
* Adding a new group member in `User#expanded_groups_requiring_two_factor_authentication` should only consider ancestors, not subgroups.
## Steps to reproduce (Bottom-up Propagation)
1. **Create a group hierarchy**:
* Create a **top-level group (Group A)**.
* Create a **subgroup (Group B)** under **Group A**.
2. **Set up 2FA for Group B**:
* Go to **Group B**'s settings and enable `require_two_factor_authentication`.
3. **Add a new user to Group A** (the parent group).
* Sign in with new user belonging to **top-level group (Group A)**
* Observe the 2FA requirement propagation behaviour from **subgroup (Group B)**, the which forces 2FA requirement on the new user
* The user should **not inherit the 2FA requirement** from **Group B** (the subgroup)
## Example Spec
The following spec is currently failing:
```ruby
it 'does not enable 2FA for ancestor group member' do
ancestor_group = create(:group)
group.update!(require_two_factor_authentication: true, parent: ancestor_group)
expect { ancestor_group.add_user(user, GroupMember::OWNER) }.not_to change { user.reload.require_two_factor_authentication_from_group }.from(false)
end
```
## Current Behaviour
If **subgroup (Group B)** has 2FA enabled and **top-level group (Group A)** does not, a new user added to Group A still inherits Group B's 2FA requirement due to the current [subgroup membership inheritance](https://docs.gitlab.com/ee/user/group/subgroups/#subgroup-membership) works.
## Expected Behaviour
When adding a new member to the **top-level group (Group A)**, the 2FA enforcement should only consider **top-level group (Group A) and its ancestors**. The user should **not inherit** the 2FA requirement from subgroups like **Group B**.
## Relevant Context
Fixing `Group#update_two_factor_requirement` is already tackled by https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/24965, we should also fix `User#expanded_groups_requiring_two_factor_authentication` and create a background migration to update 2FA requirement for all users.
/cc @jeremy @tkuah
## Related Support Tickets (internal)
1. https://gitlab.zendesk.com/agent/tickets/141403
2. https://gitlab.zendesk.com/agent/tickets/155201
issue