diff options
Diffstat (limited to 'src/routes')
-rw-r--r-- | src/routes/+layout.svelte | 1 | ||||
-rw-r--r-- | src/routes/anim-gen.ts | 84 | ||||
-rw-r--r-- | src/routes/canaries/keystore.ts | 36 |
3 files changed, 65 insertions, 56 deletions
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 53bd941..80bd58c 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,4 +1,5 @@ <script lang="ts"> + import "$/lib/console"; import "../app.css"; import "$lib/fonts/all-local-after-woff2.css"; const { children } = $props(); diff --git a/src/routes/anim-gen.ts b/src/routes/anim-gen.ts index 382237e..550efb7 100644 --- a/src/routes/anim-gen.ts +++ b/src/routes/anim-gen.ts @@ -113,17 +113,17 @@ const biosStepHandlers: Step[] = [ biosSteps, ).fill( (quantity: number, lastQuantity: number, index: number) => - (next: () => void) => { - const s = anim.selector( - `#bios .bar`, - ); - s.style(`${index === 0 ? hiddenStyles : visibleStyles} + (next: () => void) => { + const s = anim.selector( + `#bios .bar`, + ); + s.style(`${index === 0 ? hiddenStyles : visibleStyles} width: ${lastQuantity * 100}vw;`); - anim._internal_timeline.now += 1; - s.style(`${visibleStyles} + anim._internal_timeline.now += 1; + s.style(`${visibleStyles} width: ${quantity * 100}vw;`); - anim.in(quantity === 1 ? 50 : biosStepInterval, next); - }, + anim.in(quantity === 1 ? 50 : biosStepInterval, next); + }, ).map((v, i, a) => v((i + 1) / a.length, i / a.length, i)), // Show bdsdxe (next) => { @@ -378,8 +378,7 @@ const ttyStepHandlers: Step[] = [ switch (step.kind) { case 'text': { const s = anim.selector( - `${isBeforeFirstClear ? '#openrc' : '#tty-' + (ttyIdx - 1)} ${ - step.classes.map((v) => `.${v}`).join('') + `${isBeforeFirstClear ? '#openrc' : '#tty-' + (ttyIdx - 1)} ${step.classes.map((v) => `.${v}`).join('') }`, ); s.style(altHiddenStyles); @@ -391,8 +390,7 @@ const ttyStepHandlers: Step[] = [ } case 'removeNode': { const s = anim.selector( - `${isBeforeFirstClear ? '#openrc' : '#tty-' + (ttyIdx - 1)} ${ - step.removedItemClassList.map((v) => `.${v}`).join('') + `${isBeforeFirstClear ? '#openrc' : '#tty-' + (ttyIdx - 1)} ${step.removedItemClassList.map((v) => `.${v}`).join('') }`, ); s.style(altVisibleStyles); @@ -460,9 +458,8 @@ const output = `/** * You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ ${anim.exportToCSS()} -${ - stages.filter((_, i, a) => i !== a.length - 1).map((v) => - `${v.selector} { +${stages.filter((_, i, a) => i !== a.length - 1).map((v) => + `${v.selector} { ${hiddenStageStyles} } .ttytext-removed-after-done { @@ -473,35 +470,34 @@ ${hiddenStageStyles} margin-left: -100vw; margin-right: 100vw; } -${ - (ttyLines.flatMap((v) => - v.kind === 'text' - ? [ - ...v.value.map((v) => ({ - kind: 'text' as const, - ...v, - })), - ] - : [] - ).flatMap((v) => [ - ...( - v.kind === 'text' - ? [ - v.colour - ? `.ttytext-block.text-\\[\\${v.colour}\\]{color:${v.colour};}` - : '', - v.bg - ? `.ttytext-block.bg-\\[\\${v.bg}\\]{background:${v.bg};}` - : '', - ] - : [] - ), - ]).filter((v, i, a) => v.length !== 0 && a.indexOf(v) === i)).join('\n') - } +${(ttyLines.flatMap((v) => + v.kind === 'text' + ? [ + ...v.value.map((v) => ({ + kind: 'text' as const, + ...v, + })), + ] + : [] + ).flatMap((v) => [ + ...( + v.kind === 'text' + ? [ + v.colour + ? `.ttytext-block.text-\\[\\${v.colour}\\]{color:${v.colour};}` + : '', + v.bg + ? `.ttytext-block.bg-\\[\\${v.bg}\\]{background:${v.bg};}` + : '', + ] + : [] + ), + ]).filter((v, i, a) => v.length !== 0 && a.indexOf(v) === i)).join('\n') + } ` - ).join('') -} -${[...anim.exportToObject().values()].map(v=>`#app.skip-animation ${v.selector} { +).join('') + } +${[...anim.exportToObject().values()].map(v => `#app.skip-animation ${v.selector} { animation-duration: 0.01ms; }`).join('\n')} `; diff --git a/src/routes/canaries/keystore.ts b/src/routes/canaries/keystore.ts index 1d2aefb..5b85201 100644 --- a/src/routes/canaries/keystore.ts +++ b/src/routes/canaries/keystore.ts @@ -2,23 +2,31 @@ import { dev } from "$app/environment"; import { PublicKey, readCleartextMessage, readKey, verify } from "openpgp"; import { fallbackKeys } from "./fallback-keys"; export const keyStore = new Map<string, PublicKey>(); -const will_debug = false; -const debug = dev && will_debug ? console.debug : () => void 0; +const will_debug = true; +const debug = dev && will_debug ? (z: any, ...a: any[]) => console.debug(...[ + ...(typeof z === 'string' ? [`[keystore] ${z}`] : ['[keystore]', z]), + ...a +]) : () => void 0; const _validateSignature = async (message: string, id: string) => { id = id.toUpperCase(); + debug(`[validateSignature][status=lookup] looking up key by ID ${JSON.stringify(id)}`) const key = keyStore.get(id) ?? keyStore.get(id.replace(/ /g, "")); if (!key) throw new Error("Could not find key from keystore"); + debug(`[validateSignature][status=parse] parsing message`) const signedMessage = await readCleartextMessage({ cleartextMessage: message, }); + debug(`[validateSignature][status=verify] verifying message signature`) const verificationResult = await verify({ message: signedMessage, verificationKeys: key, expectSigned: true, }); + debug(`[validateSignature][success] successfully validated message signature`) return verificationResult.data; } export const validateSignature: typeof _validateSignature = async (message, id) => { + debug(`[validateSignature][globalState] waiting on initKeystore`) await initKeystore; return _validateSignature(message, id) }; @@ -40,22 +48,22 @@ const pushKey = async ({ ids = ids ?? []; if (is_url) { const url = new URL(key, "https://keys.openpgp.org/vks/v1/by-fingerprint/"); - debug('getting key with url', url) + debug('[pushKey][info] Getting key with url\n\n', url) key = await fetch( url, ).then((v) => v.text()).catch(e => { if (fallbackKeys.has(key)) { - debug('failed with error', e, 'but found fallback key') + debug('[pushKey][warn] Failed with error', e, 'but found fallback key') return fallbackKeys.get(key)! } else { - debug('failed to fetch key, cannot find fallback') + debug('[pushKey][error] Failed to fetch key, cannot find fallback') throw e } }); - debug('fetched key', key) + debug('[pushKey][success] Fetched key\n\n', JSON.stringify(key)) } else { - debug('found key', key) + debug('[pushKey][success] Found key\n\n', JSON.stringify(key)) } if (key === null) throw new Error('Key is null.') @@ -64,9 +72,9 @@ const pushKey = async ({ if (typeof key !== 'string') throw new Error(`Expected key with type string, got key of type ${key}`) if (signed_by) { - debug('key must be signed by', signed_by) + debug('[pushKey][validation][info] Key must be signed by', signed_by) key = await _validateSignature(key, signed_by); - debug('validated signature') + debug('[pushKey][success] Validated signature') } const parsedKey = await readKey({ armoredKey: key, @@ -88,9 +96,9 @@ const pushKey = async ({ `Key ${parsedKey.getFingerprint()} is not ${expect_fingerprint}`, ); else if (expect_fingerprint) - debug('fingerprint matches expected fingerprint') + debug('[success] Fingerprint matches expected fingerprint') else - debug('no expected fingerprint passed') + debug('[warn] No expected fingerprint passed') ids.push( parsedKey.getKeyID().toHex().replace(/ /g, ""), parsedKey.getFingerprint().replace(/ /g, ""), @@ -100,7 +108,10 @@ const pushKey = async ({ for (const id of ids) { keyStore.set(id, parsedKey); } - debug('added key', parsedKey, 'with ids', ids, 'to keystore') + debug('[success] Added key\n\n', { + key: parsedKey, + ids, + }) }; export const initKeystore = (async () => { await pushKey({ @@ -158,6 +169,7 @@ ZQ4KTbprMz8J4AD/bG33f9Kqg3AqehEyU2TldJs9U9Oni5AXGSGfKLJhmQc= is_url: true, signed_by: "canary-sigkey-signing", }); + debug('[success] keystore initialization completed') })(); export default keyStore; |