From 9baf999e82ef44369f6b8658c2ac80e52360fdfc Mon Sep 17 00:00:00 2001 From: Tomasz Kapias Date: Thu, 27 Apr 2023 23:27:02 +0700 Subject: [PATCH] v1 --- README.md | 141 +++++ assets/root/favicon.ico | Bin 0 -> 15086 bytes assets/root/favicon.svg | 83 +++ assets/root/icon-192.png | Bin 0 -> 4103 bytes assets/root/icon-512.png | Bin 0 -> 7412 bytes assets/root/logo.svg | 83 +++ assets/root/manifest.webmanifest | 6 + assets/root/robots.txt | 2 + assets/screenshots/startpage.png | Bin 0 -> 36809 bytes assets/screenshots/staticrypt.png | Bin 0 -> 18105 bytes assets/source/index.html | 662 ++++++++++++++++++++++++ assets/templates/password_template.html | 235 +++++++++ build.sh | 105 ++++ package.json | 20 + 14 files changed, 1337 insertions(+) create mode 100644 README.md create mode 100644 assets/root/favicon.ico create mode 100644 assets/root/favicon.svg create mode 100644 assets/root/icon-192.png create mode 100644 assets/root/icon-512.png create mode 100644 assets/root/logo.svg create mode 100644 assets/root/manifest.webmanifest create mode 100644 assets/root/robots.txt create mode 100644 assets/screenshots/startpage.png create mode 100644 assets/screenshots/staticrypt.png create mode 100644 assets/source/index.html create mode 100644 assets/templates/password_template.html create mode 100755 build.sh create mode 100644 package.json diff --git a/README.md b/README.md new file mode 100644 index 0000000..9665645 --- /dev/null +++ b/README.md @@ -0,0 +1,141 @@ +# [stilde][stilde_repo] + +![Bash](https://img.shields.io/badge/bash-1f425f.svg?style=for-the-badge&logo=image%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTExIDc5LjE1ODMyNSwgMjAxNS8wOS8xMC0wMToxMDoyMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkE3MDg2QTAyQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkE3MDg2QTAzQUZCMzExRTVBMkQxRDMzMkJDMUQ4RDk3Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QTcwODZBMDBBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QTcwODZBMDFBRkIzMTFFNUEyRDFEMzMyQkMxRDhEOTciLz4gPC9yZGY6RGVzY3JpcHRpb24%2BIDwvcmRmOlJERj4gPC94OnhtcG1ldGE%2BIDw%2FeHBhY2tldCBlbmQ9InIiPz6lm45hAAADkklEQVR42qyVa0yTVxzGn7d9Wy03MS2ii8s%2BeokYNQSVhCzOjXZOFNF4jx%2BMRmPUMEUEqVG36jo2thizLSQSMd4N8ZoQ8RKjJtooaCpK6ZoCtRXKpRempbTv5ey83bhkAUphz8fznvP8znn%2B%2F3NeEEJgNBoRRSmz0ub%2FfuxEacBg%2FDmYtiCjgo5NG2mBXq%2BH5I1ogMRk9Zbd%2BQU2e1ML6VPLOyf5tvBQ8yT1lG10imxsABm7SLs898GTpyYynEzP60hO3trHDKvMigUwdeaceacqzp7nOI4n0SSIIjl36ao4Z356OV07fSQAk6xJ3XGg%2BLCr1d1OYlVHp4eUHPnerU79ZA%2F1kuv1JQMAg%2BE4O2P23EumF3VkvHprsZKMzKwbRUXFEyTvSIEmTVbrysp%2BWr8wfQHGK6WChVa3bKUmdWou%2BjpArdGkzZ41c1zG%2Fu5uGH4swzd561F%2BuhIT4%2BLnSuPsv9%2BJKIpjNr9dXYOyk7%2FBZrcjIT4eCnoKgedJP4BEqhG77E3NKP31FO7cfQA5K0dSYuLgz2TwCWJSOBzG6crzKK%2BohNfni%2Bx6OMUMMNe%2Fgf7ocbw0v0acKg6J8Ql0q%2BT%2FAXR5PNi5dz9c71upuQqCKFAD%2BYhrZLEAmpodaHO3Qy6TI3NhBpbrshGtOWKOSMYwYGQM8nJzoFJNxP2HjyIQho4PewK6hBktoDcUwtIln4PjOWzflQ%2Be5yl0yCCYgYikTclGlxadio%2BBQCSiW1UXoVGrKYwH4RgMrjU1HAB4vR6LzWYfFUCKxfS8Ftk5qxHoCUQAUkRJaSEokkV6Y%2F%2BJUOC4hn6A39NVXVBYeNP8piH6HeA4fPbpdBQV5KOx0QaL1YppX3Jgk0TwH2Vg6S3u%2BdB91%2B%2FpuNYPYFl5uP5V7ZqvsrX7jxqMXR6ff3gCQSTzFI0a1TX3wIs8ul%2Bq4HuWAAiM39vhOuR1O1fQ2gT%2F26Z8Z5vrl2OHi9OXZn995nLV9aFfS6UC9JeJPfuK0NBohWpCHMSAAsFe74WWP%2BvT25wtP9Bpob6uGqqyDnOtaeumjRu%2ByFu36VntK%2FPA5umTJeUtPWZSU9BCgud661odVp3DZtkc7AnYR33RRC708PrVi1larW7XwZIjLnd7R6SgSqWSNjU1B3F72pz5TZbXmX5vV81Yb7Lg7XT%2FUXriu8XLVqw6c6XqWnBKiiYU%2BMt3wWF7u7i91XlSEITwSAZ%2FCzAAHsJVbwXYFFEAAAAASUVORK5CYII%3D) +https://img.shields.io/badge/staticrypt-v3.3.0-brightgreen + +**stilde** is the template for my personal startpage. + +The startpage by itself is a lightly modified version of the **[tilde][tilde_repo]** project by [cade](https://github.com/xvvvyz). + +I use it both locally (localhost file) and self-hosted (https), that's why I wanted a way to protect the page that would still stay light, static and bypassable by an action-less uri. + +Stilde include **[staticrypt][staticrypt_repo]** for that purpose and provide an authentification form to decrypt the page locally by password or by a decryption uri without any other input. + +[Staticrypt Form](assets/screenshots/startpage.png) +[Stilde Startpage](assets/screenshots/staticrypt.png) + +---- + +## Features + +- All tilde features. + - Redirect to a bookmarked website. + - Run a search on a bookmarked website. + - Get search suggestions from DuckDuckGo. + - Redirect to a specific path or uri for a bookmarked website. + - Access any other url. + - Lauch a search on a customized DuckDuckGo session for anything outside the scope. +- WebCrypto html encryption with password prompt. +- Direct decryption by secret hash uri. +- Deployment and re-deployment with one command. +- New: custom logo on both form and startpage. + +## License + +UNLICENCED : like the original tilde project. + +## Requirements + +- npm@lts (I use v18.16.0 with nvm) +- Bash (for the `build.sh` script) + +## Installation + +- Clone this repo in a parent directory outside of your webroot (the webroot is the destination of the build): + +``` bash +git clone --depth=1 https://git.tkapias.net/tkapias/stilde +cd stilde +``` + +## Preparation (optional) + +- Edit french strings for the staticrypt form in `build.sh`: + +``` bash + 85 │ --template-button "DECRYPTER" \ + 86 │ --template-instructions "Crypté avec StatiCrypt." \ + 87 │ --template-error "Mot de passe incorrect !" \ + 88 │ --template-placeholder "Mot de passe" \ + 89 │ --template-remember "Se souvenir de moi" \ +``` + +- Edit graphical asset in `assets/root/`: + - favicon.ico (`convert icon-512.png -define icon:auto-resize="48,32,16" favicon.ico`) + - favicon.svg (square logo, width 192px) + - icon-192.png (generated from favicon.svg) + - icon-512.png (generated from favicon.svg) + - logo.svg (trimmed favicon.svg, width 200px) + +- Replace the svg logo in the startpage `assets/source/index.html`: + +I exported mines from inkscape, cleaned it's code and renamed paths to use them in css and scripts. + +``` html + 622 │
+ 623 │ + 624 │ " Desination webroot path or directory + -p "" Password for decryption >= 12 characters + -s "" Salt string = 32 hexadecimal characters + -t "" Title for the staticrypt form page + -u "" Https or localhost Url for the destination root + +Example: ./build.sh -u https://start.domain.tld -d static -t "STILDE - StartPage" +``` + +---- + +[//]: # (LINKS) +[stilde_repo]: https://git.tkapias.net/tkapias/stilde +[tilde_repo]: https://github.com/xvvvyz/tilde +[staticrypt_repo]: https://github.com/robinmoisson/staticrypt diff --git a/assets/root/favicon.ico b/assets/root/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..106aa3290864a8320e5f721761fd5a4da4f2f43a GIT binary patch literal 15086 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 + + + + + + + + + + + + + image/svg+xml + + + + + diff --git a/assets/root/icon-192.png b/assets/root/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..59a0b851786c053b861ef5ad936f4893c0db6e0c GIT binary patch literal 4103 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 + + + + + + + + + + + + + image/svg+xml + + + + + diff --git a/assets/root/manifest.webmanifest b/assets/root/manifest.webmanifest new file mode 100644 index 0000000..a893e5b --- /dev/null +++ b/assets/root/manifest.webmanifest @@ -0,0 +1,6 @@ +{ + "icons": [ + { "src": "/icon-192.png", "type": "image/png", "sizes": "192x192" }, + { "src": "/icon-512.png", "type": "image/png", "sizes": "512x512" } + ] +} diff --git a/assets/root/robots.txt b/assets/root/robots.txt new file mode 100644 index 0000000..c6742d8 --- /dev/null +++ b/assets/root/robots.txt @@ -0,0 +1,2 @@ +User-Agent: * +Disallow: / diff --git a/assets/screenshots/startpage.png b/assets/screenshots/startpage.png new file mode 100644 index 0000000000000000000000000000000000000000..a51d4d3f90ef711132a82ca7351eeef04f77a663 GIT binary patch literal 36809 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�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 literal 0 HcmV?d00001 diff --git a/assets/screenshots/staticrypt.png b/assets/screenshots/staticrypt.png new file mode 100644 index 0000000000000000000000000000000000000000..4aec486ff56c7651543b4038b31d8abbbf0f757f GIT binary patch literal 18105 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 literal 0 HcmV?d00001 diff --git a/assets/source/index.html b/assets/source/index.html new file mode 100644 index 0000000..c59b32e --- /dev/null +++ b/assets/source/index.html @@ -0,0 +1,662 @@ + + + + + + + + + + +TKA - Start Page + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + +
+ +
diff --git a/assets/templates/password_template.html b/assets/templates/password_template.html new file mode 100644 index 0000000..81a52db --- /dev/null +++ b/assets/templates/password_template.html @@ -0,0 +1,235 @@ + + + + + /*[|template_title|]*/0 + + + + + + + + + + + + + + + + + +
+
+
+ + + + + + diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..b09240b --- /dev/null +++ b/build.sh @@ -0,0 +1,105 @@ +#!/usr/bin/env bash + +# locale +export LC_ALL="C.UTF-8" +export TZ=:/etc/localtime + +Help() +{ + cat <<- 'HEREDOC' + + Generate static website with encrypted code by staticrypt. + The first pass requires -t, -d and -u options, re-run it with -c option only. + + Syntax: ./build.sh [-h] [Options...] + + options: + -h Print this Help + -c Fetch options from ".staticrypt.conf" + -d "" Desination webroot path or directory + -p "" Password for decryption >= 12 characters + -s "" Salt string = 32 hexadecimal characters + -t "" Title for the staticrypt form page + -u "" Https or localhost Url for the destination root + + Example: ./build.sh -u https://start.domain.tld -d static -t "STILDE - StartPage" + + HEREDOC +} + +cd "$(dirname $0)" + +# install staticrypt package +if ! [[ -s ./node_modules/.bin/staticrypt ]]; then + npm install +fi + +# options +while getopts ":hcd:p:s:t:u:" option; do + case $option in + h ) Help; exit 0 ;; + c ) _CONF=.staticrypt.conf ;; + d ) _DEST="${OPTARG}" ;; + p ) _PASS="${OPTARG}" ;; + s ) _SALT="${OPTARG}" ;; + t ) _TITLE="${OPTARG}" ;; + u ) _URL="${OPTARG}" ;; + \?) echo -e "Unknown option: -$OPTARG \n" >&2; Help; exit 1;; + : ) echo -e "Missing argument for -$OPTARG \n" >&2; Help; exit 1;; + esac +done + +# use config file or input options +if [[ -z $_CONF ]]; then + if [[ -z $_DEST ]] || [[ -z $_URL ]] || [[ -z $_TITLE ]]; then + echo -e "Error: options -d and -u are mandatory.\n" >&2; Help; exit 1 + fi + if [[ -z $_PASS ]]; then + _PASS=$(openssl rand -base64 12) + fi + if [[ -z $_SALT ]]; then + _SALT=$(openssl rand -hex 16) + fi +else + _DEST=$(sed -n '/STATIC=/ s/STATIC=//p;' $_CONF | tr -d '\n') + _PASS=$(sed -n '/PASSWORD=/ s/PASSWORD=//p;' $_CONF | tr -d '\n') + _SALT=$(sed -n '/SALT=/ s/SALT=//p;' $_CONF | tr -d '\n') + _URL=$(sed -n '/URL=/ s/URL=//p;' $_CONF | tr -d '\n') + _TITLE=$(sed -n '/TITLE=/ s/TITLE=//p;' $_CONF | tr -d '\n') +fi + +# create directories +mkdir -p --verbose assets/{root,source,templates} encrypted $_DEST + +# generate an url hash for the decrypted form-less page +_URLHASH=$(STATICRYPT_PASSWORD=${_PASS} ./node_modules/.bin/staticrypt --config false --salt ${_SALT} --share) + +# encrypt files & update config file +STATICRYPT_PASSWORD=${_PASS} \ + ./node_modules/.bin/staticrypt assets/source/ \ + --config false \ + --recursive true \ + --remember 7 \ + --salt ${_SALT} \ + --template assets/templates/password_template.html \ + --template-button "DECRYPTER" \ + --template-instructions "Crypté avec StatiCrypt." \ + --template-error "Mot de passe incorrect !" \ + --template-placeholder "Mot de passe" \ + --template-remember "Se souvenir de moi" \ + --template-title "${_TITLE}" && \ + cat <<- HEREDOC > .staticrypt.conf + STATIC=$_DEST + PASSWORD=$_PASS + SALT=$_SALT + URL=$_URL + TITLE=$_TITLE + DECRYPTURL=$_URL$_URLHASH + LOGOUTURL=$_URL#staticrypt_logout + HEREDOC + +# copy assets and encrypted files to the webroot +cp -r assets/root/* $_DEST/ +cp -r encrypted/source/* $_DEST/ + +cat .staticrypt.conf diff --git a/package.json b/package.json new file mode 100644 index 0000000..70eafdc --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "stilde", + "version": "1.0.0", + "description": "Secure start page powered by staticrypt and tilde", + "repository": { + "type": "git", + "url": "https://git.tkapias.net/tkapias/stilde" + }, + "keywords": [ + "startpage", + "homepage", + "minimal", + "encrypted" + ], + "author": "Tomasz Kapias (https://tkapias.net)", + "license": "UNLICENSED", + "dependencies": { + "staticrypt": "^3.3.0" + } +}