@@ -7,6 +7,8 @@ package setting
77
88import (
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
12721320func NewServices () {
12731321 newService ()
0 commit comments