|
|
@@ -6,9 +6,11 @@ package config // import "miniflux.app/config"
|
|
|
|
|
|
import (
|
|
|
"bufio"
|
|
|
+ "bytes"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
"io"
|
|
|
+ "io/ioutil"
|
|
|
url_parser "net/url"
|
|
|
"os"
|
|
|
"strconv"
|
|
|
@@ -88,6 +90,8 @@ func (p *Parser) parseLines(lines []string) (err error) {
|
|
|
p.opts.listenAddr = parseString(value, defaultListenAddr)
|
|
|
case "DATABASE_URL":
|
|
|
p.opts.databaseURL = parseString(value, defaultDatabaseURL)
|
|
|
+ case "DATABASE_URL_FILE":
|
|
|
+ p.opts.databaseURL = readSecretFile(value, defaultDatabaseURL)
|
|
|
case "DATABASE_MAX_CONNS":
|
|
|
p.opts.databaseMaxConns = parseInt(value, defaultDatabaseMaxConns)
|
|
|
case "DATABASE_MIN_CONNS":
|
|
|
@@ -148,14 +152,28 @@ func (p *Parser) parseLines(lines []string) (err error) {
|
|
|
p.opts.proxyImages = parseString(value, defaultProxyImages)
|
|
|
case "CREATE_ADMIN":
|
|
|
p.opts.createAdmin = parseBool(value, defaultCreateAdmin)
|
|
|
+ case "ADMIN_USERNAME":
|
|
|
+ p.opts.adminUsername = parseString(value, defaultAdminUsername)
|
|
|
+ case "ADMIN_USERNAME_FILE":
|
|
|
+ p.opts.adminUsername = readSecretFile(value, defaultAdminUsername)
|
|
|
+ case "ADMIN_PASSWORD":
|
|
|
+ p.opts.adminPassword = parseString(value, defaultAdminPassword)
|
|
|
+ case "ADMIN_PASSWORD_FILE":
|
|
|
+ p.opts.adminPassword = readSecretFile(value, defaultAdminPassword)
|
|
|
case "POCKET_CONSUMER_KEY":
|
|
|
p.opts.pocketConsumerKey = parseString(value, defaultPocketConsumerKey)
|
|
|
+ case "POCKET_CONSUMER_KEY_FILE":
|
|
|
+ p.opts.pocketConsumerKey = readSecretFile(value, defaultPocketConsumerKey)
|
|
|
case "OAUTH2_USER_CREATION":
|
|
|
p.opts.oauth2UserCreationAllowed = parseBool(value, defaultOAuth2UserCreation)
|
|
|
case "OAUTH2_CLIENT_ID":
|
|
|
p.opts.oauth2ClientID = parseString(value, defaultOAuth2ClientID)
|
|
|
+ case "OAUTH2_CLIENT_ID_FILE":
|
|
|
+ p.opts.oauth2ClientID = readSecretFile(value, defaultOAuth2ClientID)
|
|
|
case "OAUTH2_CLIENT_SECRET":
|
|
|
p.opts.oauth2ClientSecret = parseString(value, defaultOAuth2ClientSecret)
|
|
|
+ case "OAUTH2_CLIENT_SECRET_FILE":
|
|
|
+ p.opts.oauth2ClientSecret = readSecretFile(value, defaultOAuth2ClientSecret)
|
|
|
case "OAUTH2_REDIRECT_URL":
|
|
|
p.opts.oauth2RedirectURL = parseString(value, defaultOAuth2RedirectURL)
|
|
|
case "OAUTH2_OIDC_DISCOVERY_ENDPOINT":
|
|
|
@@ -235,3 +253,17 @@ func parseString(value string, fallback string) string {
|
|
|
}
|
|
|
return value
|
|
|
}
|
|
|
+
|
|
|
+func readSecretFile(filename, fallback string) string {
|
|
|
+ data, err := ioutil.ReadFile(filename)
|
|
|
+ if err != nil {
|
|
|
+ return fallback
|
|
|
+ }
|
|
|
+
|
|
|
+ value := string(bytes.TrimSpace(data))
|
|
|
+ if value == "" {
|
|
|
+ return fallback
|
|
|
+ }
|
|
|
+
|
|
|
+ return value
|
|
|
+}
|