Source code for tank.util.login

# Copyright (c) 2013 Shotgun Software Inc.
#
# CONFIDENTIAL AND PROPRIETARY
#
# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit
# Source Code License included in this distribution package. See LICENSE.
# By accessing, using, copying or modifying this work you indicate your
# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights
# not expressly granted therein are reserved by Shotgun Software Inc.

"""
Helper methods that extracts information about the current user.

"""

import os
import sys

from . import constants
from .platforms import is_windows


def get_login_name():
    """
    Retrieves the login name of the current user.
    Returns None if no login name was found
    """
    if is_windows():
        # http://stackoverflow.com/questions/117014/how-to-retrieve-name-of-current-windows-user-ad-or-local-using-python
        return os.environ.get("USERNAME", None)
    else:
        try:
            import pwd

            pwd_entry = pwd.getpwuid(os.geteuid())
            return pwd_entry[0]
        except:
            return None


# note! Because the shotgun caching method can return None, to indicate that no
# user was found, we cannot use a None value to indicate that the cache has not been
# populated.
g_shotgun_user_cache = "unknown"
g_shotgun_current_user_cache = "unknown"


def get_shotgun_user(sg):
    """

    ---- DEPRECATED ---- user get_current_user(tk) instead

    Retrieves a shotgun user dict
    for the current user. Returns None if the user is not found in shotgun.

    Returns the following fields:

    * id
    * type
    * email
    * login
    * name
    * image (thumbnail)

    This method connects to shotgun.
    """
    global g_shotgun_user_cache
    if g_shotgun_user_cache == "unknown":
        fields = ["id", "type", "email", "login", "name", "image"]
        local_login = get_login_name()
        g_shotgun_user_cache = sg.find_one(
            "HumanUser", filters=[["login", "is", local_login]], fields=fields
        )

    return g_shotgun_user_cache


[docs]def get_current_user(tk): """ Retrieves the current user as a dictionary of metadata values. Note: This method connects to shotgun the first time around. The result is then cached to reduce latency. If a user has been authenticated via a login prompt, this method will return the credentials associated with that user. If Toolkit has been configured to use a script user to connect to Shotgun, a core hook will be executed to established which user is associated with the current session. This is usually based on the currently logged in user. :returns: None if the user is not found in Shotgun. Otherwise, it returns a dictionary with the following fields: id, type, email, login, name, image, firstname, lastname """ global g_shotgun_current_user_cache if g_shotgun_current_user_cache != "unknown": return g_shotgun_current_user_cache # Avoids cyclic imports. from .. import api user = api.get_authenticated_user() # If an authenticated user has been set and it has a name, just use that as login for the # Shotgun query. If there is no user, that's probably because we're running in an old # script that doesn't use the authenticated user concept. In that case, we'll do what we've # always been doing in the past, which is run the hook. Obviously, if the user didn't # have a login name (which happens when the authenticated user is a script user), we'll also run # the hook as well. if user and user.login: current_login = user.login else: current_login = tk.execute_core_hook(constants.CURRENT_LOGIN_HOOK_NAME) if current_login is None: g_shotgun_current_user_cache = None else: fields = [ "id", "type", "email", "login", "name", "image", "firstname", "lastname", ] g_shotgun_current_user_cache = tk.shotgun.find_one( "HumanUser", filters=[["login", "is", current_login]], fields=fields ) return g_shotgun_current_user_cache