mirror of
https://github.com/cupcakearmy/cryptgeon.git
synced 2025-09-04 08:30:39 +00:00
Compare commits
28 Commits
Author | SHA1 | Date | |
---|---|---|---|
5dff12ea70 | |||
e332dc63e8 | |||
a18e9bcc88 | |||
4b43edf54a | |||
e3aa2dd5ff | |||
98a03c25e6 | |||
7f618e7e45 | |||
84a7be4549 | |||
b2bad5f64c | |||
41f55c0920 | |||
edbf8a8ecf | |||
4852804581 | |||
22b1c35b3e | |||
d1e9ffd89b | |||
9c675ba48c | |||
ef3d3d5bde | |||
7e835af3f2 | |||
f153102978 | |||
5944c784ba | |||
2aa186450a | |||
70b53106ea | |||
b958189b0c | |||
acd488aab0 | |||
5378b7a820 | |||
1bb5d3ecb0 | |||
0d79e9c85e | |||
70382a63ed | |||
b3886cc6fc |
@@ -1 +1,2 @@
|
|||||||
target
|
target
|
||||||
|
node_modules
|
2
.github/workflows/docker.yml
vendored
2
.github/workflows/docker.yml
vendored
@@ -32,7 +32,7 @@ jobs:
|
|||||||
id: docker_build
|
id: docker_build
|
||||||
uses: docker/build-push-action@v2
|
uses: docker/build-push-action@v2
|
||||||
with:
|
with:
|
||||||
platforms: linux/amd64,linux/arm64
|
# platforms: linux/amd64,linux/arm64
|
||||||
push: true
|
push: true
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
- name: Image digest
|
- name: Image digest
|
||||||
|
18
.github/workflows/test.yml
vendored
Normal file
18
.github/workflows/test.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
name: test
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
text:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
- name: Install
|
||||||
|
run: |
|
||||||
|
docker-compose build
|
||||||
|
npm ci
|
||||||
|
- name: Test
|
||||||
|
run: npm run test:run
|
50
CHANGELOG.md
50
CHANGELOG.md
@@ -5,6 +5,56 @@ All notable changes to this project will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [1.1.0] - 2021-05-16
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
|
- Using hash `#` instead of path
|
||||||
|
|
||||||
|
## [1.0.11] - 2021-05-08
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- loading text
|
||||||
|
- description for created notes about availability
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- iterations from 100 to 100k
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- time based view bug
|
||||||
|
|
||||||
|
## [1.0.10] - 2021-05-08
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- API endpoint was not reachable
|
||||||
|
|
||||||
|
## [1.0.9] - 2021-05-07
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Removed a dependency
|
||||||
|
|
||||||
|
## [1.0.8] - 2021-05-05
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Manual theme override option
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Removed Arm builds for now
|
||||||
|
- iOS style bugs
|
||||||
|
|
||||||
|
## [1.0.7] - 2021-05-04
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Arm images
|
||||||
|
|
||||||
## [1.0.6] - 2021-05-04
|
## [1.0.6] - 2021-05-04
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
FROM node:16-alpine as CLIENT
|
FROM node:16-alpine as CLIENT
|
||||||
|
|
||||||
WORKDIR /tmp
|
WORKDIR /tmp
|
||||||
COPY ./client .
|
COPY ./client ./
|
||||||
|
|
||||||
RUN npm ci
|
RUN npm ci
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
@@ -10,7 +10,7 @@ FROM rust:1.51-alpine as RUST
|
|||||||
|
|
||||||
WORKDIR /tmp
|
WORKDIR /tmp
|
||||||
RUN apk add libc-dev openssl-dev alpine-sdk
|
RUN apk add libc-dev openssl-dev alpine-sdk
|
||||||
COPY ./Cargo* .
|
COPY ./Cargo* ./
|
||||||
COPY ./src ./src
|
COPY ./src ./src
|
||||||
|
|
||||||
RUN cargo build --release
|
RUN cargo build --release
|
||||||
@@ -23,4 +23,6 @@ COPY --from=CLIENT /tmp/build ./client/build
|
|||||||
|
|
||||||
ENV MEMCACHE=memcached:11211
|
ENV MEMCACHE=memcached:11211
|
||||||
|
|
||||||
|
EXPOSE 5000
|
||||||
|
|
||||||
ENTRYPOINT [ "/app/cryptgeon" ]
|
ENTRYPOINT [ "/app/cryptgeon" ]
|
@@ -17,7 +17,7 @@ Check out the demo and see for yourself https://cryptgeon.nicco.io.
|
|||||||
## Features
|
## Features
|
||||||
|
|
||||||
- server cannot decrypt contents due to client side encryption
|
- server cannot decrypt contents due to client side encryption
|
||||||
- view and time constrains
|
- view and time constraints
|
||||||
- in memory, no persistence
|
- in memory, no persistence
|
||||||
- obligatory dark mode support
|
- obligatory dark mode support
|
||||||
|
|
||||||
@@ -45,6 +45,8 @@ services:
|
|||||||
|
|
||||||
app:
|
app:
|
||||||
image: cupcakearmy/cryptgeon:latest
|
image: cupcakearmy/cryptgeon:latest
|
||||||
|
depends_on:
|
||||||
|
- memcache
|
||||||
ports:
|
ports:
|
||||||
- 80:5000
|
- 80:5000
|
||||||
```
|
```
|
||||||
|
1
client/.gitignore
vendored
1
client/.gitignore
vendored
@@ -1,5 +1,6 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
node_modules
|
node_modules
|
||||||
/.svelte
|
/.svelte
|
||||||
|
/.svelte-kit
|
||||||
/build
|
/build
|
||||||
/functions
|
/functions
|
||||||
|
147
client/package-lock.json
generated
147
client/package-lock.json
generated
@@ -1,15 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "cryptgeon",
|
"name": "client",
|
||||||
"version": "0.0.1",
|
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "cryptgeon",
|
|
||||||
"version": "0.0.1",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fontsource/fira-mono": "^4.2.2",
|
"@fontsource/fira-mono": "^4.2.2",
|
||||||
"axios": "^0.21.1",
|
|
||||||
"copy-to-clipboard": "^3.3.1"
|
"copy-to-clipboard": "^3.3.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -25,8 +21,7 @@
|
|||||||
"node_modules/@fontsource/fira-mono": {
|
"node_modules/@fontsource/fira-mono": {
|
||||||
"version": "4.2.2",
|
"version": "4.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/@fontsource/fira-mono/-/fira-mono-4.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@fontsource/fira-mono/-/fira-mono-4.2.2.tgz",
|
||||||
"integrity": "sha512-t2WRThg+eLkQNQCtPG2sCCq40lz3xeb7nsL7P8l4+wfSRbdLQXAY5IebMftI2YEZR4MRRhdgrg0p5fi/2yXypA==",
|
"integrity": "sha512-t2WRThg+eLkQNQCtPG2sCCq40lz3xeb7nsL7P8l4+wfSRbdLQXAY5IebMftI2YEZR4MRRhdgrg0p5fi/2yXypA=="
|
||||||
"license": "MIT"
|
|
||||||
},
|
},
|
||||||
"node_modules/@rollup/pluginutils": {
|
"node_modules/@rollup/pluginutils": {
|
||||||
"version": "4.1.0",
|
"version": "4.1.0",
|
||||||
@@ -45,15 +40,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@sveltejs/adapter-static": {
|
"node_modules/@sveltejs/adapter-static": {
|
||||||
"version": "1.0.0-next.7",
|
"version": "1.0.0-next.8",
|
||||||
"resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-1.0.0-next.7.tgz",
|
"resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-1.0.0-next.8.tgz",
|
||||||
"integrity": "sha512-kIghJ2PoAPW6x8r5f+q8JTeB0EmBtl0Jl7wDB2HfsBCcdtNmdRqVgMcpfhSstpz1VGVDOuaU8rGlHL+XBAMMKQ==",
|
"integrity": "sha512-goE3v68y+pn+fayPDJCCQ7W1QQpSMl86pZS9RvjuG64+TEI/PGsZwYR1RRgvwIiDqu33wBEHj+3ZYHEpJO/gwg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@sveltejs/kit": {
|
"node_modules/@sveltejs/kit": {
|
||||||
"version": "1.0.0-next.94",
|
"version": "1.0.0-next.101",
|
||||||
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.94.tgz",
|
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.101.tgz",
|
||||||
"integrity": "sha512-2HkW+LqijRAHjKzKur3uLNblV8Ea1Vsju7LPVNYfMarJAk/mJrLTTm+29Qw6VSgaQsezlKfrgv3i+ZwgxZM1BQ==",
|
"integrity": "sha512-SwUImLhFmyaDsq7LKRJXPJRIOPa06SWENG7heko5FTRRLMpI/UDFcijjT2ln0Fp+AL9XfSbTHO8QrOflCMbfiQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sveltejs/vite-plugin-svelte": "^1.0.0-next.9",
|
"@sveltejs/vite-plugin-svelte": "^1.0.0-next.9",
|
||||||
@@ -67,7 +62,7 @@
|
|||||||
"node": ">= 12.17.0"
|
"node": ">= 12.17.0"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"svelte": "^3.32.1",
|
"svelte": "^3.34.0",
|
||||||
"vite": "^2.2.3"
|
"vite": "^2.2.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -95,9 +90,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "15.0.1",
|
"version": "15.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz",
|
||||||
"integrity": "sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA==",
|
"integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/pug": {
|
"node_modules/@types/pug": {
|
||||||
@@ -130,14 +125,6 @@
|
|||||||
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
|
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/axios": {
|
|
||||||
"version": "0.21.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
|
|
||||||
"integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
|
|
||||||
"dependencies": {
|
|
||||||
"follow-redirects": "^1.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/chalk": {
|
"node_modules/chalk": {
|
||||||
"version": "4.1.1",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
|
||||||
@@ -237,25 +224,6 @@
|
|||||||
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
|
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/follow-redirects": {
|
|
||||||
"version": "1.14.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.0.tgz",
|
|
||||||
"integrity": "sha512-0vRwd7RKQBTt+mgu87mtYeofLFZpTas2S9zY+jIeuLJMNvudIgF52nr19q40HOwH5RrhWIPuj9puybzSJiRrVg==",
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"type": "individual",
|
|
||||||
"url": "https://github.com/sponsors/RubenVerborgh"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=4.0"
|
|
||||||
},
|
|
||||||
"peerDependenciesMeta": {
|
|
||||||
"debug": {
|
|
||||||
"optional": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/fsevents": {
|
"node_modules/fsevents": {
|
||||||
"version": "2.3.2",
|
"version": "2.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
|
||||||
@@ -370,9 +338,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/postcss": {
|
"node_modules/postcss": {
|
||||||
"version": "8.2.13",
|
"version": "8.2.14",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.13.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.14.tgz",
|
||||||
"integrity": "sha512-FCE5xLH+hjbzRdpbRb1IMCvPv9yZx2QnDarBEYSN0N0HYk+TcXsEhwdFcFb+SRWOKzKGErhIEbBK2ogyLdTtfQ==",
|
"integrity": "sha512-+jD0ZijcvyCqPQo/m/CW0UcARpdFylq04of+Q7RKX6f/Tu+dvpUI/9Sp81+i6/vJThnOBX09Quw0ZLOVwpzX3w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"colorette": "^1.2.2",
|
"colorette": "^1.2.2",
|
||||||
@@ -416,9 +384,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/rollup": {
|
"node_modules/rollup": {
|
||||||
"version": "2.46.0",
|
"version": "2.47.0",
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.46.0.tgz",
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.47.0.tgz",
|
||||||
"integrity": "sha512-qPGoUBNl+Z8uNu0z7pD3WPTABWRbcOwIrO/5ccDJzmrtzn0LVf6Lj91+L5CcWhXl6iWf23FQ6m8Jkl2CmN1O7Q==",
|
"integrity": "sha512-rqBjgq9hQfW0vRmz+0S062ORRNJXvwRpzxhFXORvar/maZqY6za3rgQ/p1Glg+j1hnc1GtYyQCPiAei95uTElg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"rollup": "dist/bin/rollup"
|
"rollup": "dist/bin/rollup"
|
||||||
@@ -488,9 +456,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/svelte": {
|
"node_modules/svelte": {
|
||||||
"version": "3.38.1",
|
"version": "3.38.2",
|
||||||
"resolved": "https://registry.npmjs.org/svelte/-/svelte-3.38.1.tgz",
|
"resolved": "https://registry.npmjs.org/svelte/-/svelte-3.38.2.tgz",
|
||||||
"integrity": "sha512-N3XLAyfzqrFxwRLevBeW7Dke9ZlHRVGSIed5abo4Drvj+zvd2OyWpFa1x4nQUc8Lnvt4Kcn8/5le1peRDybNqg==",
|
"integrity": "sha512-q5Dq0/QHh4BLJyEVWGe7Cej5NWs040LWjMbicBGZ+3qpFWJ1YObRmUDZKbbovddLC9WW7THTj3kYbTOFmU9fbg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 8"
|
"node": ">= 8"
|
||||||
@@ -506,9 +474,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/svelte-preprocess": {
|
"node_modules/svelte-preprocess": {
|
||||||
"version": "4.7.2",
|
"version": "4.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.7.3.tgz",
|
||||||
"integrity": "sha512-EToG+08rEsA33btv+C5g2qnRArwpTc5AoU0QBB3ZEkYagxAb2yPNsy0qsmtvbJOTBMy6o3oyijDdl3DMpMvpEg==",
|
"integrity": "sha512-Zx1/xLeGOIBlZMGPRCaXtlMe4ZA0faato5Dc3CosEqwu75MIEPuOstdkH6cy+RYTUYynoxzNaDxkPX4DbrPwRA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -594,9 +562,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/vite": {
|
"node_modules/vite": {
|
||||||
"version": "2.2.3",
|
"version": "2.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/vite/-/vite-2.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/vite/-/vite-2.2.4.tgz",
|
||||||
"integrity": "sha512-PtjyBL4GtACM+uT5q5hi2+AlMBbb6YI2b2bam6QI8ZdZt4FezseF0yZHQx0G+b3po9jIJ/GS5N9gc5Yq9Rue7g==",
|
"integrity": "sha512-vnIwSNci+phFMp6krhy+FbYzKL0R67Sdt9mVZ96S27AewrApSJjTqncJcalk8sf60BgcbW4+1C6DFIWkxquO9g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"esbuild": "^0.9.3",
|
"esbuild": "^0.9.3",
|
||||||
@@ -632,15 +600,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@sveltejs/adapter-static": {
|
"@sveltejs/adapter-static": {
|
||||||
"version": "1.0.0-next.7",
|
"version": "1.0.0-next.8",
|
||||||
"resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-1.0.0-next.7.tgz",
|
"resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-1.0.0-next.8.tgz",
|
||||||
"integrity": "sha512-kIghJ2PoAPW6x8r5f+q8JTeB0EmBtl0Jl7wDB2HfsBCcdtNmdRqVgMcpfhSstpz1VGVDOuaU8rGlHL+XBAMMKQ==",
|
"integrity": "sha512-goE3v68y+pn+fayPDJCCQ7W1QQpSMl86pZS9RvjuG64+TEI/PGsZwYR1RRgvwIiDqu33wBEHj+3ZYHEpJO/gwg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@sveltejs/kit": {
|
"@sveltejs/kit": {
|
||||||
"version": "1.0.0-next.94",
|
"version": "1.0.0-next.101",
|
||||||
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.94.tgz",
|
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.101.tgz",
|
||||||
"integrity": "sha512-2HkW+LqijRAHjKzKur3uLNblV8Ea1Vsju7LPVNYfMarJAk/mJrLTTm+29Qw6VSgaQsezlKfrgv3i+ZwgxZM1BQ==",
|
"integrity": "sha512-SwUImLhFmyaDsq7LKRJXPJRIOPa06SWENG7heko5FTRRLMpI/UDFcijjT2ln0Fp+AL9XfSbTHO8QrOflCMbfiQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@sveltejs/vite-plugin-svelte": "^1.0.0-next.9",
|
"@sveltejs/vite-plugin-svelte": "^1.0.0-next.9",
|
||||||
@@ -665,9 +633,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
"version": "15.0.1",
|
"version": "15.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz",
|
||||||
"integrity": "sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA==",
|
"integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@types/pug": {
|
"@types/pug": {
|
||||||
@@ -694,14 +662,6 @@
|
|||||||
"color-convert": "^2.0.1"
|
"color-convert": "^2.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"axios": {
|
|
||||||
"version": "0.21.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
|
|
||||||
"integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
|
|
||||||
"requires": {
|
|
||||||
"follow-redirects": "^1.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"chalk": {
|
"chalk": {
|
||||||
"version": "4.1.1",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
|
||||||
@@ -774,11 +734,6 @@
|
|||||||
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
|
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"follow-redirects": {
|
|
||||||
"version": "1.14.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.0.tgz",
|
|
||||||
"integrity": "sha512-0vRwd7RKQBTt+mgu87mtYeofLFZpTas2S9zY+jIeuLJMNvudIgF52nr19q40HOwH5RrhWIPuj9puybzSJiRrVg=="
|
|
||||||
},
|
|
||||||
"fsevents": {
|
"fsevents": {
|
||||||
"version": "2.3.2",
|
"version": "2.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
|
||||||
@@ -859,9 +814,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"postcss": {
|
"postcss": {
|
||||||
"version": "8.2.13",
|
"version": "8.2.14",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.13.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.14.tgz",
|
||||||
"integrity": "sha512-FCE5xLH+hjbzRdpbRb1IMCvPv9yZx2QnDarBEYSN0N0HYk+TcXsEhwdFcFb+SRWOKzKGErhIEbBK2ogyLdTtfQ==",
|
"integrity": "sha512-+jD0ZijcvyCqPQo/m/CW0UcARpdFylq04of+Q7RKX6f/Tu+dvpUI/9Sp81+i6/vJThnOBX09Quw0ZLOVwpzX3w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"colorette": "^1.2.2",
|
"colorette": "^1.2.2",
|
||||||
@@ -894,9 +849,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rollup": {
|
"rollup": {
|
||||||
"version": "2.46.0",
|
"version": "2.47.0",
|
||||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.46.0.tgz",
|
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.47.0.tgz",
|
||||||
"integrity": "sha512-qPGoUBNl+Z8uNu0z7pD3WPTABWRbcOwIrO/5ccDJzmrtzn0LVf6Lj91+L5CcWhXl6iWf23FQ6m8Jkl2CmN1O7Q==",
|
"integrity": "sha512-rqBjgq9hQfW0vRmz+0S062ORRNJXvwRpzxhFXORvar/maZqY6za3rgQ/p1Glg+j1hnc1GtYyQCPiAei95uTElg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"fsevents": "~2.3.1"
|
"fsevents": "~2.3.1"
|
||||||
@@ -942,9 +897,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"svelte": {
|
"svelte": {
|
||||||
"version": "3.38.1",
|
"version": "3.38.2",
|
||||||
"resolved": "https://registry.npmjs.org/svelte/-/svelte-3.38.1.tgz",
|
"resolved": "https://registry.npmjs.org/svelte/-/svelte-3.38.2.tgz",
|
||||||
"integrity": "sha512-N3XLAyfzqrFxwRLevBeW7Dke9ZlHRVGSIed5abo4Drvj+zvd2OyWpFa1x4nQUc8Lnvt4Kcn8/5le1peRDybNqg==",
|
"integrity": "sha512-q5Dq0/QHh4BLJyEVWGe7Cej5NWs040LWjMbicBGZ+3qpFWJ1YObRmUDZKbbovddLC9WW7THTj3kYbTOFmU9fbg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"svelte-hmr": {
|
"svelte-hmr": {
|
||||||
@@ -955,9 +910,9 @@
|
|||||||
"requires": {}
|
"requires": {}
|
||||||
},
|
},
|
||||||
"svelte-preprocess": {
|
"svelte-preprocess": {
|
||||||
"version": "4.7.2",
|
"version": "4.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-4.7.3.tgz",
|
||||||
"integrity": "sha512-EToG+08rEsA33btv+C5g2qnRArwpTc5AoU0QBB3ZEkYagxAb2yPNsy0qsmtvbJOTBMy6o3oyijDdl3DMpMvpEg==",
|
"integrity": "sha512-Zx1/xLeGOIBlZMGPRCaXtlMe4ZA0faato5Dc3CosEqwu75MIEPuOstdkH6cy+RYTUYynoxzNaDxkPX4DbrPwRA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/pug": "^2.0.4",
|
"@types/pug": "^2.0.4",
|
||||||
@@ -984,9 +939,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"vite": {
|
"vite": {
|
||||||
"version": "2.2.3",
|
"version": "2.2.4",
|
||||||
"resolved": "https://registry.npmjs.org/vite/-/vite-2.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/vite/-/vite-2.2.4.tgz",
|
||||||
"integrity": "sha512-PtjyBL4GtACM+uT5q5hi2+AlMBbb6YI2b2bam6QI8ZdZt4FezseF0yZHQx0G+b3po9jIJ/GS5N9gc5Yq9Rue7g==",
|
"integrity": "sha512-vnIwSNci+phFMp6krhy+FbYzKL0R67Sdt9mVZ96S27AewrApSJjTqncJcalk8sf60BgcbW4+1C6DFIWkxquO9g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"esbuild": "^0.9.3",
|
"esbuild": "^0.9.3",
|
||||||
|
@@ -18,7 +18,6 @@
|
|||||||
"type": "module",
|
"type": "module",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fontsource/fira-mono": "^4.2.2",
|
"@fontsource/fira-mono": "^4.2.2",
|
||||||
"axios": "^0.21.1",
|
|
||||||
"copy-to-clipboard": "^3.3.1"
|
"copy-to-clipboard": "^3.3.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -7,29 +7,46 @@
|
|||||||
:root {
|
:root {
|
||||||
font-family: 'Fira Mono', monospace;
|
font-family: 'Fira Mono', monospace;
|
||||||
|
|
||||||
--ui-bg-0: #fefefe;
|
--ui-bg-0: #111;
|
||||||
--ui-bg-0-85: #fefefed9;
|
--ui-bg-0-85: #111111d9;
|
||||||
--ui-bg-1: #eee;
|
--ui-bg-1: #333;
|
||||||
--ui-bg-2: #e2e2e2;
|
--ui-bg-2: #444;
|
||||||
--ui-text-0: #111;
|
--ui-text-0: #fefefe;
|
||||||
--ui-text-1: #222;
|
--ui-text-1: #eee;
|
||||||
--ui-clr-primary: hsl(186, 65%, 55%);
|
--ui-clr-primary: hsl(186, 65%, 55%);
|
||||||
--ui-clr-error: hsl(357, 77%, 51%);
|
--ui-clr-error: hsl(357, 77%, 51%);
|
||||||
|
|
||||||
--ui-anim: all 150ms ease;
|
--ui-anim: all 150ms ease;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (prefers-color-scheme: dark) {
|
@media (prefers-color-scheme: light) {
|
||||||
:root {
|
:root {
|
||||||
--ui-bg-0: #111;
|
--ui-bg-0: #fefefe;
|
||||||
--ui-bg-0-85: #111111d9;
|
--ui-bg-0-85: #fefefed9;
|
||||||
--ui-bg-1: #222;
|
--ui-bg-1: #eee;
|
||||||
--ui-bg-2: #282828;
|
--ui-bg-2: #e2e2e2;
|
||||||
--ui-text-0: #fefefe;
|
--ui-text-0: #111;
|
||||||
--ui-text-1: #eee;
|
--ui-text-1: #333;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:root[theme='dark'] {
|
||||||
|
--ui-bg-0: #111 !important;
|
||||||
|
--ui-bg-0-85: #111111d9 !important;
|
||||||
|
--ui-bg-1: #333 !important;
|
||||||
|
--ui-bg-2: #444 !important;
|
||||||
|
--ui-text-0: #fefefe !important;
|
||||||
|
--ui-text-1: #eee !important;
|
||||||
|
}
|
||||||
|
:root[theme='light'] {
|
||||||
|
--ui-bg-0: #fefefe !important;
|
||||||
|
--ui-bg-0-85: #fefefed9 !important;
|
||||||
|
--ui-bg-1: #eee !important;
|
||||||
|
--ui-bg-2: #e2e2e2 !important;
|
||||||
|
--ui-text-0: #111 !important;
|
||||||
|
--ui-text-1: #333 !important;
|
||||||
|
}
|
||||||
|
|
||||||
.error-text {
|
.error-text {
|
||||||
color: var(--ui-clr-error);
|
color: var(--ui-clr-error);
|
||||||
}
|
}
|
||||||
@@ -61,6 +78,8 @@ input,
|
|||||||
textarea,
|
textarea,
|
||||||
button {
|
button {
|
||||||
appearance: none;
|
appearance: none;
|
||||||
|
-webkit-appearance: none;
|
||||||
|
border-radius: 0;
|
||||||
transition: var(--ui-anim);
|
transition: var(--ui-anim);
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
font-size: inherit;
|
font-size: inherit;
|
||||||
|
@@ -1,8 +1,5 @@
|
|||||||
import axios from 'axios'
|
|
||||||
import { dev } from '$app/env'
|
import { dev } from '$app/env'
|
||||||
|
|
||||||
const base = axios.create({ baseURL: dev ? 'http://localhost:5000' : undefined })
|
|
||||||
|
|
||||||
export type Note = {
|
export type Note = {
|
||||||
contents: string
|
contents: string
|
||||||
views?: number
|
views?: number
|
||||||
@@ -11,26 +8,43 @@ export type Note = {
|
|||||||
export type NoteInfo = {}
|
export type NoteInfo = {}
|
||||||
export type NotePublic = Pick<Note, 'contents'>
|
export type NotePublic = Pick<Note, 'contents'>
|
||||||
|
|
||||||
|
type CallOptions = {
|
||||||
|
url: string
|
||||||
|
method: string
|
||||||
|
body?: any
|
||||||
|
}
|
||||||
|
const base = dev ? 'http://localhost:5000/api/' : '/api/'
|
||||||
|
async function call(options: CallOptions) {
|
||||||
|
return fetch(base + options.url, {
|
||||||
|
method: options.method,
|
||||||
|
body: options.body === undefined ? undefined : JSON.stringify(options.body),
|
||||||
|
mode: 'cors',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
}).then((r) => r.json())
|
||||||
|
}
|
||||||
|
|
||||||
export async function create(note: Note) {
|
export async function create(note: Note) {
|
||||||
const { data } = await base({
|
const data = await call({
|
||||||
url: '/api/notes',
|
url: 'notes',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: note,
|
body: note,
|
||||||
})
|
})
|
||||||
return data as { id: string }
|
return data as { id: string }
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function get(id: string) {
|
export async function get(id: string) {
|
||||||
const { data } = await base({
|
const data = await call({
|
||||||
url: `/api/notes/${id}`,
|
url: `notes/${id}`,
|
||||||
method: 'delete',
|
method: 'delete',
|
||||||
})
|
})
|
||||||
return data as NotePublic
|
return data as NotePublic
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function info(id: string) {
|
export async function info(id: string) {
|
||||||
const { data } = await base({
|
const data = await call({
|
||||||
url: `/api/notes/${id}`,
|
url: `notes/${id}`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
})
|
})
|
||||||
return data as NoteInfo
|
return data as NoteInfo
|
||||||
|
@@ -36,7 +36,7 @@ export function getKeyFromString(password: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function getDerivedForKey(key: CryptoKey, salt: ArrayBuffer) {
|
export async function getDerivedForKey(key: CryptoKey, salt: ArrayBuffer) {
|
||||||
const iterations = 1_000
|
const iterations = 100_000
|
||||||
return window.crypto.subtle.deriveKey(
|
return window.crypto.subtle.deriveKey(
|
||||||
{
|
{
|
||||||
name: 'PBKDF2',
|
name: 'PBKDF2',
|
||||||
|
62
client/src/lib/ui/ThemeToggle.svelte
Normal file
62
client/src/lib/ui/ThemeToggle.svelte
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
<script lang="ts" context="module">
|
||||||
|
import { writable } from 'svelte/store'
|
||||||
|
|
||||||
|
export enum Theme {
|
||||||
|
Dark = 'dark',
|
||||||
|
Light = 'light',
|
||||||
|
Auto = 'auto',
|
||||||
|
}
|
||||||
|
|
||||||
|
const NextTheme = {
|
||||||
|
[Theme.Auto]: Theme.Light,
|
||||||
|
[Theme.Light]: Theme.Dark,
|
||||||
|
[Theme.Dark]: Theme.Auto,
|
||||||
|
}
|
||||||
|
|
||||||
|
function init(): Theme {
|
||||||
|
if (typeof window !== 'undefined') {
|
||||||
|
const saved = window.localStorage.getItem('theme') as Theme
|
||||||
|
if (Object.values(Theme).includes(saved)) return saved
|
||||||
|
}
|
||||||
|
return Theme.Auto
|
||||||
|
}
|
||||||
|
|
||||||
|
export const theme = writable<Theme>(init())
|
||||||
|
|
||||||
|
theme.subscribe((theme) => {
|
||||||
|
if (typeof window !== 'undefined') {
|
||||||
|
window.localStorage.setItem('theme', theme)
|
||||||
|
const html = window.document.getElementsByTagName('html')[0]
|
||||||
|
html.setAttribute('theme', theme)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Icon from '$lib/ui/Icon.svelte'
|
||||||
|
|
||||||
|
function change() {
|
||||||
|
theme.update((current) => NextTheme[current])
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div on:click={change}>
|
||||||
|
<Icon class="icon" icon="contrast-sharp" />
|
||||||
|
{$theme}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
div :global(.icon) {
|
||||||
|
height: 1rem;
|
||||||
|
width: 1rem;
|
||||||
|
margin-right: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
div {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: flex-end;
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
</style>
|
@@ -50,7 +50,8 @@
|
|||||||
password: password,
|
password: password,
|
||||||
id: response.id,
|
id: response.id,
|
||||||
}
|
}
|
||||||
} catch {
|
} catch (e) {
|
||||||
|
console.error(e)
|
||||||
error = 'could not create note.'
|
error = 'could not create note.'
|
||||||
} finally {
|
} finally {
|
||||||
loading = false
|
loading = false
|
||||||
@@ -66,26 +67,49 @@
|
|||||||
<TextInput
|
<TextInput
|
||||||
type="text"
|
type="text"
|
||||||
readonly
|
readonly
|
||||||
value="{window.location.origin}/note/{result.id}/{result.password}"
|
label="share link"
|
||||||
|
value="{window.location.origin}/note/{result.id}#{result.password}"
|
||||||
copy
|
copy
|
||||||
|
data-testid="note-share-link"
|
||||||
/>
|
/>
|
||||||
<br />
|
<br />
|
||||||
<Button on:click={reset}>new</Button>
|
<p>
|
||||||
|
<b>availability:</b>
|
||||||
|
<br />
|
||||||
|
the note is not guaranteed to be stored as everything is kept in ram, if it fills up the oldest notes
|
||||||
|
will be removed.
|
||||||
|
<br />
|
||||||
|
(you probably will be fine, just be warned.)
|
||||||
|
</p>
|
||||||
|
<br />
|
||||||
|
<Button on:click={reset}>new note</Button>
|
||||||
{:else}
|
{:else}
|
||||||
<form on:submit|preventDefault={submit}>
|
<form on:submit|preventDefault={submit}>
|
||||||
<fieldset disabled={loading}>
|
<fieldset disabled={loading}>
|
||||||
<TextArea label="note" bind:value={note.contents} placeholder="..." />
|
<TextArea
|
||||||
|
label="note"
|
||||||
|
bind:value={note.contents}
|
||||||
|
placeholder="..."
|
||||||
|
data-testid="input-note"
|
||||||
|
/>
|
||||||
|
|
||||||
<div class="bottom">
|
<div class="bottom">
|
||||||
<Switch label="advanced" bind:value={advanced} />
|
<Switch label="advanced" bind:value={advanced} />
|
||||||
<Button type="submit">create</Button>
|
<Button type="submit" data-testid="button-create">create</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{#if error}
|
{#if error}
|
||||||
<div class="error-text">{error}</div>
|
<div class="error-text">{error}</div>
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<p><br />{message}</p>
|
<p>
|
||||||
|
<br />
|
||||||
|
{#if loading}
|
||||||
|
loading...
|
||||||
|
{:else}
|
||||||
|
{message}
|
||||||
|
{/if}
|
||||||
|
</p>
|
||||||
|
|
||||||
<div class="advanced" class:hidden={!advanced}>
|
<div class="advanced" class:hidden={!advanced}>
|
||||||
<br />
|
<br />
|
||||||
|
37
client/src/lib/views/Footer.svelte
Normal file
37
client/src/lib/views/Footer.svelte
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<script lang="ts">
|
||||||
|
import Icon from '$lib/ui/Icon.svelte'
|
||||||
|
import ThemeToggle from '$lib/ui/ThemeToggle.svelte'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<ThemeToggle />
|
||||||
|
<nav>
|
||||||
|
<a href="/">/home</a>
|
||||||
|
<a href="/about">/about</a>
|
||||||
|
<a href="https://github.com/cupcakearmy/cryptgeon" target="_blank" rel="noopener">/code</a>
|
||||||
|
</nav>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 1rem;
|
||||||
|
position: fixed;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
width: 100%;
|
||||||
|
background-color: var(--ui-bg-0-85);
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
margin: 0 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
nav {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: flex-end;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
</style>
|
@@ -8,9 +8,8 @@
|
|||||||
xmlns="http://www.w3.org/2000/svg"
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
xml:space="preserve"
|
xml:space="preserve"
|
||||||
xmlns:serif="http://www.serif.com/"
|
|
||||||
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
|
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
|
||||||
><g
|
><g id="Logo"
|
||||||
><clipPath id="_clip1"><rect x="6.336" y="3.225" width="193.55" height="193.55" /></clipPath
|
><clipPath id="_clip1"><rect x="6.336" y="3.225" width="193.55" height="193.55" /></clipPath
|
||||||
><g clip-path="url(#_clip1)"
|
><g clip-path="url(#_clip1)"
|
||||||
><g
|
><g
|
||||||
@@ -42,10 +41,35 @@
|
|||||||
/></g
|
/></g
|
||||||
></g
|
></g
|
||||||
></g
|
></g
|
||||||
><text
|
><g
|
||||||
x="197.239px"
|
><path
|
||||||
y="127.131px"
|
d="M222.664,114.692c0.85,-0 1.274,0.586 1.274,1.759c0,1.174 -0.242,2.347 -0.728,3.52c-0.485,1.173 -1.183,2.326 -2.093,3.459c-0.91,1.132 -2.185,2.063 -3.823,2.791c-1.639,0.728 -3.489,1.092 -5.552,1.092c-4.531,0 -8.081,-1.143 -10.65,-3.428c-2.569,-2.286 -3.853,-5.644 -3.853,-10.073c-0,-4.43 1.133,-7.889 3.398,-10.377c2.265,-2.488 5.158,-3.732 8.677,-3.732c2.549,0 4.41,0.678 5.583,2.033c1.173,1.355 1.76,2.964 1.76,4.824c-0,1.012 -0.304,1.821 -0.91,2.428c-0.607,0.606 -1.194,0.91 -1.76,0.91c-1.052,-0 -1.74,-0.243 -2.063,-0.728c0.242,-0.607 0.364,-1.477 0.364,-2.61c-0,-1.132 -0.385,-2.164 -1.153,-3.094c-0.769,-0.931 -1.699,-1.396 -2.792,-1.396c-1.901,0 -3.266,0.93 -4.095,2.791c-0.83,1.861 -1.244,4.784 -1.244,8.769c-0,3.984 0.778,6.867 2.336,8.647c1.557,1.78 3.732,2.67 6.523,2.67c2.791,-0 5.138,-0.86 7.039,-2.579c1.901,-1.72 2.852,-4.157 2.852,-7.312c0.04,-0.243 0.344,-0.364 0.91,-0.364Z"
|
||||||
style="font-family:'Sofia-Regular', 'Sofia';font-size:60.681px;">cryptgeon</text
|
style="fill-rule:nonzero;"
|
||||||
|
/><path
|
||||||
|
d="M227.337,116.815l-0,9.649c-0.405,0.566 -1.113,0.849 -2.124,0.849c-1.012,0 -1.821,-0.313 -2.428,-0.94c-0.606,-0.627 -0.91,-1.548 -0.91,-2.761l0,-23.059c0.405,-0.566 1.113,-0.85 2.124,-0.85c1.011,0 1.821,0.314 2.427,0.941c0.607,0.627 0.911,1.547 0.911,2.761l-0,4.612c2.022,-5.017 4.814,-7.525 8.373,-7.525c2.549,0 4.41,0.678 5.583,2.033c1.173,1.355 1.76,2.963 1.76,4.824c-0,1.012 -0.304,1.821 -0.91,2.427c-0.607,0.607 -1.194,0.911 -1.76,0.911c-1.052,-0 -1.74,-0.243 -2.063,-0.728c0.242,-0.607 0.364,-1.477 0.364,-2.61c-0,-1.132 -0.384,-2.164 -1.153,-3.094c-0.769,-0.931 -1.699,-1.396 -2.791,-1.396c-1.902,-0 -3.611,1.729 -5.128,5.188c-1.517,3.459 -2.275,6.382 -2.275,8.768Z"
|
||||||
|
style="fill-rule:nonzero;"
|
||||||
|
/><path
|
||||||
|
d="M245.419,103.405c0,-1.214 0.304,-2.134 0.911,-2.761c0.606,-0.627 1.375,-0.941 2.306,-0.941c0.93,0 1.678,0.284 2.245,0.85l-0,17.415c-0,4.814 1.213,7.221 3.641,7.221c2.184,0 3.974,-1.153 5.37,-3.458c1.395,-2.306 2.093,-6.19 2.093,-11.651l0,-6.675c0,-1.214 0.304,-2.134 0.91,-2.761c0.607,-0.627 1.376,-0.941 2.306,-0.941c0.931,0 1.679,0.284 2.246,0.85l-0,30.826c0.485,-0.041 1.254,-0.061 2.305,-0.061c1.052,0 1.578,0.445 1.578,1.335l-0.364,0.91c-1.537,0 -2.71,0.021 -3.519,0.061l-0,3.034c-0,4.167 -0.941,7.454 -2.822,9.861c-1.881,2.407 -4.399,3.61 -7.555,3.61c-1.861,0 -3.509,-0.556 -4.945,-1.669c-1.436,-1.112 -2.155,-2.862 -2.155,-5.248c0,-3.075 1.093,-5.522 3.277,-7.343c2.185,-1.82 5.097,-3.095 8.738,-3.823l0,-9.466c-1.699,3.156 -4.429,4.733 -8.192,4.733c-2.589,0 -4.632,-0.829 -6.128,-2.488c-1.497,-1.658 -2.246,-4.045 -2.246,-7.16l0,-14.26Zm7.646,39.989c0,1.416 0.385,2.498 1.153,3.246c0.769,0.748 1.699,1.123 2.791,1.123c1.093,-0 1.983,-0.324 2.67,-0.971c1.538,-1.376 2.306,-5.522 2.306,-12.44c-5.946,1.335 -8.92,4.349 -8.92,9.042Z"
|
||||||
|
style="fill-rule:nonzero;"
|
||||||
|
/><path
|
||||||
|
d="M298.576,104.861c1.335,2.306 2.002,5.411 2.002,9.315c0,3.904 -0.981,7.059 -2.943,9.466c-1.962,2.407 -4.52,3.611 -7.676,3.611c-1.861,-0 -3.509,-0.648 -4.945,-1.942c-1.436,-1.295 -2.155,-3.358 -2.155,-6.19c0,-6.634 3.297,-11.59 9.891,-14.866c-1.051,-1.457 -2.518,-2.185 -4.399,-2.185c-1.881,0 -3.671,0.93 -5.37,2.791c-1.699,1.861 -2.549,4.653 -2.549,8.374l0,36.105c-0.404,0.567 -1.112,0.85 -2.124,0.85c-1.011,-0 -1.82,-0.314 -2.427,-0.941c-0.607,-0.627 -0.91,-1.547 -0.91,-2.761l-0,-45.935c0.405,-0.566 1.112,-0.85 2.124,-0.85c1.011,0 1.82,0.314 2.427,0.941c0.607,0.627 0.91,1.547 0.91,2.761l0,1.335c2.104,-3.358 4.885,-5.037 8.344,-5.037c3.459,0 6.159,0.971 8.101,2.913c4.247,-1.375 9.001,-2.063 14.26,-2.063c1.092,-0 1.638,0.445 1.638,1.335l-0.364,0.91c-4.895,0 -9.507,0.688 -13.835,2.063Zm-8.738,20.025c3.317,-0 4.976,-3.297 4.976,-9.891c-0,-3.479 -0.284,-6.21 -0.85,-8.192c-5.34,2.913 -8.01,7.08 -8.01,12.5c0,1.78 0.385,3.156 1.153,4.127c0.769,0.971 1.679,1.456 2.731,1.456Z"
|
||||||
|
style="fill-rule:nonzero;"
|
||||||
|
/><path
|
||||||
|
d="M308.285,94.424c-0,-1.213 0.303,-2.134 0.91,-2.761c0.607,-0.627 1.375,-0.94 2.306,-0.94c0.93,-0 1.679,0.283 2.245,0.849l0,8.981l8.313,-0c0.85,-0 1.406,0.162 1.669,0.485c0.263,0.324 0.394,0.87 0.394,1.639l-10.376,-0l0,15.291c0,2.225 0.637,3.945 1.911,5.158c1.275,1.214 2.741,1.821 4.4,1.821c2.508,-0 4.349,-0.931 5.522,-2.792c1.173,-1.861 1.76,-4.874 1.76,-9.041c0.08,-0.243 0.384,-0.364 0.91,-0.364c0.728,-0 1.092,1.072 1.092,3.216c-0,3.277 -0.819,5.987 -2.458,8.131c-1.638,2.144 -4.156,3.216 -7.554,3.216c-3.398,0 -6.089,-0.89 -8.071,-2.67c-1.982,-1.78 -2.973,-4.429 -2.973,-7.949l-0,-22.27Z"
|
||||||
|
style="fill-rule:nonzero;"
|
||||||
|
/><path
|
||||||
|
d="M345.543,101.463c0.526,-1.173 1.365,-1.76 2.518,-1.76c1.153,0 2.013,0.284 2.579,0.85l-0,30.826c0.485,-0.041 1.254,-0.061 2.306,-0.061c1.052,0 1.578,0.445 1.578,1.335l-0.365,0.91c-1.537,0 -2.71,0.021 -3.519,0.061l-0,3.155c-0.041,4.167 -1.001,7.434 -2.882,9.8c-1.882,2.367 -4.38,3.55 -7.494,3.55c-1.861,0 -3.51,-0.556 -4.946,-1.669c-1.436,-1.112 -2.154,-2.862 -2.154,-5.248c-0,-3.075 1.092,-5.522 3.277,-7.343c2.184,-1.82 5.097,-3.095 8.738,-3.823l-0,-8.92c-1.699,2.792 -4.046,4.187 -7.039,4.187c-7.08,0 -10.619,-4.632 -10.619,-13.896c-0,-4.692 1.102,-8.151 3.307,-10.376c2.204,-2.225 5.127,-3.338 8.768,-3.338c2.791,0 4.774,0.587 5.947,1.76Zm-0.364,12.986l-0,-4.308c-0,-2.873 -0.486,-4.936 -1.457,-6.19c-0.971,-1.254 -2.093,-1.881 -3.367,-1.881c-1.275,0 -2.276,0.121 -3.004,0.364c-0.728,0.243 -1.436,0.748 -2.124,1.517c-1.295,1.456 -1.942,4.612 -1.942,9.466c0,3.196 0.283,5.684 0.85,7.464c0.566,1.78 1.213,2.903 1.942,3.368c0.728,0.465 1.749,0.698 3.064,0.698c1.315,-0 2.65,-0.84 4.005,-2.519c1.355,-1.678 2.033,-4.338 2.033,-7.979Zm-0,22.209l-0,-2.306c-5.947,1.335 -8.92,4.349 -8.92,9.042c-0,1.416 0.384,2.498 1.153,3.246c0.768,0.748 1.678,1.123 2.73,1.123c1.699,-0 2.963,-0.789 3.793,-2.367c0.829,-1.578 1.244,-4.49 1.244,-8.738Z"
|
||||||
|
style="fill-rule:nonzero;"
|
||||||
|
/><path
|
||||||
|
d="M381.891,113.478c0.849,-0 1.274,0.647 1.274,1.942c-0,2.993 -1.042,5.724 -3.125,8.192c-2.084,2.467 -5.249,3.701 -9.497,3.701c-4.247,0 -7.656,-1.143 -10.224,-3.428c-2.569,-2.286 -3.854,-5.644 -3.854,-10.073c0,-4.43 1.133,-7.889 3.398,-10.377c2.266,-2.488 5.158,-3.732 8.678,-3.732c2.548,0 4.409,0.678 5.582,2.033c1.174,1.355 1.76,2.964 1.76,4.824c0,3.034 -1.264,5.553 -3.792,7.555c-2.529,2.003 -5.755,3.004 -9.679,3.004c0.364,2.589 1.305,4.541 2.822,5.856c1.517,1.314 3.519,1.972 6.007,1.972c2.488,-0 4.733,-0.941 6.736,-2.822c2.002,-1.881 3.003,-4.642 3.003,-8.283c0.041,-0.243 0.344,-0.364 0.911,-0.364Zm-19.661,0.85l-0,0.546c2.508,-0.324 4.682,-1.113 6.523,-2.367c1.841,-1.254 2.761,-3.115 2.761,-5.583c0,-1.577 -0.344,-2.781 -1.031,-3.61c-0.688,-0.829 -1.659,-1.244 -2.913,-1.244c-1.901,0 -3.267,0.93 -4.096,2.791c-0.829,1.861 -1.244,5.017 -1.244,9.467Z"
|
||||||
|
style="fill-rule:nonzero;"
|
||||||
|
/><path
|
||||||
|
d="M393.359,99.703c3.601,0 6.534,1.194 8.799,3.581c2.265,2.386 3.398,5.633 3.398,9.739c0,4.106 -1.062,7.514 -3.186,10.225c-2.124,2.71 -4.965,4.065 -8.525,4.065c-3.56,0 -6.524,-1.224 -8.89,-3.671c-2.367,-2.447 -3.55,-5.846 -3.55,-10.194c0,-4.349 1.102,-7.727 3.307,-10.134c2.205,-2.407 5.087,-3.611 8.647,-3.611Zm0.061,2.367c-1.092,0 -2.033,0.273 -2.822,0.819c-0.789,0.546 -1.183,1.325 -1.183,2.336c-0,2.589 1.011,5.067 3.034,7.434c2.023,2.366 4.43,3.934 7.221,4.703c0.081,-1.538 0.121,-2.852 0.121,-3.945c0,-4.207 -0.445,-7.15 -1.335,-8.829c-0.89,-1.679 -2.568,-2.518 -5.036,-2.518Zm-6.25,11.347c-0,4.127 0.516,7.08 1.547,8.86c1.032,1.78 2.721,2.67 5.067,2.67c1.618,-0 2.862,-0.415 3.732,-1.244c0.87,-0.83 1.466,-2.175 1.79,-4.036c-2.63,-0.566 -5.047,-1.759 -7.251,-3.58c-2.205,-1.82 -3.813,-3.843 -4.825,-6.068c-0.04,0.688 -0.06,1.821 -0.06,3.398Z"
|
||||||
|
style="fill-rule:nonzero;"
|
||||||
|
/><path
|
||||||
|
d="M442.571,112.75c0.729,-0 1.093,1.072 1.093,3.216c-0,3.438 -0.739,6.189 -2.215,8.252c-1.477,2.064 -3.631,3.095 -6.463,3.095c-2.832,0 -5.006,-0.971 -6.523,-2.912c-1.517,-1.942 -2.275,-4.693 -2.275,-8.253l-0,-7.1c-0,-4.814 -1.214,-7.221 -3.641,-7.221c-2.144,0 -3.904,1.093 -5.28,3.277c-1.375,2.185 -2.063,5.846 -2.063,10.983l0,10.377c-0.404,0.566 -1.112,0.849 -2.124,0.849c-1.011,0 -1.82,-0.313 -2.427,-0.94c-0.607,-0.627 -0.91,-1.548 -0.91,-2.761l0,-23.059c0.405,-0.566 1.173,-0.85 2.306,-0.85c2.103,0 3.155,1.517 3.155,4.552c1.699,-3.035 4.39,-4.552 8.071,-4.552c2.629,0 4.723,0.83 6.28,2.488c1.558,1.659 2.337,4.046 2.337,7.161l-0,8.616c-0,2.306 0.364,4.046 1.092,5.219c0.728,1.173 1.81,1.76 3.246,1.76c1.436,-0 2.7,-0.9 3.793,-2.701c1.092,-1.8 1.638,-4.844 1.638,-9.132c0.041,-0.243 0.344,-0.364 0.91,-0.364Z"
|
||||||
|
style="fill-rule:nonzero;"
|
||||||
|
/></g
|
||||||
></g
|
></g
|
||||||
></svg
|
></svg
|
||||||
>
|
>
|
||||||
@@ -78,5 +102,6 @@
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 16rem;
|
max-width: 16rem;
|
||||||
transform: translateX(-1rem);
|
transform: translateX(-1rem);
|
||||||
|
fill: currentColor;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import Footer from '$lib/views/Footer.svelte'
|
||||||
import Header from '$lib/views/Header.svelte'
|
import Header from '$lib/views/Header.svelte'
|
||||||
|
|
||||||
import '../app.css'
|
import '../app.css'
|
||||||
@@ -13,16 +14,9 @@
|
|||||||
<slot />
|
<slot />
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<footer>
|
<Footer />
|
||||||
<a href="/">/home</a>
|
|
||||||
<a href="/about">/about</a>
|
|
||||||
<a href="https://github.com/cupcakearmy/cryptgeon" target="_blank" rel="noopener">/code</a>
|
|
||||||
</footer>
|
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
a {
|
|
||||||
margin: 0 0.5rem;
|
|
||||||
}
|
|
||||||
main {
|
main {
|
||||||
padding: 1rem;
|
padding: 1rem;
|
||||||
padding-bottom: 4rem;
|
padding-bottom: 4rem;
|
||||||
@@ -30,17 +24,4 @@
|
|||||||
max-width: 35rem;
|
max-width: 35rem;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
footer {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: flex-end;
|
|
||||||
align-items: center;
|
|
||||||
padding: 1rem;
|
|
||||||
position: fixed;
|
|
||||||
bottom: 0;
|
|
||||||
right: 0;
|
|
||||||
width: 100%;
|
|
||||||
background-color: var(--ui-bg-0-85);
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
<h1>About</h1>
|
<h1>About</h1>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<i>cryptgeon</i> is an secure, open source sharing note service inspired by
|
<i>cryptgeon</i> is a secure, open source sharing note service inspired by
|
||||||
<a href="https://privnote.com"><i>PrivNote</i></a>.
|
<a href="https://privnote.com"><i>PrivNote</i></a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
<b>▶ Features</b>
|
<b>▶ Features</b>
|
||||||
<ul>
|
<ul>
|
||||||
<li>server cannot decrypt contents due to client side encryption</li>
|
<li>server cannot decrypt contents due to client side encryption</li>
|
||||||
<li>view and time constrains</li>
|
<li>view and time constraints</li>
|
||||||
<li>in memory, no persistence</li>
|
<li>in memory, no persistence</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
|
@@ -7,18 +7,17 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import { onMount } from 'svelte'
|
||||||
|
import copy from 'copy-to-clipboard'
|
||||||
|
|
||||||
import type { NotePublic } from '$lib/api'
|
import type { NotePublic } from '$lib/api'
|
||||||
import { info, get } from '$lib/api'
|
import { info, get } from '$lib/api'
|
||||||
import { decrypt, getKeyFromString } from '$lib/crypto'
|
import { decrypt, getKeyFromString } from '$lib/crypto'
|
||||||
import Button from '$lib/ui/Button.svelte'
|
import Button from '$lib/ui/Button.svelte'
|
||||||
import TextInput from '$lib/ui/TextInput.svelte'
|
|
||||||
import copy from 'copy-to-clipboard'
|
|
||||||
|
|
||||||
import { onMount } from 'svelte'
|
|
||||||
|
|
||||||
export let id: string
|
export let id: string
|
||||||
export let password: string
|
|
||||||
|
|
||||||
|
let password: string
|
||||||
let note: NotePublic | null = null
|
let note: NotePublic | null = null
|
||||||
let exists = false
|
let exists = false
|
||||||
|
|
||||||
@@ -29,6 +28,8 @@
|
|||||||
try {
|
try {
|
||||||
loading = true
|
loading = true
|
||||||
error = null
|
error = null
|
||||||
|
password = window.location.hash.slice(1)
|
||||||
|
console.log(password)
|
||||||
await info(id)
|
await info(id)
|
||||||
exists = true
|
exists = true
|
||||||
} catch {
|
} catch {
|
||||||
@@ -41,40 +42,50 @@
|
|||||||
async function show() {
|
async function show() {
|
||||||
try {
|
try {
|
||||||
error = false
|
error = false
|
||||||
|
loading = true
|
||||||
const data = note || (await get(id)) // Don't get the content twice on wrong password.
|
const data = note || (await get(id)) // Don't get the content twice on wrong password.
|
||||||
const key = await getKeyFromString(password)
|
const key = await getKeyFromString(password)
|
||||||
data.contents = await decrypt(data.contents, key)
|
data.contents = await decrypt(data.contents, key)
|
||||||
note = data
|
note = data
|
||||||
} catch {
|
} catch {
|
||||||
error = true
|
error = true
|
||||||
|
} finally {
|
||||||
|
loading = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if !loading}
|
{#if !loading}
|
||||||
{#if !exists}
|
{#if !exists}
|
||||||
<p class="error-text">note was not found or was already deleted.</p>
|
<p class="error-text" data-testid="note-not-found">
|
||||||
|
note was not found or was already deleted.
|
||||||
|
</p>
|
||||||
{:else if note && !error}
|
{:else if note && !error}
|
||||||
<p class="error-text">you will not get the chance to see the note again.</p>
|
<p class="error-text">you will not get the chance to see the note again.</p>
|
||||||
<div class="note">
|
<div class="note" data-testid="note-result">
|
||||||
{note.contents}
|
{note.contents}
|
||||||
</div>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
<Button on:click={() => copy(note.contents)}>copy to clipboard</Button>
|
<Button on:click={() => copy(note.contents)}>copy to clipboard</Button>
|
||||||
{:else}
|
{:else}
|
||||||
<form on:submit|preventDefault={show}>
|
<form on:submit|preventDefault={show}>
|
||||||
<p>click below to show and delete the note if the counter has reached it's limit</p>
|
<fieldset>
|
||||||
<Button type="submit">show note</Button>
|
<p>click below to show and delete the note if the counter has reached it's limit</p>
|
||||||
{#if error}
|
<Button type="submit" data-testid="button-show">show note</Button>
|
||||||
<br />
|
{#if error}
|
||||||
<p class="error-text">
|
|
||||||
wrong password. could not decipher. probably a broken link. note was destroyed.
|
|
||||||
<br />
|
<br />
|
||||||
</p>
|
<p class="error-text">
|
||||||
{/if}
|
wrong password. could not decipher. probably a broken link. note was destroyed.
|
||||||
|
<br />
|
||||||
|
</p>
|
||||||
|
{/if}
|
||||||
|
</fieldset>
|
||||||
</form>
|
</form>
|
||||||
{/if}
|
{/if}
|
||||||
{/if}
|
{/if}
|
||||||
|
{#if loading}
|
||||||
|
<p>loading...</p>
|
||||||
|
{/if}
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.note {
|
.note {
|
1
client/static/icons/contrast-sharp.svg
Normal file
1
client/static/icons/contrast-sharp.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns='http://www.w3.org/2000/svg' class='ionicon' viewBox='0 0 512 512'><title>Contrast</title><path d='M256 32C132.29 32 32 132.29 32 256s100.29 224 224 224 224-100.29 224-224S379.71 32 256 32zM128.72 383.28A180 180 0 01256 76v360a178.82 178.82 0 01-127.28-52.72z'/></svg>
|
After Width: | Height: | Size: 279 B |
@@ -1,17 +0,0 @@
|
|||||||
const preprocess = require('svelte-preprocess')
|
|
||||||
const adapter = require('@sveltejs/adapter-static')
|
|
||||||
|
|
||||||
/** @type {import('@sveltejs/kit').Config} */
|
|
||||||
module.exports = {
|
|
||||||
// Consult https://github.com/sveltejs/svelte-preprocess
|
|
||||||
// for more information about preprocessors
|
|
||||||
preprocess: preprocess(),
|
|
||||||
|
|
||||||
kit: {
|
|
||||||
adapter: adapter({
|
|
||||||
fallback: 'index.html',
|
|
||||||
}),
|
|
||||||
// hydrate the <div id="svelte"> element in src/app.html
|
|
||||||
target: '#svelte',
|
|
||||||
},
|
|
||||||
}
|
|
13
client/svelte.config.js
Normal file
13
client/svelte.config.js
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
import preprocess from 'svelte-preprocess'
|
||||||
|
import adapter from '@sveltejs/adapter-static'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
preprocess: preprocess(),
|
||||||
|
|
||||||
|
kit: {
|
||||||
|
adapter: adapter({
|
||||||
|
fallback: 'index.html',
|
||||||
|
}),
|
||||||
|
target: '#svelte',
|
||||||
|
},
|
||||||
|
}
|
5
cypress.json
Normal file
5
cypress.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"fixturesFolder": false,
|
||||||
|
"pluginsFile": false,
|
||||||
|
"supportFile": false
|
||||||
|
}
|
2
cypress/.gitignore
vendored
Normal file
2
cypress/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
screenshots
|
||||||
|
videos
|
41
cypress/integration/main.spec.js
Normal file
41
cypress/integration/main.spec.js
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
function createNote(options = {}) {
|
||||||
|
Object.assign(options, {
|
||||||
|
text: `Revaluation battle selfish derive suicide revaluation society love superiority salvation spirit virtues revaluation. Aversion sexuality play burying mountains intentions battle reason strong burying war insofar inexpedient war. Fearful intentions selfish madness suicide.`,
|
||||||
|
})
|
||||||
|
cy.visit('http://localhost:5000')
|
||||||
|
const text = options.text
|
||||||
|
cy.get('[data-testid=input-note]').type(text)
|
||||||
|
cy.get('[data-testid=button-create]').click()
|
||||||
|
cy.wait(500)
|
||||||
|
return cy
|
||||||
|
.get('[data-testid=note-share-link]')
|
||||||
|
.invoke('val')
|
||||||
|
.then((link) => {
|
||||||
|
return [link, text]
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('Basics', () => {
|
||||||
|
it('Share note', () => {
|
||||||
|
createNote().then(([link, text]) => {
|
||||||
|
cy.visit(link)
|
||||||
|
cy.get('[data-testid=button-show]').click()
|
||||||
|
cy.wait(250)
|
||||||
|
cy.get('[data-testid=note-result]').should('have.text', text)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
it('Check destroyed', () => {
|
||||||
|
createNote().then(([link, text]) => {
|
||||||
|
// Check the first time
|
||||||
|
cy.visit(link)
|
||||||
|
cy.get('[data-testid=button-show]').click()
|
||||||
|
cy.wait(250)
|
||||||
|
cy.get('[data-testid=note-result]').should('have.text', text)
|
||||||
|
|
||||||
|
// Should not exists anymore
|
||||||
|
cy.visit(link)
|
||||||
|
cy.get('[data-testid=note-not-found]').should('exist')
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
BIN
design/Logo.afdesign
(Stored with Git LFS)
BIN
design/Logo.afdesign
(Stored with Git LFS)
Binary file not shown.
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 12 KiB |
@@ -12,5 +12,7 @@ services:
|
|||||||
|
|
||||||
app:
|
app:
|
||||||
build: .
|
build: .
|
||||||
|
depends_on:
|
||||||
|
- memcached
|
||||||
ports:
|
ports:
|
||||||
- 80:5000
|
- 5000:5000
|
||||||
|
4572
package-lock.json
generated
4572
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -3,9 +3,14 @@
|
|||||||
"dev:docker": "docker-compose up memcached",
|
"dev:docker": "docker-compose up memcached",
|
||||||
"dev:backend": "cargo watch -x 'run --bin cryptgeon'",
|
"dev:backend": "cargo watch -x 'run --bin cryptgeon'",
|
||||||
"dev:front": "npm --prefix client run dev",
|
"dev:front": "npm --prefix client run dev",
|
||||||
"dev": "run-p dev:*"
|
"dev": "run-p dev:*",
|
||||||
|
"test:server": "docker-compose up --build",
|
||||||
|
"test:cypress": "cypress run --headless",
|
||||||
|
"test:run": "start-server-and-test test:server http://localhost:5000 test:cypress"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"npm-run-all": "^4.1.5"
|
"cypress": "^7.2.0",
|
||||||
|
"npm-run-all": "^4.1.5",
|
||||||
|
"start-server-and-test": "^1.12.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -56,7 +56,8 @@ async fn create(note: web::Json<Note>) -> impl Responder {
|
|||||||
if e > 360 {
|
if e > 360 {
|
||||||
return bad_req;
|
return bad_req;
|
||||||
}
|
}
|
||||||
n.expiration = Some(now() + (e * 60))
|
let expiration = now() + (e * 60);
|
||||||
|
n.expiration = Some(expiration);
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
@@ -89,8 +90,8 @@ async fn delete(path: web::Path<NotePath>) -> impl Responder {
|
|||||||
}
|
}
|
||||||
match changed.expiration {
|
match changed.expiration {
|
||||||
Some(e) => {
|
Some(e) => {
|
||||||
if e > now() {
|
store::del(&p.id.clone());
|
||||||
store::del(&p.id.clone());
|
if e < now() {
|
||||||
return HttpResponse::BadRequest().finish();
|
return HttpResponse::BadRequest().finish();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user