Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Configure Windows at import time #194

Merged
merged 1 commit into from
Mar 25, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions gssapi/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
low-level API functions.
"""

import gssapi._win_config # noqa

from gssapi.raw.types import NameType, RequirementFlag, AddressType # noqa
from gssapi.raw.types import MechType, IntEnumFlagSet # noqa
from gssapi.raw.oids import OID # noqa
Expand Down
56 changes: 56 additions & 0 deletions gssapi/_win_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
"""
Using GSSAPI on Windows requires having an installation of Kerberos for Windows
(KfW) available in the user's PATH. This module should be imported before
anything else to check for that installation, add it to the PATH if necessary,
and throw any errors before they manifest as cryptic missing DLL errors later
down the import tree.
"""

import os
import ctypes

#: Path to normal KfW installed bin folder
KFW_BIN = os.path.join(
os.environ.get('ProgramFiles', r'C:\Program Files'),
'MIT', 'Kerberos', 'bin',
)
#: Download location for KfW
KFW_DL = "https://web.mit.edu/KERBEROS/dist"


def k4w_in_path():
"""Return if the main GSSAPI DLL for KfW is available in the PATH"""
try: # to load the main GSSAPI DLL
ctypes.WinDLL('gssapi64.dll')
except OSError: # DLL is not in PATH
return False
else: # DLL is in PATH, everything should work
return True


def error_not_found():
"""Raise an OSError detailing that KfW is missing and how to get it"""
raise OSError(
"Could not find KfW installation. Please download and install "
"the 64bit Kerberos for Windows MSI from %s and ensure the "
"'bin' folder (%s) is in your PATH."
% (KFW_DL, KFW_BIN)
)


def configure_windows():
"""
Validate that KfW appears to be installed correctly and add it to the
PATH if necessary. In the case that it can't be located, raise an error.
"""
if k4w_in_path():
return # All set, necessary DLLs should be available
if os.path.exists(KFW_BIN): # In standard location
os.environ['PATH'] += os.pathsep + KFW_BIN
if k4w_in_path():
return
error_not_found()


if os.name == 'nt': # Make sure we have the required DLLs
configure_windows()