Skip to content

Commit d7542bf

Browse files
Add InternalTokenURI to load InteralToken from an external file (#5812)
1 parent 91775c1 commit d7542bf

File tree

1 file changed

+73
-25
lines changed

1 file changed

+73
-25
lines changed

modules/setting/setting.go

+73-25
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ package setting
77

88
import (
99
"encoding/base64"
10+
"io"
11+
"io/ioutil"
1012
"net"
1113
"net/url"
1214
"os"
@@ -1007,31 +1009,7 @@ func NewContext() {
10071009
MinPasswordLength = sec.Key("MIN_PASSWORD_LENGTH").MustInt(6)
10081010
ImportLocalPaths = sec.Key("IMPORT_LOCAL_PATHS").MustBool(false)
10091011
DisableGitHooks = sec.Key("DISABLE_GIT_HOOKS").MustBool(false)
1010-
InternalToken = sec.Key("INTERNAL_TOKEN").String()
1011-
if len(InternalToken) == 0 {
1012-
InternalToken, err = generate.NewInternalToken()
1013-
if err != nil {
1014-
log.Fatal(4, "Error generate internal token: %v", err)
1015-
}
1016-
1017-
// Save secret
1018-
cfgSave := ini.Empty()
1019-
if com.IsFile(CustomConf) {
1020-
// Keeps custom settings if there is already something.
1021-
if err := cfgSave.Append(CustomConf); err != nil {
1022-
log.Error(4, "Failed to load custom conf '%s': %v", CustomConf, err)
1023-
}
1024-
}
1025-
1026-
cfgSave.Section("security").Key("INTERNAL_TOKEN").SetValue(InternalToken)
1027-
1028-
if err := os.MkdirAll(filepath.Dir(CustomConf), os.ModePerm); err != nil {
1029-
log.Fatal(4, "Failed to create '%s': %v", CustomConf, err)
1030-
}
1031-
if err := cfgSave.SaveTo(CustomConf); err != nil {
1032-
log.Fatal(4, "Error saving generated JWT Secret to custom config: %v", err)
1033-
}
1034-
}
1012+
InternalToken = loadInternalToken(sec)
10351013
IterateBufferSize = Cfg.Section("database").Key("ITERATE_BUFFER_SIZE").MustInt(50)
10361014
LogSQL = Cfg.Section("database").Key("LOG_SQL").MustBool(true)
10371015
DBConnectRetries = Cfg.Section("database").Key("DB_RETRIES").MustInt(10)
@@ -1268,6 +1246,76 @@ func NewContext() {
12681246
}
12691247
}
12701248

1249+
func loadInternalToken(sec *ini.Section) string {
1250+
uri := sec.Key("INTERNAL_TOKEN_URI").String()
1251+
if len(uri) == 0 {
1252+
return loadOrGenerateInternalToken(sec)
1253+
}
1254+
tempURI, err := url.Parse(uri)
1255+
if err != nil {
1256+
log.Fatal(4, "Failed to parse INTERNAL_TOKEN_URI (%s): %v", uri, err)
1257+
}
1258+
switch tempURI.Scheme {
1259+
case "file":
1260+
fp, err := os.OpenFile(tempURI.RequestURI(), os.O_RDWR, 0600)
1261+
if err != nil {
1262+
log.Fatal(4, "Failed to open InternalTokenURI (%s): %v", uri, err)
1263+
}
1264+
defer fp.Close()
1265+
1266+
buf, err := ioutil.ReadAll(fp)
1267+
if err != nil {
1268+
log.Fatal(4, "Failed to read InternalTokenURI (%s): %v", uri, err)
1269+
}
1270+
// No token in the file, generate one and store it.
1271+
if len(buf) == 0 {
1272+
token, err := generate.NewInternalToken()
1273+
if err != nil {
1274+
log.Fatal(4, "Error generate internal token: %v", err)
1275+
}
1276+
if _, err := io.WriteString(fp, token); err != nil {
1277+
log.Fatal(4, "Error writing to InternalTokenURI (%s): %v", uri, err)
1278+
}
1279+
return token
1280+
}
1281+
1282+
return string(buf)
1283+
default:
1284+
log.Fatal(4, "Unsupported URI-Scheme %q (INTERNAL_TOKEN_URI = %q)", tempURI.Scheme, uri)
1285+
}
1286+
return ""
1287+
}
1288+
1289+
func loadOrGenerateInternalToken(sec *ini.Section) string {
1290+
var err error
1291+
token := sec.Key("INTERNAL_TOKEN").String()
1292+
if len(token) == 0 {
1293+
token, err = generate.NewInternalToken()
1294+
if err != nil {
1295+
log.Fatal(4, "Error generate internal token: %v", err)
1296+
}
1297+
1298+
// Save secret
1299+
cfgSave := ini.Empty()
1300+
if com.IsFile(CustomConf) {
1301+
// Keeps custom settings if there is already something.
1302+
if err := cfgSave.Append(CustomConf); err != nil {
1303+
log.Error(4, "Failed to load custom conf '%s': %v", CustomConf, err)
1304+
}
1305+
}
1306+
1307+
cfgSave.Section("security").Key("INTERNAL_TOKEN").SetValue(token)
1308+
1309+
if err := os.MkdirAll(filepath.Dir(CustomConf), os.ModePerm); err != nil {
1310+
log.Fatal(4, "Failed to create '%s': %v", CustomConf, err)
1311+
}
1312+
if err := cfgSave.SaveTo(CustomConf); err != nil {
1313+
log.Fatal(4, "Error saving generated INTERNAL_TOKEN to custom config: %v", err)
1314+
}
1315+
}
1316+
return token
1317+
}
1318+
12711319
// NewServices initializes the services
12721320
func NewServices() {
12731321
newService()

0 commit comments

Comments
 (0)