Compare commits

..

13 Commits

Author SHA1 Message Date
24f9aeb229 arm images 2021-05-19 11:29:33 +02:00
976413e11b limit min height 2021-05-17 09:45:01 +02:00
2480d875b4 about page 2021-05-16 12:47:52 +02:00
5dff12ea70 use hash instead of path for key 2021-05-16 11:16:25 +02:00
e332dc63e8 on push 2021-05-14 15:09:55 +02:00
a18e9bcc88 Merge pull request #7 from cupcakearmy/testing
use docker-compose
2021-05-14 14:48:56 +02:00
4b43edf54a use docker-compose 2021-05-14 14:48:34 +02:00
e3aa2dd5ff Update test.yml 2021-05-10 10:13:05 +02:00
98a03c25e6 Merge pull request #6 from cupcakearmy/testing
Testing
2021-05-10 10:11:59 +02:00
7f618e7e45 ci 2021-05-10 10:11:31 +02:00
84a7be4549 config 2021-05-10 10:04:19 +02:00
b2bad5f64c cypress runner 2021-05-10 09:58:21 +02:00
41f55c0920 test ids 2021-05-10 09:58:13 +02:00
13 changed files with 4686 additions and 17 deletions

View File

@@ -14,6 +14,8 @@ jobs:
uses: docker/setup-qemu-action@v1 uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1 uses: docker/setup-buildx-action@v1
with:
install: true
- name: Docker Labels - name: Docker Labels
id: meta id: meta
uses: crazy-max/ghaction-docker-meta@v2 uses: crazy-max/ghaction-docker-meta@v2
@@ -32,7 +34,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
View 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

View File

@@ -5,6 +5,19 @@ 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.1] - 2021-05-17
### Fixed
- Height on big displays
- About page
## [1.1.0] - 2021-05-16
### Security
- Using hash `#` instead of path
## [1.0.11] - 2021-05-08 ## [1.0.11] - 2021-05-08
### Added ### Added

View File

@@ -13,7 +13,7 @@
<style> <style>
textarea { textarea {
width: 100%; width: 100%;
min-height: calc(100vh - 30rem); min-height: min(calc(100vh - 30rem), 30rem);
margin: 0; margin: 0;
border: 2px solid var(--ui-bg-1); border: 2px solid var(--ui-bg-1);
resize: vertical; resize: vertical;

View File

@@ -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
@@ -67,8 +68,9 @@
type="text" type="text"
readonly readonly
label="share link" label="share link"
value="{window.location.origin}/note/{result.id}/{result.password}" value="{window.location.origin}/note/{result.id}#{result.password}"
copy copy
data-testid="note-share-link"
/> />
<br /> <br />
<p> <p>
@@ -84,11 +86,16 @@
{: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}

View File

@@ -20,11 +20,13 @@
<p> <p>
<b>▶ how does it work?</b> <b>▶ how does it work?</b>
<br /> <br />
each note has a 512bit generated <i>id</i> that is used to retrieve the note. data is stored in memory each note has a 512bit generated <i>id</i> that is used to retrieve the note. the note is then encrypted
and never persisted to disk. with aes in gcm mode on the client side and then sent to the server. data is stored in memory and
never persisted to disk. the server never sees the encryption key and cannot decrypt the contents
of the notes even if it tried to.
</p> </p>
<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 constraints</li> <li>view and time constraints</li>

View File

@@ -16,8 +16,8 @@
import Button from '$lib/ui/Button.svelte' import Button from '$lib/ui/Button.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
@@ -28,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 {
@@ -55,10 +57,12 @@
{#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 />
@@ -67,7 +71,7 @@
<form on:submit|preventDefault={show}> <form on:submit|preventDefault={show}>
<fieldset> <fieldset>
<p>click below to show and delete the note if the counter has reached it's limit</p> <p>click below to show and delete the note if the counter has reached it's limit</p>
<Button type="submit">show note</Button> <Button type="submit" data-testid="button-show">show note</Button>
{#if error} {#if error}
<br /> <br />
<p class="error-text"> <p class="error-text">

5
cypress.json Normal file
View File

@@ -0,0 +1,5 @@
{
"fixturesFolder": false,
"pluginsFile": false,
"supportFile": false
}

2
cypress/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
screenshots
videos

View 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')
})
})
})

View File

@@ -15,4 +15,4 @@ services:
depends_on: depends_on:
- memcached - memcached
ports: ports:
- 80:5000 - 5000:5000

4572
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -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"
} }
} }