@sap_oss/wdio-qmate-service 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/scripts/hooks/utils/decryption.d.ts +11 -1
- package/lib/scripts/hooks/utils/decryption.js +53 -7
- package/lib/scripts/hooks/utils/decryption.js.map +1 -1
- package/package.json +1 -2
- package/test/reuse/util/data/data/test.secure.json +4 -4
- package/test/reuse/util/data/test.data.conf.js +1 -1
|
@@ -5,9 +5,19 @@ declare class Decryption {
|
|
|
5
5
|
private childProcess;
|
|
6
6
|
initDecryptFunction(): void;
|
|
7
7
|
retrievePrivateKey(dirname: string): any;
|
|
8
|
-
decryptSecureData(privateKey: string, input: string | Array<string
|
|
8
|
+
decryptSecureData(privateKey: string, input: string | Array<string>, options?: {
|
|
9
|
+
base64Output: boolean;
|
|
10
|
+
base64Input: boolean;
|
|
11
|
+
}): any;
|
|
9
12
|
decryptSauceConfig(config: Record<string, any>): void;
|
|
10
13
|
private _decryptDataWithRepoName;
|
|
14
|
+
private _unifyRepoUrl;
|
|
15
|
+
private _unifySSHUrl;
|
|
16
|
+
private _unifyHTTPUrl;
|
|
17
|
+
private _hashHostAccountAndRepo;
|
|
18
|
+
private _parseKeyByEncoding;
|
|
19
|
+
private _base64ToUtf8;
|
|
20
|
+
private _utf8ToBase64;
|
|
11
21
|
}
|
|
12
22
|
declare const _default: Decryption;
|
|
13
23
|
export default _default;
|
|
@@ -47,7 +47,7 @@ class Decryption {
|
|
|
47
47
|
process.env.QMATE_PRIVATE_KEY = "";
|
|
48
48
|
return privateKey;
|
|
49
49
|
}
|
|
50
|
-
decryptSecureData(privateKey, input) {
|
|
50
|
+
decryptSecureData(privateKey, input, options) {
|
|
51
51
|
// input data can either be as single value or array of values for different keys
|
|
52
52
|
if (typeof input === "string") {
|
|
53
53
|
input = [input];
|
|
@@ -56,11 +56,12 @@ class Decryption {
|
|
|
56
56
|
let decryptError;
|
|
57
57
|
for (const data of input) {
|
|
58
58
|
try {
|
|
59
|
-
const
|
|
59
|
+
const dataEncoded = (options === null || options === void 0 ? void 0 : options.base64Input) ? this._base64ToUtf8(data) : data;
|
|
60
|
+
const decryptedDataByRepoName = Buffer.from(this._decryptDataWithRepoName(Buffer.from(dataEncoded, "hex")), "base64");
|
|
60
61
|
decryptedDataByKey = this.crypto.privateDecrypt({
|
|
61
|
-
key: privateKey,
|
|
62
|
+
key: this._parseKeyByEncoding(privateKey),
|
|
62
63
|
padding: this.crypto.constants.RSA_PKCS1_OAEP_PADDING,
|
|
63
|
-
oaepHash: "sha256"
|
|
64
|
+
oaepHash: "sha256",
|
|
64
65
|
}, decryptedDataByRepoName);
|
|
65
66
|
}
|
|
66
67
|
catch (error) {
|
|
@@ -68,7 +69,7 @@ class Decryption {
|
|
|
68
69
|
}
|
|
69
70
|
}
|
|
70
71
|
if (decryptedDataByKey) {
|
|
71
|
-
return decryptedDataByKey.toString();
|
|
72
|
+
return (options === null || options === void 0 ? void 0 : options.base64Output) ? this._utf8ToBase64(decryptedDataByKey.toString()) : decryptedDataByKey.toString();
|
|
72
73
|
}
|
|
73
74
|
else {
|
|
74
75
|
throw new Error(`Function 'decrypt' failed: ${decryptError}`);
|
|
@@ -96,14 +97,59 @@ class Decryption {
|
|
|
96
97
|
catch (error) {
|
|
97
98
|
throw new Error("Please execute from a valid git repository.");
|
|
98
99
|
}
|
|
100
|
+
const repoUrlContractHashed = this._unifyRepoUrl(repoUrl);
|
|
99
101
|
const salt = "72hdh393987f0hdc";
|
|
100
|
-
const secretKey = this.crypto.pbkdf2Sync(
|
|
102
|
+
const secretKey = this.crypto.pbkdf2Sync(repoUrlContractHashed, salt, 100000, 32, "sha512");
|
|
101
103
|
const iv = "203efccd80e94d9f";
|
|
102
104
|
const decipher = this.crypto.createDecipheriv("aes-256-cbc", secretKey, iv);
|
|
103
|
-
let decryptedData = decipher.update(data, "hex", "
|
|
105
|
+
let decryptedData = decipher.update(data, "hex", "utf8");
|
|
104
106
|
decryptedData += decipher.final("utf8");
|
|
105
107
|
return decryptedData;
|
|
106
108
|
}
|
|
109
|
+
_unifyRepoUrl(url) {
|
|
110
|
+
const httpsRegex = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,4}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/gm;
|
|
111
|
+
const sshRegex = /git@.*:.*\/.*.git/gm;
|
|
112
|
+
if (url.match(httpsRegex)) {
|
|
113
|
+
return this._unifyHTTPUrl(url);
|
|
114
|
+
}
|
|
115
|
+
else if (url.match(sshRegex)) {
|
|
116
|
+
return this._unifySSHUrl(url);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
throw new Error("Repo url is not valid");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
_unifySSHUrl(url) {
|
|
123
|
+
const [hostAndAccount, repo] = url.replace("git@", "").trim().split("/");
|
|
124
|
+
const [host, account] = hostAndAccount.split(":");
|
|
125
|
+
const repoTrimmed = repo.endsWith(".git") ? repo.slice(0, -4) : repo;
|
|
126
|
+
return this._hashHostAccountAndRepo(host, account, repoTrimmed);
|
|
127
|
+
}
|
|
128
|
+
_unifyHTTPUrl(url) {
|
|
129
|
+
const urlWithoutProtocol = url.replace(/((\bhttp\b)|(\bhttps\b)):\/\//, "").trim();
|
|
130
|
+
const [host, account, repo] = urlWithoutProtocol.split("/");
|
|
131
|
+
const repoTrimmed = repo.endsWith(".git") ? repo.slice(0, -4) : repo;
|
|
132
|
+
return this._hashHostAccountAndRepo(host, account, repoTrimmed);
|
|
133
|
+
}
|
|
134
|
+
_hashHostAccountAndRepo(host, account, repo) {
|
|
135
|
+
return this.crypto.createHash("sha256").update(`${host}${account}${repo}`).digest("hex");
|
|
136
|
+
}
|
|
137
|
+
_parseKeyByEncoding(key) {
|
|
138
|
+
const utf8Regex = /-*(BEGIN|END)\s\w*\s(PRIVATE|PUBLIC)\sKEY-*/gm;
|
|
139
|
+
if (utf8Regex.test(key)) {
|
|
140
|
+
return key;
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
console.log("Key was processed in base64 format");
|
|
144
|
+
return this._base64ToUtf8(key);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
_base64ToUtf8(string) {
|
|
148
|
+
return Buffer.from(string, "base64").toString("utf-8");
|
|
149
|
+
}
|
|
150
|
+
_utf8ToBase64(string) {
|
|
151
|
+
return Buffer.from(string, "utf-8").toString("base64");
|
|
152
|
+
}
|
|
107
153
|
}
|
|
108
154
|
exports.default = new Decryption();
|
|
109
155
|
//# sourceMappingURL=decryption.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decryption.js","sourceRoot":"","sources":["../../../../src/scripts/hooks/utils/decryption.ts"],"names":[],"mappings":";;AAAA,MAAM,UAAU;IAAhB;QACU,SAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QACvB,OAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACnB,WAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3B,iBAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"decryption.js","sourceRoot":"","sources":["../../../../src/scripts/hooks/utils/decryption.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sap_oss/wdio-qmate-service",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"author": "SAP SE",
|
|
5
5
|
"types": "./@types/index.d.ts",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -90,7 +90,6 @@
|
|
|
90
90
|
"test:reuse:util:console": "npx wdio ./test/reuse/util/console/test.console.conf.js",
|
|
91
91
|
"test:reuse:util:system": "npx wdio ./test/reuse/util/system/test.system.conf.js",
|
|
92
92
|
"test:reuse:util:formatter": "npx wdio ./test/reuse/util/formatter/test.formatter.conf.js",
|
|
93
|
-
"test:reuse:util:temp": "npm run test:reuse:util:browser && npm run test:reuse:util:file && npm run test:reuse:util:formatter",
|
|
94
93
|
"test:reuse:util": "npm run test:reuse:util:browser && npm run test:reuse:util:data && npm run test:reuse:util:file && npm run test:reuse:util:formatter && npm run test:reuse:util:system && npm run test:reuse:util:console",
|
|
95
94
|
"test:reuse:common:assertion": "npx wdio ./test/reuse/common/assertion/test.assertion.conf.js",
|
|
96
95
|
"test:reuse:common:navigation": "npx wdio ./test/reuse/common/navigation/test.navigation.conf.js",
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"session": {
|
|
3
|
-
"password": "
|
|
3
|
+
"password": "2b45d609a893c467c7cd4f65886d49a30a693fd5c4d5b179dcbd63f79c6c9f7bcc8e0c9a6bab93ae56a26e7b07f33ee02e74a4f92edd321d16c90c6636d28f5283b5a621dc228de06cfc35506f46e5a6fc8465a8120f7bf77e333316307cbec3d9043a93e8d1423f0c43606ea8d9333386209d1f5c609186c90a68d8499d0115055a0f027af90c3ed818aa5806745bed95b8a03169764b02fffb9556e59632042472d96f58250ec9a536486e1bd4d60d00a4867df05a4bf9a795be9149f8a8cc1745f2b3d920f9ee4130ea62885477467e72bc060b40a623087707849bbba75cdc7d89e5607f900868b3f6b13ed1414f8bdfa34f12d8b0ebca8dbdccdeb988355d9b74af1eea87c3c2982926ec4be89216d5f374e0710e5f846e8e58763f06c7ebf5880c1b5742c59e1eaf2abb92c0c66e54a6cab43d89578a420e9e018db78bce0fbcce96ef069c3e7d9e589694a8b584dcc04ee8a43a232f199520f97560c9"
|
|
4
4
|
},
|
|
5
5
|
"test": {
|
|
6
6
|
"number": 42,
|
|
7
7
|
"inner": {
|
|
8
|
-
"value": "
|
|
8
|
+
"value": "7090bcc6097140bdf6e68850582b5e94bbd4ec52d0db5c83ac7b9c1cf4c771e2b467b8cab402f27d6bf7ba1737ec081aff24bb437e80f734ad385fa28cdbe765b630774df1021c5020515d714753c1fce0119d9a7360cd802ac536060b33976a564a590c0f61a83e7d83b02ea917f0eba8ef34f36c5898bd49013dc5756dbb3b775f1df9b99c552f1d6c44fdf8b0635e69d4c884a5226a29b573b7975e8ac564481a3e8870ccef8dbff66e167b67bac9ec3155dc0e3c41460b03d9ab6ab58f061aa67b4216b0f719fb37225c5e51b3cdd38c4597c0fe9c48e5400390a61271649e3eda26c011dfca6a22cab1b7f8ed54bc37883013f203a117d3893dab3f5f42bbb63bf9566114df3e1aff43758a98d1e8cddc0b2a5c9b7076e6b6ce8d02864514b8af3a8b8d5f789c910c2af37305ad73b5bf9a3403299416a4278108987b80f33f82f6f2ad812518fbeb5eca565a52d8dea18976dc4d895c3c5a22693c70e9"
|
|
9
9
|
}
|
|
10
10
|
},
|
|
11
11
|
"alternatives": [
|
|
12
|
-
"
|
|
13
|
-
"
|
|
12
|
+
"b56b1c69c17a41d74aed5bf1a924a4db6d90e54fde09e31afcef3ed0c4db3cf199b3b567f4e1de54c74c1c78121c1049a40f84e646aa682dcfe44034a312a9c522bccd94e7464b57b55a8a91c340868796bc7b4487f3a7ac1925afe07b076b25dbb17d02df113231bc0640f39c650608863b31525da712891df7b9f53cd02d608be40b476791b226ab670f0bb9dee8711dfe1e3f802b0594ac951e2146a14f8f6658afa5cad9f22247c61b5c306044b7f3f9fa5bfd373443e811f3da765084bb423dbe3855bf8419d79adb7db3c4543cd80a30386bff70790ee09c0dda1a55a10e96cf67a3c036a0289cdbf3153d058379274954951b044abf698993058063e4af970d3ffc1460adb0e132a36137180c77dbade2d5855a0bd5bfb3610b3a217db908610a98f36477f17462f387002ea83f5b0ca297c78186bd430edf72da799e8351b743a8e7620742015029383fa46c5656869ea4e41e8b96fc082a7da98cb6",
|
|
13
|
+
"730bf5f4bf0aa9acc050ab4d39b557fadb37322c7be8bf36548807b8e17b442a38abcd71b413d238355b9c3a5d898c98c58745ffef18564c6adf9116fca93df0b83720cf9afa6ec530b35c15eb7a3d049ce65edeabc4ba5147586bfcedcd3ce4fdfc2ada5b7f7e40086c3e8c2bbdb2bb8bde42b6ed2e3d47ec7bea812512f649028bcf2c71adc93210409b1e398de50de59e116cc86dcc39266e46aa7d830e079c573ddf191bbf3f1a6a15dd57247a814551953cb8dcbdd50502daf1f3ffc0b2cd42d35133f4528864aa98eccd2d36efcc53c34d5b161bf0cc92fc39bbb0a5496a634697a35716bd712671880b1e9dc9846b7a72cb39b6232d622553e8ab8d9da53f24c2b8e7d439867c181179c5212d118efc9dad5aaa40807e9c249f1d7398655deedb750339e905ef841f09f92e6d6fc4d9d005268e344fa998104ab35fb9f4340394b29461256b9483e673cbc984b283d8ea76854ef94e88f481292767a8"
|
|
14
14
|
]
|
|
15
15
|
}
|