mirror of
https://github.com/Xevion/rdap.git
synced 2025-12-06 19:16:03 -06:00
Add registrar RDAP schema, improve error handling & remove all typescript errors
This commit is contained in:
@@ -12,9 +12,6 @@ const config = {
|
|||||||
i18n: {
|
i18n: {
|
||||||
locales: ["en"],
|
locales: ["en"],
|
||||||
defaultLocale: "en",
|
defaultLocale: "en",
|
||||||
},
|
|
||||||
typescript: {
|
|
||||||
ignoreBuildErrors: true,
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
export default config;
|
export default config;
|
||||||
|
|||||||
@@ -4,29 +4,27 @@ import type {ObjectType} from "@/types";
|
|||||||
import {placeholders, registryURLs} from "@/constants";
|
import {placeholders, registryURLs} from "@/constants";
|
||||||
import {domainMatch, getBestURL, getType} from "@/rdap";
|
import {domainMatch, getBestURL, getType} from "@/rdap";
|
||||||
import type {FormEvent} from "react";
|
import type {FormEvent} from "react";
|
||||||
import {useEffect, useState} from "react";
|
import {useEffect, useMemo, useState} from "react";
|
||||||
import {truthy} from "@/helpers";
|
import {truthy} from "@/helpers";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import type {ParsedGeneric} from "@/components/Generic";
|
import type {ParsedGeneric} from "@/components/Generic";
|
||||||
import Generic from "@/components/Generic";
|
import Generic from "@/components/Generic";
|
||||||
import type {ZodSchema} from "zod";
|
import type {ZodSchema} from "zod";
|
||||||
import {DomainSchema} from "@/responses";
|
import type {Register} from "@/responses";
|
||||||
|
import {DomainSchema, RegisterSchema} from "@/responses";
|
||||||
|
|
||||||
const Index: NextPage = () => {
|
const Index: NextPage = () => {
|
||||||
const [uriType, setUriType] = useState<ObjectType>('domain');
|
|
||||||
const [requestJSContact, setRequestJSContact] = useState(false);
|
const [requestJSContact, setRequestJSContact] = useState(false);
|
||||||
const [followReferral, setFollowReferral] = useState(false);
|
const [followReferral, setFollowReferral] = useState(false);
|
||||||
const [object, setObject] = useState<string>("");
|
const [object, setObject] = useState<string>("");
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
const [response, setResponse] = useState<ParsedGeneric | null>(null);
|
const [response, setResponse] = useState<ParsedGeneric | null>(null);
|
||||||
const [error, setError] = useState<string | null>(null);
|
const [error, setError] = useState<string | null>(null);
|
||||||
const [registryData, setRegistryData] = useState<Record<string, any>>({});
|
const [registryData, setRegistryData] = useState<Record<string, Register> | null>(null);
|
||||||
|
|
||||||
// Change the selected type automatically
|
// Change the selected type automatically
|
||||||
useEffect(function () {
|
const uriType = useMemo<ObjectType>(function () {
|
||||||
const newType = getType(object);
|
return getType(object) ?? 'domain';
|
||||||
if (newType != null && newType != uriType)
|
|
||||||
setUriType(newType)
|
|
||||||
}, [object]);
|
}, [object]);
|
||||||
|
|
||||||
async function loadRegistryData() {
|
async function loadRegistryData() {
|
||||||
@@ -41,15 +39,15 @@ const Index: NextPage = () => {
|
|||||||
console.log(`Registered loaded ${registersLoaded}/${totalRegisters}`)
|
console.log(`Registered loaded ${registersLoaded}/${totalRegisters}`)
|
||||||
return {
|
return {
|
||||||
registryType,
|
registryType,
|
||||||
response: response.data
|
response: RegisterSchema.parse(response.data)
|
||||||
};
|
};
|
||||||
}))
|
}))
|
||||||
|
|
||||||
console.log('Registry data set.')
|
console.log('Registry data set.')
|
||||||
setRegistryData(() => {
|
setRegistryData(() => {
|
||||||
return Object.fromEntries(
|
return Object.fromEntries(
|
||||||
responses.map(({registryType, response}) => [registryType, response.services])
|
responses.map(({registryType, response}) => [registryType, response])
|
||||||
)
|
) as Record<string, Register>
|
||||||
})
|
})
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
}
|
}
|
||||||
@@ -58,7 +56,13 @@ const Index: NextPage = () => {
|
|||||||
function getRDAPURL(object: string): string | null {
|
function getRDAPURL(object: string): string | null {
|
||||||
let urls: string[] = [];
|
let urls: string[] = [];
|
||||||
|
|
||||||
const service: [string[], string[]][] | [string[], string[], string[]][] = registryData[uriType];
|
if (registryData == null) {
|
||||||
|
console.log('Registry data not loaded.')
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const service = registryData[uriType]?.services;
|
||||||
|
if (service == undefined) return null;
|
||||||
|
|
||||||
services:
|
services:
|
||||||
for (const serviceItem of service) {
|
for (const serviceItem of service) {
|
||||||
// special case for object tags, since the registrant email address is in the 0th position
|
// special case for object tags, since the registrant email address is in the 0th position
|
||||||
@@ -155,15 +159,15 @@ const Index: NextPage = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (followReferral && data?.links != null) {
|
// if (followReferral && data.hasOwnProperty('links') != undefined) {
|
||||||
console.log('Using followReferral.')
|
// console.log('Using followReferral.')
|
||||||
for (const link of data.links) {
|
// for (const link of data.links) {
|
||||||
if ('related' == link.rel && 'application/rdap+json' == link.type && link.href.match(/^(https?:|)\/\//i)) {
|
// if ('related' == link.rel && 'application/rdap+json' == link.type && link.href.match(/^(https?:|)\/\//i)) {
|
||||||
await sendQuery(link.href, false)
|
// await sendQuery(link.href, false)
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
console.log(data);
|
console.log(data);
|
||||||
@@ -173,16 +177,21 @@ const Index: NextPage = () => {
|
|||||||
window.history.pushState(null, document.title, url);
|
window.history.pushState(null, document.title, url);
|
||||||
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
setError(`Exception: ${e.message} (line ${e.lineNumber})`);
|
if (e instanceof Error)
|
||||||
|
setError(`Exception: ${e.message}`);
|
||||||
|
else
|
||||||
|
setError('Unknown error.')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// Load parameters from URL query string on page load
|
// Load parameters from URL query string on page load
|
||||||
const params = new URLSearchParams(window.location.search);
|
const params = new URLSearchParams(window.location.search);
|
||||||
if (params.has('type'))
|
|
||||||
setUriType(params.get('type') as ObjectType);
|
// if (params.has('type'))
|
||||||
else if (params.has('object'))
|
// setUriType(params.get('type') as ObjectType);
|
||||||
|
|
||||||
|
if (params.has('object'))
|
||||||
setObject(params.get('object')!);
|
setObject(params.get('object')!);
|
||||||
|
|
||||||
if (params.has('request-jscontact') && truthy(params.get('request-jscontact')))
|
if (params.has('request-jscontact') && truthy(params.get('request-jscontact')))
|
||||||
@@ -193,7 +202,7 @@ const Index: NextPage = () => {
|
|||||||
|
|
||||||
if (params.has('object') && (params.get('object')?.length ?? 0) > 0) {
|
if (params.has('object') && (params.get('object')?.length ?? 0) > 0) {
|
||||||
setObject(params.get('object')!);
|
setObject(params.get('object')!);
|
||||||
submit(null);
|
// submit(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
loadRegistryData().catch(console.error);
|
loadRegistryData().catch(console.error);
|
||||||
@@ -243,20 +252,16 @@ const Index: NextPage = () => {
|
|||||||
<a className="navbar-brand" href="#">rdap.xevion.dev</a>
|
<a className="navbar-brand" href="#">rdap.xevion.dev</a>
|
||||||
</span>
|
</span>
|
||||||
</nav>
|
</nav>
|
||||||
|
<div className="container py-12 mx-auto max-w-screen-lg">
|
||||||
<br/>
|
<form onSubmit={(e) => {
|
||||||
|
void submit(e)
|
||||||
<div className="container mx-auto max-w-screen-lg">
|
}} className="form-inline">
|
||||||
<form onSubmit={submit} className="form-inline">
|
|
||||||
<div className="col p-0">
|
<div className="col p-0">
|
||||||
<div className="input-group">
|
<div className="input-group">
|
||||||
|
|
||||||
<div className="input-group-prepend">
|
<div className="input-group-prepend">
|
||||||
<select className="custom-select" id="type" name="type"
|
<select className="custom-select" id="type" name="type"
|
||||||
value={uriType}
|
value={uriType}>
|
||||||
onChange={(e) => {
|
|
||||||
setUriType(e.target.value as ObjectType);
|
|
||||||
}}>
|
|
||||||
<option value="domain">Domain</option>
|
<option value="domain">Domain</option>
|
||||||
<option value="tld">TLD</option>
|
<option value="tld">TLD</option>
|
||||||
<option value="ip">IP/CIDR</option>
|
<option value="ip">IP/CIDR</option>
|
||||||
@@ -277,7 +282,9 @@ const Index: NextPage = () => {
|
|||||||
}} required/>
|
}} required/>
|
||||||
|
|
||||||
<div className="input-group-append">
|
<div className="input-group-append">
|
||||||
<input id="button" type="button" value="Submit" onClick={submit}
|
<input id="button" type="button" value="Submit" onClick={(event) => {
|
||||||
|
void submit(event)
|
||||||
|
}}
|
||||||
className="btn btn-primary"
|
className="btn btn-primary"
|
||||||
disabled={loading}/>
|
disabled={loading}/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
213
src/rdap.ts
213
src/rdap.ts
@@ -1,15 +1,13 @@
|
|||||||
import ipaddr from "ipaddr.js";
|
|
||||||
import {rdapStatusInfo, registryURLs} from "@/constants";
|
|
||||||
import type {ObjectType} from "@/types";
|
import type {ObjectType} from "@/types";
|
||||||
|
|
||||||
// keeps track of how many registries we've loaded
|
// keeps track of how many registries we've loaded
|
||||||
let loadedRegistries = 0;
|
const loadedRegistries = 0;
|
||||||
|
|
||||||
// registry data is stored in this
|
// registry data is stored in this
|
||||||
let registryData = {};
|
const registryData = {};
|
||||||
|
|
||||||
// keeps track of the elements we've created so we can assign a unique ID
|
// keeps track of the elements we've created so we can assign a unique ID
|
||||||
let elementCounter = 123456;
|
// let elementCounter = 123456;
|
||||||
|
|
||||||
const cardTitles = {
|
const cardTitles = {
|
||||||
"domain": "Domain Name",
|
"domain": "Domain Name",
|
||||||
@@ -23,23 +21,29 @@ export function domainMatch(tld: string, domain: string): boolean {
|
|||||||
return domain.toUpperCase().endsWith(`.${tld.toUpperCase()}`);
|
return domain.toUpperCase().endsWith(`.${tld.toUpperCase()}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
export function asnMatch(range, asn) {
|
export function asnMatch(range, asn) {
|
||||||
var [min, max] = range.split('-', 2);
|
let [min, max] = range.split('-', 2);
|
||||||
min = parseInt(min);
|
min = parseInt(min);
|
||||||
max = parseInt(max);
|
max = parseInt(max);
|
||||||
|
|
||||||
return (asn >= min && asn <= max);
|
return (asn >= min && asn <= max);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
export function entityMatch(tag: string, handle: string) {
|
export function entityMatch(tag: string, handle: string) {
|
||||||
return handle.toUpperCase().endsWith('-' + tag.toUpperCase());
|
return handle.toUpperCase().endsWith('-' + tag.toUpperCase());
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
export function ipMatch(prefix: string, ip: string) {
|
export function ipMatch(prefix: string, ip: string) {
|
||||||
var parsedIp = ipaddr.parse(ip);
|
const parsedIp = ipaddr.parse(ip);
|
||||||
let cidr = ipaddr.parseCIDR(prefix);
|
const cidr = ipaddr.parseCIDR(prefix);
|
||||||
return (parsedIp.kind() == cidr[0].kind() && parsedIp.match(cidr));
|
return (parsedIp.kind() == cidr[0].kind() && parsedIp.match(cidr));
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// return the first HTTPS url, or the first URL
|
// return the first HTTPS url, or the first URL
|
||||||
export function getBestURL(urls: string[]): string {
|
export function getBestURL(urls: string[]): string {
|
||||||
@@ -52,34 +56,38 @@ export function getBestURL(urls: string[]): string {
|
|||||||
|
|
||||||
// given a URL, injects that URL into the query input,
|
// given a URL, injects that URL into the query input,
|
||||||
// and initiates an RDAP query
|
// and initiates an RDAP query
|
||||||
|
/*
|
||||||
export function runQuery(url) {
|
export function runQuery(url) {
|
||||||
var type = document.getElementById('type');
|
const type = document.getElementById('type');
|
||||||
|
|
||||||
for (var i = 0; i < type.options.length; i++) if ('url' == type.options[i].value) type.selectedIndex = i;
|
for (let i = 0; i < type.options.length; i++) if ('url' == type.options[i].value) type.selectedIndex = i;
|
||||||
document.getElementById('object').value = url;
|
document.getElementById('object').value = url;
|
||||||
doQuery();
|
doQuery();
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
export function showSpinner(msg) {
|
export function showSpinner(msg) {
|
||||||
msg = msg ? msg : 'Loading...';
|
msg = msg ? msg : 'Loading...';
|
||||||
|
|
||||||
var div = document.getElementById('output-div');
|
const div = document.getElementById('output-div');
|
||||||
div.innerHTML = '';
|
div.innerHTML = '';
|
||||||
|
|
||||||
var spinner = document.createElement('div');
|
const spinner = document.createElement('div');
|
||||||
spinner.classList.add('spinner-border');
|
spinner.classList.add('spinner-border');
|
||||||
spinner.role = 'status';
|
spinner.role = 'status';
|
||||||
var span = spinner.appendChild(document.createElement('span'));
|
const span = spinner.appendChild(document.createElement('span'));
|
||||||
span.classList.add('sr-only');
|
span.classList.add('sr-only');
|
||||||
span.appendChild(document.createTextNode(msg));
|
span.appendChild(document.createTextNode(msg));
|
||||||
|
|
||||||
div.appendChild(spinner);
|
div.appendChild(spinner);
|
||||||
|
|
||||||
var msgDiv = document.createElement('div');
|
const msgDiv = document.createElement('div');
|
||||||
msgDiv.id = 'spinner-msg';
|
msgDiv.id = 'spinner-msg';
|
||||||
msgDiv.appendChild(document.createTextNode(msg));
|
msgDiv.appendChild(document.createTextNode(msg));
|
||||||
div.appendChild(msgDiv);
|
div.appendChild(msgDiv);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// export function handleError(error) {
|
// export function handleError(error) {
|
||||||
// var div = document.getElementById('output-div');
|
// var div = document.getElementById('output-div');
|
||||||
@@ -87,6 +95,7 @@ export function showSpinner(msg) {
|
|||||||
// div.appendChild(createErrorNode(error));
|
// div.appendChild(createErrorNode(error));
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
/*
|
||||||
export function createErrorNode(error) {
|
export function createErrorNode(error) {
|
||||||
el = document.createElement('p');
|
el = document.createElement('p');
|
||||||
el.classList.add('error', 'alert', 'alert-warning');
|
el.classList.add('error', 'alert', 'alert-warning');
|
||||||
@@ -94,16 +103,18 @@ export function createErrorNode(error) {
|
|||||||
|
|
||||||
return el;
|
return el;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// process an RDAP object. Argument is a JSON object, return
|
// process an RDAP object. Argument is a JSON object, return
|
||||||
// value is an element that can be inserted into the page
|
// value is an element that can be inserted into the page
|
||||||
|
/*
|
||||||
export function processObject(object, toplevel, followReferral = true) {
|
export function processObject(object, toplevel, followReferral = true) {
|
||||||
if (!object) {
|
if (!object) {
|
||||||
console.log(object);
|
console.log(object);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var dl = document.createElement('dl');
|
const dl = document.createElement('dl');
|
||||||
|
|
||||||
switch (object.objectClassName) {
|
switch (object.objectClassName) {
|
||||||
case 'domain':
|
case 'domain':
|
||||||
@@ -136,10 +147,10 @@ export function processObject(object, toplevel, followReferral = true) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var card = document.createElement('div');
|
const card = document.createElement('div');
|
||||||
card.classList.add('card');
|
card.classList.add('card');
|
||||||
|
|
||||||
var titleText = '';
|
let titleText = '';
|
||||||
if (object.unicodeName) {
|
if (object.unicodeName) {
|
||||||
titleText = object.unicodeName.toUpperCase();
|
titleText = object.unicodeName.toUpperCase();
|
||||||
|
|
||||||
@@ -164,12 +175,12 @@ export function processObject(object, toplevel, followReferral = true) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var title = document.createElement('div');
|
const title = document.createElement('div');
|
||||||
title.classList.add('card-header', 'font-weight-bold');
|
title.classList.add('card-header', 'font-weight-bold');
|
||||||
title.appendChild(document.createTextNode(titleText));
|
title.appendChild(document.createTextNode(titleText));
|
||||||
card.appendChild(title);
|
card.appendChild(title);
|
||||||
|
|
||||||
var body = document.createElement('div');
|
const body = document.createElement('div');
|
||||||
body.classList.add('card-body');
|
body.classList.add('card-body');
|
||||||
|
|
||||||
body.appendChild(dl);
|
body.appendChild(dl);
|
||||||
@@ -177,16 +188,18 @@ export function processObject(object, toplevel, followReferral = true) {
|
|||||||
card.appendChild(body);
|
card.appendChild(body);
|
||||||
return card;
|
return card;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// simplify the process of adding a name => value to a definition list
|
// simplify the process of adding a name => value to a definition list
|
||||||
|
/*
|
||||||
export function addProperty(dl, name, value) {
|
export function addProperty(dl, name, value) {
|
||||||
|
|
||||||
var dt = document.createElement('dt');
|
const dt = document.createElement('dt');
|
||||||
dt.classList.add('rdap-property-name');
|
dt.classList.add('rdap-property-name');
|
||||||
dt.appendChild(document.createTextNode(name));
|
dt.appendChild(document.createTextNode(name));
|
||||||
dl.appendChild(dt);
|
dl.appendChild(dt);
|
||||||
|
|
||||||
var dd = document.createElement('dd');
|
const dd = document.createElement('dd');
|
||||||
dd.classList.add('rdap-property-value');
|
dd.classList.add('rdap-property-value');
|
||||||
if (value instanceof Node) {
|
if (value instanceof Node) {
|
||||||
dd.appendChild(value);
|
dd.appendChild(value);
|
||||||
@@ -197,10 +210,12 @@ export function addProperty(dl, name, value) {
|
|||||||
}
|
}
|
||||||
dl.appendChild(dd);
|
dl.appendChild(dd);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// called by the individual object processors, since all RDAP objects have a similar set of
|
// called by the individual object processors, since all RDAP objects have a similar set of
|
||||||
// properties. the first argument is the RDAP object and the second is the <dl> element
|
// properties. the first argument is the RDAP object and the second is the <dl> element
|
||||||
// being used to display that object.
|
// being used to display that object.
|
||||||
|
/*
|
||||||
export function processCommonObjectProperties(object, dl) {
|
export function processCommonObjectProperties(object, dl) {
|
||||||
// if (object.objectClassName) addProperty(dl, 'Object Type:', object.objectClassName);
|
// if (object.objectClassName) addProperty(dl, 'Object Type:', object.objectClassName);
|
||||||
// if (object.handle) addProperty(dl, 'Handle:', object.handle);
|
// if (object.handle) addProperty(dl, 'Handle:', object.handle);
|
||||||
@@ -214,36 +229,40 @@ export function processCommonObjectProperties(object, dl) {
|
|||||||
if (object.port43) addProperty(dl, 'Whois Server:', object.port43);
|
if (object.port43) addProperty(dl, 'Whois Server:', object.port43);
|
||||||
if (object.rdapConformance) processrdapConformance(object.rdapConformance, dl);
|
if (object.rdapConformance) processrdapConformance(object.rdapConformance, dl);
|
||||||
|
|
||||||
var div = document.createElement('div');
|
const div = document.createElement('div');
|
||||||
div.id = 'element-' + ++elementCounter;
|
div.id = 'element-' + ++elementCounter;
|
||||||
|
|
||||||
var button = document.createElement('button');
|
const button = document.createElement('button');
|
||||||
button.classList.add('btn', 'btn-secondary');
|
button.classList.add('btn', 'btn-secondary');
|
||||||
button.appendChild(document.createTextNode('Show'));
|
button.appendChild(document.createTextNode('Show'));
|
||||||
button.onclick = new Function('showRawData("' + div.id + '");return false');
|
button.onclick = new Function('showRawData("' + div.id + '");return false');
|
||||||
div.appendChild(button);
|
div.appendChild(button);
|
||||||
|
|
||||||
var pre = document.createElement('pre');
|
const pre = document.createElement('pre');
|
||||||
pre.style = 'display:none;visibility:hidden';
|
pre.style = 'display:none;visibility:hidden';
|
||||||
pre.appendChild(document.createTextNode(JSON.stringify(object, null, 2)));
|
pre.appendChild(document.createTextNode(JSON.stringify(object, null, 2)));
|
||||||
div.appendChild(pre);
|
div.appendChild(pre);
|
||||||
|
|
||||||
addProperty(dl, 'Raw Data:', div);
|
addProperty(dl, 'Raw Data:', div);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// call back for "Show Raw Data" button
|
// call back for "Show Raw Data" button
|
||||||
|
/*
|
||||||
export function showRawData(id) {
|
export function showRawData(id) {
|
||||||
var div = document.getElementById(id);
|
const div = document.getElementById(id);
|
||||||
div.childNodes[0].style = 'display:none;visibility:hidden';
|
div.childNodes[0].style = 'display:none;visibility:hidden';
|
||||||
div.childNodes[1].style = 'display:block;visibility:visible';
|
div.childNodes[1].style = 'display:block;visibility:visible';
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// convert an array into a bulleted list
|
// convert an array into a bulleted list
|
||||||
|
/*
|
||||||
export function createList(list) {
|
export function createList(list) {
|
||||||
var ul = document.createElement('ul');
|
const ul = document.createElement('ul');
|
||||||
|
|
||||||
for (var i = 0; i < list.length; i++) {
|
for (let i = 0; i < list.length; i++) {
|
||||||
var li = document.createElement('li');
|
const li = document.createElement('li');
|
||||||
if (list[i] instanceof Node) {
|
if (list[i] instanceof Node) {
|
||||||
li.appendChild(list[i]);
|
li.appendChild(list[i]);
|
||||||
|
|
||||||
@@ -256,17 +275,21 @@ export function createList(list) {
|
|||||||
|
|
||||||
return ul;
|
return ul;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// add the RDAP conformance of the response
|
// add the RDAP conformance of the response
|
||||||
|
/*
|
||||||
export function processrdapConformance(rdapConformance, dl) {
|
export function processrdapConformance(rdapConformance, dl) {
|
||||||
addProperty(dl, 'Conformance:', createList(rdapConformance));
|
addProperty(dl, 'Conformance:', createList(rdapConformance));
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// add the object's status codes
|
// add the object's status codes
|
||||||
|
/*
|
||||||
export function processStatus(status, dl) {
|
export function processStatus(status, dl) {
|
||||||
var s = new Array;
|
const s = [];
|
||||||
for (var i = 0; i < status.length; i++) {
|
for (let i = 0; i < status.length; i++) {
|
||||||
var span = document.createElement('span');
|
const span = document.createElement('span');
|
||||||
span.classList.add('rdap-status-code');
|
span.classList.add('rdap-status-code');
|
||||||
span.appendChild(document.createTextNode(status[i]));
|
span.appendChild(document.createTextNode(status[i]));
|
||||||
span.setAttribute("title", rdapStatusInfo[status[i]]);
|
span.setAttribute("title", rdapStatusInfo[status[i]]);
|
||||||
@@ -274,18 +297,20 @@ export function processStatus(status, dl) {
|
|||||||
}
|
}
|
||||||
addProperty(dl, 'Status:', createList(s));
|
addProperty(dl, 'Status:', createList(s));
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// add the object's events
|
// add the object's events
|
||||||
|
/*
|
||||||
export function processEvents(events, dl) {
|
export function processEvents(events, dl) {
|
||||||
var sdl = document.createElement('dl');
|
const sdl = document.createElement('dl');
|
||||||
|
|
||||||
for (var i = 0; i < events.length; i++) {
|
for (let i = 0; i < events.length; i++) {
|
||||||
var span1 = document.createElement('span');
|
const span1 = document.createElement('span');
|
||||||
span1.appendChild(document.createTextNode(new Date(events[i].eventDate).toLocaleString()));
|
span1.appendChild(document.createTextNode(new Date(events[i].eventDate).toLocaleString()));
|
||||||
span1.classList.add('rdap-event-time');
|
span1.classList.add('rdap-event-time');
|
||||||
span1.setAttribute('title', events[i].eventDate);
|
span1.setAttribute('title', events[i].eventDate);
|
||||||
|
|
||||||
var span2 = document.createElement('span');
|
const span2 = document.createElement('span');
|
||||||
span2.appendChild(span1);
|
span2.appendChild(span1);
|
||||||
|
|
||||||
if (events[i].eventActor) {
|
if (events[i].eventActor) {
|
||||||
@@ -294,17 +319,19 @@ export function processEvents(events, dl) {
|
|||||||
addProperty(sdl, events[i].eventAction + ':', span2);
|
addProperty(sdl, events[i].eventAction + ':', span2);
|
||||||
}
|
}
|
||||||
|
|
||||||
addProperty(dl, 'Events:', sdl);
|
addProperty(dl, 'Event:', sdl);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// add the object's links
|
// add the object's links
|
||||||
|
/*
|
||||||
export function processLinks(links, dl) {
|
export function processLinks(links, dl) {
|
||||||
var ul = document.createElement('ul');
|
const ul = document.createElement('ul');
|
||||||
|
|
||||||
for (var i = 0; i < links.length; i++) {
|
for (let i = 0; i < links.length; i++) {
|
||||||
li = document.createElement('li');
|
li = document.createElement('li');
|
||||||
|
|
||||||
var title = (links[i].title ? links[i].title : links[i].href);
|
const title = (links[i].title ? links[i].title : links[i].href);
|
||||||
|
|
||||||
var link;
|
var link;
|
||||||
if (links[i].type && 0 == links[i].type.indexOf('application/rdap+json')) {
|
if (links[i].type && 0 == links[i].type.indexOf('application/rdap+json')) {
|
||||||
@@ -328,53 +355,61 @@ export function processLinks(links, dl) {
|
|||||||
|
|
||||||
addProperty(dl, 'Links:', ul);
|
addProperty(dl, 'Links:', ul);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// add the object's entities
|
// add the object's entities
|
||||||
|
/*
|
||||||
export function processEntities(entities, dl) {
|
export function processEntities(entities, dl) {
|
||||||
var div = document.createElement('div');
|
const div = document.createElement('div');
|
||||||
|
|
||||||
for (var i = 0; i < entities.length; i++) div.appendChild(processObject(entities[i]));
|
for (let i = 0; i < entities.length; i++) div.appendChild(processObject(entities[i]));
|
||||||
|
|
||||||
addProperty(dl, 'Entities:', div);
|
addProperty(dl, 'Entities:', div);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// add the object's remarks
|
// add the object's remarks
|
||||||
|
/*
|
||||||
export function processRemarks(remarks, dl) {
|
export function processRemarks(remarks, dl) {
|
||||||
addProperty(dl, 'Remarks:', processRemarksOrNotices(remarks));
|
addProperty(dl, 'Remarks:', processRemarksOrNotices(remarks));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// add the responses's notices
|
// add the responses's notices
|
||||||
|
/*
|
||||||
export function processNotices(notices, dl) {
|
export function processNotices(notices, dl) {
|
||||||
addProperty(dl, 'Notices:', processRemarksOrNotices(notices));
|
addProperty(dl, 'Notices:', processRemarksOrNotices(notices));
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// command handler for remarks and notices
|
// command handler for remarks and notices
|
||||||
|
/*
|
||||||
export function processRemarksOrNotices(things) {
|
export function processRemarksOrNotices(things) {
|
||||||
var div = document.createElement('div');
|
const div = document.createElement('div');
|
||||||
|
|
||||||
for (var i = 0; i < things.length; i++) {
|
for (let i = 0; i < things.length; i++) {
|
||||||
var section = document.createElement('section');
|
const section = document.createElement('section');
|
||||||
section.classList.add('card');
|
section.classList.add('card');
|
||||||
div.appendChild(section);
|
div.appendChild(section);
|
||||||
|
|
||||||
var title = document.createElement('header');
|
const title = document.createElement('header');
|
||||||
title.classList.add('card-header', 'font-weight-bold');
|
title.classList.add('card-header', 'font-weight-bold');
|
||||||
title.appendChild(document.createTextNode(things[i].title));
|
title.appendChild(document.createTextNode(things[i].title));
|
||||||
section.appendChild(title);
|
section.appendChild(title);
|
||||||
|
|
||||||
var body = document.createElement('div');
|
const body = document.createElement('div');
|
||||||
body.classList.add('card-body');
|
body.classList.add('card-body');
|
||||||
section.appendChild(body);
|
section.appendChild(body);
|
||||||
|
|
||||||
if (things[i].description) for (var j = 0; j < things[i].description.length; j++) {
|
if (things[i].description) for (let j = 0; j < things[i].description.length; j++) {
|
||||||
var p = document.createElement('p');
|
const p = document.createElement('p');
|
||||||
p.innerHTML = convertURLstoLinks(things[i].description[j]);
|
p.innerHTML = convertURLstoLinks(things[i].description[j]);
|
||||||
body.appendChild(p);
|
body.appendChild(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (things[i].links) {
|
if (things[i].links) {
|
||||||
var ldl = document.createElement('dl');
|
const ldl = document.createElement('dl');
|
||||||
processLinks(things[i].links, ldl);
|
processLinks(things[i].links, ldl);
|
||||||
body.appendChild(ldl);
|
body.appendChild(ldl);
|
||||||
}
|
}
|
||||||
@@ -382,16 +417,20 @@ export function processRemarksOrNotices(things) {
|
|||||||
|
|
||||||
return div;
|
return div;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// naively match URLs in plain text and convert to links
|
// naively match URLs in plain text and convert to links
|
||||||
|
/*
|
||||||
export function convertURLstoLinks(str) {
|
export function convertURLstoLinks(str) {
|
||||||
return str.replace(
|
return str.replace(
|
||||||
/(https?:\/\/[^\s]+[^\.])/g,
|
/(https?:\/\/[^\s]+[^\.])/g,
|
||||||
'<a href="$1" target="_new" rel="noopener">$1</a>'
|
'<a href="$1" target="_new" rel="noopener">$1</a>'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// process a domain
|
// process a domain
|
||||||
|
/*
|
||||||
export function processDomain(object, dl, toplevel = false) {
|
export function processDomain(object, dl, toplevel = false) {
|
||||||
|
|
||||||
if (toplevel) document.title = 'Domain ' + (object.unicodeName ? object.unicodeName : object.ldhName).toUpperCase() + ' - RDAP Lookup';
|
if (toplevel) document.title = 'Domain ' + (object.unicodeName ? object.unicodeName : object.ldhName).toUpperCase() + ' - RDAP Lookup';
|
||||||
@@ -416,9 +455,9 @@ export function processDomain(object, dl, toplevel = false) {
|
|||||||
object.events = object.status = object.entities = null;
|
object.events = object.status = object.entities = null;
|
||||||
|
|
||||||
if (object.nameservers) {
|
if (object.nameservers) {
|
||||||
var div = document.createElement('div');
|
const div = document.createElement('div');
|
||||||
|
|
||||||
for (var i = 0; i < object.nameservers.length; i++) div.appendChild(processObject(object.nameservers[i]));
|
for (let i = 0; i < object.nameservers.length; i++) div.appendChild(processObject(object.nameservers[i]));
|
||||||
|
|
||||||
addProperty(dl, 'Nameservers:', div);
|
addProperty(dl, 'Nameservers:', div);
|
||||||
}
|
}
|
||||||
@@ -427,8 +466,10 @@ export function processDomain(object, dl, toplevel = false) {
|
|||||||
|
|
||||||
processCommonObjectProperties(object, dl);
|
processCommonObjectProperties(object, dl);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// process a nameserver
|
// process a nameserver
|
||||||
|
/*
|
||||||
export function processNameserver(object, dl, toplevel = false) {
|
export function processNameserver(object, dl, toplevel = false) {
|
||||||
|
|
||||||
if (toplevel) document.title = 'Nameserver ' + object.ldhName + ' - RDAP Lookup';
|
if (toplevel) document.title = 'Nameserver ' + object.ldhName + ' - RDAP Lookup';
|
||||||
@@ -453,8 +494,10 @@ export function processNameserver(object, dl, toplevel = false) {
|
|||||||
|
|
||||||
processCommonObjectProperties(object, dl);
|
processCommonObjectProperties(object, dl);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// process an entity
|
// process an entity
|
||||||
|
/*
|
||||||
export function processEntity(object, dl, toplevel = false) {
|
export function processEntity(object, dl, toplevel = false) {
|
||||||
|
|
||||||
if (toplevel) document.title = 'Entity ' + object.handle + ' - RDAP Lookup';
|
if (toplevel) document.title = 'Entity ' + object.handle + ' - RDAP Lookup';
|
||||||
@@ -462,7 +505,7 @@ export function processEntity(object, dl, toplevel = false) {
|
|||||||
if (object.handle) addProperty(dl, 'Handle:', object.handle);
|
if (object.handle) addProperty(dl, 'Handle:', object.handle);
|
||||||
|
|
||||||
if (object.publicIds) {
|
if (object.publicIds) {
|
||||||
for (var i = 0; i < object.publicIds.length; i++) addProperty(dl, object.publicIds[i].type + ':', object.publicIds[i].identifier);
|
for (let i = 0; i < object.publicIds.length; i++) addProperty(dl, object.publicIds[i].type + ':', object.publicIds[i].identifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (object.roles) addProperty(dl, 'Roles:', createList(object.roles));
|
if (object.roles) addProperty(dl, 'Roles:', createList(object.roles));
|
||||||
@@ -479,16 +522,18 @@ export function processEntity(object, dl, toplevel = false) {
|
|||||||
|
|
||||||
processCommonObjectProperties(object, dl);
|
processCommonObjectProperties(object, dl);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// process an entity's vCard
|
// process an entity's vCard
|
||||||
|
/*
|
||||||
export function processVCardArray(vcard) {
|
export function processVCardArray(vcard) {
|
||||||
var vdl = document.createElement('dl');
|
const vdl = document.createElement('dl');
|
||||||
|
|
||||||
for (var i = 0; i < vcard.length; i++) {
|
for (let i = 0; i < vcard.length; i++) {
|
||||||
var node = vcard[i];
|
const node = vcard[i];
|
||||||
|
|
||||||
var type = node[0];
|
let type = node[0];
|
||||||
var value = node[3];
|
let value = node[3];
|
||||||
|
|
||||||
if ('version' == type) {
|
if ('version' == type) {
|
||||||
continue;
|
continue;
|
||||||
@@ -568,9 +613,11 @@ export function processVCardArray(vcard) {
|
|||||||
|
|
||||||
return vdl;
|
return vdl;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
export function processJSCard(jscard) {
|
export function processJSCard(jscard) {
|
||||||
var vdl = document.createElement('dl');
|
const vdl = document.createElement('dl');
|
||||||
|
|
||||||
if (jscard.fullName) addProperty(vdl, 'Name:', jscard.fullName);
|
if (jscard.fullName) addProperty(vdl, 'Name:', jscard.fullName);
|
||||||
|
|
||||||
@@ -610,14 +657,16 @@ export function processJSCard(jscard) {
|
|||||||
|
|
||||||
return vdl;
|
return vdl;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
export function processJSCardAddress(address) {
|
export function processJSCardAddress(address) {
|
||||||
var dl = document.createElement('dl');
|
const dl = document.createElement('dl');
|
||||||
for (k in address) {
|
for (k in address) {
|
||||||
v = address[k];
|
v = address[k];
|
||||||
if ('street' == k) {
|
if ('street' == k) {
|
||||||
var addr = document.createElement('span');
|
const addr = document.createElement('span');
|
||||||
for (var i = 0; i < v.length; i++) {
|
for (let i = 0; i < v.length; i++) {
|
||||||
if (i > 1) addr.appendChild(document.createElement('br'));
|
if (i > 1) addr.appendChild(document.createElement('br'));
|
||||||
addr.appendChild(document.createTextNode(v[i]));
|
addr.appendChild(document.createTextNode(v[i]));
|
||||||
}
|
}
|
||||||
@@ -639,8 +688,10 @@ export function processJSCardAddress(address) {
|
|||||||
}
|
}
|
||||||
return dl;
|
return dl;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// process an AS number
|
// process an AS number
|
||||||
|
/*
|
||||||
export function processAutnum(object, dl, toplevel = false) {
|
export function processAutnum(object, dl, toplevel = false) {
|
||||||
|
|
||||||
if (toplevel) document.title = 'AS Number ' + object.handle + ' - RDAP Lookup';
|
if (toplevel) document.title = 'AS Number ' + object.handle + ' - RDAP Lookup';
|
||||||
@@ -650,8 +701,10 @@ export function processAutnum(object, dl, toplevel = false) {
|
|||||||
|
|
||||||
processCommonObjectProperties(object, dl);
|
processCommonObjectProperties(object, dl);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// process an IP or IP block
|
// process an IP or IP block
|
||||||
|
/*
|
||||||
export function processIp(object, dl, toplevel = false) {
|
export function processIp(object, dl, toplevel = false) {
|
||||||
|
|
||||||
if (toplevel) document.title = 'IP Network ' + object.handle + ' - RDAP Lookup';
|
if (toplevel) document.title = 'IP Network ' + object.handle + ' - RDAP Lookup';
|
||||||
@@ -666,31 +719,39 @@ export function processIp(object, dl, toplevel = false) {
|
|||||||
|
|
||||||
processCommonObjectProperties(object, dl);
|
processCommonObjectProperties(object, dl);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
export function processCIDRs(cidrs) {
|
export function processCIDRs(cidrs) {
|
||||||
var list = document.createElement('ul');
|
const list = document.createElement('ul');
|
||||||
for (i = 0; i < cidrs.length; i++) {
|
for (i = 0; i < cidrs.length; i++) {
|
||||||
var cidr = (cidrs[i].v6prefix ? cidrs[i].v6prefix : cidrs[i].v4prefix) + '/' + cidrs[i].length;
|
const cidr = (cidrs[i].v6prefix ? cidrs[i].v6prefix : cidrs[i].v4prefix) + '/' + cidrs[i].length;
|
||||||
list.appendChild(document.createElement('li')).appendChild(createRDAPLink('https://rdap.org/ip/' + cidr, cidr));
|
list.appendChild(document.createElement('li')).appendChild(createRDAPLink('https://rdap.org/ip/' + cidr, cidr));
|
||||||
}
|
}
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
export function processUnknown(object, dl, toplevel = false) {
|
export function processUnknown(object, dl, toplevel = false) {
|
||||||
processCommonObjectProperties(object, dl);
|
processCommonObjectProperties(object, dl);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// given an object, return the "self" URL (if any)
|
// given an object, return the "self" URL (if any)
|
||||||
|
/*
|
||||||
export function getSelfLink(object) {
|
export function getSelfLink(object) {
|
||||||
if (object.links) for (var i = 0; i < object.links.length; i++) if ('self' == object.links[i].rel) return object.links[i].href;
|
if (object.links) for (let i = 0; i < object.links.length; i++) if ('self' == object.links[i].rel) return object.links[i].href;
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// create an RDAP link: a link pointing to an RDAP URL
|
// create an RDAP link: a link pointing to an RDAP URL
|
||||||
// that when clicked, causes an RDAP query to be made
|
// that when clicked, causes an RDAP query to be made
|
||||||
|
/*
|
||||||
export function createRDAPLink(url, title) {
|
export function createRDAPLink(url, title) {
|
||||||
var link = document.createElement('a');
|
const link = document.createElement('a');
|
||||||
|
|
||||||
link.href = 'javascript:void(0)';
|
link.href = 'javascript:void(0)';
|
||||||
link.title = url;
|
link.title = url;
|
||||||
@@ -699,6 +760,7 @@ export function createRDAPLink(url, title) {
|
|||||||
|
|
||||||
return link;
|
return link;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
const URIPatterns: [RegExp, ObjectType][] = [
|
const URIPatterns: [RegExp, ObjectType][] = [
|
||||||
[/^\d+$/, "autnum"],
|
[/^\d+$/, "autnum"],
|
||||||
@@ -717,24 +779,3 @@ export function getType(value: string): ObjectType | null {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function loadRegistries(callback) {
|
|
||||||
showSpinner('Loading bootstrap registries...');
|
|
||||||
for (const url in registryURLs) {
|
|
||||||
const xhr = new XMLHttpRequest();
|
|
||||||
xhr.open('GET', url);
|
|
||||||
|
|
||||||
xhr.timeout = 25000;
|
|
||||||
xhr.responseType = 'json';
|
|
||||||
xhr.onload = () => handleRegistryResponse(xhr);
|
|
||||||
|
|
||||||
xhr.send();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// event handler for when the submit button is pressed, or
|
|
||||||
// when the user clicks on a link to an RDAP URL
|
|
||||||
export function doQuery() {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -98,3 +98,21 @@ export const DomainSchema = z.object({
|
|||||||
network: IpNetworkSchema.optional(),
|
network: IpNetworkSchema.optional(),
|
||||||
})
|
})
|
||||||
export type Domain = z.infer<typeof DomainSchema>;
|
export type Domain = z.infer<typeof DomainSchema>;
|
||||||
|
|
||||||
|
|
||||||
|
const RegistrarSchema = z.tuple([
|
||||||
|
z.array(z.string()).min(1),
|
||||||
|
z.array(z.string()).min(1)
|
||||||
|
]).or(z.tuple([
|
||||||
|
z.array(z.string()).min(1),
|
||||||
|
z.array(z.string()).min(1),
|
||||||
|
z.array(z.string()).min(1)
|
||||||
|
]))
|
||||||
|
|
||||||
|
export const RegisterSchema = z.object({
|
||||||
|
description: z.string(),
|
||||||
|
publication: z.string(),
|
||||||
|
services: z.array(RegistrarSchema),
|
||||||
|
version: z.string()
|
||||||
|
});
|
||||||
|
export type Register = z.infer<typeof RegisterSchema>;
|
||||||
@@ -4,6 +4,10 @@
|
|||||||
@tailwind components;
|
@tailwind components;
|
||||||
@tailwind utilities;
|
@tailwind utilities;
|
||||||
|
|
||||||
|
dd {
|
||||||
|
margin: 0.5em 0 1em 2em;
|
||||||
|
}
|
||||||
|
|
||||||
[title]:not(.no-title) {
|
[title]:not(.no-title) {
|
||||||
border-bottom: 1px dashed silver;
|
border-bottom: 1px dashed silver;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user