Newer
Older
veriq / frontend / assets / verify.js
/* VerIQ verify page logic — public verification of a signed result */
(function () {
  "use strict";
  var $ = function (id) { return document.getElementById(id); };

  function showError(msg) {
    $("errorArea").textContent = msg;
    $("errorArea").style.display = "";
    $("loading").style.display = "none";
  }

  var m = window.location.pathname.match(/^\/v\/([A-Za-z0-9]{8})$/);
  if (!m) { showError("Invalid verification link."); return; }
  var rid = m[1];

  fetch("/api/result/" + rid).then(function (r) {
    if (!r.ok) return r.json().then(function (e) { throw new Error(e.detail || r.status); });
    return r.json();
  }).then(function (d) {
    $("loading").style.display = "none";
    $("verifyArea").style.display = "";

    $("iqScore").textContent = d.iq;
    $("percentileLine").textContent =
      "higher than " + d.percentile + "% of test takers" +
      (d.flagged ? " · FLAGGED: implausible timing" : "");

    var badges = $("badges");
    badges.innerHTML = "";
    var b1 = document.createElement("span");
    b1.className = "badge " + (d.signature_valid ? "ok" : "bad");
    b1.textContent = d.signature_valid ? "✓ signature valid" : "✗ SIGNATURE INVALID";
    badges.appendChild(b1);
    if (d.identity) {
      var bi = document.createElement("span");
      bi.className = "badge ok";
      bi.textContent = "identity: " + d.identity;
      badges.appendChild(bi);
    } else {
      var bn = document.createElement("span");
      bn.className = "badge";
      bn.textContent = "anonymous result";
      badges.appendChild(bn);
    }
    if (d.superseded) {
      var bs = document.createElement("span");
      bs.className = "badge warn";
      bs.textContent = "superseded by a newer result";
      badges.appendChild(bs);
    }

    $("kvId").textContent = d.result_id;
    $("kvDate").textContent = d.completed_at;
    $("kvIdentity").textContent = d.identity || "not bound (anonymous)";
    $("kvBank").textContent = "v" + d.bank_version;
    $("kvSig").textContent = d.signature;
    $("kvSig").style.color = d.signature_valid ? "var(--good)" : "var(--bad)";

    fetch("/.well-known/veriq-pubkey.txt").then(function (r) { return r.text(); })
      .then(function (pk) { $("kvPub").textContent = pk.trim(); })
      .catch(function () { $("kvPub").textContent = "unavailable"; });
  }).catch(function (e) {
    showError("Could not load result: " + e.message);
  });
})();