Skip to content

Commit 10bd774

Browse files
authored
Merge pull request #2479 from github/koesie10/validate-scoped-pack-name
Only allow scoped extension pack names
2 parents ead138e + b0d45ce commit 10bd774

File tree

2 files changed

+25
-10
lines changed

2 files changed

+25
-10
lines changed

extensions/ql-vscode/src/data-extensions-editor/extension-pack-picker.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const maxStep = 3;
1919

2020
const packNamePartRegex = /[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
2121
const packNameRegex = new RegExp(
22-
`^(?:(?<scope>${packNamePartRegex.source})/)?(?<name>${packNamePartRegex.source})$`,
22+
`^(?<scope>${packNamePartRegex.source})/(?<name>${packNamePartRegex.source})$`,
2323
);
2424
const packNameLength = 128;
2525

@@ -246,11 +246,16 @@ async function pickNewExtensionPack(
246246
return undefined;
247247
}
248248

249+
let examplePackName = `${databaseItem.name}-extensions`;
250+
if (!examplePackName.includes("/")) {
251+
examplePackName = `pack/${examplePackName}`;
252+
}
253+
249254
const packName = await window.showInputBox(
250255
{
251256
title: "Create new extension pack",
252257
prompt: "Enter name of extension pack",
253-
placeHolder: `e.g. ${databaseItem.name}-extensions`,
258+
placeHolder: `e.g. ${examplePackName}`,
254259
validateInput: async (value: string): Promise<string | undefined> => {
255260
if (!value) {
256261
return "Pack name must not be empty";
@@ -262,6 +267,10 @@ async function pickNewExtensionPack(
262267

263268
const matches = packNameRegex.exec(value);
264269
if (!matches?.groups) {
270+
if (!value.includes("/")) {
271+
return "Invalid package name: a pack name must contain a slash to separate the scope from the pack name";
272+
}
273+
265274
return "Invalid package name: a pack name must contain only lowercase ASCII letters, ASCII digits, and hyphens";
266275
}
267276

@@ -296,7 +305,7 @@ async function pickNewExtensionPack(
296305
const extensionPack: ExtensionPack = {
297306
path: packPath,
298307
yamlPath: packYamlPath,
299-
name,
308+
name: packName,
300309
version: "0.0.0",
301310
extensionTargets: {
302311
[`codeql/${databaseItem.language}-all`]: "*",

extensions/ql-vscode/test/vscode-tests/no-workspace/data-extensions-editor/extension-pack-picker.test.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ describe("pickExtensionPackModelFile", () => {
232232
label: "codeql-custom-queries-java",
233233
path: tmpDir.path,
234234
} as QuickPickItem);
235-
showInputBoxSpy.mockResolvedValueOnce("new-extension-pack");
235+
showInputBoxSpy.mockResolvedValueOnce("pack/new-extension-pack");
236236
showInputBoxSpy.mockResolvedValue("models/my-model.yml");
237237

238238
expect(
@@ -247,7 +247,7 @@ describe("pickExtensionPackModelFile", () => {
247247
extensionPack: {
248248
path: newPackDir,
249249
yamlPath: join(newPackDir, "codeql-pack.yml"),
250-
name: "new-extension-pack",
250+
name: "pack/new-extension-pack",
251251
version: "0.0.0",
252252
extensionTargets: {
253253
"codeql/java-all": "*",
@@ -280,7 +280,7 @@ describe("pickExtensionPackModelFile", () => {
280280
expect(
281281
loadYaml(await readFile(join(newPackDir, "codeql-pack.yml"), "utf8")),
282282
).toEqual({
283-
name: "new-extension-pack",
283+
name: "pack/new-extension-pack",
284284
version: "0.0.0",
285285
library: true,
286286
extensionTargets: {
@@ -303,7 +303,7 @@ describe("pickExtensionPackModelFile", () => {
303303
label: "codeql-custom-queries-java",
304304
path: tmpDir.path,
305305
} as QuickPickItem);
306-
showInputBoxSpy.mockResolvedValueOnce("new-extension-pack");
306+
showInputBoxSpy.mockResolvedValueOnce("pack/new-extension-pack");
307307
showInputBoxSpy.mockResolvedValue("models/my-model.yml");
308308

309309
expect(
@@ -321,7 +321,7 @@ describe("pickExtensionPackModelFile", () => {
321321
extensionPack: {
322322
path: newPackDir,
323323
yamlPath: join(newPackDir, "codeql-pack.yml"),
324-
name: "new-extension-pack",
324+
name: "pack/new-extension-pack",
325325
version: "0.0.0",
326326
extensionTargets: {
327327
"codeql/csharp-all": "*",
@@ -354,7 +354,7 @@ describe("pickExtensionPackModelFile", () => {
354354
expect(
355355
loadYaml(await readFile(join(newPackDir, "codeql-pack.yml"), "utf8")),
356356
).toEqual({
357-
name: "new-extension-pack",
357+
name: "pack/new-extension-pack",
358358
version: "0.0.0",
359359
library: true,
360360
extensionTargets: {
@@ -806,6 +806,12 @@ describe("pickExtensionPackModelFile", () => {
806806
"Invalid package name: a pack name must contain only lowercase ASCII letters, ASCII digits, and hyphens",
807807
);
808808
expect(await validateFile("VSCODE")).toEqual(
809+
"Invalid package name: a pack name must contain a slash to separate the scope from the pack name",
810+
);
811+
expect(await validateFile("github/")).toEqual(
812+
"Invalid package name: a pack name must contain only lowercase ASCII letters, ASCII digits, and hyphens",
813+
);
814+
expect(await validateFile("github/VSCODE")).toEqual(
809815
"Invalid package name: a pack name must contain only lowercase ASCII letters, ASCII digits, and hyphens",
810816
);
811817
expect(await validateFile("github/vscode-codeql-")).toEqual(
@@ -814,7 +820,7 @@ describe("pickExtensionPackModelFile", () => {
814820
expect(
815821
await validateFile("github/vscode-codeql-extensions"),
816822
).toBeUndefined();
817-
expect(await validateFile("vscode-codeql-extensions")).toBeUndefined();
823+
expect(await validateFile("pack/vscode-codeql-extensions")).toBeUndefined();
818824
});
819825

820826
it("validates the file input", async () => {

0 commit comments

Comments
 (0)