Files
CyberStrikeAI/web/static/js/fofa-fields.test.cjs
T

42 lines
2.5 KiB
JavaScript

const test = require('node:test');
const assert = require('node:assert/strict');
const fs = require('node:fs');
const vm = require('node:vm');
const path = require('node:path');
const info = fs.readFileSync(path.join(__dirname, 'info-collect.js'), 'utf8');
const assets = fs.readFileSync(path.join(__dirname, 'assets.js'), 'utf8');
const c = vm.createContext({ window: {}, URL });
vm.runInContext(info.slice(0, info.indexOf('const infoCollectState')), c);
const providers = vm.runInContext('INFO_COLLECT_PROVIDERS', c);
test('FOFA default, presets, and HTML use supported return fields', () => {
const supported = new Set('ip,port,protocol,country,country_name,region,city,longitude,latitude,asn,org,host,domain,os,server,icp,title,jarm,header,banner,cert,base_protocol,link,body'.split(','));
const html = fs.readFileSync(path.join(__dirname, '../../templates/index.html'), 'utf8');
const initial = html.match(/id="fofa-fields" value="([^"]+)"/)[1];
assert.equal(initial, providers.fofa.fields);
for (const fields of [initial, ...providers.fofa.fieldPresets.map(p => p[1])]) {
for (const field of fields.split(',')) assert.ok(supported.has(field), 'unsupported return field: ' + field);
}
assert.ok(providers.quake.fields.includes('location.province_cn'));
});
// Execute the real conversion and its validation helpers, including array rows.
vm.runInContext(assets.slice(assets.indexOf('function assetEditorIsIPv4('), assets.indexOf('function parseAssetEditorTarget(')), c);
vm.runInContext(assets.slice(assets.indexOf('function fofaResultToAsset('), assets.indexOf('async function importFofaAssetsByIndexes(')), c);
for (const [field, provider] of [['region', 'fofa'], ['province', 'fofa'], ['location.province_cn', 'quake']]) {
for (const array of [false, true]) {
test(`${provider} ${field} ${array ? 'array' : 'object'} row keeps province on import`, () => {
c.window.infoCollectState = { currentPayload: { provider } };
const fields = ['host', 'ip', 'port', field, 'city'];
const values = ['https://example.com', '192.0.2.1', 443, 'Beijing', 'Beijing'];
const row = array ? values : Object.fromEntries(fields.map((f, i) => [f, values[i]]));
const asset = c.fofaResultToAsset(row, fields);
assert.equal(asset.province, 'Beijing');
assert.equal(asset.ip, '192.0.2.1');
assert.equal(asset.port, 443);
assert.equal(asset.city, 'Beijing');
assert.equal(asset.source, provider);
});
}
}