Initial MVP of Hemmelig.app

This commit is contained in:
Bjarne Oeverli 2021-06-13 18:11:25 +02:00
commit d28fce7486
No known key found for this signature in database
GPG Key ID: 38A98464B30B17FB
67 changed files with 39231 additions and 0 deletions

9
.babelrc Normal file
View File

@ -0,0 +1,9 @@
{
"env": {
"test": {
"presets": [
["preact-cli/babel", { "modules": "commonjs" }]
]
}
}
}

9
.editorconfig Normal file
View File

@ -0,0 +1,9 @@
[*]
indent_style = space
indent_size = 4
[*.json]
indent_size = 2
[*.yml]
indent_size = 2

View File

@ -0,0 +1,21 @@
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Log in to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Push to Docker Hub
uses: docker/build-push-action@v2
with:
push: true
tags: hemmeligapp/hemmelig:latest

106
.gitignore vendored Normal file
View File

@ -0,0 +1,106 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript v1 declaration files
typings/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
# Next.js build output
.next
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and *not* Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
build/

1
.prettierignore Normal file
View File

@ -0,0 +1 @@
/node_modules/**

9
.prettierrc Normal file
View File

@ -0,0 +1,9 @@
{
"trailingComma": "es5",
"tabWidth": 4,
"semi": true,
"singleQuote": true,
"arrowParens": "always",
"jsxSingleQuote": false,
"printWidth": 100
}

61
Dockerfile Normal file
View File

@ -0,0 +1,61 @@
# To use this image you need a redis database enabled.
# Example:
#
# $ docker run -p 6379:6379 --name some-redis -d redis
#
# Bare minimum run
# ------------------------------
# $ docker run -p 3000:3000 -d --name=secret \
# -e SECRET_MASTER_KEY=11111222223333344444555556666677 \ # has to be a secret key of 32 characters
# -e SECRET_REDIS_HOST=127.0.0.1 \
# secret
#
#
# All available env keys
# ------------------------------
#
# $ docker run -p 3000:3000 -d --name=secret \
# -e SECRET_HOSTNAME=example.com \
# -e SECRET_PORT=3000 \
# -e SECRET_MASTER_KEY=11111222223333344444555556666677 \
# -e SECRET_REDIS_HOST=the_redis_host_name \
# -e SECRET_REDIS_PORT=6379 \
# -e SECRET_REDIS_TLS=true \
# -e SECRET_REDIS_USER=username \
# -e SECRET_REDIS_PASSWORD=glhf \
# secret
FROM node:lts-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
ENV NODE_ENV=production
RUN npm run build
# Get ready for step two of the docker image build
FROM node:lts-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm ci --production
RUN mkdir build
COPY --from=0 /usr/src/app/build build/
COPY . .
EXPOSE 3000
ENV NODE_ENV=production
CMD ["node", "server.js"]

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021 Bjarne Øverli
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# Hemmelig
Modern version of one time secret

25
config/default.js Normal file
View File

@ -0,0 +1,25 @@
const {
SECRET_HOSTNAME = '0.0.0.0',
SECRET_PORT = '3000',
SECRET_MASTER_KEY = '11111222223333344444555556666677', // has to be 32 in length
SECRET_REDIS_HOST = '0.0.0.0',
SECRET_REDIS_PORT = 6379,
SECRET_REDIS_USER = null,
SECRET_REDIS_PASSWORD = null,
SECRET_REDIS_TLS = false,
} = process.env;
module.exports = {
hostname: SECRET_HOSTNAME,
port: SECRET_PORT,
secret_key: SECRET_MASTER_KEY,
redis: {
host: SECRET_REDIS_HOST,
port: SECRET_REDIS_PORT,
user: SECRET_REDIS_USER,
password: SECRET_REDIS_PASSWORD,
tls: SECRET_REDIS_TLS === 'true',
},
logger: true,
cors: '*',
};

3
config/development.js Normal file
View File

@ -0,0 +1,3 @@
module.exports = {
logger: true,
};

3
config/production.js Normal file
View File

@ -0,0 +1,3 @@
module.exports = {
logger: true,
};

3
config/staging.js Normal file
View File

@ -0,0 +1,3 @@
module.exports = {
logger: false,
};

BIN
logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

36629
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

43
package.json Normal file
View File

@ -0,0 +1,43 @@
{
"name": "hemmelig",
"version": "1.0.0",
"description": "Paste a password, secret message or private information",
"main": "index.js",
"scripts": {
"start": "node server.js",
"build": "preact build --inline-css src/client",
"server-dev": "NODE_ENV=development nodemon server.js",
"client-dev": "NODE_ENV=development preact watch src/client"
},
"repository": {
"type": "git",
"url": "git+https://github.com/HemmeligOrg/hemmelig.git"
},
"author": "Bjarne Øverli",
"license": "MIT",
"bugs": {
"url": "https://github.com/HemmeligOrg/hemmelig/issues"
},
"homepage": "https://github.com/HemmeligOrg/hemmelig#readme",
"dependencies": {
"config": "^3.3.6",
"fastify": "^3.17.0",
"fastify-cors": "^6.0.1",
"fastify-static": "^4.2.2",
"nanoid": "^3.1.23",
"preact-render-to-string": "^5.1.4",
"preact-router": "^3.2.1",
"pretty-bytes": "^4.0.2",
"redis": "^3.1.2",
"replace-in-file": "^6.2.0",
"unfetch": "^4.2.0"
},
"devDependencies": {
"classcat": "^5.0.3",
"deepmerge": "^4.2.2",
"dlv": "^1.1.3",
"nodemon": "^2.0.7",
"preact": "^10.5.13",
"preact-cli": "^3.2.2"
}
}

43
server.js Normal file
View File

@ -0,0 +1,43 @@
const replace = require('replace-in-file');
const config = require('config');
const path = require('path');
const fastify = require('fastify')({
logger: config.get('logger'),
});
// https://github.com/fastify/fastify-cors
fastify.register(require('fastify-cors'), { origin: '*' });
// Register our routes before the static content
fastify.register(require('./src/server/controllers/secret'), { prefix: '/api/secret' });
// Static frontend for the production build
if (process.env.NODE_ENV !== 'development') {
const staticPath = path.join(__dirname, 'build');
replace.sync({
files: staticPath + '/index.html',
from: /{{NODE_ENV}}/g,
to: process.env.NODE_ENV,
});
fastify.register(require('fastify-static'), {
root: staticPath,
route: '/*',
});
}
fastify.get('/secret/*', function (_, reply) {
return reply.sendFile('index.html');
});
const startServer = async () => {
try {
await fastify.listen(config.get('port'), config.get('hostname'));
} catch (err) {
fastify.log.error(err);
}
};
startServer();

39
src/client/api/secret.js Normal file
View File

@ -0,0 +1,39 @@
import config from '../config';
export const createSecret = async (text, password, ttl) => {
const data = await fetch(`${config.get('api.host')}/secret`, {
method: 'POST',
cache: 'no-cache',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ text, password, ttl }),
});
return await data.json();
};
export const getSecret = async (secretId, password) => {
const data = await fetch(`${config.get('api.host')}/secret/${secretId}`, {
method: 'POST',
cache: 'no-cache',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ password }),
});
if (data.status === 401) {
return {
statusCode: 401,
};
}
return await data.json();
};
export const burnSecret = async (secretId) => {
const data = await fetch(`${config.get('api.host')}/secret/${secretId}/burn`);
return await data.json();
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
src/client/assets/icons/.DS_Store vendored Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 925 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

472
src/client/assets/logo.svg Normal file
View File

@ -0,0 +1,472 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="979px" height="968px" viewBox="0 0 979 968" enable-background="new 0 0 979 968" xml:space="preserve"> <image id="image0" width="979" height="968" x="0" y="0"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA9MAAAPICAMAAADtwlgvAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAvVBMVEUAAAArnY8rnY8rnY8r
nY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8r
nY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8r
nY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8rnY8r
nY////9RVFclAAAAPXRSTlMAAAYoNFBufrFCjZ9eEhy9djgeVqmWRxNlK4dyg7aRKWEdRFOkNsOb
emg6HwdZjCyvFEm5KoVjplQ3lEZ0x3Ai6gAAAAFiS0dEPklkAOMAAAAHdElNRQflBgwTAyRGhcCy
AABmDElEQVR42u2d6UIbObOGjxsDZjU7IYknIQvJZJvJMPmyTHz/t3XctgEDVVJJLakk9fv8m8EO
dtsPVaoqqf/v/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqJcBSEEzZ21oZPEg
7Zfad7SNhNOZMnNzJun6xsbG5mjOVMri4ZuzZ24Nh2twPDnaRsLpnGg9nmm87eSwwPGdjY31Nopr
v79+oG0knNanTanXF+E4mMgGuyF3ZLSNhNOKzKLyxkZ0k2m5N3Znebn2BagTbSPhtALN3iwu72jI
TKm9B7XDom0knE5KM9xqZVZ2+ZHa2xvDfe1LUw/aRsLpROwNdzf1I7NJ7NHm7hAhOwDaRsLp6DTD
9axtvm/2LGTvaV+xwtE2Ek7HZH+YX6YtEhsRuwPaRsLpODRrWyoV7YBib65jje2FtpFwOjz7ba6t
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
MzozNiswMzowMPl0khcAAAAASUVORK5CYII=" />
</svg>

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -0,0 +1,26 @@
import { h } from 'preact';
import { Router } from 'preact-router';
import Header from './header';
import Footer from './footer';
// Code-splitting is automated for `routes` directory
import Home from '../routes/home';
import Secret from '../routes/secret';
import Privacy from '../routes/privacy';
const App = () => (
<>
<div id="app">
<Header />
<Router>
<Home path="/" />
<Secret path="/secret/:secretId" />
<Privacy path="/privacy" />
</Router>
<Footer />
</div>
</>
);
export default App;

View File

@ -0,0 +1,15 @@
import { h } from 'preact';
import { Link } from 'preact-router/match';
import style from './style.css';
const Footer = () => (
<footer class={style.footer}>
<nav>
<Link href="/about">ABOUT</Link> | <Link href="/privacy">PRIVACY</Link> |{' '}
<Link href="/api">API</Link> |{' '}
<Link href="https://www.github.com/HemmeligOrg/hemmelig">Made with by Hemmelig</Link>
</nav>
</footer>
);
export default Footer;

View File

@ -0,0 +1,5 @@
.footer {
height: 25px;
font-size: 10px;
text-align: center;
}

View File

@ -0,0 +1,18 @@
import { h } from 'preact';
import cc from 'classcat';
import style from './style.css';
const Button = ({ buttonType, full = false, children, ...rest }) => (
<button
class={cc({
[style.buttonBurn]: buttonType === 'burn',
[style.buttonCreate]: buttonType === 'create',
[style.full]: full,
})}
{...rest}
>
{children}
</button>
);
export default Button;

View File

@ -0,0 +1,16 @@
import { h } from 'preact';
import { forwardRef } from 'preact/compat';
import style from './style.css';
const Input = forwardRef((props, ref) => (
<input
class={style.input}
data-gramm_editor="false"
data-lpignore="true"
autocomplete="new-password"
ref={ref}
{...props}
/>
));
export default Input;

View File

@ -0,0 +1,10 @@
import { h } from 'preact';
import style from './style.css';
const Select = ({ compress, children, ...rest }) => (
<select class={style.select} {...rest}>
{children}
</select>
);
export default Select;

View File

@ -0,0 +1,66 @@
.textarea {
width: 100%;
height: 200px;
border-radius: var(--border-radius);
background-color: var(--color-background);
border: 1px solid #eee;
margin-bottom: 7px;
padding: 10px;
}
.compress {
height: 75px;
}
.select,
.input {
width: 100%;
height: 40px;
border-radius: var(--border-radius);
background-color: var(--color-background);
border: 1px solid #eee;
padding: 5px;
margin-bottom: 10px;
}
.buttonBurn,
.buttonCreate {
margin: 7px 0;
width: 100%;
max-width: 150px;
height: 50px;
font-weight: 600;
border-radius: var(--border-radius);
font-size: 14px;
cursor: pointer;
}
.buttonCreate:hover,
.buttonBurn:hover {
filter: brightness(115%);
}
.buttonBurn:hover {
border: 1px solid var(--color-contrast);
}
.buttonCreate:active,
.buttonBurn:active {
filter: brightness(95%);
}
.buttonCreate {
background-color: var(--color-contrast);
color: var(--color-font-contrast);
border: none;
}
.buttonBurn {
color: var(--color-font);
border: 2px solid var(--color-contrast);
background-color: #fff;
}
.full {
max-width: 100%;
}

View File

@ -0,0 +1,17 @@
import { h } from 'preact';
import cc from 'classcat';
import style from './style.css';
const Textarea = ({ compress, children, ...rest }) => (
<textarea
class={cc({ [style.textarea]: true, [style.compress]: compress })}
spellcheck="false"
autocomplete="off"
data-gramm_editor="false"
{...rest}
>
{children}
</textarea>
);
export default Textarea;

View File

@ -0,0 +1,13 @@
import { h } from 'preact';
import { Link } from 'preact-router/match';
import Logo from './logo.js';
import style from './style.css';
const Header = () => (
<header class={style.header}>
<Link class={style.link} href="/">
<Logo class={style.logo} />
</Link>
</header>
);
export default Header;

View File

@ -0,0 +1,706 @@
import { h } from 'preact';
const Logo = ({ ...rest }) => (
<svg
{...rest}
version="1.1"
id="Layer_1"
xmlns="http://www.w3.org/2000/svg"
x="0px"
y="0px"
width="490px"
height="484px"
viewBox="0 0 490 484"
enable-background="new 0 0 490 484"
>
{' '}
<image
id="image0"
width="490"
height="484"
x="0"
y="0"
href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeoAAAHkCAYAAADxZ2xKAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAA
B3RJTUUH5QYMEzk4dy1ChAAAgABJREFUeNrtnXWYXOXZh+/ZbNyVhECQYGFxLcFdWkrbr6VQpC2h
BlRSN+puC3VbWuotVShQSgvFXQIESJCEAHHX9f3++L0ne5jM7nnPzJmZM2ee+7r2Sgizu0ff3/s4
GIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZh
GIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZh
GIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZh
GIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZhGIZh
GIZhGIZhGIZhGIZRPLlqH4Bh1BNNLc3VPoR+mTtrdrUPwTCMPEyoDSMBihTgHNDovgYAA92/DwSG
uL8PBwYXeVgdwAb391b338G/d4X+7InzQ03MDaOymFAbhieeYtyAhHWw+/soYDwwBhgLjEDiu4P7
e/Dfw9xncH+fiN7PAe7nFEMP0On+XA5scf++FtgMrHd/bgAWuz9XA2vcZ1YgMW9HQt8V9QtNxA0j
eUyoDSOPCEHOAUOREA8DpgKTkRjvGPr7JGCQ+++R7u8D6bWeB1T7PPPocl/t7qsDifdGJN7LgZeA
F5GAL3Ffm9AGoL2vH2zibRilYUJt1C0RgjwYCfIIJMCBCO8ObI8s3lFIqIe4zw8k+3QAbUicFwOr
gJeBhcCzSLyfQRb5FvfZbTDxNgx/TKiNuqAfUR6AXM+jgF2RIE8BDkAiPA65qQMrulg3dD3Qhlzk
i+gV8Ifcfz8PvIAscBNvw4iBCbWROfoR5UFIlCcjUd4e2BfYC9gOifQwet3TRul0IWFeDSxA7vMH
kfU9F7nRN1Agoc2E2zCECbVR8/QhzA3IbT0OaEKifAgS5Z1RYtcQ6sNdnTa6kFt8IXKfPw48ioR7
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
Bcq6jkZNU05Bddh9dTpbAdyFLOj/AkuD/2ECbRjpxoTaMGqQPMEeigZ+vNp9TUfdzzqA59GwjmuA
u1FnMcAE2jBqBRNqw6hh8gR7EDAD2B/Fr9cAc9CwjNbgQybQhlFbmFAbRkbIE+1tMIE2jNrEhNow
MkZYsE2cDcMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMw
DMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMw
DMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMw
DMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwys//A1tGBm8W3rwTAAAA
JXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTA2LTEyVDE5OjU3OjU2KzAwOjAwJE+A+gAAACV0RVh0ZGF0
ZTptb2RpZnkAMjAyMS0wNi0xMlQxOTo1Nzo1NiswMDowMFUSOEYAAAAASUVORK5CYII="
/>
</svg>
);
export default Logo;

View File

@ -0,0 +1,25 @@
.header {
width: 100%;
padding: 0;
display: flex;
align-items: center;
justify-content: center;
}
.link,
.logo {
width: 110px;
height: auto;
align-self: center;
}
@media only screen and (min-width: 768px) {
.header {
margin-bottom: 20px;
}
.link,
.logo {
width: 150px;
}
}

View File

@ -0,0 +1,10 @@
import { h } from 'preact';
import style from './style.css';
const Error = ({ children }) => (
<p class={style.error}>
An error occured: <strong>{children}</strong>
</p>
);
export default Error;

View File

@ -0,0 +1,9 @@
import { h } from 'preact';
import cc from 'classcat';
import style from './style.css';
const Error = ({ children, align = '' }) => (
<p class={cc([style.info, style[align]])}>{children}</p>
);
export default Error;

View File

@ -0,0 +1,26 @@
.error {
color: var(--color-error);
font-size: 14px;
border: 2px solid var(--color-error);
border-radius: var(--border-radius);
padding: 10px;
text-align: center;
}
.info {
font-size: 14px;
text-align: center;
color: #555;
}
.left {
text-align: left;
}
.center {
text-align: center;
}
.right {
text-align: right;
}

View File

@ -0,0 +1,7 @@
import { h } from 'preact';
import style from './style.css';
const Wrapper = ({ children }) => <section class={style.wrapper}>{children}</section>;
export default Wrapper;

View File

@ -0,0 +1,13 @@
.wrapper {
padding: 25px 25px;
background-color: #fff;
width: 100%;
height: auto;
margin-bottom: 10px;
margin-top: 10px;
display: flex;
flex-direction: column;
justify-content: center;
border-radius: var(--border-radius);
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
}

27
src/client/config.js Normal file
View File

@ -0,0 +1,27 @@
import merge from 'deepmerge';
import delve from 'dlv';
import defaultConfig from './config/default';
let NODE_ENV;
if (typeof window !== 'undefined') {
NODE_ENV = window.__ENV === '{{NODE_ENV}}' ? 'development' : window.__ENV;
} else {
NODE_ENV = 'production';
}
const config = () => {
try {
return merge(defaultConfig, require(`./config/${NODE_ENV}.js`).default);
} catch (e) {
console.log(` CONFIG: Environment "${NODE_ENV}" not found.`);
return defaultConfig;
}
};
// https://github.com/developit/dlv
// config.get('my.nested.config', 'defaultValue')
export default {
get: (value, def = '') => delve(config(), value, def),
};

View File

@ -0,0 +1,5 @@
export default {
api: {
host: 'http://localhost:3000/api',
},
};

View File

@ -0,0 +1 @@
export default {};

View File

@ -0,0 +1,5 @@
export default {
api: {
host: '/api',
},
};

View File

@ -0,0 +1 @@
export default {};

4
src/client/index.js Normal file
View File

@ -0,0 +1,4 @@
import './style';
import App from './components/app';
export default App;

53
src/client/manifest.json Normal file
View File

@ -0,0 +1,53 @@
{
"name": "Hemmelig",
"short_name": "hemmelig",
"theme_color": "#2a9d8f",
"background_color": "#fff",
"description": "Paste a password, secret message or private information",
"display": "fullscreen",
"orientation": "portrait",
"scope": "/",
"start_url": "/",
"icons": [
{
"src": "assets/icons/icon-72x72.png",
"sizes": "72x72",
"type": "image/png"
},
{
"src": "assets/icons/icon-96x96.png",
"sizes": "96x96",
"type": "image/png"
},
{
"src": "assets/icons/icon-128x128.png",
"sizes": "128x128",
"type": "image/png"
},
{
"src": "assets/icons/icon-144x144.png",
"sizes": "144x144",
"type": "image/png"
},
{
"src": "assets/icons/icon-152x152.png",
"sizes": "152x152",
"type": "image/png"
},
{
"src": "assets/icons/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "assets/icons/icon-384x384.png",
"sizes": "384x384",
"type": "image/png"
},
{
"src": "assets/icons/icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}

View File

@ -0,0 +1,161 @@
import { h } from 'preact';
import { useEffect, useState, useRef } from 'preact/hooks';
import style from './style.css';
import Wrapper from '../../components/wrapper';
import Input from '../../components/form/input';
import Textarea from '../../components/form/textarea';
import Select from '../../components/form/select';
import Button from '../../components/form/button';
import Error from '../../components/info/error';
import Info from '../../components/info/info';
import { createSecret, burnSecret } from '../../api/secret';
const Home = () => {
const [text, setText] = useState('');
const [ttl, setTTL] = useState(3600);
const [password, setPassword] = useState('');
const [secretId, setSecretId] = useState('');
const [error, setError] = useState('');
const secretRef = useRef(null);
useEffect(() => {
if (secretId) {
secretRef.current.focus();
}
}, [secretId]);
const onChangeHandler = (event) => {
setText(event.target.value);
};
const onSelectChange = (event) => {
setTTL(event.target.value);
};
const onPasswordChange = (event) => {
setPassword(event.target.value);
};
const onSubmit = async (event) => {
if (!text) {
setError('Please add a secret.');
return;
}
event.preventDefault();
const json = await createSecret(text, password, ttl);
setSecretId(json.id);
setError('');
};
const onNewSecret = async (event) => {
event.preventDefault();
setText('');
setSecretId('');
setError('');
setPassword('');
};
const onBurn = async (event) => {
if (!secretId) {
return;
}
event.preventDefault();
burnSecret(secretId);
setText('');
setSecretId('');
};
const handleFocus = (event) => event.target.select();
const getSecretURL = () => `${window.location.href}secret/${secretId}`;
return (
<>
<Wrapper>
<h1 class={style.h1}>Paste a password, secret message or private information.</h1>
<Info>Keep your sensitive information out of chat logs, emails, sms, etc.</Info>
<Info>
<strong>Hemmelig</strong>, [he`m:(ə)li], means secret in Norwegian.
</Info>
<div class={style.form}>
<Textarea
compress={secretId}
placeholder="Insert secret.."
onChange={onChangeHandler}
value={text}
readonly={!!secretId}
/>
<Select value={ttl} onChange={onSelectChange}>
<option value="604800">7 days</option>
<option value="259200">3 days</option>
<option value="86400">1 day</option>
<option value="43200">12 hours</option>
<option value="14400">4 hours</option>
<option value="3600">1 hour</option>
<option value="1800">30 minutes</option>
<option value="300">5 minutes</option>
</Select>
<Input
placeholder="Your optional password"
type="password"
value={password}
onChange={onPasswordChange}
readonly={!!secretId}
/>
{secretId && (
<>
<p class={style.info}>Share this link:</p>
<Input
value={getSecretURL()}
onFocus={handleFocus}
ref={secretRef}
readonly
/>
</>
)}
<div class={style.buttonWrapper}>
{!secretId && (
<Button buttonType="create" onClick={onSubmit}>
Create a secret link
</Button>
)}
{secretId && (
<Button buttonType="create" onClick={onNewSecret}>
Create a new secret
</Button>
)}
{secretId && (
<Button buttonType="burn" onClick={onBurn} disabled={!secretId}>
Burn the secret
</Button>
)}
</div>
</div>
</Wrapper>
{error && <Error>{error}</Error>}
<Info>The secret link only works once, and then it will disappear.</Info>
</>
);
};
export default Home;

View File

@ -0,0 +1,19 @@
.buttonWrapper {
display: flex;
flex-direction: row;
justify-content: space-between;
}
.form {
max-width: 600px;
margin: 0 auto;
width: 100%;
display: flex;
flex-direction: column;
justify-content: center;
}
.p {
text-align: center;
font-size: 14px;
}

View File

@ -0,0 +1,36 @@
import { h } from 'preact';
import Wrapper from '../../components/wrapper';
import Info from '../../components/info/info';
const Privacy = () => {
return (
<>
<Wrapper>
<h1>Privacy</h1>
<h2>Is my data secure?</h2>
<Info align="left">
Yes, your data is secure. Hemmelig is encrypting every message with the AES 256
algoritm with a dynamic IV before saving it toour database with a master
password.
</Info>
<h2>Do you track me?</h2>
<Info align="left">
We do not track anything. Hemmelig care strongly about your privacy. Future wise
we might track the status of how many secrets that is being created, which is
not personal data, and will be publicly available on this site.
</Info>
<h2>I still don't trust this application.</h2>
<Info align="left">
If that is being the case, Hemmelig offers a docker image to self host the
application.
</Info>
</Wrapper>
</>
);
};
export default Privacy;

View File

@ -0,0 +1,120 @@
import { h } from 'preact';
import { useEffect, useState } from 'preact/hooks';
import style from './style.css';
import Wrapper from '../../components/wrapper';
import Input from '../../components/form/input';
import Textarea from '../../components/form/textarea';
import Button from '../../components/form/button';
import Error from '../../components/info/error';
import Info from '../../components/info/info';
import { getSecret, burnSecret } from '../../api/secret';
const Secret = ({ secretId }) => {
const [secret, setSecret] = useState(null);
const [isSecretOpen, setIsSecretOpen] = useState(false);
const [password, setPassword] = useState('');
const [isPasswordRequired, setIsPasswordRequired] = useState(false);
const [error, setError] = useState(null);
const fetchSecret = async (event) => {
event.preventDefault();
if (isPasswordRequired && !password) {
return;
}
if (secret) {
setIsSecretOpen(true);
return;
}
const json = await getSecret(secretId, password);
if (json.statusCode === 401) {
setIsPasswordRequired(true);
setError('Incorrect password!');
return;
}
if (json.error) {
setError(json.error);
} else {
setSecret(json.secret);
setIsSecretOpen(true);
setError(null);
}
};
useEffect(() => {
(async () => {
const response = await getSecret(secretId, password);
if (response.statusCode === 401) {
setIsPasswordRequired(true);
return () => {};
}
if (!response.error) {
setSecret(response.secret);
} else {
setError(response.error);
}
})();
}, []);
useEffect(() => {
if (isSecretOpen) {
burnSecret(secretId);
}
}, [isSecretOpen, secretId]);
const onPasswordChange = (event) => {
setPassword(event.target.value);
};
return (
<>
<Wrapper>
<h1>View your secret</h1>
<Info>We will only show the secret once.</Info>
{isSecretOpen && (
<Textarea class={style.textarea} readonly>
{secret}
</Textarea>
)}
{isPasswordRequired && !isSecretOpen && (
<>
<Info>A password is required to open this secret</Info>
<Input
type="password"
placeholder="Your password"
value={password}
onChange={onPasswordChange}
/>
</>
)}
{!isSecretOpen && (
<Button buttonType="create" onClick={fetchSecret} full>
View secret
</Button>
)}
</Wrapper>
{error && <Error>{error}</Error>}
</>
);
};
export default Secret;

View File

@ -0,0 +1,14 @@
.textarea {
width: 100%;
height: 200px;
border-radius: var(--border-radius);
background-color: var(--color-background);
border: 1px solid #eee;
margin-bottom: 10px;
padding: 10px;
}
.p {
text-align: center;
font-size: 14px;
}

View File

@ -0,0 +1,79 @@
@import url('https://rsms.me/inter/inter.css');
html {
font-family: 'Inter', sans-serif;
}
@supports (font-variation-settings: normal) {
html {
font-family: 'Inter var', sans-serif;
}
}
html,
body {
height: 100%;
width: 100%;
padding: 0;
margin: 0;
background: var(--color-background);
font-weight: 400;
color: var(--color-font);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
a,
a:visited {
color: var(--color-font);
text-decoration: underline;
}
a:hover {
text-decoration: none;
}
h1,
h2 {
margin: 7px;
text-align: center;
font-size: 22px;
}
h2 {
font-size: 18px;
text-align: left;
}
p {
margin: 7px;
}
* {
box-sizing: border-box;
}
#app {
padding: 20px 10px;
width: 100%;
margin: 0 auto;
max-width: 850px;
display: flex;
flex-direction: column;
}
:root {
--color-contrast: #2a9d8f;
--color-font-contrast: #fcfcfc;
--color-contrast-second: #577590;
--color-background: #f9f9f9;
--color-font: #232323;
--color-dark: #030303;
--color-success: #43aa8b;
--color-error: #f94144;
--border-radius: 10px;
}
@media only screen and (min-width: 768px) {
#app {
padding: 56px 20px;
}
}

4
src/client/sw.js Normal file
View File

@ -0,0 +1,4 @@
import { getFiles, setupPrecaching, setupRouting } from 'preact-cli/sw/';
setupRouting();
setupPrecaching(getFiles());

40
src/client/template.html Normal file
View File

@ -0,0 +1,40 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title><% preact.title %> - paste a password, secret message or private information.</title>
<!-- Primary Meta Tags -->
<meta name="title" content="Paste a password, secret message or private information.">
<meta name="description"
content="Keep your sensitive information out of chat logs, emails, sms, etc.">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://www.hemmelig.app/">
<meta property="og:title" content="Paste a password, secret message or private information.">
<meta property="og:description"
content="Keep your sensitive information out of chat logs, emails, sms, etc.">
<meta property="og:image"
content="/assets/icons/icon-512x512.png">
<!-- Twitter -->
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://www.hemmelig.app/">
<meta property="twitter:title" content="Paste a password, secret message or private information.">
<meta property="twitter:description"
content="Keep your sensitive information out of chat logs, emails, sms, etc.">
<meta property="twitter:image"
content="/assets/icons/icon-512x512.png">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<link rel="apple-touch-icon" href="/assets/icons/apple-touch-icon.png">
<script>window.__ENV = "{{NODE_ENV}}";</script>
<% preact.headEnd %>
</head>
<body>
<% preact.bodyEnd %>
</body>
</html>

View File

@ -0,0 +1,75 @@
const { nanoid } = require('nanoid');
const prettyBytes = require('pretty-bytes');
const { encrypt, decrypt } = require('../helpers/crypto');
const redis = require('../services/redis');
const MAX_BYTES = 256 * 1000; // 256 kb - 256 000 bytes
const validIdRegExp = new RegExp('^[A-Za-z0-9_-]*$');
async function secret(fastify) {
fastify.post('/:id', async (request, reply) => {
const { id } = request.params;
const { password = '' } = request.body;
// If it does not match the valid characters set for nanoid, return 403
if (!validIdRegExp.test(id)) {
return reply.code(403).send({ error: 'Not a valid secret id' });
}
const data = await redis.getSecret(id);
if (!data) {
return reply.code(404).send({ error: 'Secret not found' });
}
if (decrypt(JSON.parse(data.password)) !== password) {
return reply.code(401).send({ error: 'Wrong password!' });
}
const secret = decrypt(JSON.parse(data.secret));
return { secret };
});
fastify.post('/', async (request, reply) => {
const { text, ttl, password } = request.body;
if (Buffer.byteLength(text) > MAX_BYTES) {
return reply.code(413).send({
error: `The secret size (${prettyBytes(
Buffer.byteLength(text)
)}) exceeded our limit of ${prettyBytes(MAX_BYTES)}.`,
});
}
// Test id collision by using 21 characters https://zelark.github.io/nano-id-cc/
const id = nanoid();
const data = {
id,
secret: JSON.stringify(encrypt(text)),
password: JSON.stringify(encrypt(password)),
};
redis.createSecret(data, ttl);
return { id };
});
// This will burn the secret 🔥
fastify.get('/:id/burn', async (request) => {
const { id } = request.params;
if (!validIdRegExp.test(id)) {
return reply.code(403).send({ error: 'Not a valid secret id' });
}
redis.deleteSecret(id);
return { success: 'Secret burned' };
});
}
module.exports = secret;

View File

@ -0,0 +1,36 @@
const crypto = require('crypto');
const config = require('config');
const ALGORITHM = 'aes-256-ctr';
const SECRET_KEY = config.get('secret_key');
// Change algorithm? https://stackoverflow.com/questions/1220751/how-to-choose-an-aes-encryption-mode-cbc-ecb-ctr-ocb-cfb
function encrypt(text) {
const IV = crypto.randomBytes(16);
const cipher = crypto.createCipheriv(ALGORITHM, SECRET_KEY, IV);
const encrypted = Buffer.concat([cipher.update(text), cipher.final()]);
return {
iv: IV.toString('hex'),
content: encrypted.toString('hex'),
};
}
function decrypt(hash) {
const decipher = crypto.createDecipheriv(ALGORITHM, SECRET_KEY, Buffer.from(hash.iv, 'hex'));
const decrypted = Buffer.concat([
decipher.update(Buffer.from(hash.content, 'hex')),
decipher.final(),
]);
return decrypted.toString();
}
module.exports = {
encrypt,
decrypt,
};

View File

@ -0,0 +1,14 @@
const VALID_TTL = [
604800, // 7 days
259200, // 3 days
86400, // 1 day
43200, // 12 hours
14400, // 4 hours
3600, // 1 hour
1800, // 30 minutes
300, // 5 minutes
];
module.exports = function isValidTTL(ttl) {
return VALID_TTL.some((_ttl) => _ttl === ttl);
};

View File

@ -0,0 +1,55 @@
const config = require('config');
const redis = require('redis');
const { promisify } = require('util');
const isValidTTL = require('../helpers/validate-ttl');
const options = {
host: config.get('redis.host'),
port: config.get('redis.port'),
tls: config.get('redis.tls'),
};
if (config.get('redis.user', null) && config.get('redis.password', null)) {
Object.assign(options, {
user: config.get('redis.user', null),
password: config.get('redis.password', null),
});
}
const client = redis.createClient(options);
client.on('error', (error) => console.error(error));
const hgetallAsync = promisify(client.hgetall).bind(client);
const deleteAsync = promisify(client.del).bind(client);
const DEFAULT_EXPIRE = 60 * 60 * 24; // One day
function redisCommands() {
function createSecret(data, ttl) {
const key = data.id;
client.hmset(key, 'secret', data.secret, 'password', data.password);
client.expire(key, isValidTTL(Number(ttl)) ? ttl : DEFAULT_EXPIRE);
}
async function getSecret(id) {
const data = await hgetallAsync(id);
return data;
}
async function deleteSecret(id) {
await deleteAsync(id);
}
return {
createSecret,
getSecret,
deleteSecret,
};
}
module.exports = redisCommands();