add option to suppress platform admin temporarily

so that platform admins (us) can view pages as regular users do easily.
Simply adds a flag in the session cookie that overrides the actual
platform admin flag on the user model if set. This way it's safe, since
this only downgrades existing functionality, so if someone managed to
alter it they could only get less permissions, not more.

You can change this value from the user profile page if either:

* you're a platform admin
* the flag is set (to any value) on the cookie.

This slightly weird check means that we don't check the underlying
`user._platform_admin` flag anywhere in the code, even when toggling
the suppression.
This commit is contained in:
Leo Hemsted
2019-06-13 19:00:17 +01:00
parent c7325576d6
commit 7b02cb72c6
7 changed files with 147 additions and 4 deletions

View File

@@ -14,6 +14,18 @@ def test_should_show_overview_page(
):
page = client_request.get(('main.user_profile'))
assert page.select_one('h1').text.strip() == 'Your profile'
assert 'Suppress Platform Admin' not in page
def test_overview_page_shows_suppress_for_platform_admin(
client_request,
platform_admin_user
):
client_request.login(platform_admin_user)
page = client_request.get(('main.user_profile'))
assert page.select_one('h1').text.strip() == 'Your profile'
suppress_platform_admin_row = page.select('tr')[-1]
assert ' '.join(suppress_platform_admin_row.text.split()) == 'Suppress Platform Admin Off Change'
def test_should_show_name_page(
@@ -264,3 +276,49 @@ def test_non_gov_user_cannot_access_change_email_page(
):
client_request.login(api_nongov_user_active)
client_request.get('main.user_profile_email', _expected_status=403)
def test_normal_user_doesnt_see_suppress_platform_admin(client_request):
client_request.get('main.user_profile_suppress_platform_admin', _expected_status=403)
def test_platform_admin_can_see_suppress_platform_admin_page(client_request, platform_admin_user):
client_request.login(platform_admin_user)
page = client_request.get('main.user_profile_suppress_platform_admin')
assert page.select_one('h1').text.strip() == 'Suppress platform admin'
assert page.select_one('input[checked]')['value'] == 'False'
def test_can_suppress_platform_admin(client_request, platform_admin_user):
client_request.login(platform_admin_user)
with client_request.session_transaction() as session:
assert 'suppress_platform_admin' not in session
client_request.post(
'main.user_profile_suppress_platform_admin',
_data={'enabled': True},
_expected_status=302,
_expected_redirect=url_for('main.user_profile', _external=True),
)
with client_request.session_transaction() as session:
assert session['suppress_platform_admin'] is True
def test_can_turn_off_suppress_platform_admin(client_request, platform_admin_user):
client_request.login(platform_admin_user)
with client_request.session_transaction() as session:
session['suppress_platform_admin'] = True
client_request.post(
'main.user_profile_suppress_platform_admin',
_data={'enabled': False},
_expected_status=302,
_expected_redirect=url_for('main.user_profile', _external=True),
)
with client_request.session_transaction() as session:
assert session['suppress_platform_admin'] is False

View File

@@ -9,7 +9,8 @@ def test_user(app_):
'email_address': 'test@user.gov.uk',
'mobile_number': '+4412341234',
'state': 'pending',
'failed_login_count': 0
'failed_login_count': 0,
'platform_admin': False,
}
user = User(user_data)
@@ -40,3 +41,21 @@ def test_activate_user(app_, api_user_pending, mock_activate_user):
def test_activate_user_already_active(app_, api_user_active, mock_activate_user):
assert User(api_user_active).activate() == User(api_user_active)
assert mock_activate_user.called is False
@pytest.mark.parametrize('is_platform_admin, value_in_session, expected_result', [
(True, True, False),
(True, False, True),
(True, None, True),
(False, True, False),
(False, False, False),
(False, None, False),
])
def test_platform_admin_checks_flag_set_in_session(client, mocker, is_platform_admin, value_in_session, expected_result):
session_dict = {}
if value_in_session is not None:
session_dict['suppress_platform_admin'] = value_in_session
mocker.patch.dict('app.models.user.session', values=session_dict, clear=True)
assert User({'platform_admin': is_platform_admin}).platform_admin == expected_result