Add new Anubis mascot (#204)
* Add new Anubis mascot Signed-off-by: Xe Iaso <me@xeiaso.net> * web: add artist credit to footer Signed-off-by: Xe Iaso <me@xeiaso.net> --------- Signed-off-by: Xe Iaso <me@xeiaso.net>
@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
- The placeholder Anubis mascot has been replaced with a design by [CELPHASE](https://bsky.app/profile/celphase.bsky.social).
|
||||||
- Allow iMessage's link preview fetcher through Anubis by default.
|
- Allow iMessage's link preview fetcher through Anubis by default.
|
||||||
- Added a periodic cleanup routine for the decaymap that removes expired entries, ensuring stale data is properly pruned.
|
- Added a periodic cleanup routine for the decaymap that removes expired entries, ensuring stale data is properly pruned.
|
||||||
- Added a no-store Cache-Control header to the challenge page
|
- Added a no-store Cache-Control header to the challenge page
|
||||||
|
@ -76,7 +76,7 @@ const config: Config = {
|
|||||||
title: 'Anubis',
|
title: 'Anubis',
|
||||||
logo: {
|
logo: {
|
||||||
alt: 'A happy jackal woman with brown hair and red eyes',
|
alt: 'A happy jackal woman with brown hair and red eyes',
|
||||||
src: 'img/happy.webp',
|
src: 'img/favicon.webp',
|
||||||
},
|
},
|
||||||
items: [
|
items: [
|
||||||
{
|
{
|
||||||
|
BIN
docs/static/img/android-chrome-512x512.png
vendored
Before Width: | Height: | Size: 222 KiB After Width: | Height: | Size: 106 KiB |
BIN
docs/static/img/favicon.ico
vendored
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
BIN
docs/static/img/favicon.webp
vendored
Normal file
After Width: | Height: | Size: 5.9 KiB |
BIN
docs/static/img/happy.webp
vendored
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 30 KiB |
@ -66,6 +66,7 @@ templ base(title string, body templ.Component) {
|
|||||||
href="https://techaro.lol"
|
href="https://techaro.lol"
|
||||||
>Techaro</a>. Made with ❤️ in 🇨🇦.
|
>Techaro</a>. Made with ❤️ in 🇨🇦.
|
||||||
</p>
|
</p>
|
||||||
|
<p>Mascot design by <a href="https://bsky.app/profile/celphase.bsky.social">CELPHASE</a>.</p>
|
||||||
</center>
|
</center>
|
||||||
</footer>
|
</footer>
|
||||||
</main>
|
</main>
|
||||||
@ -114,7 +115,7 @@ templ errorPage(message string) {
|
|||||||
<img
|
<img
|
||||||
id="image"
|
id="image"
|
||||||
style="width:100%;max-width:256px;"
|
style="width:100%;max-width:256px;"
|
||||||
src={ "/.within.website/x/cmd/anubis/static/img/sad.webp?cacheBuster=" + anubis.Version }
|
src={ "/.within.website/x/cmd/anubis/static/img/reject.webp?cacheBuster=" + anubis.Version }
|
||||||
/>
|
/>
|
||||||
<p>{ message }.</p>
|
<p>{ message }.</p>
|
||||||
<button onClick="window.location.reload();">Try again</button>
|
<button onClick="window.location.reload();">Try again</button>
|
||||||
@ -137,8 +138,7 @@ templ bench() {
|
|||||||
<th style="width:4rem">Iters B</th>
|
<th style="width:4rem">Iters B</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody id="results" style="padding-top:0.25rem;display:grid;grid-template-columns:subgrid;grid-auto-rows:min-content;grid-column:1/-1;row-gap:0.25rem;overflow-y:auto;font-variant-numeric:tabular-nums">
|
<tbody id="results" style="padding-top:0.25rem;display:grid;grid-template-columns:subgrid;grid-auto-rows:min-content;grid-column:1/-1;row-gap:0.25rem;overflow-y:auto;font-variant-numeric:tabular-nums"></tbody>
|
||||||
</tbody>
|
|
||||||
</table>
|
</table>
|
||||||
<div class="centered-div">
|
<div class="centered-div">
|
||||||
<img
|
<img
|
||||||
|
14
web/index_templ.go
generated
@ -89,7 +89,7 @@ func base(title string, body templ.Component) templ.Component {
|
|||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "<footer><center><p>Protected by <a href=\"https://github.com/TecharoHQ/anubis\">Anubis</a> from <a href=\"https://techaro.lol\">Techaro</a>. Made with ❤️ in 🇨🇦.</p></center></footer></main></body></html>")
|
templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 6, "<footer><center><p>Protected by <a href=\"https://github.com/TecharoHQ/anubis\">Anubis</a> from <a href=\"https://techaro.lol\">Techaro</a>. Made with ❤️ in 🇨🇦.</p><p>Mascot design by <a href=\"https://bsky.app/profile/celphase.bsky.social\">CELPHASE</a>.</p></center></footer></main></body></html>")
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
@ -126,7 +126,7 @@ func index() templ.Component {
|
|||||||
templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs("/.within.website/x/cmd/anubis/static/img/pensive.webp?cacheBuster=" +
|
templ_7745c5c3_Var6, templ_7745c5c3_Err = templ.JoinStringErrs("/.within.website/x/cmd/anubis/static/img/pensive.webp?cacheBuster=" +
|
||||||
anubis.Version)
|
anubis.Version)
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `index.templ`, Line: 82, Col: 18}
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `index.templ`, Line: 83, Col: 18}
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var6))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
@ -140,7 +140,7 @@ func index() templ.Component {
|
|||||||
templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs("/.within.website/x/cmd/anubis/static/img/happy.webp?cacheBuster=" +
|
templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs("/.within.website/x/cmd/anubis/static/img/happy.webp?cacheBuster=" +
|
||||||
anubis.Version)
|
anubis.Version)
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `index.templ`, Line: 88, Col: 18}
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `index.templ`, Line: 89, Col: 18}
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
@ -153,7 +153,7 @@ func index() templ.Component {
|
|||||||
var templ_7745c5c3_Var8 string
|
var templ_7745c5c3_Var8 string
|
||||||
templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs("/.within.website/x/cmd/anubis/static/js/main.mjs?cacheBuster=" + anubis.Version)
|
templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs("/.within.website/x/cmd/anubis/static/js/main.mjs?cacheBuster=" + anubis.Version)
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `index.templ`, Line: 91, Col: 116}
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `index.templ`, Line: 92, Col: 116}
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
@ -193,9 +193,9 @@ func errorPage(message string) templ.Component {
|
|||||||
return templ_7745c5c3_Err
|
return templ_7745c5c3_Err
|
||||||
}
|
}
|
||||||
var templ_7745c5c3_Var10 string
|
var templ_7745c5c3_Var10 string
|
||||||
templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs("/.within.website/x/cmd/anubis/static/img/sad.webp?cacheBuster=" + anubis.Version)
|
templ_7745c5c3_Var10, templ_7745c5c3_Err = templ.JoinStringErrs("/.within.website/x/cmd/anubis/static/img/reject.webp?cacheBuster=" + anubis.Version)
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `index.templ`, Line: 117, Col: 90}
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `index.templ`, Line: 118, Col: 93}
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var10))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
@ -208,7 +208,7 @@ func errorPage(message string) templ.Component {
|
|||||||
var templ_7745c5c3_Var11 string
|
var templ_7745c5c3_Var11 string
|
||||||
templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(message)
|
templ_7745c5c3_Var11, templ_7745c5c3_Err = templ.JoinStringErrs(message)
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
return templ.Error{Err: templ_7745c5c3_Err, FileName: `index.templ`, Line: 119, Col: 14}
|
return templ.Error{Err: templ_7745c5c3_Err, FileName: `index.templ`, Line: 120, Col: 14}
|
||||||
}
|
}
|
||||||
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
|
_, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var11))
|
||||||
if templ_7745c5c3_Err != nil {
|
if templ_7745c5c3_Err != nil {
|
||||||
|
@ -103,7 +103,7 @@ function showContinueBar(hash, nonce, t0, t1) {
|
|||||||
ohNoes({
|
ohNoes({
|
||||||
titleMsg: "Your context is not secure!",
|
titleMsg: "Your context is not secure!",
|
||||||
statusMsg: `Try connecting over HTTPS or let the admin know to set up HTTPS. For more information, see <a href="https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts#when_is_a_context_considered_secure">MDN</a>.`,
|
statusMsg: `Try connecting over HTTPS or let the admin know to set up HTTPS. For more information, see <a href="https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts#when_is_a_context_considered_secure">MDN</a>.`,
|
||||||
imageSrc: imageURL("sad", anubisVersion),
|
imageSrc: imageURL("reject", anubisVersion),
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -116,7 +116,7 @@ function showContinueBar(hash, nonce, t0, t1) {
|
|||||||
// if (!videoWorks) {
|
// if (!videoWorks) {
|
||||||
// title.innerHTML = "Oh no!";
|
// title.innerHTML = "Oh no!";
|
||||||
// status.innerHTML = "Checks failed. Please check your browser's settings and try again.";
|
// status.innerHTML = "Checks failed. Please check your browser's settings and try again.";
|
||||||
// image.src = imageURL("sad");
|
// image.src = imageURL("reject");
|
||||||
// progress.style.display = "none";
|
// progress.style.display = "none";
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
@ -128,7 +128,7 @@ function showContinueBar(hash, nonce, t0, t1) {
|
|||||||
ohNoes({
|
ohNoes({
|
||||||
titleMsg: `Missing feature ${name}`,
|
titleMsg: `Missing feature ${name}`,
|
||||||
statusMsg: msg,
|
statusMsg: msg,
|
||||||
imageSrc: imageURL("sad", anubisVersion),
|
imageSrc: imageURL("reject", anubisVersion),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -142,7 +142,7 @@ function showContinueBar(hash, nonce, t0, t1) {
|
|||||||
ohNoes({
|
ohNoes({
|
||||||
titleMsg: "Internal error!",
|
titleMsg: "Internal error!",
|
||||||
statusMsg: `Failed to fetch challenge config: ${err.message}`,
|
statusMsg: `Failed to fetch challenge config: ${err.message}`,
|
||||||
imageSrc: imageURL("sad", anubisVersion),
|
imageSrc: imageURL("reject", anubisVersion),
|
||||||
});
|
});
|
||||||
throw err;
|
throw err;
|
||||||
});
|
});
|
||||||
@ -152,7 +152,7 @@ function showContinueBar(hash, nonce, t0, t1) {
|
|||||||
ohNoes({
|
ohNoes({
|
||||||
titleMsg: "Challenge error!",
|
titleMsg: "Challenge error!",
|
||||||
statusMsg: `Failed to resolve check algorithm. You may want to reload the page.`,
|
statusMsg: `Failed to resolve check algorithm. You may want to reload the page.`,
|
||||||
imageSrc: imageURL("sad", anubisVersion),
|
imageSrc: imageURL("reject", anubisVersion),
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -265,7 +265,7 @@ function showContinueBar(hash, nonce, t0, t1) {
|
|||||||
ohNoes({
|
ohNoes({
|
||||||
titleMsg: "Calculation error!",
|
titleMsg: "Calculation error!",
|
||||||
statusMsg: `Failed to calculate challenge: ${err.message}`,
|
statusMsg: `Failed to calculate challenge: ${err.message}`,
|
||||||
imageSrc: imageURL("sad", anubisVersion),
|
imageSrc: imageURL("reject", anubisVersion),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
})();
|
})();
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 28 KiB |
BIN
web/static/img/reject.webp
Normal file
After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 50 KiB |