Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

実装:MinimumEngineManifest格納時の検証をZodで行う #1186

Merged
merged 10 commits into from
Feb 10, 2023
15 changes: 4 additions & 11 deletions src/background/engineManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
MinimumEngineManifest,
EngineId,
engineIdSchema,
minimumEngineManifestSchema,
} from "@/type/preload";

import log from "electron-log";
Expand Down Expand Up @@ -96,8 +97,8 @@ export class EngineManager {
}
let manifest: MinimumEngineManifest;
try {
manifest = JSON.parse(
fs.readFileSync(manifestPath, { encoding: "utf8" })
manifest = minimumEngineManifestSchema.parse(
JSON.parse(fs.readFileSync(manifestPath, { encoding: "utf8" }))
);
} catch (e) {
return "manifestParseError";
Expand Down Expand Up @@ -455,19 +456,11 @@ export class EngineManager {
);
let manifestContent: MinimumEngineManifest;
try {
manifestContent = JSON.parse(manifest);
manifestContent = minimumEngineManifestSchema.parse(JSON.parse(manifest));
} catch (e) {
return "invalidManifest";
}

if (
["name", "uuid", "port", "command", "icon"].some(
(key) => !(key in manifestContent)
)
) {
return "invalidManifest";
}

const engineInfos = this.fetchEngineInfos();
if (
engineInfos.some((engineInfo) => engineInfo.uuid === manifestContent.uuid)
Expand Down
20 changes: 13 additions & 7 deletions src/background/vvppManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@ import log from "electron-log";
import { moveFile } from "move-file";
import { Extract } from "unzipper";
import { dialog } from "electron";
import { EngineId, EngineInfo, MinimumEngineManifest } from "@/type/preload";
import {
EngineId,
EngineInfo,
minimumEngineManifestSchema,
MinimumEngineManifest,
} from "@/type/preload";
import MultiStream from "multistream";
import glob, { glob as callbackGlob } from "glob";

Expand Down Expand Up @@ -147,13 +152,14 @@ export class VvppManager {
.on("close", resolve)
.on("error", reject);
});
// FIXME: バリデーションをかけるか、`validateEngineDir`で検査する
const manifest = JSON.parse(
await fs.promises.readFile(
path.join(outputDir, "engine_manifest.json"),
"utf-8"
const manifest: MinimumEngineManifest = minimumEngineManifestSchema.parse(
JSON.parse(
await fs.promises.readFile(
path.join(outputDir, "engine_manifest.json"),
"utf-8"
)
)
) as MinimumEngineManifest;
);
return {
outputDir,
manifest,
Expand Down
23 changes: 17 additions & 6 deletions src/type/preload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -285,12 +285,23 @@ export type DefaultStyleId = {
defaultStyleId: number;
};

export type MinimumEngineManifest = {
name: string;
uuid: EngineId;
command: string;
port: string;
};
export const supportedFeaturesItemSchema = z.object({
type: z.string(),
value: z.boolean(),
name: z.string(),
});

export const minimumEngineManifestSchema = z
.object({
name: z.string(),
uuid: engineIdSchema,
command: z.string(),
port: z.number(),
supported_features: z.record(z.string(), supportedFeaturesItemSchema), // FIXME:JSON側はsnake_caseなので合わせているが、camelCaseに修正する
})
.passthrough();

export type MinimumEngineManifest = z.infer<typeof minimumEngineManifestSchema>;

export type EngineInfo = {
uuid: EngineId;
Expand Down