diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 906aecb3..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "python.pythonPath": "/root/venvs/datagateway-api-36/bin/python" -} \ No newline at end of file diff --git a/common/backend.py b/common/backend.py index acbbf1b0..dbe31edd 100644 --- a/common/backend.py +++ b/common/backend.py @@ -10,7 +10,7 @@ class Backend(ABC): def login(self, credentials): """ Attempt to log a user in using the provided credentials - :param credentials: The user's credentials + :param credentials: The user's credentials (including mechanism) :returns: a session ID """ pass diff --git a/common/config.py b/common/config.py index 53643c1b..58319f3a 100644 --- a/common/config.py +++ b/common/config.py @@ -24,6 +24,12 @@ def get_db_url(self): except: sys.exit("Missing config value, DB_URL") + def get_icat_url(self): + try: + return self.config["ICAT_URL"] + except: + sys.exit("Missing config value, ICAT_URL") + def get_log_level(self): try: return self.config["log_level"] diff --git a/common/database_backend.py b/common/database_backend.py index bb434f4d..acb331cb 100644 --- a/common/database_backend.py +++ b/common/database_backend.py @@ -9,6 +9,8 @@ from common.exceptions import AuthenticationError import datetime +import logging +log = logging.getLogger() class DatabaseBackend(Backend): """ @@ -18,7 +20,7 @@ class DatabaseBackend(Backend): def login(self, credentials): if credentials["username"] == "user" and credentials["password"] == "password": session_id = str(uuid.uuid1()) - insert_row_into_table(SESSION, SESSION(ID=session_id, USERNAME="simple/root", + insert_row_into_table(SESSION, SESSION(ID=session_id, USERNAME=f"{credentials['mechanism']}/root", EXPIREDATETIME=datetime.datetime.now() + datetime.timedelta(days=1))) return session_id else: diff --git a/common/python_icat_backend.py b/common/python_icat_backend.py index 96935d0e..46df3b97 100644 --- a/common/python_icat_backend.py +++ b/common/python_icat_backend.py @@ -1,15 +1,32 @@ +import logging + +import icat.client +from icat.exception import ICATSessionError + from common.backend import Backend -from common.helpers import requires_session_id, queries_records -#from common.python_icat_helpers import +from common.helpers import queries_records, requires_session_id +from common.config import config +from common.exceptions import AuthenticationError +from common.models.db_models import SESSION +log = logging.getLogger() class PythonICATBackend(Backend): """ Class that contains functions to access and modify data in an ICAT database directly """ - def login(self, credentials, mnemonic): - pass + def login(self, credentials): + icat_server_url = config.get_icat_url() + client = icat.client.Client(icat_server_url, checkCert=False) + # Syntax for Python ICAT + login_details = {'username': credentials['username'], 'password': credentials['password']} + + try: + session_id = client.login(credentials["mechanism"], login_details) + return session_id + except ICATSessionError: + raise AuthenticationError("User credentials are incorrect") @requires_session_id def get_session_details(self, session_id): @@ -86,4 +103,3 @@ def get_instrument_facilitycycle_investigations_with_filters(self, session_id, i def count_instrument_facilitycycles_investigations_with_filters(self, session_id, instrument_id, facilitycycle_id, filters): pass #return get_investigations_for_instrument_in_facility_cycle_count(instrument_id, facilitycycle_id, filters) - diff --git a/config.json.example b/config.json.example index 391d78d3..2a7154b8 100644 --- a/config.json.example +++ b/config.json.example @@ -1,6 +1,7 @@ { "backend": "db", "DB_URL": "mysql+pymysql://root:rootpw@localhost:13306/icatdb", + "ICAT_URL": "https://localhost.localdomain:8181", "log_level": "WARN", "debug_mode": false, "generate_swagger": false, diff --git a/src/resources/non_entities/sessions_endpoints.py b/src/resources/non_entities/sessions_endpoints.py index 1142e31e..ba6e24fd 100644 --- a/src/resources/non_entities/sessions_endpoints.py +++ b/src/resources/non_entities/sessions_endpoints.py @@ -54,6 +54,9 @@ def post(self): """ if not (request.data and "username" in request.json and "password" in request.json): return "Bad request", 400 + # If no mechanism is present in request body, default to simple + if not ("mechanism" in request.json): + request.json["mechanism"] = "simple" try: return {"sessionID": backend.login(request.json)}, 201 except AuthenticationError: