Add registrar RDAP schema, improve error handling & remove all typescript errors

This commit is contained in:
Xevion
2023-01-15 01:41:02 -06:00
parent 3010cf22b3
commit 9787076922
5 changed files with 193 additions and 126 deletions

View File

@@ -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;

View File

@@ -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>

View File

@@ -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() {
}

View File

@@ -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>;

View File

@@ -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;
} }