mirror of
https://github.com/XRPLF/xrpl-dev-portal.git
synced 2025-11-23 13:15:49 +00:00
Add xrp-ledger.toml Checker
- Update ripple-lib to 1.2.4 - Redirects ripple.txt validator to the xrp-ledger.toml checker
This commit is contained in:
22
assets/js/ripple-lib-1.1.2-min.js
vendored
22
assets/js/ripple-lib-1.1.2-min.js
vendored
File diff suppressed because one or more lines are too long
15
assets/js/ripple-lib-1.2.4-min.js
vendored
Normal file
15
assets/js/ripple-lib-1.2.4-min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
214
assets/js/xrp-ledger-toml-checker.js
Normal file
214
assets/js/xrp-ledger-toml-checker.js
Normal file
@@ -0,0 +1,214 @@
|
||||
const TOML_PATH = "/.well-known/xrp-ledger.toml"
|
||||
const TIPS = '<p>Check if the file is actually hosted at the URL above, check your server\'s HTTP settings, and make sure your server provides the required <a href="xrp-ledger-toml.html#cors-setup">CORS header.</a></p>'
|
||||
const CLASS_GOOD = "badge badge-success"
|
||||
const CLASS_BAD = "badge badge-danger"
|
||||
|
||||
const ACCOUNT_FIELDS = [
|
||||
"address",
|
||||
"network",
|
||||
"desc"
|
||||
]
|
||||
const VALIDATOR_FIELDS = [
|
||||
"public_key",
|
||||
"network",
|
||||
"owner_country",
|
||||
"server_country",
|
||||
"unl"
|
||||
]
|
||||
const PRINCIPAL_FIELDS = [
|
||||
"name",
|
||||
"email"
|
||||
]
|
||||
const SERVER_FIELDS = [
|
||||
"json_rpc",
|
||||
"ws",
|
||||
"peer",
|
||||
"network"
|
||||
]
|
||||
const CURRENCY_FIELDS = [
|
||||
"code",
|
||||
"display_decimals",
|
||||
"issuer",
|
||||
"network",
|
||||
"symbol"
|
||||
]
|
||||
|
||||
function VerificationError(message, tips) {
|
||||
this.name = "VerificationError"
|
||||
this.message = message || ""
|
||||
this.tips = tips || ""
|
||||
}
|
||||
VerificationError.prototype = Error.prototype
|
||||
|
||||
function makeLogEntry(text, raw) {
|
||||
let log
|
||||
if (raw) {
|
||||
log = $('<li></li>').appendTo('#log').append(text)
|
||||
} else {
|
||||
log = $('<li></li>').text(text+" ").appendTo('#log')
|
||||
}
|
||||
log.resolve = function(text) {
|
||||
return $('<span></span>').html(text).appendTo(log)
|
||||
}
|
||||
return log
|
||||
}
|
||||
|
||||
function fetch_file() {
|
||||
const domain = $('#domain').val()
|
||||
const url = "https://" + domain + TOML_PATH
|
||||
|
||||
const log = makeLogEntry('Checking ' + url + '...')
|
||||
$.ajax({
|
||||
url: url,
|
||||
dataType: 'text',
|
||||
success: function(data) {
|
||||
log.resolve('FOUND').addClass(CLASS_GOOD)
|
||||
parse_xrpl_toml(data, domain)
|
||||
},
|
||||
error: function(jqxhr, status, error) {
|
||||
switch (status) {
|
||||
case 'timeout':
|
||||
err = 'TIMEOUT'
|
||||
break
|
||||
case 'abort':
|
||||
err = 'ABORTED'
|
||||
break
|
||||
case 'error':
|
||||
err = 'ERROR'
|
||||
break
|
||||
default:
|
||||
err = 'UNKNOWN'
|
||||
}
|
||||
log.resolve(err).addClass(CLASS_BAD).after(TIPS)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
async function parse_xrpl_toml(data, domain) {
|
||||
let parsed
|
||||
let log1 = makeLogEntry("Parsing TOML data...")
|
||||
try {
|
||||
parsed = TOML(data)
|
||||
log1.resolve("SUCCESS").addClass(CLASS_GOOD)
|
||||
} catch(e) {
|
||||
log1.resolve(e).addClass(CLASS_BAD)
|
||||
return
|
||||
}
|
||||
|
||||
console.log(parsed)
|
||||
|
||||
if (parsed.METADATA.modified) {
|
||||
const mod_log = makeLogEntry("Modified date: ")
|
||||
try {
|
||||
mod_log.resolve(parsed.METADATA.modified.toISOString()).addClass(CLASS_GOOD)
|
||||
} catch(e) {
|
||||
mod_log.resolve("INVALID").addClass(CLASS_BAD)
|
||||
}
|
||||
}
|
||||
|
||||
async function list_entries(name, list, fields, validate) {
|
||||
let list_wrap = $("<p>"+name+"</p>")
|
||||
let list_ol = $("<ol>").appendTo(list_wrap)
|
||||
for (i=0; i<list.length; i++) {
|
||||
let entry_wrap = $("<li>").appendTo(list_ol)
|
||||
let entry_def = $("<ul class='mb-3'>").appendTo(entry_wrap)
|
||||
let entry = list[i]
|
||||
for (j=0; j<fields.length; j++) {
|
||||
let fieldname = fields[j]
|
||||
if (entry[fieldname] !== undefined) {
|
||||
let field_def = $("<li><strong>"+fieldname+":</strong> ").appendTo(entry_def)
|
||||
$(" <span class='"+fieldname+"'>").text(entry[fieldname]).appendTo(field_def)
|
||||
}
|
||||
}
|
||||
if (validate) {
|
||||
validate(entry).then((validated) => {
|
||||
if (validated === true) {
|
||||
entry_def.append('<li class="badge badge-success">Domain Validated <i class="fa fa-check-circle"></i></li>')
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
makeLogEntry(list_wrap, true)
|
||||
}
|
||||
|
||||
if (parsed.ACCOUNTS) {
|
||||
list_entries("Accounts:", parsed.ACCOUNTS, ACCOUNT_FIELDS, async function(acct) {
|
||||
if (acct.address === undefined) {return undefined}
|
||||
let net
|
||||
if (acct.network === undefined) { net = "main" } else { net = acct.network }
|
||||
return await validate_address_domain_on_net(acct.address, domain, net)
|
||||
})
|
||||
}
|
||||
if (parsed.VALIDATORS) {
|
||||
list_entries("Validators:", parsed.VALIDATORS, VALIDATOR_FIELDS)
|
||||
}
|
||||
if (parsed.PRINCIPALS) {
|
||||
list_entries("Principals:", parsed.PRINCIPALS, PRINCIPAL_FIELDS)
|
||||
}
|
||||
if (parsed.SERVERS) {
|
||||
list_entries("Servers:", parsed.SERVERS, SERVER_FIELDS)
|
||||
}
|
||||
if (parsed.CURRENCIES) {
|
||||
list_entries("Currencies:", parsed.CURRENCIES, CURRENCY_FIELDS)
|
||||
}
|
||||
}
|
||||
|
||||
const testnet = new ripple.RippleAPI({server: 'wss://s.altnet.rippletest.net:51233'})
|
||||
testnet.connect()
|
||||
const mainnet = new ripple.RippleAPI({server: 'wss://s1.ripple.com'})
|
||||
mainnet.connect()
|
||||
|
||||
async function validate_address_domain_on_net(address, domain, net) {
|
||||
if (net === "main") {
|
||||
let settings
|
||||
try {
|
||||
settings = await mainnet.getSettings(address)
|
||||
} catch(e) {
|
||||
console.error("failed to look up address on mainnet:", address, e)
|
||||
return undefined
|
||||
}
|
||||
|
||||
if (settings.domain === domain) {
|
||||
return true
|
||||
} else if (settings.domain === undefined) {
|
||||
console.debug(address, ": Domain is undefined in settings")
|
||||
return undefined
|
||||
} else {
|
||||
console.debug(address, ": Domain mismatch ("+settings.domain+" vs. "+domain+")")
|
||||
return false
|
||||
}
|
||||
} else if (net === "testnet") {
|
||||
let settings
|
||||
try {
|
||||
settings = await testnet.getSettings(address)
|
||||
} catch(e) {
|
||||
console.error("failed to look up address on testnet:", address, e)
|
||||
return undefined
|
||||
}
|
||||
|
||||
if (settings.domain === domain) {
|
||||
return true
|
||||
} else if (settings.domain === undefined) {
|
||||
console.debug(address, ": Domain is undefined in settings")
|
||||
return undefined
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
} else {
|
||||
return undefined
|
||||
}
|
||||
}
|
||||
|
||||
function handle_submit(event) {
|
||||
event.preventDefault();
|
||||
|
||||
$('.result-title').show()
|
||||
$('#result').show()
|
||||
$('#log').empty()
|
||||
|
||||
fetch_file()
|
||||
}
|
||||
|
||||
$(document).ready(() => {
|
||||
$('#domain-entry').submit(handle_submit)
|
||||
})
|
||||
1660
assets/vendor/iarna-toml-parse.js
vendored
Normal file
1660
assets/vendor/iarna-toml-parse.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@@ -19,11 +19,9 @@ Ripple provides a set of developer tools to help you test, explore, and validate
|
||||
|
||||
Use the WebSocket and JSON-RPC Test Net endpoints to test software built on the XRP Ledger without using real funds. Generate Test Net credentials and funds for testing purposes. Test Net ledger and balances are reset on a regular basis.
|
||||
|
||||
* **[ripple.txt Validator](ripple-txt-validator.html)**
|
||||
* **[xrp-ledger.toml Checker](xrp-ledger-toml-checker.html)**
|
||||
|
||||
Use this tool to verify that your `ripple.txt` is syntactically correct and deployed properly.
|
||||
|
||||
**Warning:** The `ripple.txt` file definition has been deprecated. Use an [xrp-ledger.toml file](xrp-ledger-toml.html) instead.
|
||||
Use this tool to verify that your [xrp-ledger.toml file](xrp-ledger-toml.html) is set up properly.
|
||||
|
||||
* **[Transaction Sender](tx-sender.html)**
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ This tutorial explains how to send a simple XRP Payment using RippleAPI for Java
|
||||
|
||||
<!-- Interactive example use ripple-lib and its prerequisites -->
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
|
||||
<script type="application/javascript" src="assets/js/ripple-lib-1.1.2-min.js"></script>
|
||||
<script type="application/javascript" src="assets/js/ripple-lib-1.2.4-min.js"></script>
|
||||
<!-- Helper for interactive tutorial breadcrumbs -->
|
||||
<script type="application/javascript" src="assets/js/interactive-tutorial.js"></script>
|
||||
|
||||
|
||||
@@ -973,8 +973,6 @@ pages:
|
||||
targets:
|
||||
- local
|
||||
|
||||
# TODO: identify your accounts with ripple.txt (to come later)
|
||||
|
||||
- name: Manage the rippled Server
|
||||
html: manage-the-rippled-server.html
|
||||
funnel: Docs
|
||||
@@ -2932,12 +2930,20 @@ pages:
|
||||
- local
|
||||
template: template-rest-api-tool.html
|
||||
|
||||
- name: ripple.txt Validator
|
||||
- name: ripple.txt Validator # Redirect from ripple.txt validator to toml
|
||||
funnel: Dev Tools
|
||||
html: ripple-txt-validator.html
|
||||
template: template-redirect.html
|
||||
redirect_url: xrp-ledger-toml-checker.html
|
||||
targets:
|
||||
- local
|
||||
template: template-ripple-txt-validator.html
|
||||
|
||||
- name: xrp-ledger.toml Checker
|
||||
funnel: Dev Tools
|
||||
html: xrp-ledger-toml-checker.html
|
||||
targets:
|
||||
- local
|
||||
template: template-xrp-ledger-toml-checker.html
|
||||
|
||||
- name: XRP Test Net Faucet
|
||||
funnel: Dev Tools
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
|
||||
{% block endbody %}
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
|
||||
<script type="application/javascript" src="assets/js/ripple-lib-1.1.2-min.js"></script>
|
||||
<script type="application/javascript" src="assets/js/ripple-lib-1.2.4-min.js"></script>
|
||||
<script type="application/javascript" src="assets/vendor/bootstrap-growl.jquery.js"></script>
|
||||
<script type='application/javascript' src='assets/js/tx-sender.js'></script>
|
||||
{% endblock %}
|
||||
|
||||
32
tool/template-xrp-ledger-toml-checker.html
Normal file
32
tool/template-xrp-ledger-toml-checker.html
Normal file
@@ -0,0 +1,32 @@
|
||||
{% extends "template-base.html" %}
|
||||
|
||||
{% block main %}
|
||||
<section class="container-fluid p-3">
|
||||
<h1>xrp-ledger.toml Checker</h1>
|
||||
|
||||
<p>If you run an XRP Ledger validator or use the XRP Ledger for your business, you can provide information about your usage of the XRP Ledger to the world in a machine-readable <a href="https://developers.ripple.com/xrp-ledger-toml.html"><code>xrp-ledger.toml</code> file</a>.</p>
|
||||
|
||||
<p>This tool allows you to verify that your <code>xrp-ledger.toml</code> file is syntactically
|
||||
correct and deployed properly.</p><br/>
|
||||
<form id="domain-entry">
|
||||
<div class="input-group">
|
||||
<input id="domain" type="text" class="form-control" required
|
||||
placeholder="example.com (Domain name to check)"
|
||||
pattern="^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$"><br>
|
||||
<button class="btn btn-primary form-control">Check toml file</button>
|
||||
</div><!--/.input-group-->
|
||||
</form>
|
||||
<div id="result">
|
||||
<h5 class='result-title'>Result</h5>
|
||||
<ul id="log">
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
{% endblock %}
|
||||
|
||||
{% block endbody %}
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
|
||||
<script type="application/javascript" src="assets/js/ripple-lib-1.2.4-min.js"></script>
|
||||
<script type='text/javascript' src='assets/vendor/iarna-toml-parse.js'></script>
|
||||
<script type='text/javascript' src='assets/js/xrp-ledger-toml-checker.js'></script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user