{
"version": 3,
"sources": ["../../page/coze_verifier.js"],
"sourcesContent": ["\"use strict\";\n\nimport * as App from '../app/app~fv=cw_byBD8.min.js';\nimport * as Lib from '../lib/lib~fv=LNbMt1n5.min.js';\nimport * as Highlight from '../page/coze_verifier_highlight~fv=Q0bSPAKM.min.js';\nimport * as Coze from '../pkg/coze_all~fv=-7uCIHNa.min.js'; // Must import coze_all for coze array function. \nimport '../pkg/urlform~fv=VhWyOSvq.min.js'; // Namespaced as 'URLForm'.\nimport QrScanner from '../pkg/qr-scanner.min.js'\n\n/**\n@typedef {import ('../../../pkg/urlformjs/urlform.js').FormParameters} FormParameters\n@typedef {import('../../../pkg/cozejs/key.js').CozeKey} CozeKey\n */\n\n// URLFormJS sticky form\n/**@type {FormOptions} */\nconst FormOptions = {\n\t\"FormParameters\": [{\n\t\t\t\"name\": \"input\",\n\t\t\t\"id\": \"message\",\n\t\t},\n\t\t{\n\t\t\t\"name\": \"private\", // Private mode\n\t\t\t\"id\": \"privateMode\",\n\t\t\t\"type\": \"bool\",\n\t\t\t\"funcTrue\": () => privateMode = true,\n\t\t},\n\t\t{\n\t\t\t\"name\": \"dontSignRevoke\", // Do not sign messages that contain `rvk`\n\t\t\t\"type\": \"bool\",\n\t\t\t\"defaultValue\": true,\n\t\t},\n\t\t{\n\t\t\t\"name\": \"updateIat\", // Update `iat` when signing a message\n\t\t\t\"type\": \"bool\",\n\t\t\t\"defaultValue\": true,\n\t\t},\n\t\t{\n\t\t\t\"name\": \"key\",\n\t\t\t\"id\": \"keyArea\",\n\t\t},\n\t\t{\n\t\t\t\"name\": \"selectedAlg\",\n\t\t\t\"func\": function (value) {\n\t\t\t\tSetSelectedAlg(value);\n\t\t\t},\n\t\t\t\"defaultValue\": \"ES256\", // TODO fix this in URLFormJS so URLFormJS omits parameter from share if the same value as default. \n\t\t},\n\t\t{\n\t\t\t\"name\": \"advanced\",\n\t\t\t\"type\": \"bool\",\n\t\t\t\"funcTrue\": () => document.getElementById(\"advancedBtn\").click(),\n\t\t\t// \"nonFormValue\": true,\n\t\t},\n\t\t// Import must be before Verify so that imported keys can be used for verify. \n\t\t{\n\t\t\t\"name\": \"import\", // Typically use Verify instead since it also imports the key. \n\t\t\t\"type\": \"bool\",\n\t\t\t\"funcTrue\": async function () {\n\t\t\t\t// console.debug(\"import\")\n\t\t\t\t//await ImportKey(JSON.parse(URLForm.GetQuagParts(initedFormOptions).pairs.key))\n\t\t\t\tlet key = URLForm.GetQuagParts(initedFormOptions).pairs.key\n\t\t\t\tif (!isEmpty(key)) {\n\t\t\t\t\tdocument.querySelector(\"#keyArea\").value = key\n\t\t\t\t\tawait ImportKey()\n\t\t\t\t}\n\t\t\t},\n\t\t\t// \"nonFormValue\": true,\n\t\t},\n\t\t{\n\t\t\t\"name\": \"verify\",\n\t\t\t\"type\": \"bool\",\n\t\t\t\"funcTrue\": async function () {\n\t\t\t\tawait VerifyCoze()\n\t\t\t},\n\t\t},\n\n\t\t{\n\t\t\t\"name\": \"pretty\",\n\t\t\t\"type\": \"bool\",\n\t\t\t\"funcTrue\": () => jsonSpaces(4),\n\t\t},\n\t\t{\n\t\t\t\"name\": \"block\",\n\t\t\t\"type\": \"bool\",\n\t\t\t\"funcTrue\": () => jsonSpaces(0),\n\t\t},\n\t]\n};\nvar initedFormOptions = {}; // URLFormJS.FormOptions after being inited by `URLFormJS.Init(FormOptions)`\n\n// The global Coze Key used for all signing and verifying. If set the default\n// is App.Coze key, and it can be replaced with imported key, by retrieving, and\n// by coze.key.\nvar CozeKey = {};\n\n// Metadata\nvar Alg;\nvar Iat;\nvar Iats; // iat as a string.\nvar Tmb;\nvar Typ;\nvar Can;\nvar Cad;\nvar Sig;\nvar Czd;\n\n// Spaces is the default number of spaces for JSON indentation.\nvar Spaces = 4;\n\n// privateMode does not send any requests to the server. This may be a security\n// concern for verification since revoked keys cannot be checked. When true, any\n// calls related to verification should be the user warning that revokes are not\n// being checked.\nvar privateMode = false;\nvar dontSignRevoke = true;\nvar updateIat = true;\nvar selectedAlg = \"\";\n\nlet scanQRModal;\n\nconst verifiedIcon = `
`;\nconst failIcon = `
`;\n\nvar KeyLocations = {\n\t\"CozeKeyApp\": {\n\t\tlocationTitle: \"\", // kid is title.\n\t\t// Assume key is good and don't attempt retrieval. (Key loads on app load) \n\t\tattemptRetrieval: false,\n\t\tverifiedMsg: \"Message verified using your key.\"\n\t},\n\t\"CozeKeyNew\": {\n\t\tlocationTitle: \"New key: \",\n\t\tattemptRetrieval: false, // New keys are not on the system. \n\t\tverifiedMsg: \"Message verified using key generated on this page.\"\n\t},\n\t\"CozeKeyRetrieved\": {\n\t\tlocationTitle: \"Retrieved key: \",\n\t\tattemptRetrieval: false,\n\t\tverifiedMsg: \"Message verified using key retrieved from servers looked up by \\\"tmb\\\".\"\n\t},\n\t\"CozeKeyFromMessage\": {\n\t\tlocationTitle: \"Key from coze: \",\n\t\tattemptRetrieval: true,\n\t\tverifiedMsg: \"Message verified using key from inside message.\"\n\t},\n\t\"CozeKeyTmbOnly\": {\n\t\tlocationTitle: \"tmb only key: \",\n\t\tattemptRetrieval: true,\n\t\tverifiedMsg: \"\" // Not possible to verify with tmb\n\t},\n\t\"CozeKeyImported\": {\n\t\tlocationTitle: \"Imported key: \",\n\t\tattemptRetrieval: true,\n\t\tverifiedMsg: \"Message verified using imported key.\"\n\t},\n}\n\nApp.AddOnload(Onload);\nasync function Onload() {\n\t// Details elements\n\tAlg = document.querySelector(\"#alg\");\n\tIat = document.querySelector(\"#iat\");\n\tIats = document.querySelector(\"#iats\");\n\tTmb = document.querySelector(\"#tmb\");\n\tTyp = document.querySelector(\"#typ\");\n\tCan = document.querySelector(\"#can\");\n\tCad = document.querySelector(\"#cad\");\n\tSig = document.querySelector(\"#sig\");\n\tCzd = document.querySelector(\"#czd\");\n\n\tdocument.querySelector(\"#signMessageBtn\").addEventListener('click', SignMsgGUI);\n\tdocument.querySelector(\"#signRawBtn\").addEventListener('click', SignRawJSONGUI);\n\tdocument.querySelector(\"#verifyMessageBtn\").addEventListener('click', () => VerifyCoze());\n\tdocument.querySelector(\"#removeSpacesBtn\").addEventListener('click', () => jsonSpaces(0));\n\tdocument.querySelector(\"#spacesBtn\").addEventListener('click', () => jsonSpaces(4));\n\tdocument.querySelectorAll('.newKeyBtn').forEach((e) => e.addEventListener('click', NewKey));\n\tdocument.querySelector('#importKeyBtn').addEventListener('click', ImportKey);\n\tdocument.querySelector(\"#advancedBtn\").addEventListener('click', () => ToggleVisible(AdvancedDiv));\n\n\t// // Set GUI state (disable sign buttons when CozeKey is empty)\n\t// await ResetGUI();\n\n\t// Shift + Enter trigger VerifyCoze \n\tdocument.querySelector(\"#message\").addEventListener('keydown', function (event) {\n\t\tif (event.code == \"Enter\" && event.shiftKey) {\n\t\t\tevent.preventDefault();\n\t\t\tVerifyCoze();\n\t\t}\n\t});\n\tdocument.querySelectorAll('.copyOutputBtn').forEach(function (item) {\n\t\titem.addEventListener('click', function () {\n\t\t\tClipboardE(document.getElementById(\"signedMessage\"));\n\t\t\tApp.Notification(\"Copied.\", \"success\");\n\t\t});\n\t});\n\tdocument.querySelector(\"#showPrivateKeyBtn\").addEventListener('click', function () {\n\t\tToggleVisible(\"privateKeyDiv\");\n\t});\n\tdocument.querySelector(\"#publicKeyCopyBtn\").addEventListener('click', function () {\n\t\tClipboardE(document.getElementById(\"publicKeyDisplay\"));\n\t\tApp.Notification(\"Copied.\", \"success\");\n\t});\n\n\tdocument.querySelector(\"#privateKeyCopyBtn\").addEventListener('click', function () {\n\t\tClipboardE(document.getElementById(\"privateKeyDisplay\"));\n\t\tApp.Notification(\"Copied.\", \"success\");\n\t});\n\n\t// Page toggles\n\tlet pmElem = document.querySelector(\"#privateMode\")\n\tpmElem.addEventListener('click', function (event) {\n\t\tif (pmElem.checked) {\n\t\t\tprivateMode = true;\n\t\t} else {\n\t\t\tprivateMode = false;\n\t\t}\n\t});\n\tlet uiElem = document.querySelector(\"#updateIat\")\n\tuiElem.addEventListener('click', function () {\n\t\tif (uiElem.checked) {\n\t\t\tupdateIat = true;\n\t\t} else {\n\t\t\tupdateIat = false;\n\t\t}\n\t});\n\tlet dsrElem = document.querySelector(\"#dontSignRevoke\")\n\tdsrElem.addEventListener('click', function () {\n\t\tif (dsrElem.checked) {\n\t\t\tdontSignRevoke = true;\n\t\t} else {\n\t\t\tdontSignRevoke = false;\n\t\t}\n\t});\n\t// Trigger events so any manipulation by URLFormJS is in effect. \n\tpmElem.dispatchEvent(new Event(\"click\"))\n\tdsrElem.dispatchEvent(new Event(\"click\"))\n\tuiElem.dispatchEvent(new Event(\"click\"))\n\n\tdocument.querySelectorAll('.selectedAlg').forEach(function (item) {\n\t\titem.addEventListener('change', function () {\n\t\t\tSetSelectedAlg(this.value)\n\t\t})\n\t})\n\t// Set ID on the first one instance so URLFormJS can set the value in the URL. \n\tdocument.querySelector('select[name=\"selectedAlg\"]').id = \"selectedAlg\"\n\tdocument.querySelector(\"#customShareURLBtn\").addEventListener('click', async function () {\n\t\tawait jsonSpaces(0); // Remove spaces so links are smaller. \n\t\tURLForm.ShareURI(initedFormOptions);\n\t})\n\tdocument.querySelectorAll(\".clearAllBtn\").forEach(function (item) {\n\t\titem.addEventListener('click', function () {\n\t\t\tURLForm.Clear(initedFormOptions)\n\t\t\tResetGUI()\n\t\t});\n\t});\n\n\n\tif (!isEmpty(App.CozeKey)) {\n\t\tApp.CozeKey.fromLocation = \"CozeKeyApp\";\n\t\tawait SetSelectedCozeKey(App.CozeKey);\n\t}\n\n\n\n\t// Modals\n\tlet modalOpts = {\n\t\tkeyboard: true\n\t};\n\n\tscanQRModal = new bootstrap.Modal(document.getElementById('scanQRModal'), modalOpts);\n\tdocument.querySelector(\".scanQRBtn\").addEventListener(\"click\", ScanQRModal);\n\n\n\t// Enable tooltips\n\t// TODO seems to have a bug.\n\t// var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'))\n\t// var tooltipList = tooltipTriggerList.map(function(tooltipTriggerEl) {\n\t// \treturn new bootstrap.Tooltip(tooltipTriggerEl)\n\t// });\n\n\n\t////////////////\n\t// Dragster\n\t////////////////\n\tlet dropzone = document.getElementById(\"file_drop_area\");\n\tlet dragster = new App.Dragster(dropzone);\n\n\tdocument.addEventListener(\"dragster:enter\", function (e) {\n\t\te.target.classList.add(\"highlight\");\n\t}, false);\n\tdocument.addEventListener(\"dragster:leave\", function (e) {\n\t\te.target.classList.remove(\"highlight\");\n\t}, false);\n\n\t// Handle dropped files\n\tdropzone.addEventListener('drop', (e) => {\n\t\tHandleFiles(e.dataTransfer.files)\n\t}, false);\n\n\tdocument.querySelector(\"#fileUploadBtn\").addEventListener('click', function () {\n\t\tthis.parentElement.querySelector(\".fileUploadInput\").click();\n\t});\n\n\t// Trigger the file upload event from the GUI File Selection.\n\tdocument.querySelector(\".fileUploadInput\").onchange = function () {\n\t\tlet files = document.querySelector(\".fileUploadInput\").files;\n\t\tHandleFiles(files);\n\t};\n\n\tfunction preventDefaults(e) {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t};\n\n\t// Prevent default drag behaviors.\n\t// For unknown reasons dragover is yanking the drop event it's not stopped.\n\t// dragenter and dragleave are just for extra measure. \n\t['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {\n\t\t//dropzone.addEventListener(eventName, preventDefaults, false);\n\t\tdocument.body.addEventListener(eventName, preventDefaults, false);\n\t});\n\n\t// Set sticky options on the page via URL.\n\tinitedFormOptions = URLForm.Init(FormOptions)\n\tURLForm.Populate(initedFormOptions);\n};\n\n// SetSelectedAlg sets the global selected alg and displays the selected alg on\n// the GUI.\nfunction SetSelectedAlg(alg) {\n\t//console.log(\"SetSelectedAlg\", alg);\n\tif (alg == \"\") {\n\t\tconsole.log(\"SetSelectedAlg alg empty. Using ES256\");\n\t\talg = \"ES256\"\n\t}\n\tselectedAlg = alg\n\tdocument.querySelector(\".selectedHashAlg\").textContent = selectedAlg;\n\tdocument.querySelector(\".selectedHashAlgHash\").textContent = Coze.HashAlg(selectedAlg);\n\n\t// Keep all instances on the same value. \n\tdocument.querySelectorAll('.selectedAlg').forEach(function (item) {\n\t\titem.value = selectedAlg\n\t})\n}\n\n/**\nNewKey generates a new key, sets `CozeKey`, and set the GUI appropriately.\n */\nasync function NewKey() {\n\ttry {\n\t\t// console.debug(\"Generating a new Coze key with alg: \" + selectedAlg);\n\t\tvar key = await Coze.NewKey(selectedAlg);\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tMessageSucceedFail(\"verified\", e, \"\", false);\n\t}\n\tkey.fromLocation = \"CozeKeyNew\"\n\tawait SetSelectedCozeKey(key);\n};\n\n/**\nImportKey grabs the key from the input key area and updates the GUI\nappropriately.\n */\nasync function ImportKey() {\n\tconsole.log(\"Import Key\");\n\tlet k = document.querySelector(\"#keyArea\").value;\n\tif (isEmpty(k)) {\n\t\tconsole.log(\"No key to import\");\n\t\treturn;\n\t}\n\n\tlet key = JSON.parse(k)\n\tkey.fromLocation = \"CozeKeyImported\";\n\tawait SetSelectedCozeKey(key);\n};\n\n\n/**\njsonSpaces sets spaces (pretty) on the input (#message) and output\n(#signedMessage).\n@param {number} spaces Number of spaces.\n */\nfunction jsonSpaces(spaces) {\n\ttry { // Input Message\n\t\tlet Msg = document.getElementById(\"message\");\n\t\tif (Msg.value !== \"\") {\n\t\t\tlet msgJSON = JSON.parse(Msg.value);\n\t\t\tMsg.value = JSON.stringify(msgJSON, null, spaces);\n\t\t}\n\t} catch (e) {\n\t\tconsole.debug(e); // Continue on error. \n\t}\n\n\ttry { // Signed Message\n\t\tlet sMsgElem = document.getElementById(\"signedMessage\");\n\t\tif (isEmpty(!sMsgElem.textContent)) {\n\t\t\tif (Highlight.EnableHighlighting) {\n\t\t\t\tsMsgElem.textContent = \"\";\n\t\t\t\tHighlight.HighlightCan();\n\t\t\t} else {\n\t\t\t\tdocument.getElementById('signedMessage').classList.remove('highlightGrey');\n\t\t\t\tsMsgElem.textContent = JSON.stringify(JSON.parse(sMsgElem.textContent), null, spaces);\n\t\t\t}\n\t\t}\n\t} catch (e) {\n\t\tconsole.debug(e); // Continue on error. \n\t}\n\n\ttry { // Public Key Display\n\t\tlet pukKeyElem = document.getElementById(\"publicKeyDisplay\")\n\t\tif (!isEmpty(pukKeyElem.textContent)) {\n\t\t\tpukKeyElem.textContent = JSON.stringify(JSON.parse(pukKeyElem.textContent), null, spaces);\n\t\t}\n\t} catch (e) {\n\t\tconsole.debug(e); // Continue on error. \n\t}\n\n\ttry { // Import Key\n\t\tlet key = document.getElementById(\"keyArea\");\n\t\tconsole.log(\"keyArea value:\", key.value);\n\t\tif (key.value !== \"\") {\n\t\t\tlet msgJSON = JSON.parse(key.value);\n\t\t\tkey.value = JSON.stringify(msgJSON, null, spaces);\n\t\t}\n\t} catch (e) {\n\t\tconsole.debug(e); // Continue on error. \n\t}\n};\n\n\n/**\nShowMeta displays the coze information on the page. SetSelectedCozeKey\nmust be called first to set CozeKey global. \n@param {coze} coze Javascript object. May be coze or coze.pay.\n */\nasync function ShowMeta(coze) {\n\t//console.log(\"ShowMeta\", coze);\n\ttry {\n\t\tif (Array.isArray(coze)) { // Don't attempt for arrays.\n\t\t\treturn;\n\t\t}\n\n\t\t// !! Assumes that CozeKey is the key. TODO consider alg selection. \n\t\tlet meta = await Coze.Meta(coze, CozeKey.alg);\n\t\tAlg.textContent = meta.alg;\n\t\tIat.textContent = meta.iat;\n\t\tIats.textContent = \"(\" + new Date(meta.iat * 1000).toLocaleString() + \")\";\n\t\tTmb.innerText = meta.tmb;\n\t\tif (!isEmpty(CozeKey.link) && CozeKey.tmb == meta.tmb) {\n\t\t\tTmb.innerHTML = CozeKey.tmb.link(App.Page.CozeKey + \"/\" + CozeKey.tmb) + \" | \" + \"(JSON)\".link(CozeKey.linkJSON);\n\t\t}\n\t\tTyp.textContent = meta.typ;\n\t\tCan.textContent = JSON.stringify(meta.can);\n\t\tCad.textContent = meta.cad;\n\t\tSig.textContent = meta.sig;\n\t\tCzd.textContent = meta.czd;\n\n\t\tShow(\"detailsRow\");\n\t} catch (e) {\n\t\tconsole.error(e)\n\t}\n};\n\n// ResetGUI resets all non-user input GUI fields. \nasync function ResetGUI() {\n\tClear(Alg);\n\tClear(Iat);\n\tClear(Iats);\n\tClear(Tmb);\n\tClear(Typ);\n\tClear(Can);\n\tClear(Cad);\n\tClear(Sig);\n\tClear(Czd);\n\n\tClear(\"verified\");\n\tClear(\"signedMessage\");\n\tClear(\"privateKeyDisplay\")\n\n\tHide(\"verified\");\n\tHide(\"signedMessageRow\");\n\tHide(\"detailsRow\");\n\tHide(\"Revoked\");\n\tHide(\"privateMode\");\n\tHide(\"showPrivateKeyBtn\")\n\tHide(\"privateKeyDiv\")\n\tHide(\"retrievedKeyLink\")\n\tHide(\"publicKeyDiv\");\n\n\tif (isEmpty(CozeKey)) {\n\t\tShow(\"noUserKey\");\n\t\tDisable(\"signMessageBtn\");\n\t\tDisable(\"signRawBtn\");\n\t} else {\n\t\tHide(\"noUserKey\");\n\t\tEnable(\"signMessageBtn\");\n\t\tEnable(\"signRawBtn\");\n\t}\n\n\tdocument.getElementById('signedMessage').classList.remove('highlightGrey');\n};\n\n\n/**\nUpdateKeyGui does the following:\n\n1. Sets the GUI to display the currently used key (var CozeKey). \n2. Sets the URL on the \"currently used key\".\n@returns {void} \n */\nasync function UpdateKeyGui() {\n\tResetGUI();\n\tif (isEmpty(CozeKey) || isEmpty(CozeKey.tmb)) {\n\t\tconsole.error(\"CozeKey is Empty\")\n\t\treturn\n\t}\n\tCozeKey.title = KeyLocations[CozeKey.fromLocation].locationTitle + CozeKey.kid + \" \" + CozeKey.tmb.substring(0, 6) + \"...\";\n\n\t// key.time is used as the source of truth for \"key exists in Cyphrme\".\n\tif (!isEmpty(CozeKey.time) || CozeKey.fromLocation === \"CozeKeyRetrieved\") {\n\t\tCozeKey.link = App.Page.CozeKey + \"/\" + CozeKey.tmb\n\t\tCozeKey.linkJSON = App.API.Get.CozeKey + \"/\" + CozeKey.tmb + \"?pretty\"\n\t\tCozeKey.titleHTML = CozeKey.title.link(CozeKey.link);\n\t} else {\n\t\tCozeKey.titleHTML = CozeKey.title;\n\t}\n\n\tdocument.querySelectorAll('.selectedKid').forEach((item) => {\n\t\titem.innerHTML = CozeKey.titleHTML;\n\t});\n\n\tvar sanitizeCozeKey = {\n\t\talg: CozeKey.alg,\n\t\tiat: CozeKey.iat,\n\t\tkid: CozeKey.kid,\n\t\trvk: CozeKey.rvk,\n\t\ttmb: CozeKey.tmb,\n\t\tx: CozeKey.x,\n\t}\n\n\tShow(\"publicKeyDiv\"); // Show only the public key\n\tSetHTML(\"publicKeyDisplay\", JSON.stringify(sanitizeCozeKey, null, Spaces))\n\n\tif (CozeKey.fromLocation === \"CozeKeyRetrieved\") { // Set GUI with retrieved key\n\t\tdocument.querySelector(\"#retrievedKeyLink\").href = CozeKey.link;\n\t\tShow(\"retrievedKeyLink\");\n\t}\n\n\t// Only allow showing the private key if the private key was imported or\n\t// generated on page. \n\tif ((CozeKey.fromLocation == \"CozeKeyImported\" && !isEmpty(CozeKey.d)) ||\n\t\tCozeKey.fromLocation == \"CozeKeyNew\") {\n\n\t\tlet sanitizePrikCozeKey = {\n\t\t\talg: CozeKey.alg,\n\t\t\tiat: CozeKey.iat,\n\t\t\tkid: CozeKey.kid,\n\t\t\trvk: CozeKey.rvk,\n\t\t\ttmb: CozeKey.tmb,\n\t\t\tx: CozeKey.x,\n\t\t\td: CozeKey.d,\n\t\t}\n\n\t\tSetHTML(\"privateKeyDisplay\", JSON.stringify(sanitizePrikCozeKey, null, Spaces))\n\t\tShow(\"showPrivateKeyBtn\")\n\t}\n\n\tif (Coze.IsRevoked(CozeKey)) { // If revoked set warning.\n\t\tlet msg = \"\u26A0\uFE0F Key is revoked.\";\n\t\t// Use `rvk_time`, authority time, not `rvk` which is self-signed\n\t\tif (CozeKey.rvk_time > 0) {\n\t\t\tmsg = \"\u26A0\uFE0F Key is revoked since \" + await App.UnixToHR(CozeKey.rvk_time);\n\t\t}\n\n\t\tSetHTML(\"Revoked\", msg);\n\t\tShow(\"Revoked\");\n\t}\n}\n\n\n/**\nSetSelectedCozeKey does the following:\n\n// TODO this should be re-worked where ajax calls are split out and not handled\nby this function. \n\n1. Sets links for keys that are in Cyphr.me. \n2. Sets key title with \"Retrieved: ...\", \"New key: ...\", etc...\n3. If needed, attempts retrieval of the Coze key from Cyphr.me \n4. Displays errors \n - if key is not found for the given tmb\n\nCozeKeyApp from App.CozeKey. \nCozeKeyRetrieved key retrieved by ajax to check for `rvk`.\nCozeKeyTmbOnly tmb from coze, no public key was given so it needs retrieval. \nCozeKeyImported key imported from the input. \nCozeKeyNew key created by this page. \nCozeKeyFromMessage key from the given Coze, e.g. {\"pay\":...,\"key\":{the key in here}, \"sig\":...}\n@param {CozeKey} cozeKey Key to set global CozeKey to. \n@returns {boolean} successfully retrieved a valid key. \n */\nasync function SetSelectedCozeKey(cozeKey) {\n\t//console.log(\"SetSelectedCozeKey\", cozeKey)\n\tif (isEmpty(cozeKey.fromLocation)) {\n\t\tconsole.error(\"Key fromLocation is not set. \")\n\t\treturn false;\n\t}\n\tif (!isEmpty(cozeKey.x)) {\n\t\tcozeKey.tmb = await Coze.Thumbprint(cozeKey); // Recalculate, don't trust input. (input may be from user input).\n\t}\n\tcozeKey.attemptRetrieval = KeyLocations[cozeKey.fromLocation].attemptRetrieval;\n\tif (cozeKey.attemptRetrieval) {\n\t\tGetKey(cozeKey.tmb)\n\t}\n\n\tCozeKey = cozeKey;\n\tUpdateKeyGui();\n}\n\n\n/**\nGetKey gets the Coze key for the given tmb from the server. Returns error if\nserver errors or response from server does not include x.\n@param {Tmb} tmb Key to set global CozeKey to.\n@returns {error} Empty string on no error.\n */\nasync function GetKey(tmb) {\n\tif (privateMode) {\n\t\treturn \"Private mode is on. Not fetching key.\";\n\t}\n\n\t// On error, ajaxKey will be error object, `{\"success\": false,\"msg\": \"[error msg here]\"}`\n\tlet successJSON = await App.Fetch(App.API.Get.CozeKey + \"/\" + tmb)\n\tlet ajaxKey = successJSON.obj\n\t// console.debug(\"GetKey ajax key:\", ajaxKey)\n\tif (isEmpty(ajaxKey.x)) {\n\t\tif (isEmpty(ajaxKey.msg)) { // If for some reason msg from server is also empty.\n\t\t\tajaxKey.msg = \"There was a problem retrieving the key from the server\"\n\t\t}\n\t\treturn ajaxKey.msg\n\t}\n\tajaxKey.fromLocation = \"CozeKeyRetrieved\"\n\tajaxKey.attemptRetrieval = false // Break any potential infinite loop.\n\n\tCozeKey = ajaxKey\n\tUpdateKeyGui()\n\treturn \"\"\n}\n\n/**\nVerifyCoze verifies the input coze using the global CozeKey, sets the GUI,\nretrieves public key, and returns bool. privateMode is for checking for\nrevokes, and/or may be needed if the public key isn't given, but tmb is\notherwise known.\n @returns {boolean} valid or not.\n */\nasync function VerifyCoze() {\n\tawait ResetGUI();\n\tawait SetSelectedCozeKey(CozeKey);\n\tlet invalidMsg = \"Unable to verify. \";\n\tlet validMsg = \"Message verified.\";\n\tlet coze = {};\n\tif (privateMode) { // If in Private Mode show warning\n\t\tShow(\"privateMode\")\n\t}\n\n\tvar msg = await document.getElementById(\"message\").value.trim(); // .trim() removes accidental whitespace. \n\t//console.log(\"VerifyCoze\", CozeKey, msg);\n\n\n\t// Is digest? Callback will re-call VerifyCoze on success. (Digests don't\n\t// have signatures, so this function won't work otherwise.) \n\tif (await App.IsCyphrmeDigest(msg)) {\n\t\tif (!privateMode) {\n\t\t\tvar rj = await App.Fetch(App.API.Get.SearchCoze + \"/\" + msg);\n\t\t\tif (Object.keys(rj).includes('success') && rj.success == false) {\n\t\t\t\tMessageSucceedFail(\"verified\", rj.msg, \"\", false);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tdocument.getElementById('Message').value = JSON.stringify(rj, null, Spaces);\n\t\t\tcoze = rj;\n\t\t} else {\n\t\t\tMessageSucceedFail(\"verified\", \"Private mode is on. Cannot retrieve coze from digest.\", \"\", false, true);\n\t\t\treturn false;\n\t\t}\n\t} else { // If not dig, input must be JSON.\n\t\ttry {\n\t\t\tcoze = JSON.parse(msg);\n\t\t} catch (e) {\n\t\t\tinvalidMsg = \"Invalid JSON: \" + e;\n\t\t\tconsole.error(\"Invalid JSON: \", invalidMsg);\n\t\t\tMessageSucceedFail(\"verified\", invalidMsg, \"\", false);\n\t\t\treturn false;\n\t\t}\n\t}\n\tawait ShowMeta(coze) // Attempt ShowMeta, should be overwritten again by later checks. \n\n\t// Is the message an array? \n\tif (Array.isArray(coze)) {\n\t\t// Grab public key if needed. Assumes from first tmb. Does not support multi-key. \n\t\tif (coze[0].pay.tmb !== CozeKey.tmb) {\n\t\t\tlet err = await GetKey(coze[0].pay.tmb);\n\t\t\tif (!isEmpty(err)) {\n\t\t\t\tMessageSucceedFail(\"verified\", err, \"\", false);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tlet obj = await Coze.VerifyCozeArray(coze, CozeKey);\n\t\t//console.log(\"Verified Is Array obj:\", obj);\n\t\tvalidMsg = \"Verified all. Count: \" + obj.VerifiedCount;\n\n\t\tif (obj.VerifiedAll == false) {\n\t\t\tinvalidMsg = `${invalidMsg} Fail count: ${obj.FailedCount} at [${obj.FailedPosition}]`\n\t\t}\n\n\t\tMessageSucceedFail(\"verified\", invalidMsg, validMsg, obj.VerifiedAll);\n\t\tHighlight.HighlightCan();\n\t\t// TODO ShowMeta(coze); with array.\n\t\treturn obj.VerifiedAll;\n\t}\n\n\t// Single coze (not array)\n\t// Is message \"coze\" encapsulated?\n\tif (!isEmpty(coze.coze)) {\n\t\tcoze = coze.coze;\n\t}\n\n\t// Does Coze have sig? If not, not coze. \n\tif (!Object.keys(coze).includes(\"sig\")) {\n\t\t// Is it a key? Show massage saying to import key. \n\t\tMessageSucceedFail(\"verified\", `Input does not have field \"sig\".`, \"\", false);\n\t\treturn false;\n\t}\n\n\t// Does msg have a public key? If yes, use that key, ignore currently set\n\t// application key. \n\tif (!isEmpty(coze.key)) {\n\t\tcoze.key.fromLocation = \"CozeKeyFromMessage\";\n\t\tawait SetSelectedCozeKey(coze.key);\n\t}\n\n\t// Is the tmb different from the current key? Try to get it and use it. \n\tif (!isEmpty(coze.pay.tmb) && (isEmpty(CozeKey) || coze.pay.tmb !== CozeKey.tmb)) {\n\t\tif (privateMode) {\n\t\t\tMessageSucceedFail(\"verified\", \"Message's \\\"tmb\\\" doesn't match key's \\\"tmb\\\".\", \"\", false);\n\t\t\treturn false;\n\t\t}\n\t\tlet err = await GetKey(coze.pay.tmb)\n\t\tif (!isEmpty(err)) {\n\t\t\tMessageSucceedFail(\"verified\", err, \"\", false);\n\t\t\treturn false;\n\t\t}\n\t\treturn VerifyCoze(); // Start over again.\n\n\t}\n\n\tlet verified = await Coze.Verify(coze, CozeKey);\n\t// console.debug(verified)\n\n\tShowMeta(coze);\n\tvalidMsg = KeyLocations[CozeKey.fromLocation].verifiedMsg\n\tMessageSucceedFail(\"verified\", invalidMsg, validMsg, verified);\n\tHighlight.HighlightCan();\n\treturn verified;\n};\n\n\n/**\nSignMsgGUI puts the text area string into a \"msg\" field in a Coze object and\nsigns it.\n@returns {void}\n */\nasync function SignMsgGUI() {\n\ttry {\n\t\tResetGUI();\n\t\tif (Object.keys(CozeKey).length === 0) {\n\t\t\tthrow \"No key is set. Key is needed to sign.\";\n\t\t}\n\n\t\tlet pay = {\n\t\t\tmsg: document.getElementById(\"message\").value,\n\t\t\talg: CozeKey.alg,\n\t\t\tiat: Now(),\n\t\t\ttmb: CozeKey.tmb,\n\t\t\ttyp: \"cyphr.me/msg/create\"\n\t\t};\n\n\t\tlet coze = {\n\t\t\tpay: pay\n\t\t};\n\t\tawait Coze.Sign(coze, CozeKey);\n\t\tdocument.getElementById(\"signedMessage\").textContent = JSON.stringify(coze, null, Spaces);\n\t\tShowMeta(coze);\n\t\tShow(\"signedMessageRow\");\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tMessageSucceedFail(\"verified\", e, \"\", false);\n\t}\n};\n\n\n/**\nSignRawJSONGUI grabs the GUI input JSON, signs with minimal Coze checks, and\nsets the GUI.\n\nThe resulting `coze` may be missing required Coze fields, such as iat, tmb, typ,\nand alg.\n@returns {void}\n */\nasync function SignRawJSONGUI() {\n\ttry {\n\t\tResetGUI();\n\t\tvar coze = {};\n\t\tlet obj = JSON.parse(document.getElementById(\"message\").value);\n\n\t\tif (Array.isArray(obj)) { // Is the message an array?\n\t\t\tcoze = [];\n\t\t\tfor (let i = 0; i < obj.length; i++) {\n\t\t\t\tlet signed = await signRawJSON(obj[i]);\n\t\t\t\tcoze.push(signed);\n\t\t\t}\n\t\t} else { // Not an array\n\t\t\tcoze = await signRawJSON(obj);\n\t\t}\n\t\tconsole.debug(coze)\n\n\t\t// Double check if the signed verifies. \n\t\tlet valid = await Coze.VerifyCozeArray(coze, CozeKey);\n\t\tif (!valid) {\n\t\t\tthrow new Error(\"Coze.SignRawJSONGUI: Invalid Coze\");\n\t\t}\n\t\t// Everything passed. Set GUI.\n\t\tdocument.getElementById(\"signedMessage\").textContent = JSON.stringify(coze, null, Spaces);\n\t\tShowMeta(coze);\n\t\tShow(\"signedMessageRow\");\n\t} catch (e) {\n\t\tconsole.error(e);\n\t\tMessageSucceedFail(\"verified\", \"Unable to sign JSON: \" + e, \"\", false);\n\t\treturn;\n\t}\n};\n\n\n/**\nsignRawJSON signs input object or JSON string and puts it in a `coze` object.\n\nThe resulting `coze` may be missing required coze fields, such as `alg`,`iat`,\nand `tmb`. This function may return an cryptographically valid, but coze\ninvalid, object.\n\nInput var \"coze\" may or may not be `pay` wrapped e.g. `\"pay\":{...}` or coze\nwrapped e.g. \"coze\":{\"pay\":{...},\"sig\":\"...\"}\n\nOutput is always pay wrapped regardless of input.\n\nIf input is coze wrapped, output will be coze wrapped.\n\nThrows error if `coze` is array. (Use `SignRawJSONGUI` for arrays.)\n@param {(coze|string)} coze Stringed JSON object to be signed.\n@returns {coze} Coze returned from signing the message. Empty if invalid.\n@throws {SyntaxError} JSON parse exception.\n */\nasync function signRawJSON(coze) {\n\tif (isEmpty(CozeKey)) {\n\t\tthrow new Error(\"signRawJSON: Private key not set. Cannot sign message.\");\n\t}\n\tif (Array.isArray(coze)) {\n\t\tthrow new Error(\"signRawJSON: Input cannot be array.\");\n\t}\n\tif (typeof coze == \"string\") {\n\t\tcoze = JSON.parse(coze);\n\t}\n\n\t// \"coze\" encapsulated? Unencapsulate and re-wrap after signing.\n\tif (coze.hasOwnProperty(\"coze\")) {\n\t\tvar cozeWrap = true;\n\t\tcoze = coze.coze;\n\t}\n\n\t// If there is no pay, assume input is pay and encapsulate into a pay. \n\tif (isEmpty(coze.pay) && Object.keys(coze).length !== 0) {\n\t\tcoze = {\n\t\t\tpay: coze\n\t\t};\n\t}\n\n\t// Don't allow signing revoke messages when option is checked/true\n\tif (dontSignRevoke) {\n\t\tif (!isEmpty(coze.pay.rvk)) {\n\t\t\tthrow new Error(\"signRawJSON: The message contains \\\"rvk\\\". (To sign, allow signing revoke messages.)\");\n\t\t}\n\t}\n\n\tif (updateIat && !isEmpty(coze.pay.iat)) {\n\t\tconsole.log(\"in\");\n\t\tcoze.pay.iat = Math.floor(Date.now() / 1000); // To get Unix from js, divide by 1000.\n\t}\n\n\tawait Coze.SignCozeRaw(coze, CozeKey);\n\n\tif (cozeWrap) { // rewrap in a \"coze\" if given was wrapped. \n\t\tlet coze2 = {}\n\t\tcoze2.coze = coze;\n\t\tcoze = coze2;\n\t}\n\n\treturn coze;\n};\n\n\nfunction ScanQRModal() {\n\tconsole.log(\"Start scan QR\");\n\tscanQRModal.toggle();\n\tlet videoElem = document.getElementById(\"scanQRVideo\");\n\n\tconst qrScanner = new QrScanner(\n\t\tvideoElem,\n\t\tresult => scanQRCallback(result), {\n\t\t\thighlightScanRegion: true,\n\t\t},\n\t);\n\n\tfunction scanQRCallback(result) {\n\t\tconsole.log('decoded qr code:', result, result.data);\n\t\tscanQRModal.toggle();\n\t\tdocument.querySelector('#keyArea').value = result.data;\n\t\tdocument.querySelector('#importKeyBtn').dispatchEvent(new Event('click'));\n\t}\n\n\t// Stop scanning when the modal is closed. (The bootstrap modal object is\n\t// not the html element, so select it by ID. )\n\tdocument.getElementById('scanQRModal').addEventListener('hidden.bs.modal', event => {\n\t\tqrScanner.stop();\n\t});\n\n\tqrScanner.start();\n}\n\n\n/**\nHandleFiles accepts variadic files handled by calling 2 helper functions:\nuploadFile uploads the files to the database.\npreviewFile displays the files to the page.\n@param {FileList} files JavaScript FileList Object. Array of files.\n@returns {void} Upload/Preview are called per file.\n */\nasync function HandleFiles(files) {\n\t// Clear out existing digests:\n\tdocument.getElementById('digest_output').textContent = \"\";\n\tvar fileHashes = [];\n\n\tfor (let file of files) {\n\t\tfileHashes.push(await Lib.HashFile(file, selectedAlg));\n\t}\n\t// Take out of Array if just 1.\n\tif (fileHashes.length == 1) {\n\t\tfileHashes = fileHashes[0];\n\t}\n\tdocument.getElementById('digest_output').textContent = JSON.stringify({\n\t\t\"digest\": fileHashes\n\t});\n\n\tShow(\"digest_output\");\n};\n\n/**\nMessageSucceedFail shows a message in the given page element with a fail or\nsuccess message and pushes a notification. \n@param {string} elementID ID of element or element.\n@param {string} failMessage\n@param {string} successMessage \n@param {boolean} pass\n@param {boolean} [warn] Warning instead of danger.\n@returns {boolean} If the element was hidden.\n */\nfunction MessageSucceedFail(elementID, failMessage, successMessage, pass, warn) {\n\tconsole.log(\"MessageSucceedFail\");\n\tvar e = document.getElementById(elementID);\n\n\t// Clear out any existing message\n\te.innerHTML = \"\";\n\te.classList.remove('text-success');\n\te.classList.remove('text-danger');\n\te.classList.remove('text-warning');\n\n\t// Fail\n\tif (!pass) {\n\t\tfailMessage = failIcon + \" \" + failMessage;\n\t\tif (warn) {\n\t\t\te.classList.add(\"text-warning\");\n\t\t} else {\n\t\t\te.classList.add(\"text-danger\");\n\t\t}\n\t\te.innerHTML = failMessage;\n\t\tApp.Notification(failMessage, \"error\");\n\t} else {\n\t\tsuccessMessage = verifiedIcon + \" \" + successMessage;\n\t\t// Success\n\t\te.innerHTML = successMessage\n\t\te.classList.add(\"text-success\");\n\t\tApp.Notification(successMessage, \"success\");\n\t}\n\n\tShow(e);\n\treturn;\n};"],
"mappings": "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",
"names": ["App", "Lib", "Highlight", "Coze", "QrScanner", "FormOptions", "privateMode", "value", "SetSelectedAlg", "key", "initedFormOptions", "ImportKey", "VerifyCoze", "jsonSpaces", "CozeKey", "Alg", "Iat", "Iats", "Tmb", "Typ", "Can", "Cad", "Sig", "Czd", "Spaces", "dontSignRevoke", "updateIat", "selectedAlg", "scanQRModal", "verifiedIcon", "failIcon", "KeyLocations", "Onload", "SignMsgGUI", "SignRawJSONGUI", "e", "NewKey", "event", "item", "pmElem", "uiElem", "dsrElem", "ResetGUI", "SetSelectedCozeKey", "modalOpts", "ScanQRModal", "dropzone", "dragster", "HandleFiles", "files", "preventDefaults", "eventName", "alg", "MessageSucceedFail", "k", "spaces", "Msg", "msgJSON", "sMsgElem", "pukKeyElem", "ShowMeta", "coze", "meta", "UpdateKeyGui", "sanitizeCozeKey", "sanitizePrikCozeKey", "msg", "cozeKey", "GetKey", "tmb", "ajaxKey", "invalidMsg", "validMsg", "rj", "err", "obj", "verified", "i", "signed", "signRawJSON", "cozeWrap", "coze2", "videoElem", "qrScanner", "result", "scanQRCallback", "fileHashes", "file", "elementID", "failMessage", "successMessage", "pass", "warn"]
}