diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index 379e366..d8f20cd 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -1930,6 +1930,11 @@ int agent_GenerateCertificates(MeshAgentHostContainer *agent, char* certfile) int len = -1; char* str; +#ifdef WIN32 + // If there is a cert here, it was Generated by OpenSSL, so we'll force the regenerate to use OpenSSL, to honor how the current cert was generated + if (agent->noCertStore == 0) { agent->noCertStore = ILibSimpleDataStore_Get(agent->masterDb, "SelfNodeCert", NULL, 0); } +#endif + // Clear the certs in the database. ILibSimpleDataStore_Delete(agent->masterDb, "SelfNodeCert"); ILibSimpleDataStore_Delete(agent->masterDb, "SelfNodeTlsCert"); @@ -1940,7 +1945,7 @@ int agent_GenerateCertificates(MeshAgentHostContainer *agent, char* certfile) { #if defined(WIN32) char *rootSubject = (agent->capabilities & MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY) == MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY ? "CN=MeshNodeDiagnosticCertificate" : "CN=MeshNodeCertificate"; - if (wincrypto_open(TRUE, rootSubject) == 0) // Force certificate re-generation + if (agent->noCertStore == 0 && wincrypto_open(TRUE, rootSubject) == 0) // Force certificate re-generation { int l; do { @@ -2051,7 +2056,7 @@ int agent_LoadCertificates(MeshAgentHostContainer *agent) // No cert in this .db file. Try to load or generate a root certificate from a Windows crypto provider. This can be TPM backed which is great. // However, if we don't have the second cert created, we need to regen the root... - if (wincrypto_open(FALSE, rootSubject) == 0 && ILibSimpleDataStore_Get(agent->masterDb, "SelfNodeTlsCert", NULL, 0) != 0) + if (agent->noCertStore == 0 && wincrypto_open(FALSE, rootSubject) == 0 && ILibSimpleDataStore_Get(agent->masterDb, "SelfNodeTlsCert", NULL, 0) != 0) { char* str = NULL; int l; @@ -3715,6 +3720,14 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char ** { agentHost->capabilities |= MeshCommand_AuthInfo_CapabilitiesMask_RECOVERY; parseCommands = 0; } + if (strcmp(param[ri], "-nocertstore") == 0) + { + parseCommands = 0; +#ifdef WIN32 + printf("** Not using Certificate Store **\n"); + agentHost->noCertStore = 1; +#endif + } } @@ -3953,11 +3966,14 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char ** else { RegDeleteKeyA(hKey, "DiagnosticAgentNodeId"); } } - int NodeIDLen = 0; - if ((NodeIDLen = ILibSimpleDataStore_Get(agentHost->masterDb, "NodeID", ILibScratchPad, (int)sizeof(ILibScratchPad))) == 0 || !(NodeIDLen == (int)sizeof(agentHost->g_selfid) && memcmp(agentHost->g_selfid, ILibScratchPad, NodeIDLen)==0)) + if (ILibSimpleDataStore_Get(agentHost->masterDb, "SelfNodeCert", NULL, 0) == 0) { - // NodeID isn't saved to db, so let's put it there - ILibSimpleDataStore_PutEx(agentHost->masterDb, "NodeID", 6, agentHost->g_selfid, (int)sizeof(agentHost->g_selfid)); + int NodeIDLen = 0; + if ((NodeIDLen = ILibSimpleDataStore_Get(agentHost->masterDb, "NodeID", ILibScratchPad, (int)sizeof(ILibScratchPad))) == 0 || !(NodeIDLen == (int)sizeof(agentHost->g_selfid) && memcmp(agentHost->g_selfid, ILibScratchPad, NodeIDLen) == 0)) + { + // NodeID isn't saved to db, so let's put it there + ILibSimpleDataStore_PutEx(agentHost->masterDb, "NodeID", 6, agentHost->g_selfid, (int)sizeof(agentHost->g_selfid)); + } } // Close the registry key diff --git a/meshcore/agentcore.h b/meshcore/agentcore.h index 90d692f..87e9f01 100644 --- a/meshcore/agentcore.h +++ b/meshcore/agentcore.h @@ -180,6 +180,9 @@ typedef struct MeshAgentHostContainer char agentHash[UTIL_SHA384_HASHSIZE]; char serverHash[UTIL_SHA384_HASHSIZE]; #ifndef MICROSTACK_NOTLS +#ifdef WIN32 + int noCertStore; +#endif struct util_cert selfcert; struct util_cert selftlscert; char serverWebHash[UTIL_SHA384_HASHSIZE]; diff --git a/microscript/ILibDuktape_Polyfills.c b/microscript/ILibDuktape_Polyfills.c index fa2366a..3899323 100644 --- a/microscript/ILibDuktape_Polyfills.c +++ b/microscript/ILibDuktape_Polyfills.c @@ -1940,8 +1940,8 @@ void ILibDuktape_Polyfills_JS_Init(duk_context *ctx) // Mesh Agent NodeID helper, refer to modules/_agentNodeId.js - duk_peval_string_noresult(ctx, "addModule('_agentNodeId', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCmZ1bmN0aW9uIF9tZXNoTm9kZUlkKCkNCnsNCiAgICB2YXIgcmV0ID0gJyc7DQogICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgIHsNCiAgICAgICAgY2FzZSAnbGludXgnOg0KICAgICAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGRiID0gcmVxdWlyZSgnU2ltcGxlRGF0YVN0b3JlJykuQ3JlYXRlKHByb2Nlc3MuZXhlY1BhdGggKyAnLmRiJywgeyByZWFkT25seTogdHJ1ZSB9KTsNCiAgICAgICAgICAgICAgICByZXQgPSByZXF1aXJlKCd0bHMnKS5sb2FkQ2VydGlmaWNhdGUoeyBwZng6IGRiLkdldEJ1ZmZlcignU2VsZk5vZGVDZXJ0JyksIHBhc3NwaHJhc2U6ICdoaWRkZW4nIH0pLmdldEtleUhhc2goKS50b1N0cmluZygnaGV4Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaChlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ3dpbjMyJzoNCiAgICAgICAgICAgIC8vIEZpcnN0IENoZWNrIGlmIHRoZSBkYiBDb250YWlucyB0aGUgTm9kZUlEDQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgZGIgPSByZXF1aXJlKCdTaW1wbGVEYXRhU3RvcmUnKS5DcmVhdGUocHJvY2Vzcy5leGVjUGF0aC5yZXBsYWNlKCcuZXhlJywgJy5kYicpLCB7IHJlYWRPbmx5OiB0cnVlIH0pOw0KICAgICAgICAgICAgICAgIHZhciB2ID0gZGIuR2V0QnVmZmVyKCdOb2RlSUQnKTsNCiAgICAgICAgICAgICAgICBpZih2IT1udWxsKQ0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gdi50b1N0cmluZygnaGV4Jyk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHJldCA9IHJlcXVpcmUoJ3RscycpLmxvYWRDZXJ0aWZpY2F0ZSh7IHBmeDogZGIuR2V0QnVmZmVyKCdTZWxmTm9kZUNlcnQnKSwgcGFzc3BocmFzZTogJ2hpZGRlbicgfSkuZ2V0S2V5SGFzaCgpLnRvU3RyaW5nKCdoZXgnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaCAoZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgYnJlYWs7DQogICAgfQ0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KbW9kdWxlLmV4cG9ydHMgPSBfbWVzaE5vZGVJZDsNCg0K', 'base64').toString());"); - + duk_peval_string_noresult(ctx, "addModule('_agentNodeId', Buffer.from('LyoKQ29weXJpZ2h0IDIwMTkgSW50ZWwgQ29ycG9yYXRpb24KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKi8KCmZ1bmN0aW9uIF9tZXNoTm9kZUlkKCkNCnsNCiAgICB2YXIgcmV0ID0gJyc7DQogICAgc3dpdGNoIChwcm9jZXNzLnBsYXRmb3JtKQ0KICAgIHsNCiAgICAgICAgY2FzZSAnbGludXgnOg0KICAgICAgICBjYXNlICdkYXJ3aW4nOg0KICAgICAgICAgICAgdHJ5DQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgdmFyIGRiID0gcmVxdWlyZSgnU2ltcGxlRGF0YVN0b3JlJykuQ3JlYXRlKHByb2Nlc3MuZXhlY1BhdGggKyAnLmRiJywgeyByZWFkT25seTogdHJ1ZSB9KTsNCiAgICAgICAgICAgICAgICByZXQgPSByZXF1aXJlKCd0bHMnKS5sb2FkQ2VydGlmaWNhdGUoeyBwZng6IGRiLkdldEJ1ZmZlcignU2VsZk5vZGVDZXJ0JyksIHBhc3NwaHJhc2U6ICdoaWRkZW4nIH0pLmdldEtleUhhc2goKS50b1N0cmluZygnaGV4Jyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaChlKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIGNhc2UgJ3dpbjMyJzoNCiAgICAgICAgICAgIC8vIEZpcnN0IENoZWNrIGlmIHRoZSBkYiBDb250YWlucyB0aGUgTm9kZUlEDQogICAgICAgICAgICB0cnkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICB2YXIgZGIgPSByZXF1aXJlKCdTaW1wbGVEYXRhU3RvcmUnKS5DcmVhdGUocHJvY2Vzcy5leGVjUGF0aC5yZXBsYWNlKCcuZXhlJywgJy5kYicpLCB7IHJlYWRPbmx5OiB0cnVlIH0pOw0KICAgICAgICAgICAgICAgIHZhciB2ID0gZGIuR2V0QnVmZmVyKCdTZWxmTm9kZUNlcnQnKTsNCiAgICAgICAgICAgICAgICBpZiAodikNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXF1aXJlKCd0bHMnKS5sb2FkQ2VydGlmaWNhdGUoeyBwZng6IHYsIHBhc3NwaHJhc2U6ICdoaWRkZW4nIH0pLmdldEtleUhhc2goKS50b1N0cmluZygnaGV4Jyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgdiA9IG51bGw7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCAmJiAodiA9IGRiLkdldEJ1ZmZlcignTm9kZUlEJykpICE9IE5VTEwpDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICByZXQgPSB2LnRvU3RyaW5nKCdoZXgnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjYXRjaCAoZSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgYnJlYWs7DQogICAgfQ0KICAgIHJldHVybiAocmV0KTsNCn0NCg0KbW9kdWxlLmV4cG9ydHMgPSBfbWVzaE5vZGVJZDsNCg0K', 'base64').toString());"); + // Task Scheduler, refer to modules/task-scheduler.js char *_taskscheduler = ILibMemory_Allocate(44751, 0, NULL, NULL); memcpy_s(_taskscheduler + 0, 25572, "LyoNCkNvcHlyaWdodCAyMDE5IEludGVsIENvcnBvcmF0aW9uDQoNCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQoNCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCg0KVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQoqLw0KDQp2YXIgcHJvbWlzZSA9IHJlcXVpcmUoJ3Byb21pc2UnKTsNCnZhciBzZXJ2aWNlbWFuYWdlciA9IHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpOw0KdmFyIG1nciA9IG5ldyBzZXJ2aWNlbWFuYWdlcigpOw0KDQovL2F0dGFjaERlYnVnZ2VyKHsgd2VicG9ydDogOTk5NSwgd2FpdDogMSB9KS50aGVuKGNvbnNvbGUubG9nKTsNCg0KZnVuY3Rpb24gdGFzaygpDQp7DQogICAgdGhpcy5fT2JqZWN0SUQgPSAndGFzay1zY2hlZHVsZXInOw0KDQogICAgdGhpcy5jcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUob3B0aW9ucykNCiAgICB7DQogICAgICAgIHZhciByZXQgPSBuZXcgcHJvbWlzZShmdW5jdGlvbiAocmVzLCByZWopIHsgdGhpcy5fcmVzID0gcmVzOyB0aGlzLl9yZWogPSByZWo7IH0pOw0KICAgICAgICBpZihvcHRpb25zLm5hbWUgJiYgb3B0aW9ucy5zZXJ2aWNlKQ0KICAgICAgICB7DQogICAgICAgICAgICBzd2l0Y2gocHJvY2Vzcy5wbGF0Zm9ybSkNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlICd3aW4zMic6DQogICAgICAgICAgICAgICAgICAgIHZhciBwYXJtcyA9IFsnc2NodGFza3MnLCAnL0NyZWF0ZScsICcvUlUgU1lTVEVNJ107DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGZ0eXBlIGluIG9wdGlvbnMpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChmdHlwZS50b1VwcGVyQ2FzZSgpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01JTlVURSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSE9VUkxZJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEQUlMWSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnV0VFS0xZJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNT05USExZJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMucHVzaCgnL1NDICcgKyBmdHlwZS50b1VwcGVyQ2FzZSgpKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMucHVzaCgnL01PICcgKyBvcHRpb25zW2Z0eXBlXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RBWSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLnB1c2goJy9EICcgKyBvcHRpb25zW2Z0eXBlXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01PTlRIJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMucHVzaCgnL00gJyArIG9wdGlvbnNbZnR5cGVdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVElNRSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLnB1c2goJy9TVCAnICsgb3B0aW9uc1tmdHlwZV0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOQU1FJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybXMucHVzaCgnL1ROICInICsgb3B0aW9uc1tmdHlwZV0uc3BsaXQoJy8nKS5qb2luKCdcXCcpICsgJyInKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnU0VSVklDRSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1zLnB1c2goJy9UUiAibmV0IHN0YXJ0ICcgKyBvcHRpb25zW2Z0eXBlXSArICciJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHBhcm1zLmpvaW4oJyAnKSk7DQogICAgICAgICAgICAgICAgICAgIHJldC5jaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZShwcm9jZXNzLmVudlsnd2luZGlyJ10gKyAnXFxzeXN0ZW0zMlxcc2NodGFza3MuZXhlJywgcGFybXMpOw0KICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOw0KICAgICAgICAgICAgICAgICAgICByZXQuY2hpbGQucHJvbWlzZSA9IHJldDsNCiAgICAgICAgICAgICAgICAgICAgcmV0LmNoaWxkLm9uKCdleGl0JywgZnVuY3Rpb24gKGNvZGUpIHsgaWYgKGNvZGUgPT0gMCkgeyB0aGlzLnByb21pc2UuX3JlcygpOyB9IGVsc2UgeyB0aGlzLnByb21pc2UuX3Jlaihjb2RlKTsgfX0pOyANCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnbGludXgnOg0KICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZSgnZnMnKS5leGlzdHNTeW5jKCcvZXRjL2Nyb24uZC8nICsgb3B0aW9ucy5uYW1lLnNwbGl0KCcvJykuam9pbignXycpLnNwbGl0KCcuJykuam9pbignJykpKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXQuX3JlaignVGFzayBbJyArIG9wdGlvbnMubmFtZSArICddIEFscmVhZHkgZXhpc3RzJyk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFyIG1pbnV0ZSA9ICcqJzsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGhvdXIgPSAnKic7DQogICAgICAgICAgICAgICAgICAgIHZhciBkYXkgPSAnKic7DQogICAgICAgICAgICAgICAgICAgIHZhciBtb250aCA9ICcqJzsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHdlZWtkYXkgPSAnKic7DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGZ0eXBlIGluIG9wdGlvbnMpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChmdHlwZS50b1VwcGVyQ2FzZSgpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ01JTlVURSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5USU1FICYmICFvcHRpb25zLnRpbWUpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZSA9ICcqLycgKyBvcHRpb25zW2Z0eXBlXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdIT1VSTFknOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMuVElNRSAmJiAhb3B0aW9ucy50aW1lKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gJyovJyArIG9wdGlvbnNbZnR5cGVdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RBSUxZJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gJyovJyArIG9wdGlvbnNbZnR5cGVdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdXRUVLTFknOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1tmdHlwZV0gPT0gMSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIW9wdGlvbnMuREFZICYmICFvcHRpb25zLmRheSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gMDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5fcmVqKCdPbmx5IE9uY2UvV2Vla2x5IHN1cHBvcnRlZCBvbiBMaW51eCcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0RBWSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLndlZWtseSB8fCBvcHRpb25zLldFRUtMWSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla2RheSA9IG9wdGlvbnNbZnR5cGVdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gb3B0aW9uc1tmdHlwZV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnVElNRSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBvcHRpb25zW2Z0eXBlXS5zcGxpdCgnOicpWzBdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51dGUgPSBvcHRpb25zW2Z0eXBlXS5zcGxpdCgnOicpWzFdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdNT05USExZJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggPSAnKi8nICsgb3B0aW9uc1tmdHlwZV07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIGFjdGlvbiA9ICdTSEVMTD0vYmluL3NoXG5QQVRIPS91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2Jpbjovc2JpbjovYmluOi91c3Ivc2JpbjovdXNyL2JpblxuXG4nOw0KICAgICAgICAgICAgICAgICAgICBhY3Rpb24gKz0gKG1pbnV0ZSArICcgJyArIGhvdXIgKyAnICcgKyBkYXkgKyAnICcgKyBtb250aCArICcgJyArIHdlZWtkYXkgKyAnICAgcm9vdCAgICcpOw0KICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocmVxdWlyZSgnc2VydmljZS1tYW5hZ2VyJykubWFuYWdlci5nZXRTZXJ2aWNlVHlwZSgpKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdpbml0JzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGQgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGUoJy9iaW4vc2gnLCBbJ3NoJ10pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5zdHIgPSAnJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgdGhpcy5zdHIgKz0gY2h1bmsudG9TdHJpbmcoKTsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkZXJyLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGluLndyaXRlKCJ3aGVyZWlzIHNlcnZpY2UgfCBhd2sgJ3twcmludCAkMn0nXG5cZXhpdFxuIik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQud2FpdEV4aXQoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gY2hpbGQuc3Rkb3V0LnN0ci50cmltKCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uICs9IChjaGlsZC5zdGRvdXQuc3RyICsgJyAnICsgb3B0aW9ucy5zZXJ2aWNlICsgJyByZXN0YXJ0ID4vZGV2L251bGwgMj4mMSBcbicpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndXBzdGFydCc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWNGaWxlKCcvYmluL3NoJywgWydzaCddKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRvdXQuc3RyID0gJyc7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0Lm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7IHRoaXMuc3RyICs9IGNodW5rLnRvU3RyaW5nKCk7IH0pOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRpbi53cml0ZSgid2hlcmVpcyBpbml0Y3RsIHwgYXdrICd7cHJpbnQgJDJ9J1xuXGV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiArPSAoY2hpbGQuc3Rkb3V0LnN0ciArICcgJyArIG9wdGlvbnMuc2VydmljZSArICcgcmVzdGFydCA+L2Rldi9udWxsIDI+JjEgXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N5c3RlbWQnOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjaGlsZCA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjRmlsZSgnL2Jpbi9zaCcsIFsnc2gnXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9ICcnOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLnN0ZG91dC5vbignZGF0YScsIGZ1bmN0aW9uIChjaHVuaykgeyB0aGlzLnN0ciArPSBjaHVuay50b1N0cmluZygpOyB9KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5zdGRlcnIub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHsgfSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3RkaW4ud3JpdGUoIndoZXJlaXMgc3lzdGVtY3RsIHwgYXdrICd7cHJpbnQgJDJ9J1xuXGV4aXRcbiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLndhaXRFeGl0KCk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuc3Rkb3V0LnN0ciA9IGNoaWxkLnN0ZG91dC5zdHIudHJpbSgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiArPSAoY2hpbGQuc3Rkb3V0LnN0ciArICcgcmVzdGFydCAnICsgb3B0aW9ucy5zZXJ2aWNlICsgJyA+L2Rldi9udWxsIDI+JjEgXG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll9yZWooJ1Vua25vd24gU2VydmljZSBQbGF0Zm9ybTogJyArIHJlcXVpcmUoJ3NlcnZpY2UtbWFuYWdlcicpLm1hbmFnZXIuZ2V0U2VydmljZVR5cGUoKSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChyZXQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHRyeQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JUlVTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JV1VTUiB8IHJlcXVpcmUoJ2ZzJykuQ0hNT0RfTU9ERVMuU19JUk9USDsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUoJ2ZzJykud3JpdGVGaWxlU3luYygnL2V0Yy9jcm9uLmQvJyArIG9wdGlvbnMubmFtZS5zcGxpdCgnLycpLmpvaW4oJ18nKS5zcGxpdCgnLicpLmpvaW4oJycpLCBhY3Rpb24sIHsgZmxhZ3M6ICd3YicsIG1vZGU6IG0gfSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgY2F0Y2goZSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0Ll9yZWooZSk7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJldCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcmV0Ll9yZXMoKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAnZGFyd2luJzoNCiAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2tuYW1lID0gb3B0aW9ucy5uYW1lLnNwbGl0KCcvJykuam9pbignXycpLnNwbGl0KCcuJykuam9pbignJyk7DQogICAgICAgICAgICAgICAgICAgIHZhciBwbGlzdCA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PlxuJzsNCiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gJzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPlxuJzsNCiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gJzxwbGlzdCB2ZXJzaW9uPSIxLjAiPlxuJzsNCiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgPGRpY3Q+XG4nOw0KICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5MYWJlbDwva2V5PlxuJzsNCiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gKCcgICAgIDxzdHJpbmc+JyArIHRhc2tuYW1lICsgJzwvc3RyaW5nPlxuJyk7DQogICAgICAgICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8a2V5PlByb2dyYW1Bcmd1bWVudHM8L2tleT5cbic7DQogICAgICAgICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8YXJyYXk+XG4nOw0KICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgICA8c3RyaW5nPi9iaW4vbGF1bmNoY3RsPC9zdHJpbmc+XG4nOw0KICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgICA8c3RyaW5nPnN0YXJ0PC9zdHJpbmc+XG4nOw0KICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAoJyAgICAgICA8c3RyaW5nPicgKyBvcHRpb25zLnNlcnZpY2UgKyAnPC9zdHJpbmc+XG4nKTsNCiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgICAgIDwvYXJyYXk+XG4nOw0KICAgICAgICAgICAgICAgICAgICAgICBwbGlzdCArPSAnICAgICAgPGtleT5SdW5BdExvYWQ8L2tleT5cbic7DQogICAgICAgICAgICAgICAgICAgICAgIHBsaXN0ICs9ICcgICAgICA8ZmFsc2UvPlxuJzsNCiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gJ3t7e0lOVEVSVkFMfX19JzsNCiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gJyAgPC9kaWN0PlxuJzsNCiAgICAgICAgICAgICAgICAgICAgICAgcGxpc3QgKz0gJzwvcGxpc3Q+JzsNCg0KICAgICAgICAgICAgICAgICAgICB2YXIgaW50ZXJ2YWwgPSBudWxsOw0KICAgICAgICAgICAgICAgICAgICB2YXIgcGVyaW9kaWMgPSAnJzsNCg0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBmdHlwZSBpbiBvcHRpb25zKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZ0eXBlLnRvVXBwZXJDYXNlKCkpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTUlOVVRFJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVydmFsICE9IG51bGwgfHwgcGVyaW9kaWMgIT0gJycpIHsgcmV0Ll9yZWooJ0ludmFsaWQgT3B0aW9ucycpOyByZXR1cm4gKHJldCk7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAnICAgICAgPGludGVnZXI+JyArIChwYXJzZUludChvcHRpb25zW2Z0eXBlXSkgKiA2MCkgKyAnPC9pbnRlZ2VyPlxuJzsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSE9VUkxZJzoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVydmFsICE9IG51bGwgfHwgcGVyaW9kaWMgIT0gJycpIHsgcmV0Ll9yZWooJ0ludmFsaWQgT3B0aW9ucycpOyByZXR1cm4gKHJldCk7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAnICAgICAgPGludGVnZXI+JyArIChwYXJzZUludChvcHRpb25zW2Z0eXBlXSkgKiA2MCAqIDYwKSArICc8L2ludGVnZXI+XG4nOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdEQUlMWSc6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcnZhbCAhPSBudWxsIHx8IHBlcmlvZGljICE9ICcnKSB7IHJldC5fcmVqKCdJbnZhbGlkIE9wdGlvbnMnKTsgcmV0dXJuIChyZXQpO30NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSAnICAgICAgPGludGVnZXI+JyArIChwYXJzZUludChvcHRpb25zW2Z0eXBlXSkgKiAyNCAqIDYwICogNjApICsgJzwvaW50ZWdlcj5cbic7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1dFRUtM", 16000); diff --git a/modules/_agentNodeId.js b/modules/_agentNodeId.js index f4151e8..7603f25 100644 --- a/modules/_agentNodeId.js +++ b/modules/_agentNodeId.js @@ -35,15 +35,22 @@ function _meshNodeId() try { var db = require('SimpleDataStore').Create(process.execPath.replace('.exe', '.db'), { readOnly: true }); - var v = db.GetBuffer('NodeID'); - if(v!=null) + var v = db.GetBuffer('SelfNodeCert'); + if (v) + { + try + { + ret = require('tls').loadCertificate({ pfx: v, passphrase: 'hidden' }).getKeyHash().toString('hex'); + } + catch(e) + { + v = null; + } + } + if (v == null && (v = db.GetBuffer('NodeID')) != NULL) { ret = v.toString('hex'); } - else - { - ret = require('tls').loadCertificate({ pfx: db.GetBuffer('SelfNodeCert'), passphrase: 'hidden' }).getKeyHash().toString('hex'); - } } catch (e) {