diff --git a/client/src/components/redesign/ApiKeys.jsx b/client/src/components/redesign/ApiKeys.jsx index f4b8574f7..9d0607606 100644 --- a/client/src/components/redesign/ApiKeys.jsx +++ b/client/src/components/redesign/ApiKeys.jsx @@ -164,11 +164,6 @@ class ApiKeys extends React.Component { header: I18n.t("models.userTokens.createdAt"), mapper: apiKey => dateFromEpoch(apiKey.created_at) }, - { - key: "created_at", - header: I18n.t("models.userTokens.createdAt"), - mapper: apiKey => dateFromEpoch(apiKey.created_at) - }, { nonSortable: true, key: "trash", diff --git a/client/src/locale/en.js b/client/src/locale/en.js index 11d660a13..1bb9aaa74 100644 --- a/client/src/locale/en.js +++ b/client/src/locale/en.js @@ -1379,7 +1379,7 @@ const en = { }, }, apiKeys: { - title: "Create an organisation API tokenĀ for {{organisation}}", + title: "Create an organisation API token for {{organisation}}", info: "An organisation API token is required to use the Application Programmer Interface (API).", backToOrganisationDetail: "Back to my organisation {{name}}", secretDisclaimer: "You can view this organisation API token only once. Copy it and store it somewhere safe.

If the token is lost, delete it and create a new one.", diff --git a/server/api/pam_websso.py b/server/api/pam_websso.py index d018359f3..b0a1e55f0 100644 --- a/server/api/pam_websso.py +++ b/server/api/pam_websso.py @@ -1,10 +1,9 @@ import io -import json import random import string import uuid from datetime import datetime, timedelta -from collections import OrderedDict + import qrcode from flasgger import swag_from from flask import Blueprint, request as current_request, current_app, session @@ -16,7 +15,7 @@ from server.auth.tokens import validate_service_token from server.db.db import db from server.db.defaults import PAM_WEB_LOGIN, SERVICE_TOKEN_PAM -from server.db.domain import User, PamSSOSession +from server.db.domain import User, PamSSOSession, Service, CollaborationMembership from server.db.models import log_user_login, flatten from server.logger.context_logger import ctx_logger @@ -48,9 +47,12 @@ def _validate_pam_sso_session(pam_sso_session: PamSSOSession, pin, validate_pin, if validate_pin and pam_sso_session.pin != pin: return {"result": "FAIL", "info": "Incorrect pin"} - groups = {m.collaboration.short_name: m.collaboration.name for m in user.collaboration_memberships if - service in m.collaboration.services or service in m.collaboration.organisation.services} - sorted_groups = OrderedDict(sorted(groups.items(), key=lambda x: x[1].casefold(), reverse=False)) + def include_service(s: Service, m: CollaborationMembership): + return s in m.collaboration.services or s in m.collaboration.organisation.services + + groups = [{"short_name": m.collaboration.short_name, "name": m.collaboration.name} for m in + user.collaboration_memberships if include_service(service, m)] + sorted_groups = sorted(groups, key=lambda group: group["name"].lower()) return {"result": "SUCCESS", "username": user.username, "groups": sorted_groups, @@ -191,9 +193,8 @@ def check_pin(): log_user_login(PAM_WEB_LOGIN, success, user, user.uid, service, service.entity_id, status=validation["result"]) logger.debug(f"PamWebSSO check-pin for service {service.name} for user {user.uid} with result {validation}") - # We need to preserve the ordering of the groups dict, soo we dump the validation here - json_res = json.dumps(validation) - return json_res, 201 + + return validation, 201 @pam_websso_api.route("/ssh_keys", methods=["GET"], strict_slashes=False) diff --git a/server/test/abstract_test.py b/server/test/abstract_test.py index 79bf3dbfd..e1d6c7254 100644 --- a/server/test/abstract_test.py +++ b/server/test/abstract_test.py @@ -129,20 +129,19 @@ def get(self, url, query_data={}, response_status_code=200, with_basic_auth=True self.assertEqual(response.headers.get(key), value) return response if response_status_code == 302 else response.json if hasattr(response, "json") else None - def post(self, url, body={}, headers={}, response_status_code=201, with_basic_auth=True, result_to_json=False): - return self._do_call(body, self.client.post, headers, response_status_code, url, with_basic_auth, - result_to_json) + def post(self, url, body={}, headers={}, response_status_code=201, with_basic_auth=True): + return self._do_call(body, self.client.post, headers, response_status_code, url, with_basic_auth) - def put(self, url, body={}, headers={}, response_status_code=201, with_basic_auth=True, result_to_json=False): - return self._do_call(body, self.client.put, headers, response_status_code, url, with_basic_auth, result_to_json) + def put(self, url, body={}, headers={}, response_status_code=201, with_basic_auth=True): + return self._do_call(body, self.client.put, headers, response_status_code, url, with_basic_auth) - def _do_call(self, body, call, headers, response_status_code, url, with_basic_auth, result_to_json): + def _do_call(self, body, call, headers, response_status_code, url, with_basic_auth): with requests.Session(): response = call(url, headers={**BASIC_AUTH_HEADER, **headers} if with_basic_auth else headers, data=json.dumps(body), content_type="application/json") self.assertEqual(response_status_code, response.status_code, msg=str(response.json)) - return json.loads(response.json) if result_to_json else response.json + return response.json def delete(self, url, primary_key=None, with_basic_auth=True, response_status_code=204, headers={}): primary_key_part = f"/{primary_key}" if primary_key else "" diff --git a/server/test/api/test_pam_websso.py b/server/test/api/test_pam_websso.py index e6d444233..d05fb4319 100644 --- a/server/test/api/test_pam_websso.py +++ b/server/test/api/test_pam_websso.py @@ -142,8 +142,7 @@ def test_check_pin_success(self): body={"session_id": pam_session_id, "pin": "1234"}, with_basic_auth=False, - headers={"Authorization": f"bearer {service_storage_token}"}, - result_to_json=True) + headers={"Authorization": f"bearer {service_storage_token}"}) self.assertEqual("SUCCESS", res["result"]) self.assertEqual("peter", res["username"]) self.assertEqual(1, len(res["groups"])) @@ -164,8 +163,7 @@ def test_check_pin_wrong_pin(self): body={"session_id": pam_session_id, "pin": "nope"}, with_basic_auth=False, - headers={"Authorization": f"bearer {service_storage_token}"}, - result_to_json=True) + headers={"Authorization": f"bearer {service_storage_token}"}) self.assertEqual("FAIL", res["result"]) def test_check_pin_time_out(self): @@ -205,7 +203,6 @@ def test_anonymous_pam_websso_login_flow(self): body={"session_id": pam_session_id, "pin": pin}, with_basic_auth=False, - headers={"Authorization": f"bearer {service_storage_token}"}, - result_to_json=True) + headers={"Authorization": f"bearer {service_storage_token}"}) self.assertEqual("SUCCESS", res["result"]) self.assertEqual("peter", res["username"])