[#20] Add option to disable creation frontend

Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
Knut Ahlers 2020-06-18 14:17:52 +02:00
parent f2db3f9bdb
commit d326984f51
No known key found for this signature in database
GPG Key ID: DC2729FDD34BE99E
7 changed files with 9498 additions and 9452 deletions

18882
assets.go

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

30
main.go
View File

@ -3,6 +3,7 @@ package main
//go:generate go-bindata -pkg $GOPACKAGE -o assets.go -modtime 1 -md5checksum ./frontend/...
import (
"encoding/json"
"fmt"
"mime"
"net/http"
@ -19,10 +20,11 @@ import (
var (
cfg struct {
Listen string `flag:"listen" default:":3000" description:"IP/Port to listen on"`
LogLevel string `flag:"log-level" default:"info" description:"Set log level (debug, info, warning, error)"`
StorageType string `flag:"storage-type" default:"mem" description:"Storage to use for putting secrets to" validate:"nonzero"`
VersionAndExit bool `flag:"version" default:"false" description:"Print version information and exit"`
DisableCreateInterface bool `flag:"disable-create-interface" default:"false" description:"Removes the interface for secret creation"`
Listen string `flag:"listen" default:":3000" description:"IP/Port to listen on"`
LogLevel string `flag:"log-level" default:"info" description:"Set log level (debug, info, warning, error)"`
StorageType string `flag:"storage-type" default:"mem" description:"Storage to use for putting secrets to" validate:"nonzero"`
VersionAndExit bool `flag:"version" default:"false" description:"Print version information and exit"`
}
product = "ots"
@ -94,8 +96,9 @@ func handleVars(w http.ResponseWriter, r *http.Request) {
acceptLang := r.Header.Get("Accept-Language")
defaultLang := "en" // known valid language
vars := map[string]string{
"version": version,
vars := map[string]interface{}{
"disableCreateInterface": cfg.DisableCreateInterface,
"version": version,
}
switch {
@ -108,11 +111,22 @@ func handleVars(w http.ResponseWriter, r *http.Request) {
}
w.Header().Set("Content-Type", "application/javascript")
for k, v := range vars {
fmt.Fprintf(w, "var %s = %q\n", k, v)
opts, err := toJSONString(vars)
if err != nil {
log.WithError(err).Error("Unable to encode JSON var")
http.Error(w, "Unable to encode options", http.StatusInternalServerError)
return
}
fmt.Fprintf(w, "const otsOptions = %s", opts)
}
func normalizeLang(lang string) string {
return strings.ToLower(strings.Split(lang, "-")[0])
}
func toJSONString(in interface{}) (string, error) {
b, err := json.Marshal(in)
return string(b), err
}

View File

@ -22,7 +22,10 @@
<b-nav-item @click="explanationShown = !explanationShown">
<i class="fas fa-question" /> {{ $t('btn-show-explanation') }}
</b-nav-item>
<b-nav-item @click="newSecret">
<b-nav-item
v-if="!otsOptions.disableCreateInterface"
@click="newSecret"
>
<i class="fas fa-plus" /> {{ $t('btn-new-secret') }}
</b-nav-item>
</b-navbar-nav>
@ -64,7 +67,7 @@
<!-- Creation dialog -->
<b-card
v-if="mode == 'create' && !secretId"
v-if="mode == 'create' && !secretId && !otsOptions.disableCreateInterface"
border-variant="primary"
header-bg-variant="primary"
header-text-variant="white"
@ -89,6 +92,19 @@
</b-button>
</b-card>
<b-card
v-if="mode == 'create' && !secretId && otsOptions.disableCreateInterface"
border-variant="primary"
header-bg-variant="primary"
header-text-variant="white"
>
<span
slot="header"
v-html="$t('title-create-disabled')"
/>
<p>{{ $t('text-create-disabled') }}</p>
</b-card>
<!-- Secret created, show secret URL -->
<b-card
v-if="mode == 'create' && secretId"
@ -176,6 +192,10 @@ export default {
},
computed: {
otsOptions() {
return otsOptions
},
secretUrl() {
return `${window.location.href}#${this.secretId}|${this.securePassword}`
},

View File

@ -16,10 +16,12 @@
],
"label-secret-data": "Inhalt des Secrets:",
"text-burn-hint": "Bitte rufe die URL nicht selbst auf, da das Secret dadurch zerstört würde. Gib sie einfach weiter!",
"text-create-disabled": "In dieser Instanz wurde die Erstellung von Secrets deaktiviert.",
"text-hint-burned": "<strong>Achtung:</strong> Du kannst das nur einmal ansehen! Sobald du die Seite neu lädst, ist das Secret verschwunden, also besser direkt kopieren und sicher abspeichern&hellip;",
"text-powered-by": "Läuft mit",
"text-pre-reveal-hint": "Um das Secret anzuzeigen klicke diesen Button aber denk dran, dass das Secret nur einmal angezeigt und dabei gelöscht wird.",
"text-pre-url": "Dein Secret wurde angelegt und unter folgender URL gespeichert:",
"title-create-disabled": "Secret-Erstellung deaktiviert",
"title-explanation": "So funktioniert es&hellip;",
"title-new-secret": "Erstelle ein neues Secret",
"title-reading-secret": "Secret auslesen&hellip;",

View File

@ -16,10 +16,12 @@
],
"label-secret-data": "Secret data:",
"text-burn-hint": "Please remember not to go to this URL yourself as that would destroy the secret. Just pass it to someone else!",
"text-create-disabled": "This instance has disabled creation of new secrets",
"text-hint-burned": "<strong>Attention:</strong> You're only seeing this once. As soon as you reload the page the secret will be gone so maybe copy it now&hellip;",
"text-powered-by": "Powered by",
"text-pre-reveal-hint": "To reveal the secret click this button but be aware doing so will destroy the secret. You can only view it once!",
"text-pre-url": "Your secret was created and stored using this URL:",
"title-create-disabled": "Secret creation disabled",
"title-explanation": "This is how it works&hellip;",
"title-new-secret": "Create a new secret",
"title-reading-secret": "Reading your secret&hellip;",

View File

@ -14,7 +14,7 @@ Vue.use(BootstrapVue)
Vue.use(VueI18n)
const i18n = new VueI18n({
locale,
locale: otsOptions.locale || '',
fallbackLocale: 'en',
messages,
})
@ -22,7 +22,9 @@ const i18n = new VueI18n({
new Vue({
el: '#app',
components: { app },
data: { version },
data: {
version: otsOptions.version,
},
i18n,
render: createElement => createElement('app'),
})