challenger

OAuth 2.0-based authentication service that validates user can receive messages at a certain address
Log | Files | Refs | Submodules | README | LICENSE

commit 05b7ed71025895c1121336daf64eeb65868f4bba
parent 06236f0d6a92fb11191c061277dfb604873a70ff
Author: Florian Dold <florian@dold.me>
Date:   Mon,  6 Jul 2026 18:09:24 +0200

use externally packaged SPA

Diffstat:
M.gitmodules | 4----
Mbootstrap | 1-
Dcontrib/check-prebuilt | 15---------------
Dcontrib/main.css | 1752-------------------------------------------------------------------------------
Mcontrib/meson.build | 3+--
Dcontrib/spa.lock | 2--
Acontrib/spa/index.html | 11+++++++++++
Dcontrib/wallet-core | 1-
Msrc/challenger/challenger-httpd.c | 18++++++++++++++++++
Msrc/challenger/challenger-httpd.h | 7+++++++
Msrc/challenger/challenger-httpd_spa.c | 20++++++++++++++++++--
Msrc/challenger/challenger.conf | 3+++
12 files changed, 58 insertions(+), 1779 deletions(-)

diff --git a/.gitmodules b/.gitmodules @@ -2,7 +2,3 @@ path = doc/prebuilt url = ../taler-docs.git branch = prebuilt -[submodule "contrib/wallet-core"] - path = contrib/wallet-core - url = ../taler-typescript-core.git - branch = prebuilt diff --git a/bootstrap b/bootstrap @@ -19,7 +19,6 @@ if [ -d .git ]; then echo "$0: Updating submodules" echo | git submodule update --init --force fi -./contrib/check-prebuilt # This is more portable than `which' but comes with # the caveat of not(?) properly working on busybox's ash: diff --git a/contrib/check-prebuilt b/contrib/check-prebuilt @@ -1,15 +0,0 @@ -#!/usr/bin/env python3 - -import os -import sys - -contrib = os.path.abspath(os.path.dirname(__file__)) - -spa_ver_lock = open(contrib + "/" + "spa.lock").read().strip() -spa_ver_prebuilt = open(contrib + "/" + "wallet-core/challenger/version.txt").read().strip() - -if spa_ver_lock != spa_ver_prebuilt: - print("SPA version mismatch (contrib/spa.lock)") - print("lockfile has version", spa_ver_lock) - print("prebuilt has version", spa_ver_prebuilt) - sys.exit(1) diff --git a/contrib/main.css b/contrib/main.css @@ -1,1752 +0,0 @@ -/* src/scss/main.css */ -*, -::before, -::after { - box-sizing: border-box; - border-width: 0; - border-style: solid; - border-color: #e5e7eb; -} -::before, -::after { - --tw-content: ""; -} -html { - line-height: 1.5; - -webkit-text-size-adjust: 100%; - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - font-family: - ui-sans-serif, - system-ui, - -apple-system, - BlinkMacSystemFont, - "Segoe UI", - Roboto, - "Helvetica Neue", - Arial, - "Noto Sans", - sans-serif, - "Apple Color Emoji", - "Segoe UI Emoji", - "Segoe UI Symbol", - "Noto Color Emoji"; - font-feature-settings: normal; - font-variation-settings: normal; -} -body { - margin: 0; - line-height: inherit; -} -hr { - height: 0; - color: inherit; - border-top-width: 1px; -} -abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} -a { - color: inherit; - text-decoration: inherit; -} -b, -strong { - font-weight: bolder; -} -code, -kbd, -samp, -pre { - font-family: - ui-monospace, - SFMono-Regular, - Menlo, - Monaco, - Consolas, - "Liberation Mono", - "Courier New", - monospace; - font-size: 1em; -} -small { - font-size: 80%; -} -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} -sub { - bottom: -0.25em; -} -sup { - top: -0.5em; -} -table { - text-indent: 0; - border-color: inherit; - border-collapse: collapse; -} -button, -input, -optgroup, -select, -textarea { - font-family: inherit; - font-size: 100%; - font-weight: inherit; - line-height: inherit; - color: inherit; - margin: 0; - padding: 0; -} -button, -select { - text-transform: none; -} -button, -[type=button], -[type=reset], -[type=submit] { - -webkit-appearance: button; - background-color: transparent; - background-image: none; -} -:-moz-focusring { - outline: auto; -} -:-moz-ui-invalid { - box-shadow: none; -} -progress { - vertical-align: baseline; -} -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} -[type=search] { - -webkit-appearance: textfield; - outline-offset: -2px; -} -::-webkit-search-decoration { - -webkit-appearance: none; -} -::-webkit-file-upload-button { - -webkit-appearance: button; - font: inherit; -} -summary { - display: list-item; -} -blockquote, -dl, -dd, -h1, -h2, -h3, -h4, -h5, -h6, -hr, -figure, -p, -pre { - margin: 0; -} -fieldset { - margin: 0; - padding: 0; -} -legend { - padding: 0; -} -ol, -ul, -menu { - list-style: none; - margin: 0; - padding: 0; -} -textarea { - resize: vertical; -} -input::-moz-placeholder, -textarea::-moz-placeholder { - opacity: 1; - color: #9ca3af; -} -input::placeholder, -textarea::placeholder { - opacity: 1; - color: #9ca3af; -} -button, -[role=button] { - cursor: pointer; -} -:disabled { - cursor: default; -} -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; - vertical-align: middle; -} -img, -video { - max-width: 100%; - height: auto; -} -[hidden] { - display: none; -} -[type=text], -[type=email], -[type=url], -[type=password], -[type=number], -[type=date], -[type=datetime-local], -[type=month], -[type=search], -[type=tel], -[type=time], -[type=week], -[multiple], -textarea, -select { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - background-color: #fff; - border-color: #6b7280; - border-width: 1px; - border-radius: 0px; - padding-top: 0.5rem; - padding-right: 0.75rem; - padding-bottom: 0.5rem; - padding-left: 0.75rem; - font-size: 1rem; - line-height: 1.5rem; - --tw-shadow: 0 0 #0000; -} -[type=text]:focus, -[type=email]:focus, -[type=url]:focus, -[type=password]:focus, -[type=number]:focus, -[type=date]:focus, -[type=datetime-local]:focus, -[type=month]:focus, -[type=search]:focus, -[type=tel]:focus, -[type=time]:focus, -[type=week]:focus, -[multiple]:focus, -textarea:focus, -select:focus { - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-inset: var(--tw-empty, ); - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: #2563eb; - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: - var(--tw-ring-offset-shadow), - var(--tw-ring-shadow), - var(--tw-shadow); - border-color: #2563eb; -} -input::-moz-placeholder, -textarea::-moz-placeholder { - color: #6b7280; - opacity: 1; -} -input::placeholder, -textarea::placeholder { - color: #6b7280; - opacity: 1; -} -::-webkit-datetime-edit-fields-wrapper { - padding: 0; -} -::-webkit-date-and-time-value { - min-height: 1.5em; -} -::-webkit-datetime-edit, -::-webkit-datetime-edit-year-field, -::-webkit-datetime-edit-month-field, -::-webkit-datetime-edit-day-field, -::-webkit-datetime-edit-hour-field, -::-webkit-datetime-edit-minute-field, -::-webkit-datetime-edit-second-field, -::-webkit-datetime-edit-millisecond-field, -::-webkit-datetime-edit-meridiem-field { - padding-top: 0; - padding-bottom: 0; -} -select { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); - background-position: right 0.5rem center; - background-repeat: no-repeat; - background-size: 1.5em 1.5em; - padding-right: 2.5rem; - -webkit-print-color-adjust: exact; - print-color-adjust: exact; -} -[multiple] { - background-image: initial; - background-position: initial; - background-repeat: unset; - background-size: initial; - padding-right: 0.75rem; - -webkit-print-color-adjust: unset; - print-color-adjust: unset; -} -[type=checkbox], -[type=radio] { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - padding: 0; - -webkit-print-color-adjust: exact; - print-color-adjust: exact; - display: inline-block; - vertical-align: middle; - background-origin: border-box; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - flex-shrink: 0; - height: 1rem; - width: 1rem; - color: #2563eb; - background-color: #fff; - border-color: #6b7280; - border-width: 1px; - --tw-shadow: 0 0 #0000; -} -[type=checkbox] { - border-radius: 0px; -} -[type=radio] { - border-radius: 100%; -} -[type=checkbox]:focus, -[type=radio]:focus { - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-inset: var(--tw-empty, ); - --tw-ring-offset-width: 2px; - --tw-ring-offset-color: #fff; - --tw-ring-color: #2563eb; - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: - var(--tw-ring-offset-shadow), - var(--tw-ring-shadow), - var(--tw-shadow); -} -[type=checkbox]:checked, -[type=radio]:checked { - border-color: transparent; - background-color: currentColor; - background-size: 100% 100%; - background-position: center; - background-repeat: no-repeat; -} -[type=checkbox]:checked { - background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); -} -[type=radio]:checked { - background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); -} -[type=checkbox]:checked:hover, -[type=checkbox]:checked:focus, -[type=radio]:checked:hover, -[type=radio]:checked:focus { - border-color: transparent; - background-color: currentColor; -} -[type=checkbox]:indeterminate { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e"); - border-color: transparent; - background-color: currentColor; - background-size: 100% 100%; - background-position: center; - background-repeat: no-repeat; -} -[type=checkbox]:indeterminate:hover, -[type=checkbox]:indeterminate:focus { - border-color: transparent; - background-color: currentColor; -} -[type=file] { - background: unset; - border-color: inherit; - border-width: 0; - border-radius: 0; - padding: 0; - font-size: unset; - line-height: inherit; -} -[type=file]:focus { - outline: 1px solid ButtonText; - outline: 1px auto -webkit-focus-ring-color; -} -*, -::before, -::after { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; -} -::backdrop { - --tw-border-spacing-x: 0; - --tw-border-spacing-y: 0; - --tw-translate-x: 0; - --tw-translate-y: 0; - --tw-rotate: 0; - --tw-skew-x: 0; - --tw-skew-y: 0; - --tw-scale-x: 1; - --tw-scale-y: 1; - --tw-pan-x: ; - --tw-pan-y: ; - --tw-pinch-zoom: ; - --tw-scroll-snap-strictness: proximity; - --tw-gradient-from-position: ; - --tw-gradient-via-position: ; - --tw-gradient-to-position: ; - --tw-ordinal: ; - --tw-slashed-zero: ; - --tw-numeric-figure: ; - --tw-numeric-spacing: ; - --tw-numeric-fraction: ; - --tw-ring-inset: ; - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: rgb(59 130 246 / 0.5); - --tw-ring-offset-shadow: 0 0 #0000; - --tw-ring-shadow: 0 0 #0000; - --tw-shadow: 0 0 #0000; - --tw-shadow-colored: 0 0 #0000; - --tw-blur: ; - --tw-brightness: ; - --tw-contrast: ; - --tw-grayscale: ; - --tw-hue-rotate: ; - --tw-invert: ; - --tw-saturate: ; - --tw-sepia: ; - --tw-drop-shadow: ; - --tw-backdrop-blur: ; - --tw-backdrop-brightness: ; - --tw-backdrop-contrast: ; - --tw-backdrop-grayscale: ; - --tw-backdrop-hue-rotate: ; - --tw-backdrop-invert: ; - --tw-backdrop-opacity: ; - --tw-backdrop-saturate: ; - --tw-backdrop-sepia: ; -} -.\!container { - width: 100% !important; -} -.container { - width: 100%; -} -@media (min-width: 640px) { - .\!container { - max-width: 640px !important; - } - .container { - max-width: 640px; - } -} -@media (min-width: 768px) { - .\!container { - max-width: 768px !important; - } - .container { - max-width: 768px; - } -} -@media (min-width: 1024px) { - .\!container { - max-width: 1024px !important; - } - .container { - max-width: 1024px; - } -} -@media (min-width: 1280px) { - .\!container { - max-width: 1280px !important; - } - .container { - max-width: 1280px; - } -} -@media (min-width: 1536px) { - .\!container { - max-width: 1536px !important; - } - .container { - max-width: 1536px; - } -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; -} -.pointer-events-none { - pointer-events: none; -} -.pointer-events-auto { - pointer-events: auto; -} -.visible { - visibility: visible; -} -.fixed { - position: fixed; -} -.absolute { - position: absolute; -} -.relative { - position: relative; -} -.-inset-0 { - inset: -0px; -} -.-inset-0\.5 { - inset: -0.125rem; -} -.-inset-1 { - inset: -0.25rem; -} -.-inset-2 { - inset: -0.5rem; -} -.-inset-2\.5 { - inset: -0.625rem; -} -.inset-0 { - inset: 0px; -} -.inset-y-0 { - top: 0px; - bottom: 0px; -} -.bottom-0 { - bottom: 0px; -} -.bottom-4 { - bottom: 1rem; -} -.left-0 { - left: 0px; -} -.right-0 { - right: 0px; -} -.top-0 { - top: 0px; -} -.isolate { - isolation: isolate; -} -.z-10 { - z-index: 10; -} -.z-20 { - z-index: 20; -} -.col-span-full { - grid-column: 1 / -1; -} -.mx-8 { - margin-left: 2rem; - margin-right: 2rem; -} -.mx-auto { - margin-left: auto; - margin-right: auto; -} -.my-2 { - margin-top: 0.5rem; - margin-bottom: 0.5rem; -} -.my-4 { - margin-top: 1rem; - margin-bottom: 1rem; -} -.-ml-px { - margin-left: -1px; -} -.-mt-2 { - margin-top: -0.5rem; -} -.-mt-5 { - margin-top: -1.25rem; -} -.mb-4 { - margin-bottom: 1rem; -} -.mb-6 { - margin-bottom: 1.5rem; -} -.ml-3 { - margin-left: 0.75rem; -} -.ml-4 { - margin-left: 1rem; -} -.ml-6 { - margin-left: 1.5rem; -} -.mr-2 { - margin-right: 0.5rem; -} -.mt-0 { - margin-top: 0px; -} -.mt-0\.5 { - margin-top: 0.125rem; -} -.mt-1 { - margin-top: 0.25rem; -} -.mt-10 { - margin-top: 2.5rem; -} -.mt-16 { - margin-top: 4rem; -} -.mt-2 { - margin-top: 0.5rem; -} -.mt-2\.5 { - margin-top: 0.625rem; -} -.mt-3 { - margin-top: 0.75rem; -} -.mt-4 { - margin-top: 1rem; -} -.mt-6 { - margin-top: 1.5rem; -} -.mt-8 { - margin-top: 2rem; -} -.block { - display: block; -} -.flex { - display: flex; -} -.inline-flex { - display: inline-flex; -} -.grid { - display: grid; -} -.contents { - display: contents; -} -.\!hidden { - display: none !important; -} -.hidden { - display: none; -} -.h-10 { - height: 2.5rem; -} -.h-12 { - height: 3rem; -} -.h-16 { - height: 4rem; -} -.h-24 { - height: 6rem; -} -.h-3 { - height: 0.75rem; -} -.h-4 { - height: 1rem; -} -.h-5 { - height: 1.25rem; -} -.h-6 { - height: 1.5rem; -} -.h-7 { - height: 1.75rem; -} -.h-8 { - height: 2rem; -} -.h-full { - height: 100%; -} -.max-h-60 { - max-height: 15rem; -} -.min-h-full { - min-height: 100%; -} -.w-10 { - width: 2.5rem; -} -.w-12 { - width: 3rem; -} -.w-3 { - width: 0.75rem; -} -.w-4 { - width: 1rem; -} -.w-5 { - width: 1.25rem; -} -.w-6 { - width: 1.5rem; -} -.w-8 { - width: 2rem; -} -.w-auto { - width: auto; -} -.w-full { - width: 100%; -} -.w-screen { - width: 100vw; -} -.min-w-0 { - min-width: 0px; -} -.max-w-2xl { - max-width: 42rem; -} -.max-w-7xl { - max-width: 80rem; -} -.max-w-full { - max-width: 100%; -} -.max-w-md { - max-width: 28rem; -} -.max-w-xl { - max-width: 36rem; -} -.flex-1 { - flex: 1 1 0%; -} -.flex-auto { - flex: 1 1 auto; -} -.flex-shrink-0 { - flex-shrink: 0; -} -.shrink-0 { - flex-shrink: 0; -} -.flex-grow { - flex-grow: 1; -} -.rotate-45 { - --tw-rotate: 45deg; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} -.cursor-default { - cursor: default; -} -.cursor-not-allowed { - cursor: not-allowed; -} -.cursor-pointer { - cursor: pointer; -} -.select-none { - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; -} -.grid-cols-1 { - grid-template-columns: repeat(1, minmax(0, 1fr)); -} -.flex-row { - flex-direction: row; -} -.flex-col { - flex-direction: column; -} -.items-start { - align-items: flex-start; -} -.items-center { - align-items: center; -} -.items-stretch { - align-items: stretch; -} -.justify-start { - justify-content: flex-start; -} -.justify-end { - justify-content: flex-end; -} -.justify-center { - justify-content: center; -} -.justify-between { - justify-content: space-between; -} -.gap-x-0 { - -moz-column-gap: 0px; - column-gap: 0px; -} -.gap-x-0\.5 { - -moz-column-gap: 0.125rem; - column-gap: 0.125rem; -} -.gap-x-1 { - -moz-column-gap: 0.25rem; - column-gap: 0.25rem; -} -.gap-x-1\.5 { - -moz-column-gap: 0.375rem; - column-gap: 0.375rem; -} -.gap-x-3 { - -moz-column-gap: 0.75rem; - column-gap: 0.75rem; -} -.gap-x-6 { - -moz-column-gap: 1.5rem; - column-gap: 1.5rem; -} -.gap-x-8 { - -moz-column-gap: 2rem; - column-gap: 2rem; -} -.gap-y-2 { - row-gap: 0.5rem; -} -.gap-y-6 { - row-gap: 1.5rem; -} -.gap-y-7 { - row-gap: 1.75rem; -} -.gap-y-8 { - row-gap: 2rem; -} -.-space-y-px > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(-1px * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(-1px * var(--tw-space-y-reverse)); -} -.space-x-4 > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(1rem * var(--tw-space-x-reverse)); - margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); -} -.space-y-1 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); -} -.space-y-10 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(2.5rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(2.5rem * var(--tw-space-y-reverse)); -} -.space-y-4 > :not([hidden]) ~ :not([hidden]) { - --tw-space-y-reverse: 0; - margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); - margin-bottom: calc(1rem * var(--tw-space-y-reverse)); -} -.divide-y > :not([hidden]) ~ :not([hidden]) { - --tw-divide-y-reverse: 0; - border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); - border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); -} -.divide-gray-900\/10 > :not([hidden]) ~ :not([hidden]) { - border-color: rgb(17 24 39 / 0.1); -} -.overflow-auto { - overflow: auto; -} -.overflow-hidden { - overflow: hidden; -} -.overflow-y-scroll { - overflow-y: scroll; -} -.truncate { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.whitespace-break-spaces { - white-space: break-spaces; -} -.rounded { - border-radius: 0.25rem; -} -.rounded-full { - border-radius: 9999px; -} -.rounded-lg { - border-radius: 0.5rem; -} -.rounded-md { - border-radius: 0.375rem; -} -.rounded-none { - border-radius: 0px; -} -.rounded-sm { - border-radius: 0.125rem; -} -.rounded-l-md { - border-top-left-radius: 0.375rem; - border-bottom-left-radius: 0.375rem; -} -.rounded-r-md { - border-top-right-radius: 0.375rem; - border-bottom-right-radius: 0.375rem; -} -.rounded-bl-md { - border-bottom-left-radius: 0.375rem; -} -.rounded-br-md { - border-bottom-right-radius: 0.375rem; -} -.rounded-tl-md { - border-top-left-radius: 0.375rem; -} -.rounded-tr-md { - border-top-right-radius: 0.375rem; -} -.border { - border-width: 1px; -} -.border-0 { - border-width: 0px; -} -.border-2 { - border-width: 2px; -} -.border-b { - border-bottom-width: 1px; -} -.border-l-0 { - border-left-width: 0px; -} -.border-r-0 { - border-right-width: 0px; -} -.border-r-2 { - border-right-width: 2px; -} -.border-dashed { - border-style: dashed; -} -.border-gray-200 { - --tw-border-opacity: 1; - border-color: rgb(229 231 235 / var(--tw-border-opacity)); -} -.border-gray-300 { - --tw-border-opacity: 1; - border-color: rgb(209 213 219 / var(--tw-border-opacity)); -} -.border-gray-900\/25 { - border-color: rgb(17 24 39 / 0.25); -} -.border-indigo-200 { - --tw-border-opacity: 1; - border-color: rgb(199 210 254 / var(--tw-border-opacity)); -} -.border-indigo-400 { - --tw-border-opacity: 1; - border-color: rgb(129 140 248 / var(--tw-border-opacity)); -} -.border-indigo-600 { - --tw-border-opacity: 1; - border-color: rgb(79 70 229 / var(--tw-border-opacity)); -} -.border-transparent { - border-color: transparent; -} -.border-opacity-25 { - --tw-border-opacity: 0.25; -} -.bg-black { - --tw-bg-opacity: 1; - background-color: rgb(0 0 0 / var(--tw-bg-opacity)); -} -.bg-gray-100 { - --tw-bg-opacity: 1; - background-color: rgb(243 244 246 / var(--tw-bg-opacity)); -} -.bg-gray-50 { - --tw-bg-opacity: 1; - background-color: rgb(249 250 251 / var(--tw-bg-opacity)); -} -.bg-indigo-50 { - --tw-bg-opacity: 1; - background-color: rgb(238 242 255 / var(--tw-bg-opacity)); -} -.bg-indigo-600 { - --tw-bg-opacity: 1; - background-color: rgb(79 70 229 / var(--tw-bg-opacity)); -} -.bg-indigo-700 { - --tw-bg-opacity: 1; - background-color: rgb(67 56 202 / var(--tw-bg-opacity)); -} -.bg-red-50 { - --tw-bg-opacity: 1; - background-color: rgb(254 242 242 / var(--tw-bg-opacity)); -} -.bg-red-600 { - --tw-bg-opacity: 1; - background-color: rgb(220 38 38 / var(--tw-bg-opacity)); -} -.bg-slate-200 { - --tw-bg-opacity: 1; - background-color: rgb(226 232 240 / var(--tw-bg-opacity)); -} -.bg-transparent { - background-color: transparent; -} -.bg-white { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); -} -.stroke-gray-700\/50 { - stroke: rgb(55 65 81 / 0.5); -} -.object-cover { - -o-object-fit: cover; - object-fit: cover; -} -.p-1 { - padding: 0.25rem; -} -.p-2 { - padding: 0.5rem; -} -.p-3 { - padding: 0.75rem; -} -.p-4 { - padding: 1rem; -} -.px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} -.px-3 { - padding-left: 0.75rem; - padding-right: 0.75rem; -} -.px-3\.5 { - padding-left: 0.875rem; - padding-right: 0.875rem; -} -.px-4 { - padding-left: 1rem; - padding-right: 1rem; -} -.px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; -} -.py-1 { - padding-top: 0.25rem; - padding-bottom: 0.25rem; -} -.py-1\.5 { - padding-top: 0.375rem; - padding-bottom: 0.375rem; -} -.py-12 { - padding-top: 3rem; - padding-bottom: 3rem; -} -.py-2 { - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} -.py-2\.5 { - padding-top: 0.625rem; - padding-bottom: 0.625rem; -} -.py-4 { - padding-top: 1rem; - padding-bottom: 1rem; -} -.py-6 { - padding-top: 1.5rem; - padding-bottom: 1.5rem; -} -.pb-4 { - padding-bottom: 1rem; -} -.pl-1 { - padding-left: 0.25rem; -} -.pl-10 { - padding-left: 2.5rem; -} -.pl-2 { - padding-left: 0.5rem; -} -.pl-3 { - padding-left: 0.75rem; -} -.pr-10 { - padding-right: 2.5rem; -} -.pr-12 { - padding-right: 3rem; -} -.pr-2 { - padding-right: 0.5rem; -} -.pr-3 { - padding-right: 0.75rem; -} -.pr-4 { - padding-right: 1rem; -} -.pr-9 { - padding-right: 2.25rem; -} -.pt-2 { - padding-top: 0.5rem; -} -.pt-3 { - padding-top: 0.75rem; -} -.pt-4 { - padding-top: 1rem; -} -.pt-5 { - padding-top: 1.25rem; -} -.text-left { - text-align: left; -} -.text-center { - text-align: center; -} -.text-3xl { - font-size: 1.875rem; - line-height: 2.25rem; -} -.text-\[0\.625rem\] { - font-size: 0.625rem; -} -.text-base { - font-size: 1rem; - line-height: 1.5rem; -} -.text-lg { - font-size: 1.125rem; - line-height: 1.75rem; -} -.text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} -.text-xl { - font-size: 1.25rem; - line-height: 1.75rem; -} -.text-xs { - font-size: 0.75rem; - line-height: 1rem; -} -.font-bold { - font-weight: 700; -} -.font-medium { - font-weight: 500; -} -.font-normal { - font-weight: 400; -} -.font-semibold { - font-weight: 600; -} -.leading-5 { - line-height: 1.25rem; -} -.leading-6 { - line-height: 1.5rem; -} -.leading-7 { - line-height: 1.75rem; -} -.leading-8 { - line-height: 2rem; -} -.leading-none { - line-height: 1; -} -.tracking-tight { - letter-spacing: -0.025em; -} -.text-gray-300 { - --tw-text-opacity: 1; - color: rgb(209 213 219 / var(--tw-text-opacity)); -} -.text-gray-400 { - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity)); -} -.text-gray-500 { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); -} -.text-gray-600 { - --tw-text-opacity: 1; - color: rgb(75 85 99 / var(--tw-text-opacity)); -} -.text-gray-700 { - --tw-text-opacity: 1; - color: rgb(55 65 81 / var(--tw-text-opacity)); -} -.text-gray-900 { - --tw-text-opacity: 1; - color: rgb(17 24 39 / var(--tw-text-opacity)); -} -.text-indigo-200 { - --tw-text-opacity: 1; - color: rgb(199 210 254 / var(--tw-text-opacity)); -} -.text-indigo-600 { - --tw-text-opacity: 1; - color: rgb(79 70 229 / var(--tw-text-opacity)); -} -.text-indigo-700 { - --tw-text-opacity: 1; - color: rgb(67 56 202 / var(--tw-text-opacity)); -} -.text-red-400 { - --tw-text-opacity: 1; - color: rgb(248 113 113 / var(--tw-text-opacity)); -} -.text-red-600 { - --tw-text-opacity: 1; - color: rgb(220 38 38 / var(--tw-text-opacity)); -} -.text-red-700 { - --tw-text-opacity: 1; - color: rgb(185 28 28 / var(--tw-text-opacity)); -} -.text-red-800 { - --tw-text-opacity: 1; - color: rgb(153 27 27 / var(--tw-text-opacity)); -} -.text-red-900 { - --tw-text-opacity: 1; - color: rgb(127 29 29 / var(--tw-text-opacity)); -} -.text-white { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} -.opacity-0 { - opacity: 0; -} -.shadow { - --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); - box-shadow: - var(--tw-ring-offset-shadow, 0 0 #0000), - var(--tw-ring-shadow, 0 0 #0000), - var(--tw-shadow); -} -.shadow-lg { - --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); - box-shadow: - var(--tw-ring-offset-shadow, 0 0 #0000), - var(--tw-ring-shadow, 0 0 #0000), - var(--tw-shadow); -} -.shadow-sm { - --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); - --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); - box-shadow: - var(--tw-ring-offset-shadow, 0 0 #0000), - var(--tw-ring-shadow, 0 0 #0000), - var(--tw-shadow); -} -.shadow-xl { - --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); - box-shadow: - var(--tw-ring-offset-shadow, 0 0 #0000), - var(--tw-ring-shadow, 0 0 #0000), - var(--tw-shadow); -} -.ring-1 { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: - var(--tw-ring-offset-shadow), - var(--tw-ring-shadow), - var(--tw-shadow, 0 0 #0000); -} -.ring-2 { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: - var(--tw-ring-offset-shadow), - var(--tw-ring-shadow), - var(--tw-shadow, 0 0 #0000); -} -.ring-inset { - --tw-ring-inset: inset; -} -.ring-black { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity)); -} -.ring-gray-200 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity)); -} -.ring-gray-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); -} -.ring-gray-900\/5 { - --tw-ring-color: rgb(17 24 39 / 0.05); -} -.ring-indigo-600 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(79 70 229 / var(--tw-ring-opacity)); -} -.ring-red-300 { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(252 165 165 / var(--tw-ring-opacity)); -} -.ring-opacity-5 { - --tw-ring-opacity: 0.05; -} -.filter { - filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); -} -.duration-300 { - transition-duration: 300ms; -} -.placeholder\:text-gray-400::-moz-placeholder { - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity)); -} -.placeholder\:text-gray-400::placeholder { - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity)); -} -.placeholder\:text-red-300::-moz-placeholder { - --tw-text-opacity: 1; - color: rgb(252 165 165 / var(--tw-text-opacity)); -} -.placeholder\:text-red-300::placeholder { - --tw-text-opacity: 1; - color: rgb(252 165 165 / var(--tw-text-opacity)); -} -.focus-within\:z-10:focus-within { - z-index: 10; -} -.focus-within\:outline-none:focus-within { - outline: 2px solid transparent; - outline-offset: 2px; -} -.focus-within\:ring-2:focus-within { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: - var(--tw-ring-offset-shadow), - var(--tw-ring-shadow), - var(--tw-shadow, 0 0 #0000); -} -.focus-within\:ring-inset:focus-within { - --tw-ring-inset: inset; -} -.focus-within\:ring-indigo-600:focus-within { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(79 70 229 / var(--tw-ring-opacity)); -} -.focus-within\:ring-offset-2:focus-within { - --tw-ring-offset-width: 2px; -} -.hover\:bg-gray-100:hover { - --tw-bg-opacity: 1; - background-color: rgb(243 244 246 / var(--tw-bg-opacity)); -} -.hover\:bg-gray-50:hover { - --tw-bg-opacity: 1; - background-color: rgb(249 250 251 / var(--tw-bg-opacity)); -} -.hover\:bg-gray-500\/20:hover { - background-color: rgb(107 114 128 / 0.2); -} -.hover\:bg-indigo-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(99 102 241 / var(--tw-bg-opacity)); -} -.hover\:bg-indigo-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(79 70 229 / var(--tw-bg-opacity)); -} -.hover\:bg-red-500:hover { - --tw-bg-opacity: 1; - background-color: rgb(239 68 68 / var(--tw-bg-opacity)); -} -.hover\:bg-opacity-75:hover { - --tw-bg-opacity: 0.75; -} -.hover\:text-gray-400:hover { - --tw-text-opacity: 1; - color: rgb(156 163 175 / var(--tw-text-opacity)); -} -.hover\:text-gray-500:hover { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); -} -.hover\:text-indigo-500:hover { - --tw-text-opacity: 1; - color: rgb(99 102 241 / var(--tw-text-opacity)); -} -.hover\:text-indigo-600:hover { - --tw-text-opacity: 1; - color: rgb(79 70 229 / var(--tw-text-opacity)); -} -.hover\:text-white:hover { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} -.hover\:opacity-70:hover { - opacity: 0.7; -} -.hover\:ring-indigo-500:hover { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity)); -} -.focus\:z-10:focus { - z-index: 10; -} -.focus\:outline-none:focus { - outline: 2px solid transparent; - outline-offset: 2px; -} -.focus\:ring-0:focus { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: - var(--tw-ring-offset-shadow), - var(--tw-ring-shadow), - var(--tw-shadow, 0 0 #0000); -} -.focus\:ring-2:focus { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: - var(--tw-ring-offset-shadow), - var(--tw-ring-shadow), - var(--tw-shadow, 0 0 #0000); -} -.focus\:ring-inset:focus { - --tw-ring-inset: inset; -} -.focus\:ring-indigo-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity)); -} -.focus\:ring-indigo-600:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(79 70 229 / var(--tw-ring-opacity)); -} -.focus\:ring-red-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity)); -} -.focus\:ring-white:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity)); -} -.focus\:ring-offset-2:focus { - --tw-ring-offset-width: 2px; -} -.focus\:ring-offset-indigo-600:focus { - --tw-ring-offset-color: #4f46e5; -} -.focus-visible\:outline:focus-visible { - outline-style: solid; -} -.focus-visible\:outline-2:focus-visible { - outline-width: 2px; -} -.focus-visible\:outline-offset-2:focus-visible { - outline-offset: 2px; -} -.focus-visible\:outline-indigo-600:focus-visible { - outline-color: #4f46e5; -} -.disabled\:cursor-not-allowed:disabled { - cursor: not-allowed; -} -.disabled\:bg-gray-50:disabled { - --tw-bg-opacity: 1; - background-color: rgb(249 250 251 / var(--tw-bg-opacity)); -} -.disabled\:text-gray-500:disabled { - --tw-text-opacity: 1; - color: rgb(107 114 128 / var(--tw-text-opacity)); -} -.disabled\:ring-gray-200:disabled { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(229 231 235 / var(--tw-ring-opacity)); -} -.group:hover .group-hover\:flex { - display: flex; -} -.group:hover .group-hover\:border-indigo-600 { - --tw-border-opacity: 1; - border-color: rgb(79 70 229 / var(--tw-border-opacity)); -} -.group:hover .group-hover\:stroke-gray-700\/75 { - stroke: rgb(55 65 81 / 0.75); -} -.group:hover .group-hover\:text-indigo-600 { - --tw-text-opacity: 1; - color: rgb(79 70 229 / var(--tw-text-opacity)); -} -.group:hover .group-hover\:text-white { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} -.group.attention-danger .group-\[\.attention-danger\]\:bg-red-50 { - --tw-bg-opacity: 1; - background-color: rgb(254 242 242 / var(--tw-bg-opacity)); -} -.group.attention-info .group-\[\.attention-info\]\:bg-blue-50 { - --tw-bg-opacity: 1; - background-color: rgb(239 246 255 / var(--tw-bg-opacity)); -} -.group.attention-success .group-\[\.attention-success\]\:bg-green-50 { - --tw-bg-opacity: 1; - background-color: rgb(240 253 244 / var(--tw-bg-opacity)); -} -.group.attention-warning .group-\[\.attention-warning\]\:bg-yellow-50 { - --tw-bg-opacity: 1; - background-color: rgb(254 252 232 / var(--tw-bg-opacity)); -} -.group.attention-danger .group-\[\.attention-danger\]\:text-red-400 { - --tw-text-opacity: 1; - color: rgb(248 113 113 / var(--tw-text-opacity)); -} -.group.attention-danger .group-\[\.attention-danger\]\:text-red-700 { - --tw-text-opacity: 1; - color: rgb(185 28 28 / var(--tw-text-opacity)); -} -.group.attention-danger .group-\[\.attention-danger\]\:text-red-800 { - --tw-text-opacity: 1; - color: rgb(153 27 27 / var(--tw-text-opacity)); -} -.group.attention-info .group-\[\.attention-info\]\:text-blue-400 { - --tw-text-opacity: 1; - color: rgb(96 165 250 / var(--tw-text-opacity)); -} -.group.attention-info .group-\[\.attention-info\]\:text-blue-700 { - --tw-text-opacity: 1; - color: rgb(29 78 216 / var(--tw-text-opacity)); -} -.group.attention-info .group-\[\.attention-info\]\:text-blue-800 { - --tw-text-opacity: 1; - color: rgb(30 64 175 / var(--tw-text-opacity)); -} -.group.attention-success .group-\[\.attention-success\]\:text-green-400 { - --tw-text-opacity: 1; - color: rgb(74 222 128 / var(--tw-text-opacity)); -} -.group.attention-success .group-\[\.attention-success\]\:text-green-700 { - --tw-text-opacity: 1; - color: rgb(21 128 61 / var(--tw-text-opacity)); -} -.group.attention-success .group-\[\.attention-success\]\:text-green-800 { - --tw-text-opacity: 1; - color: rgb(22 101 52 / var(--tw-text-opacity)); -} -.group.attention-warning .group-\[\.attention-warning\]\:text-yellow-400 { - --tw-text-opacity: 1; - color: rgb(250 204 21 / var(--tw-text-opacity)); -} -.group.attention-warning .group-\[\.attention-warning\]\:text-yellow-700 { - --tw-text-opacity: 1; - color: rgb(161 98 7 / var(--tw-text-opacity)); -} -.group.attention-warning .group-\[\.attention-warning\]\:text-yellow-800 { - --tw-text-opacity: 1; - color: rgb(133 77 14 / var(--tw-text-opacity)); -} -@media (min-width: 640px) { - .sm\:col-span-2 { - grid-column: span 2 / span 2; - } - .sm\:col-span-6 { - grid-column: span 6 / span 6; - } - .sm\:mt-20 { - margin-top: 5rem; - } - .sm\:inline { - display: inline; - } - .sm\:flex { - display: flex; - } - .sm\:hidden { - display: none; - } - .sm\:grid-cols-6 { - grid-template-columns: repeat(6, minmax(0, 1fr)); - } - .sm\:justify-between { - justify-content: space-between; - } - .sm\:px-0 { - padding-left: 0px; - padding-right: 0px; - } - .sm\:px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; - } - .sm\:text-4xl { - font-size: 2.25rem; - line-height: 2.5rem; - } - .sm\:text-sm { - font-size: 0.875rem; - line-height: 1.25rem; - } - .sm\:leading-6 { - line-height: 1.5rem; - } -} -@media (min-width: 768px) { - .md\:order-1 { - order: 1; - } - .md\:col-span-2 { - grid-column: span 2 / span 2; - } - .md\:mt-0 { - margin-top: 0px; - } - .md\:grid-cols-3 { - grid-template-columns: repeat(3, minmax(0, 1fr)); - } -} -@media (min-width: 1024px) { - .lg\:px-8 { - padding-left: 2rem; - padding-right: 2rem; - } -} -/*# sourceMappingURL=main.css.map */ diff --git a/contrib/meson.build b/contrib/meson.build @@ -8,9 +8,8 @@ configure_file( install_dir: get_option('bindir'), ) - install_subdir( - 'wallet-core' / 'challenger', + 'spa', strip_directory: true, install_dir: get_option('datadir') / 'challenger' / 'spa', ) diff --git a/contrib/spa.lock b/contrib/spa.lock @@ -1 +0,0 @@ -1.5.14 -\ No newline at end of file diff --git a/contrib/spa/index.html b/contrib/spa/index.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<html> +<body> + <h1>Taler Merchant Web UI not installed</h1> + <p>This is a fallback page shown when the Taler Merchant Web UI is not + available.</p> + <p>Please make sure the page is installed and the + <code>BACKOFFICE_SPA_DIR</code> option in the <code>[merchant]</code> section of + the taler-merchant configuration is set correctly.</p> +</body> +</html> diff --git a/contrib/wallet-core b/contrib/wallet-core @@ -1 +0,0 @@ -Subproject commit 45c7768f9153846198dac99b6a9015477b9d7d2a diff --git a/src/challenger/challenger-httpd.c b/src/challenger/challenger-httpd.c @@ -87,6 +87,8 @@ char *CH_address_hint; char *CH_auth_command; +char *CH_spa_dir; + /** * Function called first by MHD with the full URL. @@ -743,6 +745,22 @@ run (void *cls, } } + if (GNUNET_OK == + GNUNET_CONFIGURATION_get_value_filename (config, + "challenger", + "SPA_DIR", + &CH_spa_dir)) + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Loading challenger SPA from %s\n", + CH_spa_dir); + } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Loading challenger SPA from default location\n"); + } + global_ret = EXIT_NOTCONFIGURED; GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL); diff --git a/src/challenger/challenger-httpd.h b/src/challenger/challenger-httpd.h @@ -189,6 +189,13 @@ extern struct GNUNET_TIME_Relative CH_token_expiration; extern struct GNUNET_TIME_Relative CH_pin_retransmission_frequency; /** + * Absolute directory path of the (externally packaged) challenger SPA. + * + * Can be NULL. + */ +extern char *CH_spa_dir; + +/** * JSON object with key-object pairs mapping address keys (from the * form) to an object with a field "regex" containing a regular * expressions expressing restrictions on values for the address and a diff --git a/src/challenger/challenger-httpd_spa.c b/src/challenger/challenger-httpd_spa.c @@ -53,8 +53,24 @@ CH_handler_spa (struct CH_HandlerContext *hc, enum GNUNET_GenericReturnValue CH_spa_init () { - spa = TALER_MHD_spa_load (CHALLENGER_project_data (), - "spa/"); + bool have_spa = false; + if (NULL != CH_spa_dir) + { + struct stat sb; + have_spa = stat (CH_spa_dir, &sb) == 0 && S_ISDIR (sb.st_mode); + if (! have_spa) + { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + "SPA not found at '%s', using fallback\n", + CH_spa_dir); + } + } + if (! have_spa) + spa = TALER_MHD_spa_load (CHALLENGER_project_data (), + "spa/"); + else + spa = TALER_MHD_spa_load_dir (CH_spa_dir); + if (NULL == spa) { GNUNET_break (0); diff --git a/src/challenger/challenger.conf b/src/challenger/challenger.conf @@ -49,3 +49,6 @@ AUTH_COMMAND = /usr/bin/true # # ADDRESS_TYPE = ADDRESS_TYPE = postal + +# Where is the webui installed? +SPA_DIR = $PREFIX/share/challenger-webui/