Skip to content

Commit 9164e99

Browse files
authored
Fixing the header sanitisation to allow only Ascii characters. (#135)
1 parent b64fc29 commit 9164e99

File tree

5 files changed

+173
-59
lines changed

5 files changed

+173
-59
lines changed

lib/Utils/CommonUtils.js

Lines changed: 78 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
1515
}) : function(o, v) {
1616
o["default"] = v;
1717
});
18-
var __importStar = (this && this.__importStar) || function (mod) {
19-
if (mod && mod.__esModule) return mod;
20-
var result = {};
21-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22-
__setModuleDefault(result, mod);
23-
return result;
24-
};
18+
var __importStar = (this && this.__importStar) || (function () {
19+
var ownKeys = function(o) {
20+
ownKeys = Object.getOwnPropertyNames || function (o) {
21+
var ar = [];
22+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23+
return ar;
24+
};
25+
return ownKeys(o);
26+
};
27+
return function (mod) {
28+
if (mod && mod.__esModule) return mod;
29+
var result = {};
30+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31+
__setModuleDefault(result, mod);
32+
return result;
33+
};
34+
})();
2535
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2636
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
2737
return new (P || (P = Promise))(function (resolve, reject) {
@@ -32,7 +42,44 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
3242
});
3343
};
3444
Object.defineProperty(exports, "__esModule", { value: true });
35-
exports.getAllFileErrors = exports.validateTestRunParamsFromPipeline = exports.getDefaultRunDescription = exports.getDefaultTestRunName = exports.getDefaultTestName = exports.inValidEngineInstances = exports.invalidName = exports.validateUrlcert = exports.validateUrl = exports.validateOutputParametervariableName = exports.validateOverRideParameters = exports.validateAndGetSegregatedManagedIdentities = exports.validateAutoStop = exports.getSubscriptionIdFromResourceId = exports.getResourceGroupFromResourceId = exports.getResourceNameFromResourceId = exports.getResourceTypeFromResourceId = exports.invalidDescription = exports.invalidDisplayName = exports.getFileName = exports.getResultObj = exports.isStatusFailed = exports.isTerminalFileStatusSucceeded = exports.isTerminalFileStatus = exports.isTerminalTestStatus = exports.removeUnits = exports.indexOfFirstDigit = exports.getReportFolder = exports.getResultFolder = exports.getUniqueId = exports.sleep = exports.printClientMetrics = exports.errorCorrection = exports.printCriteria = exports.printTestDuration = exports.checkFileTypes = exports.checkFileType = void 0;
45+
exports.checkFileType = checkFileType;
46+
exports.checkFileTypes = checkFileTypes;
47+
exports.printTestDuration = printTestDuration;
48+
exports.printCriteria = printCriteria;
49+
exports.errorCorrection = errorCorrection;
50+
exports.printClientMetrics = printClientMetrics;
51+
exports.sleep = sleep;
52+
exports.getUniqueId = getUniqueId;
53+
exports.getResultFolder = getResultFolder;
54+
exports.getReportFolder = getReportFolder;
55+
exports.indexOfFirstDigit = indexOfFirstDigit;
56+
exports.removeUnits = removeUnits;
57+
exports.isTerminalTestStatus = isTerminalTestStatus;
58+
exports.isTerminalFileStatus = isTerminalFileStatus;
59+
exports.isTerminalFileStatusSucceeded = isTerminalFileStatusSucceeded;
60+
exports.isStatusFailed = isStatusFailed;
61+
exports.getResultObj = getResultObj;
62+
exports.getFileName = getFileName;
63+
exports.invalidDisplayName = invalidDisplayName;
64+
exports.invalidDescription = invalidDescription;
65+
exports.getResourceTypeFromResourceId = getResourceTypeFromResourceId;
66+
exports.getResourceNameFromResourceId = getResourceNameFromResourceId;
67+
exports.getResourceGroupFromResourceId = getResourceGroupFromResourceId;
68+
exports.getSubscriptionIdFromResourceId = getSubscriptionIdFromResourceId;
69+
exports.validateAutoStop = validateAutoStop;
70+
exports.validateAndGetSegregatedManagedIdentities = validateAndGetSegregatedManagedIdentities;
71+
exports.validateOverRideParameters = validateOverRideParameters;
72+
exports.validateOutputParametervariableName = validateOutputParametervariableName;
73+
exports.validateUrl = validateUrl;
74+
exports.validateUrlcert = validateUrlcert;
75+
exports.invalidName = invalidName;
76+
exports.inValidEngineInstances = inValidEngineInstances;
77+
exports.getDefaultTestName = getDefaultTestName;
78+
exports.getDefaultTestRunName = getDefaultTestRunName;
79+
exports.getDefaultRunDescription = getDefaultRunDescription;
80+
exports.validateTestRunParamsFromPipeline = validateTestRunParamsFromPipeline;
81+
exports.getAllFileErrors = getAllFileErrors;
82+
exports.sanitisePipelineNameHeader = sanitisePipelineNameHeader;
3683
const { v4: uuidv4 } = require('uuid');
3784
const util_1 = require("util");
3885
const GeneralConstants_1 = require("../Constants/GeneralConstants");
@@ -47,7 +94,6 @@ function checkFileType(filePath, fileExtToValidate) {
4794
let split = filePath.split('.');
4895
return split[split.length - 1].toLowerCase() == fileExtToValidate.toLowerCase();
4996
}
50-
exports.checkFileType = checkFileType;
5197
function checkFileTypes(filePath, fileExtsToValidate) {
5298
var _a;
5399
if ((0, util_1.isNullOrUndefined)(filePath)) {
@@ -57,7 +103,6 @@ function checkFileTypes(filePath, fileExtsToValidate) {
57103
let fileExtsToValidateLower = fileExtsToValidate.map(ext => ext.toLowerCase());
58104
return fileExtsToValidateLower.includes((_a = split[split.length - 1]) === null || _a === void 0 ? void 0 : _a.toLowerCase());
59105
}
60-
exports.checkFileTypes = checkFileTypes;
61106
function printTestDuration(testRunObj) {
62107
return __awaiter(this, void 0, void 0, function* () {
63108
var _a, _b;
@@ -70,7 +115,6 @@ function printTestDuration(testRunObj) {
70115
return;
71116
});
72117
}
73-
exports.printTestDuration = printTestDuration;
74118
function printCriteria(criteria) {
75119
if (Object.keys(criteria).length == 0)
76120
return;
@@ -99,11 +143,9 @@ function printCriteria(criteria) {
99143
}
100144
console.log("\n");
101145
}
102-
exports.printCriteria = printCriteria;
103146
function errorCorrection(result) {
104147
return "Unable to fetch the response. Please re-run or contact support if the issue persists. " + "Status code :" + result.message.statusCode;
105148
}
106-
exports.errorCorrection = errorCorrection;
107149
function printTestResult(criteria) {
108150
var _a, _b;
109151
let pass = 0;
@@ -142,7 +184,6 @@ function printClientMetrics(obj) {
142184
}
143185
});
144186
}
145-
exports.printClientMetrics = printClientMetrics;
146187
function getAbsVal(data) {
147188
if ((0, util_1.isNullOrUndefined)(data)) {
148189
return "undefined";
@@ -156,69 +197,59 @@ function sleep(ms) {
156197
setTimeout(resolve, ms);
157198
});
158199
}
159-
exports.sleep = sleep;
160200
function getUniqueId() {
161201
return uuidv4();
162202
}
163-
exports.getUniqueId = getUniqueId;
164203
function getResultFolder(testArtifacts) {
165204
if ((0, util_1.isNullOrUndefined)(testArtifacts) || (0, util_1.isNullOrUndefined)(testArtifacts.outputArtifacts))
166205
return null;
167206
var outputurl = testArtifacts.outputArtifacts;
168207
return !(0, util_1.isNullOrUndefined)(outputurl.resultFileInfo) ? outputurl.resultFileInfo.url : null;
169208
}
170-
exports.getResultFolder = getResultFolder;
171209
function getReportFolder(testArtifacts) {
172210
if ((0, util_1.isNullOrUndefined)(testArtifacts) || (0, util_1.isNullOrUndefined)(testArtifacts.outputArtifacts))
173211
return null;
174212
var outputurl = testArtifacts.outputArtifacts;
175213
return !(0, util_1.isNullOrUndefined)(outputurl.reportFileInfo) ? outputurl.reportFileInfo.url : null;
176214
}
177-
exports.getReportFolder = getReportFolder;
178215
function indexOfFirstDigit(input) {
179216
let i = 0;
180217
for (; input[i] < '0' || input[i] > '9'; i++)
181218
;
182219
return i == input.length ? -1 : i;
183220
}
184-
exports.indexOfFirstDigit = indexOfFirstDigit;
185221
function removeUnits(input) {
186222
let i = 0;
187223
for (; input[i] >= '0' && input[i] <= '9'; i++)
188224
;
189225
return i == input.length ? input : input.substring(0, i);
190226
}
191-
exports.removeUnits = removeUnits;
192227
function isTerminalTestStatus(testStatus) {
193228
if (testStatus == "DONE" || testStatus === "FAILED" || testStatus === "CANCELLED") {
194229
return true;
195230
}
196231
return false;
197232
}
198-
exports.isTerminalTestStatus = isTerminalTestStatus;
199233
function isTerminalFileStatus(fileStatus) {
200234
let fileStatusEnum = fileStatus;
201235
if (fileStatusEnum == PayloadModels_1.FileStatus.VALIDATION_INITIATED) {
202236
return false;
203237
}
204238
return true;
205239
}
206-
exports.isTerminalFileStatus = isTerminalFileStatus;
207240
function isTerminalFileStatusSucceeded(fileStatus) {
208241
let fileStatusEnum = fileStatus;
209242
if ((0, util_1.isNullOrUndefined)(fileStatusEnum) || fileStatusEnum == PayloadModels_1.FileStatus.VALIDATION_SUCCESS || fileStatusEnum == PayloadModels_1.FileStatus.NOT_VALIDATED) {
210243
return true;
211244
}
212245
return false;
213246
}
214-
exports.isTerminalFileStatusSucceeded = isTerminalFileStatusSucceeded;
215247
function isStatusFailed(testStatus) {
216248
if (testStatus === "FAILED" || testStatus === "CANCELLED") {
217249
return true;
218250
}
219251
return false;
220252
}
221-
exports.isStatusFailed = isStatusFailed;
222253
function getResultObj(data) {
223254
return __awaiter(this, void 0, void 0, function* () {
224255
let dataString;
@@ -233,40 +264,32 @@ function getResultObj(data) {
233264
}
234265
});
235266
}
236-
exports.getResultObj = getResultObj;
237267
function getFileName(filepath) {
238268
const filename = path.basename(filepath);
239269
return filename;
240270
}
241-
exports.getFileName = getFileName;
242271
function invalidDisplayName(value) {
243272
if (value.length < 2 || value.length > 50)
244273
return true;
245274
return false;
246275
}
247-
exports.invalidDisplayName = invalidDisplayName;
248276
function invalidDescription(value) {
249277
if (value.length > 100)
250278
return true;
251279
return false;
252280
}
253-
exports.invalidDescription = invalidDescription;
254281
function getResourceTypeFromResourceId(resourceId) {
255282
return resourceId && resourceId.split("/").length > 7 ? resourceId.split("/")[6] + "/" + resourceId.split("/")[7] : null;
256283
}
257-
exports.getResourceTypeFromResourceId = getResourceTypeFromResourceId;
258284
function getResourceNameFromResourceId(resourceId) {
259285
return resourceId && resourceId.split("/").length > 8 ? resourceId.split("/")[8] : null;
260286
}
261-
exports.getResourceNameFromResourceId = getResourceNameFromResourceId;
262287
function getResourceGroupFromResourceId(resourceId) {
263288
return resourceId && resourceId.split("/").length > 4 ? resourceId.split("/")[4] : null;
264289
}
265-
exports.getResourceGroupFromResourceId = getResourceGroupFromResourceId;
266290
function getSubscriptionIdFromResourceId(resourceId) {
267291
return resourceId && resourceId.split("/").length > 2 ? resourceId.split("/")[2] : null;
268292
}
269-
exports.getSubscriptionIdFromResourceId = getSubscriptionIdFromResourceId;
270293
function validateAutoStop(autoStop, isPipelineParam = false) {
271294
if (typeof autoStop != 'string') {
272295
if ((0, util_1.isNullOrUndefined)(autoStop.errorPercentage) || isNaN(autoStop.errorPercentage) || autoStop.errorPercentage > 100 || autoStop.errorPercentage < 0) {
@@ -290,7 +313,6 @@ function validateAutoStop(autoStop, isPipelineParam = false) {
290313
}
291314
return { valid: true, error: "" };
292315
}
293-
exports.validateAutoStop = validateAutoStop;
294316
function validateAndGetSegregatedManagedIdentities(referenceIdentities, keyVaultGivenOutOfReferenceIdentities = false) {
295317
let referenceIdentityValuesUAMIMap = {
296318
[UtilModels_1.ReferenceIdentityKinds.KeyVault]: [],
@@ -337,7 +359,6 @@ function validateAndGetSegregatedManagedIdentities(referenceIdentities, keyVault
337359
}
338360
return { referenceIdentityValuesUAMIMap, referenceIdentiesSystemAssignedCount };
339361
}
340-
exports.validateAndGetSegregatedManagedIdentities = validateAndGetSegregatedManagedIdentities;
341362
function validateOverRideParameters(overRideParams) {
342363
try {
343364
if (!(0, util_1.isNullOrUndefined)(overRideParams)) {
@@ -393,64 +414,54 @@ function validateOverRideParameters(overRideParams) {
393414
}
394415
return { valid: true, error: "" };
395416
}
396-
exports.validateOverRideParameters = validateOverRideParameters;
397417
function validateOutputParametervariableName(outputVarName) {
398418
if ((0, util_1.isNullOrUndefined)(outputVarName) || typeof outputVarName != 'string' || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(outputVarName)) {
399419
return { valid: false, error: `Invalid output variable name '${outputVarName}'. Use only letters, numbers, and underscores.` };
400420
}
401421
return { valid: true, error: "" };
402422
}
403-
exports.validateOutputParametervariableName = validateOutputParametervariableName;
404423
function validateUrl(url) {
405424
var r = new RegExp(/(http|https):\/\/.*\/secrets\/.+$/);
406425
return r.test(url);
407426
}
408-
exports.validateUrl = validateUrl;
409427
function validateUrlcert(url) {
410428
var r = new RegExp(/(http|https):\/\/.*\/certificates\/.+$/);
411429
return r.test(url);
412430
}
413-
exports.validateUrlcert = validateUrlcert;
414431
function invalidName(value) {
415432
if (value.length < 2 || value.length > 50)
416433
return true;
417434
var r = new RegExp(/[^a-z0-9_-]+/);
418435
return r.test(value);
419436
}
420-
exports.invalidName = invalidName;
421437
function inValidEngineInstances(engines) {
422438
if (engines > 400 || engines < 1) {
423439
return true;
424440
}
425441
return false;
426442
}
427-
exports.inValidEngineInstances = inValidEngineInstances;
428443
function getDefaultTestName() {
429444
const a = (new Date(Date.now())).toLocaleString();
430445
const b = a.split(", ");
431446
const c = a.split(" ");
432447
return "Test_" + b[0] + "_" + c[1] + c[2];
433448
}
434-
exports.getDefaultTestName = getDefaultTestName;
435449
function getDefaultTestRunName() {
436450
const a = (new Date(Date.now())).toLocaleString();
437451
const b = a.split(", ");
438452
const c = a.split(" ");
439453
return "TestRun_" + b[0] + "_" + c[1] + c[2];
440454
}
441-
exports.getDefaultTestRunName = getDefaultTestRunName;
442455
function getDefaultRunDescription() {
443456
const pipelineName = process.env.GITHUB_WORKFLOW || "Unknown Pipeline";
444457
return "Started using GH workflows" + (pipelineName ? "-" + pipelineName : "");
445458
}
446-
exports.getDefaultRunDescription = getDefaultRunDescription;
447459
function validateTestRunParamsFromPipeline(runTimeParams) {
448460
if (runTimeParams.runDisplayName && invalidDisplayName(runTimeParams.runDisplayName))
449461
throw new Error("Invalid test run name. Test run name must be between 2 to 50 characters.");
450462
if (runTimeParams.runDescription && invalidDescription(runTimeParams.runDescription))
451463
throw new Error("Invalid test run description. Test run description must be less than 100 characters.");
452464
}
453-
exports.validateTestRunParamsFromPipeline = validateTestRunParamsFromPipeline;
454465
function getAllFileErrors(testObj) {
455466
var _a, _b, _c, _d, _e, _f;
456467
let allArtifacts = [];
@@ -474,4 +485,26 @@ function getAllFileErrors(testObj) {
474485
}
475486
return fileErrors;
476487
}
477-
exports.getAllFileErrors = getAllFileErrors;
488+
/**
489+
* This function returns the string with only ascii charaters, removing the non-ascii characters.
490+
* @param pipelineName - original pipeline name
491+
* @returns sanitised pipeline name with only ascii characters
492+
*/
493+
function sanitisePipelineNameHeader(pipelineName) {
494+
if (!pipelineName) {
495+
return pipelineName;
496+
}
497+
let result = "";
498+
for (const ch of pipelineName) {
499+
const code = ch.codePointAt(0);
500+
const allowed = (code >= 32 && code <= 126); // ASCII characters range, the only allowed characters in headers.
501+
if (allowed) {
502+
result += ch;
503+
}
504+
}
505+
result = result.trim();
506+
if (result.length == 0) {
507+
result = "-"; // this is what GH does when i try to give all non-ascii characters in the repo name.
508+
}
509+
return result;
510+
}

0 commit comments

Comments
 (0)