mirror of
https://github.com/Luzifer/ots.git
synced 2025-04-19 06:55:51 -04:00
[#20] Add option to disable creation frontend
Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
parent
f2db3f9bdb
commit
d326984f51
File diff suppressed because one or more lines are too long
30
main.go
30
main.go
@ -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
|
||||
}
|
||||
|
24
src/app.vue
24
src/app.vue
@ -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}`
|
||||
},
|
||||
|
@ -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…",
|
||||
"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…",
|
||||
"title-new-secret": "Erstelle ein neues Secret",
|
||||
"title-reading-secret": "Secret auslesen…",
|
||||
|
@ -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…",
|
||||
"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…",
|
||||
"title-new-secret": "Create a new secret",
|
||||
"title-reading-secret": "Reading your secret…",
|
||||
|
@ -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'),
|
||||
})
|
||||
|
Loading…
x
Reference in New Issue
Block a user