import { fetchMalwareDatabase, fetchMalwareDatabaseVersion, } from "../api/aikido.js"; import { readDatabaseFromLocalCache, writeDatabaseToLocalCache, } from "../config/configFile.js"; import { ui } from "../environment/userInteraction.js"; export async function openMalwareDatabase() { const malwareDatabase = await getMalwareDatabase(); function getPackageStatus(name, version) { const packageData = malwareDatabase.find( (pkg) => pkg.package_name === name && (pkg.version === version || pkg.version === "*") ); if (!packageData) { return MALWARE_STATUS_OK; } return packageData.reason; } return { getPackageStatus, isMalware: (name, version) => { const status = getPackageStatus(name, version); return isMalwareStatus(status); }, }; } async function getMalwareDatabase() { const { malwareDatabase: cachedDatabase, version: cachedVersion } = readDatabaseFromLocalCache(); try { if (cachedDatabase) { const currentVersion = await fetchMalwareDatabaseVersion(); if (cachedVersion === currentVersion) { return cachedDatabase; } } const { malwareDatabase, version } = await fetchMalwareDatabase(); writeDatabaseToLocalCache(malwareDatabase, version); return malwareDatabase; } catch (error) { if (cachedDatabase) { ui.writeWarning( "Failed to fetch the latest malware database. Using cached version." ); return cachedDatabase; } throw error; } } function isMalwareStatus(status) { let malwareStatus = status.toUpperCase(); return malwareStatus === MALWARE_STATUS_MALWARE; } export const MALWARE_STATUS_OK = "OK"; export const MALWARE_STATUS_MALWARE = "MALWARE"; export const MALWARE_STATUS_TELEMETRY = "TELEMETRY"; export const MALWARE_STATUS_PROTESTWARE = "PROTESTWARE";