@@ -7,6 +7,8 @@ package setting
7
7
8
8
import (
9
9
"encoding/base64"
10
+ "io"
11
+ "io/ioutil"
10
12
"net"
11
13
"net/url"
12
14
"os"
@@ -1007,31 +1009,7 @@ func NewContext() {
1007
1009
MinPasswordLength = sec .Key ("MIN_PASSWORD_LENGTH" ).MustInt (6 )
1008
1010
ImportLocalPaths = sec .Key ("IMPORT_LOCAL_PATHS" ).MustBool (false )
1009
1011
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 )
1035
1013
IterateBufferSize = Cfg .Section ("database" ).Key ("ITERATE_BUFFER_SIZE" ).MustInt (50 )
1036
1014
LogSQL = Cfg .Section ("database" ).Key ("LOG_SQL" ).MustBool (true )
1037
1015
DBConnectRetries = Cfg .Section ("database" ).Key ("DB_RETRIES" ).MustInt (10 )
@@ -1268,6 +1246,76 @@ func NewContext() {
1268
1246
}
1269
1247
}
1270
1248
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
+
1271
1319
// NewServices initializes the services
1272
1320
func NewServices () {
1273
1321
newService ()
0 commit comments