mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-02 22:46:30 +02:00
ssh: Add support for Putty.
* agent/gpg-agent.c [W32]: Include Several Windows header. (opts): Change help text for enable-ssh-support. (opts, main): Add option --enable-putty-support (putty_support, PUTTY_IPC_MAGIC, PUTTY_IPC_MAXLEN): New for W32. (agent_init_default_ctrl): Add and asssert call. (putty_message_proc, putty_message_thread): New. (handle_connections) [W32]: Start putty message thread. * common/sysutils.c (w32_get_user_sid): New for W32 only * tools/gpgconf-comp.c (gc_options_gpg_agent): Add --enable-ssh-support and --enable-putty-support. Make the configuration group visible at basic level. * agent/command-ssh.c (serve_mmapped_ssh_request): New for W32 only. -- This patch enables support for Putty. It has been tested with Putty 0.62 using an Unix created ssh key copied to the private-keys-v1.d directory on Windows and with a manually crafted sshcontrol file. It also works with a smartcard key. May thanks to gniibe who implemented a proxy in Python to test the putty/gpg-agent communication. Signed-off-by: Werner Koch <wk@gnupg.org>
This commit is contained in:
parent
ed056d67c7
commit
9f32499f99
7 changed files with 472 additions and 5 deletions
|
@ -1,6 +1,7 @@
|
|||
/* sysutils.c - system helpers
|
||||
* Copyright (C) 1998, 1999, 2000, 2001, 2003, 2004,
|
||||
* 2007, 2008 Free Software Foundation, Inc.
|
||||
* Copyright (C) 2013 Werner Koch
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
|
@ -495,3 +496,59 @@ gnupg_allow_set_foregound_window (pid_t pid)
|
|||
(unsigned long)pid, w32_strerror (-1));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_W32_SYSTEM
|
||||
/* Return the user's security identifier from the current process. */
|
||||
PSID
|
||||
w32_get_user_sid (void)
|
||||
{
|
||||
int okay = 0;
|
||||
HANDLE proc = NULL;
|
||||
HANDLE token = NULL;
|
||||
TOKEN_USER *user = NULL;
|
||||
PSID sid = NULL;
|
||||
DWORD tokenlen, sidlen;
|
||||
|
||||
proc = OpenProcess (PROCESS_QUERY_INFORMATION, FALSE, GetCurrentProcessId());
|
||||
if (!proc)
|
||||
goto leave;
|
||||
|
||||
if (!OpenProcessToken (proc, TOKEN_QUERY, &token))
|
||||
goto leave;
|
||||
|
||||
if (!GetTokenInformation (token, TokenUser, NULL, 0, &tokenlen)
|
||||
&& GetLastError() != ERROR_INSUFFICIENT_BUFFER)
|
||||
goto leave;
|
||||
|
||||
user = xtrymalloc (tokenlen);
|
||||
if (!user)
|
||||
goto leave;
|
||||
|
||||
if (!GetTokenInformation (token, TokenUser, user, tokenlen, &tokenlen))
|
||||
goto leave;
|
||||
if (!IsValidSid (user->User.Sid))
|
||||
goto leave;
|
||||
sidlen = GetLengthSid (user->User.Sid);
|
||||
sid = xtrymalloc (sidlen);
|
||||
if (!sid)
|
||||
goto leave;
|
||||
if (!CopySid (sidlen, sid, user->User.Sid))
|
||||
goto leave;
|
||||
okay = 1;
|
||||
|
||||
leave:
|
||||
xfree (user);
|
||||
if (token)
|
||||
CloseHandle (token);
|
||||
if (proc)
|
||||
CloseHandle (proc);
|
||||
|
||||
if (!okay)
|
||||
{
|
||||
xfree (sid);
|
||||
sid = NULL;
|
||||
}
|
||||
return sid;
|
||||
}
|
||||
#endif /*HAVE_W32_SYSTEM*/
|
||||
|
|
|
@ -51,8 +51,9 @@ void gnupg_allow_set_foregound_window (pid_t pid);
|
|||
|
||||
|
||||
#ifdef HAVE_W32_SYSTEM
|
||||
void *w32_get_user_sid (void);
|
||||
|
||||
#include "../jnlib/w32help.h"
|
||||
# include "../jnlib/w32help.h"
|
||||
|
||||
#endif /*HAVE_W32_SYSTEM*/
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue