From 30d354d9994b49d0835455c4da1234f1db927535 Mon Sep 17 00:00:00 2001 From: "clement.hector" Date: Wed, 7 Jul 2021 15:35:45 +0200 Subject: [PATCH] Refecto credential from ftrack module to shotgrid module --- openpype/modules/shotgrid/lib/credentials.py | 93 ++++++++++--------- .../modules/shotgrid/lib/credentials_test.py | 11 +++ 2 files changed, 59 insertions(+), 45 deletions(-) create mode 100644 openpype/tests/modules/shotgrid/lib/credentials_test.py diff --git a/openpype/modules/shotgrid/lib/credentials.py b/openpype/modules/shotgrid/lib/credentials.py index b20f23c80e4..26d8902a210 100644 --- a/openpype/modules/shotgrid/lib/credentials.py +++ b/openpype/modules/shotgrid/lib/credentials.py @@ -1,5 +1,6 @@ -import os import shotgun_api3 +from typing import AnyStr, Dict, Any +from shotgun_api3.shotgun import AuthenticationFault try: from urllib.parse import urlparse @@ -9,93 +10,95 @@ from openpype.lib import OpenPypeSecureRegistry -USERNAME_KEY = "login" -API_KEY_KEY = "password" +_LOGIN_NAME = "login" +_PASSWORD_NAME = "password" -def get_shotgrid_hostname(shotgrid_server=None): - if not shotgrid_server: - shotgrid_server = os.environ.get("SHOTGRID_SERVER") +def get_shotgrid_hostname(shotgrid_url: AnyStr) -> AnyStr: - if not shotgrid_server: - return None + if not shotgrid_url: + raise Exception("Shotgrid url cannot be a null") - if "//" not in shotgrid_server: - shotgrid_server = "//" + shotgrid_server + valid_shotgrid_url = ( + f"//{shotgrid_url}" if "//" not in shotgrid_url else shotgrid_url + ) - return urlparse(shotgrid_server).hostname + return urlparse(valid_shotgrid_url).hostname -def _get_shotgrid_secure_key(hostname, key): +def _get_shotgrid_secure_key(hostname: AnyStr, key: AnyStr) -> AnyStr: """Secure item key for entered hostname.""" - return "/".join(("shotgrid", hostname, key)) + return f"shotgrid/{hostname}/{key}" -def get_credentials(shotgrid_server=None): - output = {USERNAME_KEY: None, API_KEY_KEY: None} - hostname = get_shotgrid_hostname(shotgrid_server) +def get_credentials(shotgrid_url: AnyStr) -> Dict[AnyStr, Any]: + output = {_LOGIN_NAME: None, _PASSWORD_NAME: None} + hostname = get_shotgrid_hostname(shotgrid_url) if not hostname: return output - username_name = _get_shotgrid_secure_key(hostname, USERNAME_KEY) - api_key_name = _get_shotgrid_secure_key(hostname, API_KEY_KEY) + username_name = _get_shotgrid_secure_key(hostname, _LOGIN_NAME) + api_key_name = _get_shotgrid_secure_key(hostname, _PASSWORD_NAME) username_registry = OpenPypeSecureRegistry(username_name) api_key_registry = OpenPypeSecureRegistry(api_key_name) - output[USERNAME_KEY] = username_registry.get_item(USERNAME_KEY, None) - output[API_KEY_KEY] = api_key_registry.get_item(API_KEY_KEY, None) + output[_LOGIN_NAME] = username_registry.get_item(_LOGIN_NAME, None) + output[_PASSWORD_NAME] = api_key_registry.get_item(_PASSWORD_NAME, None) return output -def save_credentials(username, api_key, shotgrid_server=None): - hostname = get_shotgrid_hostname(shotgrid_server) - username_name = _get_shotgrid_secure_key(hostname, USERNAME_KEY) - api_key_name = _get_shotgrid_secure_key(hostname, API_KEY_KEY) +def save_credentials(login: AnyStr, password: AnyStr, shotgrid_url: AnyStr): + hostname = get_shotgrid_hostname(shotgrid_url) + login_key = _get_shotgrid_secure_key(hostname, _LOGIN_NAME) + password_key = _get_shotgrid_secure_key(hostname, _PASSWORD_NAME) # Clear credentials - clear_credentials(shotgrid_server) + clear_credentials(shotgrid_url) - username_registry = OpenPypeSecureRegistry(username_name) - api_key_registry = OpenPypeSecureRegistry(api_key_name) + login_registry = OpenPypeSecureRegistry(login_key) + password_registry = OpenPypeSecureRegistry(password_key) - username_registry.set_item(USERNAME_KEY, username) - api_key_registry.set_item(API_KEY_KEY, api_key) + login_registry.set_item(_LOGIN_NAME, login) + password_registry.set_item(_PASSWORD_NAME, password) -def clear_credentials(shotgrid_server=None): - hostname = get_shotgrid_hostname(shotgrid_server) - username_name = _get_shotgrid_secure_key(hostname, USERNAME_KEY) - api_key_name = _get_shotgrid_secure_key(hostname, API_KEY_KEY) +def clear_credentials(shotgrid_url: AnyStr): + hostname = get_shotgrid_hostname(shotgrid_url) + login_key = _get_shotgrid_secure_key(hostname, _LOGIN_NAME) + password_key = _get_shotgrid_secure_key(hostname, _PASSWORD_NAME) - username_registry = OpenPypeSecureRegistry(username_name) - api_key_registry = OpenPypeSecureRegistry(api_key_name) + login_registry = OpenPypeSecureRegistry(login_key) + password_registry = OpenPypeSecureRegistry(password_key) - current_username = username_registry.get_item(USERNAME_KEY, None) - current_api_key = api_key_registry.get_item(API_KEY_KEY, None) + current_username = login_registry.get_item(_LOGIN_NAME, None) + current_api_key = password_registry.get_item(_PASSWORD_NAME, None) if current_username is not None: - username_registry.delete_item(USERNAME_KEY) + login_registry.delete_item(_LOGIN_NAME) if current_api_key is not None: - api_key_registry.delete_item(API_KEY_KEY) + password_registry.delete_item(_PASSWORD_NAME) -def check_credentials(username, api_key, shotgrid_server=None): - if not shotgrid_server: - shotgrid_server = os.environ.get("SHOTGRID_SERVER") +def check_credentials( + login: AnyStr, password: AnyStr, shotgrid_url: AnyStr +) -> bool: - if not shotgrid_server or not username or not api_key: + if not shotgrid_url or not login or not password: return False try: session = shotgun_api3.Shotgun( - server_url=shotgrid_server, api_key=api_key, api_user=username + shotgrid_url, + login=login, + password=password, ) + session.preferences_read() session.close() - except Exception: + except AuthenticationFault: return False return True diff --git a/openpype/tests/modules/shotgrid/lib/credentials_test.py b/openpype/tests/modules/shotgrid/lib/credentials_test.py new file mode 100644 index 00000000000..0d6104721e5 --- /dev/null +++ b/openpype/tests/modules/shotgrid/lib/credentials_test.py @@ -0,0 +1,11 @@ +import pytest +import openpype.modules.shotgrid.lib.credentials as sut + + +@pytest.mark.xfail(raises=Exception) +def test_missing_shotgrid_url(): + # arrange + url = "" + # act + sut.get_shotgrid_hostname(url) + # assert