diff options
author | NIIBE Yutaka <[email protected]> | 2022-07-27 09:56:17 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2022-07-27 09:56:17 +0000 |
commit | 6f9bb301b720f6f791414b89391fbba7ef86e3da (patch) | |
tree | db8a5ba9aee60c52e14fc2f6a5c0525aa5ebd2e6 | |
parent | Initial experiment for NamedPipe on Windows. (diff) | |
download | gnupg-6f9bb301b720f6f791414b89391fbba7ef86e3da.tar.gz gnupg-6f9bb301b720f6f791414b89391fbba7ef86e3da.zip |
Implement the procedure to handle requests from client.
Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r-- | agent/agent.h | 1 | ||||
-rw-r--r-- | agent/command-ssh.c | 68 | ||||
-rw-r--r-- | agent/gpg-agent.c | 65 |
3 files changed, 87 insertions, 47 deletions
diff --git a/agent/agent.h b/agent/agent.h index 30f30200d..ee5c67568 100644 --- a/agent/agent.h +++ b/agent/agent.h @@ -453,6 +453,7 @@ gpg_error_t ssh_search_control_file (ssh_control_file_t cf, int *r_disabled, int *r_ttl, int *r_confirm); +void start_command_handler_ssh_stream (ctrl_t ctrl, estream_t stream); void start_command_handler_ssh (ctrl_t, gnupg_fd_t); /*-- findkey.c --*/ diff --git a/agent/command-ssh.c b/agent/command-ssh.c index ce2b5df9d..5aa2ea8ba 100644 --- a/agent/command-ssh.c +++ b/agent/command-ssh.c @@ -3768,67 +3768,73 @@ get_client_info (gnupg_fd_t fd, struct peer_info_s *out) } -/* Start serving client on SOCK_CLIENT. */ +/* Start serving client on STREAM. */ void -start_command_handler_ssh (ctrl_t ctrl, gnupg_fd_t sock_client) +start_command_handler_ssh_stream (ctrl_t ctrl, estream_t stream) { - estream_t stream_sock = NULL; gpg_error_t err; int ret; - struct peer_info_s peer_info; - es_syshd_t syshd; - - syshd.type = ES_SYSHD_SOCK; - syshd.u.sock = sock_client; err = agent_copy_startup_env (ctrl); if (err) goto out; - get_client_info (sock_client, &peer_info); - ctrl->client_pid = peer_info.pid; - ctrl->client_uid = peer_info.uid; - - /* Create stream from socket. */ - stream_sock = es_sysopen (&syshd, "r+"); - if (!stream_sock) - { - err = gpg_error_from_syserror (); - log_error (_("failed to create stream from socket: %s\n"), - gpg_strerror (err)); - goto out; - } /* We have to disable the estream buffering, because the estream core doesn't know about secure memory. */ - ret = es_setvbuf (stream_sock, NULL, _IONBF, 0); + ret = es_setvbuf (stream, NULL, _IONBF, 0); if (ret) { - err = gpg_error_from_syserror (); - log_error ("failed to disable buffering " - "on socket stream: %s\n", gpg_strerror (err)); + log_error ("failed to disable buffering on socket stream: %s\n", + strerror (errno)); goto out; } /* Main processing loop. */ - while ( !ssh_request_process (ctrl, stream_sock) ) + while ( !ssh_request_process (ctrl, stream) ) { /* Check whether we have reached EOF before trying to read another request. */ int c; - c = es_fgetc (stream_sock); + c = es_fgetc (stream); if (c == EOF) break; - es_ungetc (c, stream_sock); + es_ungetc (c, stream); } /* Reset the daemon in case it has been used. */ agent_reset_daemon (ctrl); - out: - if (stream_sock) - es_fclose (stream_sock); + es_fclose (stream); +} + + +/* Start serving client on SOCK_CLIENT. */ +void +start_command_handler_ssh (ctrl_t ctrl, gnupg_fd_t sock_client) +{ + estream_t stream_sock; + struct peer_info_s peer_info; + es_syshd_t syshd; + + syshd.type = ES_SYSHD_SOCK; + syshd.u.sock = sock_client; + + get_client_info (sock_client, &peer_info); + ctrl->client_pid = peer_info.pid; + ctrl->client_uid = peer_info.uid; + + /* Create stream from socket. */ + stream_sock = es_sysopen (&syshd, "r+"); + if (!stream_sock) + { + log_error (_("failed to create stream from socket: %s\n"), + strerror (errno)); + return; + } + + start_command_handler_ssh_stream (ctrl, stream_sock); } diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 5f7431edd..36d919d14 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -2767,6 +2767,7 @@ putty_message_thread (void *arg) #define AGENT_PIPE_NAME "\\\\.\\pipe\\openssh-ssh-agent" /* FIXME: Don't know exact semantics, but copied from Win32-Openssh */ #define SDDL_STR "D:P(A;;GA;;;SY)(A;;GA;;;BA)(A;;0x12019b;;;AU)" +#define BUFSIZE 5 * 1024 /* The thread handling Win32-OpenSSH requests through NamedPipe. */ static void * @@ -2774,7 +2775,6 @@ win32_openssh_thread (void *arg) { HANDLE pipe; SECURITY_ATTRIBUTES sa; - const char *; (void)arg; @@ -2783,10 +2783,10 @@ win32_openssh_thread (void *arg) memset(&sa, 0, sizeof (SECURITY_ATTRIBUTES)); sa.nLength = sizeof (sa); - if (!ConvertStringSecurityDescriptorToSecurityDescriptorA (SDDL_STR, SDDL_REVISION_1, - &sa.lpSecurityDescriptor, &sa.nLength)) + if (!ConvertStringSecurityDescriptorToSecurityDescriptorA + (SDDL_STR, SDDL_REVISION_1, &sa.lpSecurityDescriptor, &sa.nLength)) { - log_error ("cannot convert sddl: %d\n", GetLastError ()); + log_error ("cannot convert sddl: %ld\n", GetLastError ()); return NULL; } @@ -2794,12 +2794,12 @@ win32_openssh_thread (void *arg) while (1) { - /* The message loop runs as thread independent from our nPth system. - This also means that we need to make sure that we switch back to - our system before calling any no-windows function. */ - npth_unprotect (); + ctrl_t ctrl = NULL; + estream_t ssh_stream = NULL; + es_syshd_t syshd; - pipe = CreateNamedPipeW (AGENT_PIPE_NAME, + npth_unprotect (); + pipe = CreateNamedPipeA (AGENT_PIPE_NAME, PIPE_ACCESS_DUPLEX, // | FILE_FLAG_OVERLAPPED PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, @@ -2807,26 +2807,59 @@ win32_openssh_thread (void *arg) if (pipe == INVALID_HANDLE_VALUE) { - log_error ("cannot create pipe: %d\n", GetLastError()); + npth_protect (); + log_error ("cannot create pipe: %ld\n", GetLastError()); break; } if (ConnectNamedPipe (pipe, NULL) != FALSE) { - CloseHandle (pipe); npth_protect (); + CloseHandle (pipe); log_error ("ConnectNamedPipe returned TRUE unexpectedly\n"); - return NULL; + break; } - /* FIXME: Here, handle the requests from ssh client */ + npth_protect (); + ctrl = xtrycalloc (1, sizeof *ctrl); + if (!ctrl) + { + CloseHandle (pipe); + log_error ("error allocating connection control data: %s\n", + strerror (errno)); + break; + } + + ctrl->session_env = session_env_new (); + if (!ctrl->session_env) + { + log_error ("error allocating session environment block: %s\n", + strerror (errno)); + agent_deinit_default_ctrl (ctrl); + xfree (ctrl); + CloseHandle (pipe); + break; + } + agent_init_default_ctrl (ctrl); + + syshd.type = ES_SYSHD_HANDLE; + syshd.u.handle = pipe; + ssh_stream = es_sysopen (&syshd, "r+"); + if (!ssh_stream) + { + agent_deinit_default_ctrl (ctrl); + xfree (ctrl); + CloseHandle (pipe); + break; + } + + start_command_handler_ssh_stream (ctrl, ssh_stream); + agent_deinit_default_ctrl (ctrl); + xfree (ctrl); CloseHandle (pipe); } - /* Back to nPth. */ - npth_protect (); - if (opt.verbose) log_info ("Win32-OpenSSH thread stopped\n"); return NULL; |