diff options
author | Robey Pointer <robey@lag.net> | 2007-05-20 19:35:45 -0700 |
---|---|---|
committer | Robey Pointer <robey@lag.net> | 2007-05-20 19:35:45 -0700 |
commit | 946e4dbc2925bd7bc151736107e46527323f66b7 (patch) | |
tree | b152ac75ab0608693bb42f5f6eab25ef4d5f1074 | |
parent | 58e26ae41bada74198abd81ebe0040fd0ea6a2b4 (diff) |
[project @ robey@lag.net-20070521023545-8a36vex4ewgdxcwk]
merge in a modified form of a patch from alexander belchenko. this lets
windows users use the 'win32all' module *or* the 'ctypes' module, if they
have ctypes installed. python 2.5 comes with ctypes in the standard
library.
-rw-r--r-- | paramiko/win_pageant.py | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/paramiko/win_pageant.py b/paramiko/win_pageant.py index 07de48c4..3478b92e 100644 --- a/paramiko/win_pageant.py +++ b/paramiko/win_pageant.py @@ -27,12 +27,19 @@ import tempfile import mmap import array -# if you're on windows, you should have these, i guess? +# if you're on windows, you should have one of these, i guess? +# ctypes is part of standard library since Python 2.5 +_has_win32all = False +_has_ctypes = False try: import win32ui _has_win32all = True except ImportError: - _has_win32all = False + try: + import ctypes + _has_ctypes = True + except ImportError: + pass _AGENT_COPYDATA_ID = 0x804e50ba @@ -43,11 +50,15 @@ win32con_WM_COPYDATA = 74 def _get_pageant_window_object(): - try: - hwnd = win32ui.FindWindow('Pageant', 'Pageant') - return hwnd - except win32ui.error: - pass + if _has_win32all: + try: + hwnd = win32ui.FindWindow('Pageant', 'Pageant') + return hwnd + except win32ui.error: + pass + elif _has_ctypes: + # Return 0 if there is no Pageant window. + return ctypes.windll.user32.FindWindowA('Pageant', 'Pageant') return None @@ -55,12 +66,12 @@ def can_talk_to_agent(): """ Check to see if there is a "Pageant" agent we can talk to. - This checks both if we have the required libraries (win32all) + This checks both if we have the required libraries (win32all or ctypes) and if there is a Pageant currently running. """ - if not _has_win32all or not _get_pageant_window_object(): - return False - return True + if (_has_win32all or _has_ctypes) and _get_pageant_window_object(): + return True + return False def _query_pageant(msg): @@ -86,7 +97,15 @@ def _query_pageant(msg): # Create a string to use for the SendMessage function call cds = struct.pack("LLP", _AGENT_COPYDATA_ID, char_buffer_size, char_buffer_address) - response = hwnd.SendMessage(win32con_WM_COPYDATA, cds) + if _has_win32all: + response = hwnd.SendMessage(win32con_WM_COPYDATA, cds) + elif _has_ctypes: + _buf = array.array('B', cds) + _addr, _size = _buf.buffer_info() + response = ctypes.windll.user32.SendMessageA(hwnd, win32con_WM_COPYDATA, _size, _addr) + else: + response = 0 + if response > 0: datalen = pymap.read(4) retlen = struct.unpack('>I', datalen)[0] |