Skip to content

Commit

Permalink
Refecto credential from ftrack module to shotgrid module
Browse files Browse the repository at this point in the history
  • Loading branch information
clement.hector authored and ClementHector committed Feb 7, 2022
1 parent 4977e10 commit 30d354d
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 45 deletions.
93 changes: 48 additions & 45 deletions openpype/modules/shotgrid/lib/credentials.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
11 changes: 11 additions & 0 deletions openpype/tests/modules/shotgrid/lib/credentials_test.py
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 30d354d

Please sign in to comment.