1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2026-01-05 10:03:27 +00:00

Added proxy detection logic on windows

This commit is contained in:
Bryan Roe
2019-01-28 15:57:11 -08:00
parent 61de975f3a
commit 258c1396c7

View File

@@ -361,10 +361,10 @@ void MeshAgent_sendConsoleText(duk_context *ctx, char *txt)
}
int MeshAgent_GetSystemProxy(char *buffer, size_t bufferSize)
int MeshAgent_GetSystemProxy(MeshAgentHostContainer *agent, char *buffer, size_t bufferSize)
{
#ifdef _POSIX
int retVal = 0;
#ifdef _POSIX
for (char **env = environ; *env; ++env)
{
int envLen = (int)strnlen_s(*env, INT_MAX);
@@ -394,7 +394,84 @@ int MeshAgent_GetSystemProxy(char *buffer, size_t bufferSize)
}
return(retVal);
#else
return(0);
char getProxy[] = "(function () {\
var isroot = false;\
var servers = [];\
/* First we need to see if we are running as admin */\
var GM = require('_GenericMarshal');\
var advapi = GM.CreateNativeProxy('Advapi32.dll');\
advapi.CreateMethod('AllocateAndInitializeSid');\
advapi.CreateMethod('CheckTokenMembership');\
advapi.CreateMethod('FreeSid');\
var NTAuthority = GM.CreateVariable(6);\
NTAuthority.toBuffer().writeInt8(5, 5);\
var AdministratorsGroup = GM.CreatePointer();\
if (advapi.AllocateAndInitializeSid(NTAuthority, 2, 32, 544, 0, 0, 0, 0, 0, 0, AdministratorsGroup).Val != 0)\
{\
var member = GM.CreateInteger();\
if (advapi.CheckTokenMembership(0, AdministratorsGroup.Deref(), member).Val != 0)\
{\
if (member.toBuffer().readUInt32LE() != 0) { isroot = true; }\
}\
advapi.FreeSid(AdministratorsGroup.Deref());\
}\
var reg = require('win-registry');\
if (isroot)\
{\
/* If running as admin, enumerate the users to find proxy settings */\
var users = reg.QueryKey(reg.HKEY.Users);\
var keys;\
for (var i in users.subkeys)\
{\
try\
{\
value = reg.QueryKey(reg.HKEY.Users, users.subkeys[i] + '\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings', 'ProxyEnable');\
if (value == 1)\
{\
value = reg.QueryKey(reg.HKEY.Users, users.subkeys[i] + '\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings', 'ProxyServer');\
servers.push(value);\
}\
}\
catch (e)\
{\
}\
}\
return (servers);\
}\
else\
{\
/* We're not admin, so we can only check HKEY_LOCAL_USERS for proxy settings */\
try\
{\
if (reg.QueryKey(reg.HKEY.CurrentUser, 'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Internet Settings', 'ProxyEnable') == 1)\
{\
servers.push(reg.QueryKey(reg.HKEY.CurrentUser, 'Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Internet Settings', 'ProxyServer'));\
}\
}\
catch (e)\
{\
}\
return (servers);\
}\
})();";
if (duk_peval_string(agent->meshCoreCtx, getProxy) == 0)
{
if (duk_get_length(agent->meshCoreCtx, -1) > 0) // [array]
{
duk_get_prop_index(agent->meshCoreCtx, -1, 0); // [array][0];
char *tmp;
duk_size_t tmpLen;
tmp = (char*)duk_get_lstring(agent->meshCoreCtx, -1, &tmpLen);
strncpy_s(buffer, bufferSize, tmp, tmpLen);
duk_pop(agent->meshCoreCtx); // [array]
retVal = (int)tmpLen;
}
}
duk_pop(agent->meshCoreCtx); // ...
return(retVal);
#endif
}
#ifdef _POSIX
@@ -2827,7 +2904,7 @@ void MeshServer_ConnectEx(MeshAgentHostContainer *agent)
ILibWebClient_Request_SetSNI(reqToken, host, (int)strnlen_s(host, serverUrlLen));
#endif
if ((len = ILibSimpleDataStore_Get(agent->masterDb, "WebProxy", ILibScratchPad, sizeof(ILibScratchPad))) != 0 || (len = MeshAgent_GetSystemProxy(ILibScratchPad, sizeof(ILibScratchPad))) != 0)
if ((len = ILibSimpleDataStore_Get(agent->masterDb, "WebProxy", ILibScratchPad, sizeof(ILibScratchPad))) != 0 || (len = MeshAgent_GetSystemProxy(agent, ILibScratchPad, sizeof(ILibScratchPad))) != 0)
{
#ifdef MICROSTACK_PROXY
unsigned short proxyPort = 80;