mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-03-22 14:39:24 -05:00
Move the dynamic loading of advapi into its own module.
There's now a winsecur.[ch], which centralises helper functions using the Windows security stuff in advapi.h (currently just get_user_sid), and also centralises the run-time loading of those functions and checking they're all there. [originally from svn r10082]
This commit is contained in:
parent
e5a3e28eec
commit
f6f78f8355
6
Recipe
6
Recipe
@ -300,7 +300,7 @@ SSH = ssh sshcrc sshdes sshmd5 sshrsa sshrand sshsha sshblowf
|
|||||||
+ sshdh sshcrcda sshpubk sshzlib sshdss x11fwd portfwd
|
+ sshdh sshcrcda sshpubk sshzlib sshdss x11fwd portfwd
|
||||||
+ sshaes sshsh256 sshsh512 sshbn wildcard pinger ssharcf
|
+ sshaes sshsh256 sshsh512 sshbn wildcard pinger ssharcf
|
||||||
+ sshgssc pgssapi
|
+ sshgssc pgssapi
|
||||||
WINSSH = SSH winnoise winpgntc wingss winhsock errsock
|
WINSSH = SSH winnoise winsecur winpgntc wingss winhsock errsock
|
||||||
UXSSH = SSH uxnoise uxagentc uxgss
|
UXSSH = SSH uxnoise uxagentc uxgss
|
||||||
|
|
||||||
# SFTP implementation (pscp, psftp).
|
# SFTP implementation (pscp, psftp).
|
||||||
@ -350,8 +350,8 @@ psftp : [C] psftp winsftp wincons WINSSH BE_SSH SFTP wildcard WINMISC
|
|||||||
+ psftp.res winnojmp LIBS
|
+ psftp.res winnojmp LIBS
|
||||||
|
|
||||||
pageant : [G] winpgnt sshrsa sshpubk sshdes sshbn sshmd5 version tree234
|
pageant : [G] winpgnt sshrsa sshpubk sshdes sshbn sshmd5 version tree234
|
||||||
+ misc sshaes sshsha winpgntc sshdss sshsh256 sshsh512 winutils
|
+ misc sshaes sshsha winsecur winpgntc sshdss sshsh256 sshsh512
|
||||||
+ winmisc winhelp conf pageant.res LIBS
|
+ winutils winmisc winhelp conf pageant.res LIBS
|
||||||
|
|
||||||
puttygen : [G] winpgen sshrsag sshdssg sshprime sshdes sshbn sshmd5 version
|
puttygen : [G] winpgen sshrsag sshdssg sshprime sshdes sshbn sshmd5 version
|
||||||
+ sshrand winnoise sshsha winstore misc winctrls sshrsa sshdss winmisc
|
+ sshrand winnoise sshsha winstore misc winctrls sshrsa sshdss winmisc
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
#if !defined NO_SECURITY
|
#if !defined NO_SECURITY
|
||||||
|
|
||||||
#include <aclapi.h>
|
#include "winsecur.h"
|
||||||
|
|
||||||
Socket make_handle_socket(HANDLE send_H, HANDLE recv_H, Plug plug,
|
Socket make_handle_socket(HANDLE send_H, HANDLE recv_H, Plug plug,
|
||||||
int overlapped);
|
int overlapped);
|
||||||
@ -27,9 +27,6 @@ Socket new_named_pipe_client(const char *pipename, Plug plug)
|
|||||||
char *err;
|
char *err;
|
||||||
Socket ret;
|
Socket ret;
|
||||||
|
|
||||||
extern int advapi_initialised;
|
|
||||||
init_advapi(); /* for get_user_sid. FIXME: do better. */
|
|
||||||
|
|
||||||
assert(strncmp(pipename, "\\\\.\\pipe\\", 9) == 0);
|
assert(strncmp(pipename, "\\\\.\\pipe\\", 9) == 0);
|
||||||
assert(strchr(pipename + 9, '\\') == NULL);
|
assert(strchr(pipename + 9, '\\') == NULL);
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include "ssh.h"
|
#include "ssh.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "tree234.h"
|
#include "tree234.h"
|
||||||
|
#include "winsecur.h"
|
||||||
|
|
||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
|
|
||||||
@ -2065,7 +2066,7 @@ int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show)
|
|||||||
/*
|
/*
|
||||||
* Attempt to get the security API we need.
|
* Attempt to get the security API we need.
|
||||||
*/
|
*/
|
||||||
if (!init_advapi()) {
|
if (!got_advapi()) {
|
||||||
MessageBox(NULL,
|
MessageBox(NULL,
|
||||||
"Unable to access security APIs. Pageant will\n"
|
"Unable to access security APIs. Pageant will\n"
|
||||||
"not run, in case it causes a security breach.",
|
"not run, in case it causes a security breach.",
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#include "putty.h"
|
#include "putty.h"
|
||||||
|
|
||||||
#ifndef NO_SECURITY
|
#ifndef NO_SECURITY
|
||||||
#include <aclapi.h>
|
#include "winsecur.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define AGENT_COPYDATA_ID 0x804e50ba /* random goop */
|
#define AGENT_COPYDATA_ID 0x804e50ba /* random goop */
|
||||||
@ -70,88 +70,6 @@ DWORD WINAPI agent_query_thread(LPVOID param)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* Dynamically load advapi32.dll for SID manipulation. In its absence,
|
|
||||||
* we degrade gracefully.
|
|
||||||
*/
|
|
||||||
#ifndef NO_SECURITY
|
|
||||||
int advapi_initialised = FALSE;
|
|
||||||
static HMODULE advapi;
|
|
||||||
DECL_WINDOWS_FUNCTION(static, BOOL, OpenProcessToken,
|
|
||||||
(HANDLE, DWORD, PHANDLE));
|
|
||||||
DECL_WINDOWS_FUNCTION(static, BOOL, GetTokenInformation,
|
|
||||||
(HANDLE, TOKEN_INFORMATION_CLASS,
|
|
||||||
LPVOID, DWORD, PDWORD));
|
|
||||||
DECL_WINDOWS_FUNCTION(static, BOOL, InitializeSecurityDescriptor,
|
|
||||||
(PSECURITY_DESCRIPTOR, DWORD));
|
|
||||||
DECL_WINDOWS_FUNCTION(static, BOOL, SetSecurityDescriptorOwner,
|
|
||||||
(PSECURITY_DESCRIPTOR, PSID, BOOL));
|
|
||||||
DECL_WINDOWS_FUNCTION(, DWORD, GetSecurityInfo,
|
|
||||||
(HANDLE, SE_OBJECT_TYPE, SECURITY_INFORMATION,
|
|
||||||
PSID *, PSID *, PACL *, PACL *,
|
|
||||||
PSECURITY_DESCRIPTOR *));
|
|
||||||
int init_advapi(void)
|
|
||||||
{
|
|
||||||
advapi = load_system32_dll("advapi32.dll");
|
|
||||||
return advapi &&
|
|
||||||
GET_WINDOWS_FUNCTION(advapi, GetSecurityInfo) &&
|
|
||||||
GET_WINDOWS_FUNCTION(advapi, OpenProcessToken) &&
|
|
||||||
GET_WINDOWS_FUNCTION(advapi, GetTokenInformation) &&
|
|
||||||
GET_WINDOWS_FUNCTION(advapi, InitializeSecurityDescriptor) &&
|
|
||||||
GET_WINDOWS_FUNCTION(advapi, SetSecurityDescriptorOwner);
|
|
||||||
}
|
|
||||||
|
|
||||||
PSID get_user_sid(void)
|
|
||||||
{
|
|
||||||
HANDLE proc = NULL, tok = NULL;
|
|
||||||
TOKEN_USER *user = NULL;
|
|
||||||
DWORD toklen, sidlen;
|
|
||||||
PSID sid = NULL, ret = NULL;
|
|
||||||
|
|
||||||
if ((proc = OpenProcess(MAXIMUM_ALLOWED, FALSE,
|
|
||||||
GetCurrentProcessId())) == NULL)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!p_OpenProcessToken(proc, TOKEN_QUERY, &tok))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!p_GetTokenInformation(tok, TokenUser, NULL, 0, &toklen) &&
|
|
||||||
GetLastError() != ERROR_INSUFFICIENT_BUFFER)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if ((user = (TOKEN_USER *)LocalAlloc(LPTR, toklen)) == NULL)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!p_GetTokenInformation(tok, TokenUser, user, toklen, &toklen))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
sidlen = GetLengthSid(user->User.Sid);
|
|
||||||
|
|
||||||
sid = (PSID)smalloc(sidlen);
|
|
||||||
|
|
||||||
if (!CopySid(sidlen, sid, user->User.Sid))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
/* Success. Move sid into the return value slot, and null it out
|
|
||||||
* to stop the cleanup code freeing it. */
|
|
||||||
ret = sid;
|
|
||||||
sid = NULL;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
if (proc != NULL)
|
|
||||||
CloseHandle(proc);
|
|
||||||
if (tok != NULL)
|
|
||||||
CloseHandle(tok);
|
|
||||||
if (user != NULL)
|
|
||||||
LocalFree(user);
|
|
||||||
if (sid != NULL)
|
|
||||||
sfree(sid);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int agent_query(void *in, int inlen, void **out, int *outlen,
|
int agent_query(void *in, int inlen, void **out, int *outlen,
|
||||||
void (*callback)(void *, void *, int), void *callback_ctx)
|
void (*callback)(void *, void *, int), void *callback_ctx)
|
||||||
{
|
{
|
||||||
@ -175,7 +93,7 @@ int agent_query(void *in, int inlen, void **out, int *outlen,
|
|||||||
|
|
||||||
psa = NULL;
|
psa = NULL;
|
||||||
#ifndef NO_SECURITY
|
#ifndef NO_SECURITY
|
||||||
if (advapi_initialised || init_advapi()) {
|
if (got_advapi()) {
|
||||||
/*
|
/*
|
||||||
* Make the file mapping we create for communication with
|
* Make the file mapping we create for communication with
|
||||||
* Pageant owned by the user SID rather than the default. This
|
* Pageant owned by the user SID rather than the default. This
|
||||||
|
86
windows/winsecur.c
Normal file
86
windows/winsecur.c
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* winsecur.c: implementation of winsecur.h.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "putty.h"
|
||||||
|
|
||||||
|
#if !defined NO_SECURITY
|
||||||
|
|
||||||
|
#define WINSECUR_GLOBAL
|
||||||
|
#include "winsecur.h"
|
||||||
|
|
||||||
|
int got_advapi(void)
|
||||||
|
{
|
||||||
|
static int attempted = FALSE;
|
||||||
|
static int successful;
|
||||||
|
static HMODULE advapi;
|
||||||
|
|
||||||
|
if (!attempted) {
|
||||||
|
attempted = TRUE;
|
||||||
|
advapi = load_system32_dll("advapi32.dll");
|
||||||
|
successful = advapi &&
|
||||||
|
GET_WINDOWS_FUNCTION(advapi, GetSecurityInfo) &&
|
||||||
|
GET_WINDOWS_FUNCTION(advapi, OpenProcessToken) &&
|
||||||
|
GET_WINDOWS_FUNCTION(advapi, GetTokenInformation) &&
|
||||||
|
GET_WINDOWS_FUNCTION(advapi, InitializeSecurityDescriptor) &&
|
||||||
|
GET_WINDOWS_FUNCTION(advapi, SetSecurityDescriptorOwner);
|
||||||
|
}
|
||||||
|
return successful;
|
||||||
|
}
|
||||||
|
|
||||||
|
PSID get_user_sid(void)
|
||||||
|
{
|
||||||
|
HANDLE proc = NULL, tok = NULL;
|
||||||
|
TOKEN_USER *user = NULL;
|
||||||
|
DWORD toklen, sidlen;
|
||||||
|
PSID sid = NULL, ret = NULL;
|
||||||
|
|
||||||
|
if (!got_advapi())
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if ((proc = OpenProcess(MAXIMUM_ALLOWED, FALSE,
|
||||||
|
GetCurrentProcessId())) == NULL)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!p_OpenProcessToken(proc, TOKEN_QUERY, &tok))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!p_GetTokenInformation(tok, TokenUser, NULL, 0, &toklen) &&
|
||||||
|
GetLastError() != ERROR_INSUFFICIENT_BUFFER)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if ((user = (TOKEN_USER *)LocalAlloc(LPTR, toklen)) == NULL)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!p_GetTokenInformation(tok, TokenUser, user, toklen, &toklen))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
sidlen = GetLengthSid(user->User.Sid);
|
||||||
|
|
||||||
|
sid = (PSID)smalloc(sidlen);
|
||||||
|
|
||||||
|
if (!CopySid(sidlen, sid, user->User.Sid))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
/* Success. Move sid into the return value slot, and null it out
|
||||||
|
* to stop the cleanup code freeing it. */
|
||||||
|
ret = sid;
|
||||||
|
sid = NULL;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if (proc != NULL)
|
||||||
|
CloseHandle(proc);
|
||||||
|
if (tok != NULL)
|
||||||
|
CloseHandle(tok);
|
||||||
|
if (user != NULL)
|
||||||
|
LocalFree(user);
|
||||||
|
if (sid != NULL)
|
||||||
|
sfree(sid);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* !defined NO_SECURITY */
|
32
windows/winsecur.h
Normal file
32
windows/winsecur.h
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* winsecur.h: some miscellaneous security-related helper functions,
|
||||||
|
* defined in winsecur.c, that use the advapi32 library. Also
|
||||||
|
* centralises the machinery for dynamically loading that library.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined NO_SECURITY
|
||||||
|
|
||||||
|
#include <aclapi.h>
|
||||||
|
|
||||||
|
#ifndef WINSECUR_GLOBAL
|
||||||
|
#define WINSECUR_GLOBAL extern
|
||||||
|
#endif
|
||||||
|
|
||||||
|
DECL_WINDOWS_FUNCTION(WINSECUR_GLOBAL, BOOL, OpenProcessToken,
|
||||||
|
(HANDLE, DWORD, PHANDLE));
|
||||||
|
DECL_WINDOWS_FUNCTION(WINSECUR_GLOBAL, BOOL, GetTokenInformation,
|
||||||
|
(HANDLE, TOKEN_INFORMATION_CLASS,
|
||||||
|
LPVOID, DWORD, PDWORD));
|
||||||
|
DECL_WINDOWS_FUNCTION(WINSECUR_GLOBAL, BOOL, InitializeSecurityDescriptor,
|
||||||
|
(PSECURITY_DESCRIPTOR, DWORD));
|
||||||
|
DECL_WINDOWS_FUNCTION(WINSECUR_GLOBAL, BOOL, SetSecurityDescriptorOwner,
|
||||||
|
(PSECURITY_DESCRIPTOR, PSID, BOOL));
|
||||||
|
DECL_WINDOWS_FUNCTION(WINSECUR_GLOBAL, DWORD, GetSecurityInfo,
|
||||||
|
(HANDLE, SE_OBJECT_TYPE, SECURITY_INFORMATION,
|
||||||
|
PSID *, PSID *, PACL *, PACL *,
|
||||||
|
PSECURITY_DESCRIPTOR *));
|
||||||
|
|
||||||
|
int got_advapi(void);
|
||||||
|
PSID get_user_sid(void);
|
||||||
|
|
||||||
|
#endif
|
@ -516,14 +516,6 @@ void agent_schedule_callback(void (*callback)(void *, void *, int),
|
|||||||
void *callback_ctx, void *data, int len);
|
void *callback_ctx, void *data, int len);
|
||||||
#define FLAG_SYNCAGENT 0x1000
|
#define FLAG_SYNCAGENT 0x1000
|
||||||
|
|
||||||
/*
|
|
||||||
* winpgntc.c also exports these two functions which are used by the
|
|
||||||
* server side of Pageant as well, to get the user SID for comparing
|
|
||||||
* with clients'.
|
|
||||||
*/
|
|
||||||
int init_advapi(void); /* initialises everything needed by get_user_sid */
|
|
||||||
PSID get_user_sid(void);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Exports from winser.c.
|
* Exports from winser.c.
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user