Fix some linter errors, use blob URL for download

Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
Knut Ahlers 2023-09-23 17:11:28 +02:00
parent 69c2b09bcc
commit b8fd877654
No known key found for this signature in database
GPG Key ID: D91C3E91E4CAD6F5
6 changed files with 28 additions and 16 deletions

1
.eslintignore Normal file
View File

@ -0,0 +1 @@
src/langs/langs.tpl.js

View File

@ -1,7 +1,6 @@
<!doctype html> <!doctype html>
<html lang="en"> <html lang="en">
<head> <head>
<!-- Required meta tags -->
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
@ -64,4 +63,3 @@
></script> ></script>
</body> </body>
</html> </html>

View File

@ -1,3 +1,4 @@
<!-- eslint-disable vue/no-v-html -->
<template> <template>
<div id="app"> <div id="app">
<b-navbar <b-navbar
@ -76,7 +77,10 @@
v-html="$t('title-explanation')" v-html="$t('title-explanation')"
/> />
<ul> <ul>
<li v-for="explanation in $t('items-explanation')"> <li
v-for="(explanation, idx) in $t('items-explanation')"
:key="`idx${idx}`"
>
{{ explanation }} {{ explanation }}
</li> </li>
</ul> </ul>
@ -255,7 +259,7 @@
<i class="fas fa-fw fa-clipboard" /> <i class="fas fa-fw fa-clipboard" />
</b-button> </b-button>
<b-button <b-button
:href="`data:text/plain;charset=UTF-8,${encodeURIComponent(secret)}`" :href="secretContentBlobURL"
download download
title="Download Secret as Text File" title="Download Secret as Text File"
> >
@ -305,6 +309,8 @@
</template> </template>
<script> <script>
/* global maxSecretExpire */
import crypto from './crypto.js' import crypto from './crypto.js'
import qrcode from 'qrcode' import qrcode from 'qrcode'
@ -351,10 +357,11 @@ export default {
explanationShown: false, explanationShown: false,
mode: 'create', mode: 'create',
secret: '', secret: '',
secretContentBlobURL: '',
secretContentQRDataURL: '',
secretExpiry: null, secretExpiry: null,
secretId: '', secretId: '',
secretQRDataURL: '', secretQRDataURL: '',
secretContentQRDataURL: '',
securePassword: '', securePassword: '',
selectedExpiry: null, selectedExpiry: null,
showError: false, showError: false,
@ -443,7 +450,7 @@ export default {
window.setTimeout(() => this.$refs.secretUrl.focus(), 100) window.setTimeout(() => this.$refs.secretUrl.focus(), 100)
}) })
}) })
.catch(err => { .catch(() => {
// Network error // Network error
this.error = this.$t('alert-something-went-wrong') this.error = this.$t('alert-something-went-wrong')
this.showError = true this.showError = true
@ -533,7 +540,7 @@ export default {
}) })
}) })
}) })
.catch(err => { .catch(() => {
// Network error // Network error
this.error = this.$t('alert-something-went-wrong') this.error = this.$t('alert-something-went-wrong')
this.showError = true this.showError = true
@ -558,6 +565,11 @@ export default {
}, },
secret(to) { secret(to) {
if (this.secretContentBlobURL) {
window.URL.revokeObjectURL(this.secretContentBlobURL)
}
this.secretContentBlobURL = window.URL.createObjectURL(new Blob([to], { type: 'text/plain' }))
if (this.customize.disableQRSupport || !to) { if (this.customize.disableQRSupport || !to) {
return return
} }
@ -566,7 +578,9 @@ export default {
.then(url => { .then(url => {
this.secretContentQRDataURL = url this.secretContentQRDataURL = url
}) })
.catch(() => this.secretContentQRDataURL = null) .catch(() => {
this.secretContentQRDataURL = null
})
}, },
secretUrl(to) { secretUrl(to) {

View File

@ -1,8 +1,6 @@
// Auto-Generated, do not edit! // Auto-Generated, do not edit!
const switchFormal = (formal, informal) => { const switchFormal = (formal, informal) => window.useFormalLanguage ? formal : informal
return window.useFormalLanguage ? formal : informal
}
export default { export default {
'ca': JSON.parse('{"alert-secret-not-found":"Aquest no és el secret que busques\u0026hellip; - Si esperaves que el secret estiguera ací, és possible que s\'haja vist compromés, ja que una altra persona podria haver obert l\'enllaç en comptes de tu.","alert-something-went-wrong":"Alguna cosa ha eixit malament. Ens sap molt greu\u0026hellip;","btn-create-secret":"Crea el secret!","btn-new-secret":"Nou secret","btn-reveal-secret":"Mostra\'m el secret!","btn-show-explanation":"Com funciona?","expire-default":"Caducitat predeterminada","expire-n-days":"{n} dia | {n} dies","expire-n-hours":"{n} hora | {n} hores","expire-n-minutes":"{n} minut | {n} minuts","expire-n-seconds":"{n} segon | {n} segons","items-explanation":["Introduïx un secret en el formulari que hi ha en aquesta pàgina","El teu navegador xifra el secret utilitzant una contrasenya generada","Únicament s\'envia al servidor el secret xifrat (mai s\'envien ni el secret sense xifrar ni la contrasenya!)","El servidor emmagatzema el secret xifrat durant un temps limitat","Envia al destinatari l\'enllaç mostrat, que conté l\'identificador del secret i la contrasenya de desxifrat","El destinatari pot veure el secret una sola vegada: si no pot, el secret podria haver sigut vist per una altra persona!","Quan s\'ha obtingut per primera i única vegada el secret xifrat, s\'elimina del servidor"],"label-expiry":"Caduca en:","label-secret-data":"Informació secreta:","text-burn-hint":"Per favor, recorda no accedir a aquest enllaç tu mateix, ja que això destruiria el secret. Només has de passar-li\'l a una altra persona!","text-burn-time":"Si no es mostra abans, aquest secret s\'eliminarà automàticament:","text-hint-burned":"\u003cstrong\u003eAtenció:\u003c/strong\u003e Només veuràs això una vegada. Quan recarregues la pàgina, el secret desapareixerà, així que copia\'l ja\u0026hellip;","text-powered-by":"Funciona amb","text-pre-reveal-hint":"Per a mostrar el secret prem aquest botó, però tingues en compte que en fer-ho es destruirà. Només pots veure\'l una vegada!","text-pre-url":"El teu secret ha sigut creat i emmagatzemat en el següent enllaç:","text-secret-create-disabled":"La creació de nous secrets està desactivada en aquesta instància.","title-explanation":"Així és com funciona\u0026hellip;","title-new-secret":"Crea un nou secret","title-reading-secret":"Obtenint el teu secret\u0026hellip;","title-secret-create-disabled":"S\'ha desactivat la creació de secrets...","title-secret-created":"Secret creat!"}'), 'ca': JSON.parse('{"alert-secret-not-found":"Aquest no és el secret que busques\u0026hellip; - Si esperaves que el secret estiguera ací, és possible que s\'haja vist compromés, ja que una altra persona podria haver obert l\'enllaç en comptes de tu.","alert-something-went-wrong":"Alguna cosa ha eixit malament. Ens sap molt greu\u0026hellip;","btn-create-secret":"Crea el secret!","btn-new-secret":"Nou secret","btn-reveal-secret":"Mostra\'m el secret!","btn-show-explanation":"Com funciona?","expire-default":"Caducitat predeterminada","expire-n-days":"{n} dia | {n} dies","expire-n-hours":"{n} hora | {n} hores","expire-n-minutes":"{n} minut | {n} minuts","expire-n-seconds":"{n} segon | {n} segons","items-explanation":["Introduïx un secret en el formulari que hi ha en aquesta pàgina","El teu navegador xifra el secret utilitzant una contrasenya generada","Únicament s\'envia al servidor el secret xifrat (mai s\'envien ni el secret sense xifrar ni la contrasenya!)","El servidor emmagatzema el secret xifrat durant un temps limitat","Envia al destinatari l\'enllaç mostrat, que conté l\'identificador del secret i la contrasenya de desxifrat","El destinatari pot veure el secret una sola vegada: si no pot, el secret podria haver sigut vist per una altra persona!","Quan s\'ha obtingut per primera i única vegada el secret xifrat, s\'elimina del servidor"],"label-expiry":"Caduca en:","label-secret-data":"Informació secreta:","text-burn-hint":"Per favor, recorda no accedir a aquest enllaç tu mateix, ja que això destruiria el secret. Només has de passar-li\'l a una altra persona!","text-burn-time":"Si no es mostra abans, aquest secret s\'eliminarà automàticament:","text-hint-burned":"\u003cstrong\u003eAtenció:\u003c/strong\u003e Només veuràs això una vegada. Quan recarregues la pàgina, el secret desapareixerà, així que copia\'l ja\u0026hellip;","text-powered-by":"Funciona amb","text-pre-reveal-hint":"Per a mostrar el secret prem aquest botó, però tingues en compte que en fer-ho es destruirà. Només pots veure\'l una vegada!","text-pre-url":"El teu secret ha sigut creat i emmagatzemat en el següent enllaç:","text-secret-create-disabled":"La creació de nous secrets està desactivada en aquesta instància.","title-explanation":"Així és com funciona\u0026hellip;","title-new-secret":"Crea un nou secret","title-reading-secret":"Obtenint el teu secret\u0026hellip;","title-secret-create-disabled":"S\'ha desactivat la creació de secrets...","title-secret-created":"Secret creat!"}'),

View File

@ -1,8 +1,6 @@
// Auto-Generated, do not edit! // Auto-Generated, do not edit!
const switchFormal = (formal, informal) => { const switchFormal = (formal, informal) => window.useFormalLanguage ? formal : informal
return window.useFormalLanguage ? formal : informal
}
export default { export default {
{{- range $lang, $translation := .Translations -}} {{- range $lang, $translation := .Translations -}}

View File

@ -1,3 +1,5 @@
/* eslint-disable sort-imports */
/* global version */
import Vue from 'vue' import Vue from 'vue'
import VueI18n from 'vue-i18n' import VueI18n from 'vue-i18n'
@ -16,15 +18,16 @@ const cookieSet = Object.fromEntries(document.cookie.split('; ')
.map(el => decodeURIComponent(el)))) .map(el => decodeURIComponent(el))))
const i18n = new VueI18n({ const i18n = new VueI18n({
locale: cookieSet.lang || navigator?.language || 'en',
fallbackLocale: 'en', fallbackLocale: 'en',
locale: cookieSet.lang || navigator?.language || 'en',
messages, messages,
}) })
new Vue({ new Vue({
el: '#app',
components: { app }, components: { app },
data: { version }, data: { version },
el: '#app',
i18n, i18n,
name: 'OTSAppInterface',
render: createElement => createElement('app'), render: createElement => createElement('app'),
}) })