mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-10-20 14:37:20 +02:00
42 lines
2.5 KiB
JavaScript
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);
|
|
});
|
|
}
|
|
}
|