Skip to content

Commit

Permalink
updated: check for wildcard only if many returned
Browse files Browse the repository at this point in the history
  • Loading branch information
AndreiIgna committed Feb 1, 2024
1 parent fbf5257 commit 91943f1
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 10 deletions.
1 change: 1 addition & 0 deletions dist/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ export type GetAllDnsRecordsOptions = {
export declare function getAllDnsRecordsStream(domain: string, options?: Partial<GetAllDnsRecordsOptions>): ReadableStream;
export declare function getAllDnsRecords(domain: string, options?: Partial<GetAllDnsRecordsOptions>): Promise<DnsRecord[]>;
export declare function parseDnsRecord(record: string | Uint8Array): DnsRecord;
export declare function detectWildcardRecords(domain: string, records: DnsRecord[], percent?: number): DnsRecord[];
42 changes: 36 additions & 6 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -190,20 +190,17 @@ export async function getAllDnsRecords(domain, options = {}) {
const records = [];
const dnsRecordsStream = getAllDnsRecordsStream(domain, options);
const reader = dnsRecordsStream.getReader();
return new Promise((resolve) => {
return new Promise((resolve, reject) => {
const read = () => {
reader.read().then(({ done, value }) => {
if (done) {
//todo detect wildcards
resolve(records);
resolve(detectWildcardRecords(domain, records));
}
else {
records.push(parseDnsRecord(value));
read();
}
}).catch(error => {
console.error('dns err', error);
});
}).catch(reject);
};
read();
});
Expand All @@ -223,3 +220,36 @@ export function parseDnsRecord(record) {
data: String(parts[4]),
};
}
export function detectWildcardRecords(domain, records, percent = 0.15) {
const sameDataGroup = {};
const wildcardsFound = [];
records.forEach(record => {
if (['A', 'AAAA', 'CNAME'].includes(record.type)) {
const key = `${record.type}-${record.data}`;
sameDataGroup[key] ||= 0;
sameDataGroup[key]++;
}
});
const recordsWithWildcard = [];
records.forEach(record => {
if (['A', 'AAAA', 'CNAME'].includes(record.type)) {
const key = `${record.type}-${record.data}`;
const sameData = sameDataGroup[key] || 0;
const recordTypeLength = records.filter(r => r.type === record.type).length;
if (sameData / recordTypeLength < percent || recordTypeLength < subdomainsRecords.length / 2) {
recordsWithWildcard.push(record);
}
else if (!wildcardsFound.includes(key)) {
wildcardsFound.push(key);
recordsWithWildcard.push({
...record,
name: `*.${domain}`,
});
}
}
else {
recordsWithWildcard.push(record);
}
});
return recordsWithWildcard;
}
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@layered/dns-records",
"version": "2.0.0-beta.6",
"version": "2.0.0-beta.8",
"description": "Discover publicly available DNS Records for a domain",
"type": "module",
"keywords": [
Expand Down
3 changes: 2 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -292,8 +292,9 @@ export function detectWildcardRecords(domain: string, records: DnsRecord[], perc
if (['A', 'AAAA', 'CNAME'].includes(record.type)) {
const key = `${record.type}-${record.data}`
const sameData = sameDataGroup[key] || 0
const recordTypeLength = records.filter(r => r.type === record.type).length

if (sameData / records.filter(r => r.type === record.type).length < percent) {
if (sameData / recordTypeLength < percent || recordTypeLength < subdomainsRecords.length / 2) {
recordsWithWildcard.push(record)
} else if (!wildcardsFound.includes(key)) {
wildcardsFound.push(key)
Expand Down

0 comments on commit 91943f1

Please sign in to comment.