diff --git a/appdirs.py b/appdirs.py index f7f8359..b2a44bf 100644 --- a/appdirs.py +++ b/appdirs.py @@ -20,6 +20,11 @@ import sys import os +try: + import pwd +except ImportError: + pwd = None + PY3 = sys.version_info[0] == 3 if PY3: @@ -41,7 +46,6 @@ system = sys.platform - def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): r"""Return full path to the user-specific data dir for this application. @@ -84,14 +88,22 @@ def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): path = os.path.join(path, appauthor, appname) else: path = os.path.join(path, appname) - elif system == 'darwin': - path = os.path.expanduser('~/Library/Application Support/') - if appname: - path = os.path.join(path, appname) else: - path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) - if appname: - path = os.path.join(path, appname) + if system == 'darwin': + path = os.path.expanduser( + '~{0}/Library/Application Support/'.format(_effective_user()) + ) + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv( + 'XDG_DATA_HOME', + os.path.expanduser( + '~{0}/.local/share'.format(_effective_user()) + ) + ) + if appname: + path = os.path.join(path, appname) if appname and version: path = os.path.join(path, version) return path @@ -194,14 +206,20 @@ def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): """ if system == "win32": path = user_data_dir(appname, appauthor, None, roaming) - elif system == 'darwin': - path = os.path.expanduser('~/Library/Preferences/') - if appname: - path = os.path.join(path, appname) else: - path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) - if appname: - path = os.path.join(path, appname) + if system == 'darwin': + path = os.path.expanduser( + '~{0}/Library/Preferences/'.format(_effective_user()) + ) + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv( + 'XDG_CONFIG_HOME', + os.path.expanduser('~{0}/.config'.format(_effective_user())) + ) + if appname: + path = os.path.join(path, appname) if appname and version: path = os.path.join(path, version) return path @@ -306,14 +324,20 @@ def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): path = os.path.join(path, appname) if opinion: path = os.path.join(path, "Cache") - elif system == 'darwin': - path = os.path.expanduser('~/Library/Caches') - if appname: - path = os.path.join(path, appname) else: - path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) - if appname: - path = os.path.join(path, appname) + if system == 'darwin': + path = os.path.expanduser( + '~{0}/Library/Caches'.format(_effective_user()) + ) + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv( + 'XDG_CACHE_HOME', + os.path.expanduser('~{0}/.cache'.format(_effective_user())) + ) + if appname: + path = os.path.join(path, appname) if appname and version: path = os.path.join(path, version) return path @@ -353,7 +377,10 @@ def user_state_dir(appname=None, appauthor=None, version=None, roaming=False): if system in ["win32", "darwin"]: path = user_data_dir(appname, appauthor, None, roaming) else: - path = os.getenv('XDG_STATE_HOME', os.path.expanduser("~/.local/state")) + path = os.getenv( + 'XDG_STATE_HOME', + os.path.expanduser('~{0}/.local/state'.format(_effective_user())) + ) if appname: path = os.path.join(path, appname) if appname and version: @@ -395,8 +422,9 @@ def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): """ if system == "darwin": path = os.path.join( - os.path.expanduser('~/Library/Logs'), - appname) + os.path.expanduser('~{0}/Library/Logs'.format(_effective_user())), + appname + ) elif system == "win32": path = user_data_dir(appname, appauthor, version) version = False @@ -460,6 +488,13 @@ def user_log_dir(self): #---- internal support stuff +def _effective_user(): + try: + return pwd.getpwuid(os.geteuid()).pw_name + except Exception: + return '' + + def _get_win_folder_from_registry(csidl_name): """This is a fallback technique at best. I'm not sure if using the registry for this guarantees us the correct answer for all CSIDL_*