Compare commits

..

No commits in common. "master" and "v1.0.9" have entirely different histories.

4 changed files with 42 additions and 31 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "@apiclient.xyz/abuse.ch", "name": "@apiclient.xyz/abuse.ch",
"version": "1.0.12", "version": "1.0.9",
"private": false, "private": false,
"description": "an unofficial client to retrieve abuse.ch data", "description": "an unofficial client to retrieve abuse.ch data",
"main": "dist_ts/index.js", "main": "dist_ts/index.js",

View File

@ -17,7 +17,7 @@ tap.test('should deal with FeodoTracker data', async () => {
const feodoTracker = new abuseCh.FeodoTracker(); const feodoTracker = new abuseCh.FeodoTracker();
const data = await feodoTracker.getData(); const data = await feodoTracker.getData();
console.log(data.length); console.log(data.length);
console.log(data[1]); console.log(data[0]);
}); });
tap.start(); tap.start();

View File

@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@apiclient.xyz/abuse.ch', name: '@apiclient.xyz/abuse.ch',
version: '1.0.12', version: '1.0.9',
description: 'an unofficial client to retrieve abuse.ch data' description: 'an unofficial client to retrieve abuse.ch data'
} }

View File

@ -3,50 +3,61 @@ import * as paths from './paths.js';
import * as helpers from './helpers.js'; import * as helpers from './helpers.js';
export interface IFeodoTrackerData { export interface IFeodoTrackerData {
ip_address: string; ID: string;
port: number; Dateadded: string;
status: string; DestinationIP: string;
hostname: string | null; DestinationPort: string;
as_number: number; Malware: string;
as_name: string; Reporter: string;
country: string;
first_seen: string;
last_online: string;
malware: string;
} }
export class FeodoTracker { export class FeodoTracker {
private static readonly FEODO_TRACKER_API_URL: string = 'https://feodotracker.abuse.ch/downloads/ipblocklist.json'; private static readonly FEODO_TRACKER_API_URL: string = 'https://feodotracker.abuse.ch/downloads/ipblocklist_recommended.txt';
public async getData(): Promise<IFeodoTrackerData[]> { public async getData(): Promise<IFeodoTrackerData[]> {
plugins.smartfile.fs.ensureDirSync(paths.feodoTrackerTmp);
const txtPath = plugins.path.join(paths.feodoTrackerTmp, 'feodo.txt');
const response = await plugins.nodeFetch(FeodoTracker.FEODO_TRACKER_API_URL, { const response = await plugins.nodeFetch(FeodoTracker.FEODO_TRACKER_API_URL, {
...(helpers.findProxy() ? { ...(helpers.findProxy() ? {
agent: helpers.getAgent(), agent: helpers.getAgent(),
} : {}) } : {})
}); });
if (!response.ok) { if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`); throw new Error(`HTTP error! status: ${response.status}`);
} }
const data: IFeodoTrackerData[] = await response.json() as IFeodoTrackerData[]; await new Promise((resolve, reject) => {
const fileStream = plugins.fs.createWriteStream(txtPath);
// @ts-ignore
const readable = plugins.stream.Readable.from(response.body);
plugins.stream.pipeline(readable, fileStream, (err) => {
if (err) reject(err);
else resolve(null);
});
});
// Ensure the data is an array and has the expected structure let data: IFeodoTrackerData[] = [];
if (!Array.isArray(data) || !data.every(item => await new Promise((resolve, reject) => {
typeof item.ip_address === 'string' && plugins.stream.pipeline(
typeof item.port === 'number' && plugins.fs.createReadStream(txtPath),
(typeof item.hostname === 'string' || item.hostname === null) && plugins.csv({
typeof item.as_number === 'number' && headers: ['ID', 'Dateadded', 'DestinationIP', 'DestinationPort', 'Malware', 'Reporter'],
typeof item.as_name === 'string' && mapValues: ({ header, value }) => value.trim()
typeof item.country === 'string' && }),
typeof item.first_seen === 'string' && (err) => {
typeof item.last_online === 'string' && if (err) reject(err);
typeof item.malware === 'string' }
)) { )
throw new Error(`Invalid data structure!`); .on('data', (row) => {
} data.push(row);
})
.on('end', resolve)
.on('error', reject);
});
plugins.smartfile.fs.removeSync(paths.feodoTrackerTmp);
return data; return data;
} }
} }