# Copyright (C) 2005 John Arbash-Meinel <john@arbash-meinel.com> # Modified up by: Todd Whiteman <ToddW@ActiveState.com> # # This file is part of paramiko. # # Paramiko is free software; you can redistribute it and/or modify it under the # terms of the GNU Lesser General Public License as published by the Free # Software Foundation; either version 2.1 of the License, or (at your option) # any later version. # # Paramiko is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more # details. # # You should have received a copy of the GNU Lesser General Public License # along with Paramiko; if not, write to the Free Software Foundation, Inc., # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. """ Functions for communicating with Pageant, the basic windows ssh agent program. """ import array import ctypes.wintypes import platform import struct from paramiko.common import zero_byte from paramiko.py3compat import b try: import _thread as thread # Python 3.x except ImportError: import thread # Python 2.5-2.7 from . import _winapi _AGENT_COPYDATA_ID = 0x804e50ba _AGENT_MAX_MSGLEN = 8192 # Note: The WM_COPYDATA value is pulled from win32con, as a workaround # so we do not have to import this huge library just for this one variable. win32con_WM_COPYDATA = 74 def _get_pageant_window_object(): return ctypes.windll.user32.FindWindowA(b"Pageant", b"Pageant") 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 or ctypes) and if there is a Pageant currently running. """ return bool(_get_pageant_window_object()) if platform.architecture()[0] == "64bit": ULONG_PTR = ctypes.c_uint64 else: ULONG_PTR = ctypes.c_uint32 class COPYDATASTRUCT(ctypes.Structure): """ ctypes implementation of http://msdn.microsoft.com/en-us/library/windows/desktop/ms649010%28v=vs.85%29.aspx """ _fields_ = [ ("num_data", ULONG_PTR), ("data_size", ctypes.wintypes.DWORD), ("data_loc", ctypes.c_void_p), ] def _query_pageant(msg): """ Communication with the Pageant process is done through a shared memory-mapped file. """ hwnd = _get_pageant_window_object() if not hwnd: # Raise a failure to connect exception, pageant isn't running anymore! return None # create a name for the mmap map_name = "PageantRequest%08x" % thread.get_ident() pymap = _winapi.MemoryMap( map_name, _AGENT_MAX_MSGLEN, _winapi.get_security_attributes_for_user() ) with pymap: pymap.write(msg) # Create an array buffer containing the mapped filename char_buffer = array.array("b", b(map_name) + zero_byte) # noqa char_buffer_address, char_buffer_size = char_buffer.buffer_info() # Create a string to use for the SendMessage function call cds = COPYDATASTRUCT( _AGENT_COPYDATA_ID, char_buffer_size, char_buffer_address ) response = ctypes.windll.user32.SendMessageA( hwnd, win32con_WM_COPYDATA, ctypes.sizeof(cds), ctypes.byref(cds) ) if response > 0: pymap.seek(0) datalen = pymap.read(4) retlen = struct.unpack(">I", datalen)[0] return datalen + pymap.read(retlen) return None class PageantConnection(object): """ Mock "connection" to an agent which roughly approximates the behavior of a unix local-domain socket (as used by Agent). Requests are sent to the pageant daemon via special Windows magick, and responses are buffered back for subsequent reads. """ def __init__(self): self._response = None def send(self, data): self._response = _query_pageant(data) def recv(self, n): if self._response is None: return "" ret = self._response[:n] self._response = self._response[n:] if self._response == "": self._response = None return ret def close(self): pass
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
__init__.py | File | 3.76 KB | 0644 |
|
_version.py | File | 80 B | 0644 |
|
_winapi.py | File | 11.09 KB | 0644 |
|
agent.py | File | 12.46 KB | 0644 |
|
auth_handler.py | File | 31.19 KB | 0644 |
|
ber.py | File | 4.25 KB | 0644 |
|
buffered_pipe.py | File | 7.29 KB | 0644 |
|
channel.py | File | 48.18 KB | 0644 |
|
client.py | File | 31.32 KB | 0644 |
|
common.py | File | 8.04 KB | 0644 |
|
compress.py | File | 1.26 KB | 0644 |
|
config.py | File | 13.17 KB | 0644 |
|
dsskey.py | File | 7.65 KB | 0644 |
|
ecdsakey.py | File | 10.1 KB | 0644 |
|
ed25519key.py | File | 7.84 KB | 0644 |
|
file.py | File | 19.13 KB | 0644 |
|
hostkeys.py | File | 12.95 KB | 0644 |
|
kex_curve25519.py | File | 4.3 KB | 0644 |
|
kex_ecdh_nist.py | File | 4.86 KB | 0644 |
|
kex_gex.py | File | 10.06 KB | 0644 |
|
kex_group1.py | File | 5.6 KB | 0644 |
|
kex_group14.py | File | 1.79 KB | 0644 |
|
kex_group16.py | File | 2.23 KB | 0644 |
|
kex_gss.py | File | 24 KB | 0644 |
|
message.py | File | 8.8 KB | 0644 |
|
packet.py | File | 22.13 KB | 0644 |
|
pipe.py | File | 3.83 KB | 0644 |
|
pkey.py | File | 21.04 KB | 0644 |
|
primes.py | File | 5 KB | 0644 |
|
proxy.py | File | 4.34 KB | 0644 |
|
py3compat.py | File | 3.71 KB | 0644 |
|
rsakey.py | File | 5.84 KB | 0644 |
|
server.py | File | 29.7 KB | 0644 |
|
sftp.py | File | 5.89 KB | 0644 |
|
sftp_attr.py | File | 8.15 KB | 0644 |
|
sftp_client.py | File | 33.4 KB | 0644 |
|
sftp_file.py | File | 20.1 KB | 0644 |
|
sftp_handle.py | File | 7.26 KB | 0644 |
|
sftp_server.py | File | 19.14 KB | 0644 |
|
sftp_si.py | File | 12.28 KB | 0644 |
|
ssh_exception.py | File | 6.24 KB | 0644 |
|
ssh_gss.py | File | 28.22 KB | 0644 |
|
transport.py | File | 117.68 KB | 0644 |
|
util.py | File | 8.37 KB | 0644 |
|
win_pageant.py | File | 4.17 KB | 0644 |
|