diff --git a/src/renderer/hooks/useKeyImport.ts b/src/renderer/hooks/useKeyImport.ts index 6fc557c9f..66666983b 100644 --- a/src/renderer/hooks/useKeyImport.ts +++ b/src/renderer/hooks/useKeyImport.ts @@ -13,11 +13,82 @@ export default function useKeyImport() { const [key, setKey] = useState({}); const [error, setError] = useState(null); + const isValidFileName = (fileName: string) => { + const utcRegex = + /^UTC--\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}Z--[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}.json$/i; + return utcRegex.test(fileName); + }; + + //파일 형식 검증 + const isImageFile = (fileName: string) => { + const imageExtensions = /\.(png|jpg|jpeg)$/i; + return imageExtensions.test(fileName); + }; + + // 파일 안 내용 검증 + function validateWeb3SecretStorage(json: any): boolean { + const schema: { [key: string]: any } = { + version: "number", + id: "string", + address: "string", + crypto: { + ciphertext: "string", + cipherparams: { + iv: "string", + }, + cipher: "string", + kdf: "string", + kdfparams: { + c: "number", + dklen: "number", + prf: "string", + salt: "string", + }, + mac: "string", + }, + }; + + function validate(obj: any, schema: any): boolean { + for (const key in schema) { + if (typeof schema[key] === "object") { + if (!obj[key] || typeof obj[key] !== "object") return false; + if (!validate(obj[key], schema[key])) return false; + } else if (typeof obj[key] !== schema[key]) { + return false; + } + } + return true; + } + + return validate(json, schema); + } + const handleSubmit = async () => { let privateKey: RawPrivateKey; if (key.keyFile) { + const fileName = key.keyFile.name; + try { - const keystore = await decodeQRCode(key.keyFile); + //qr디코딩 없이 일반 파일로 처리 + const keyFileText = await key.keyFile.text(); + let keystore; + + if (isImageFile(fileName)) { + keystore = await decodeQRCode(key.keyFile); + } else if (isValidFileName(fileName)) { + const parsedKeyFile = JSON.parse(keyFileText); + + // JSON 내용 검증 + if (!validateWeb3SecretStorage(parsedKeyFile)) { + setError(t("Invalid keystore JSON")); + return; + } + keystore = keyFileText; + } else { + setError(t("Invalid keyFile text")); + return; + } + const { id, address }: { id: string; address: string } = JSON.parse(keystore); try {