Skip to content

Commit e9bce26

Browse files
authored
Merge pull request #777 from gravitl/hotfix_v0.9.4
added hotfix
2 parents 44688fe + faefa0f commit e9bce26

File tree

4 files changed

+67
-2
lines changed

4 files changed

+67
-2
lines changed

logic/jwts.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,29 @@ import (
55
"time"
66

77
"github.com/golang-jwt/jwt/v4"
8+
"github.com/gravitl/netmaker/logger"
89
"github.com/gravitl/netmaker/models"
910
"github.com/gravitl/netmaker/servercfg"
1011
)
1112

12-
var jwtSecretKey = []byte("(BytesOverTheWire)")
13+
var jwtSecretKey []byte
14+
15+
// SetJWTSecret - sets the jwt secret on server startup
16+
func SetJWTSecret() {
17+
currentSecret, jwtErr := FetchJWTSecret()
18+
if jwtErr != nil {
19+
newString, err := GenerateRandomString(64)
20+
if err != nil {
21+
logger.FatalLog("something went wrong when generating the auth secret")
22+
}
23+
jwtSecretKey = []byte(newString) // 512 bit random password
24+
if err := StoreJWTSecret(string(jwtSecretKey)); err != nil {
25+
logger.FatalLog("something went wrong when configuring JWT authentication")
26+
}
27+
} else {
28+
jwtSecretKey = []byte(currentSecret)
29+
}
30+
}
1331

1432
// CreateJWT func will used to create the JWT while signing in and signing out
1533
func CreateJWT(macaddress string, network string) (response string, err error) {

logic/serverconf.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,32 @@ func FetchPrivKey(serverID string) (string, error) {
4343
func RemovePrivKey(serverID string) error {
4444
return database.DeleteRecord(database.SERVERCONF_TABLE_NAME, serverID)
4545
}
46+
47+
// FetchJWTSecret - fetches jwt secret from db
48+
func FetchJWTSecret() (string, error) {
49+
var dbData string
50+
var err error
51+
var fetchedData = serverData{}
52+
dbData, err = database.FetchRecord(database.SERVERCONF_TABLE_NAME, "nm-jwt-secret")
53+
if err != nil {
54+
return "", err
55+
}
56+
err = json.Unmarshal([]byte(dbData), &fetchedData)
57+
if err != nil {
58+
return "", err
59+
}
60+
return fetchedData.PrivateKey, nil
61+
}
62+
63+
// StoreJWTSecret - stores server jwt secret if needed
64+
func StoreJWTSecret(privateKey string) error {
65+
var newData = serverData{}
66+
var err error
67+
var data []byte
68+
newData.PrivateKey = privateKey
69+
data, err = json.Marshal(&newData)
70+
if err != nil {
71+
return err
72+
}
73+
return database.Insert("nm-jwt-secret", string(data), database.SERVERCONF_TABLE_NAME)
74+
}

logic/util.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22
package logic
33

44
import (
5+
crand "crypto/rand"
56
"encoding/base64"
67
"encoding/json"
8+
"math/big"
79
"math/rand"
810
"strconv"
911
"strings"
@@ -278,7 +280,7 @@ func GetPeersList(networkName string, excludeRelayed bool, relayedNodeAddr strin
278280

279281
// RandomString - returns a random string in a charset
280282
func RandomString(length int) string {
281-
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
283+
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"
282284

283285
var seededRand *rand.Rand = rand.New(rand.NewSource(time.Now().UnixNano()))
284286

@@ -289,6 +291,21 @@ func RandomString(length int) string {
289291
return string(b)
290292
}
291293

294+
// GenerateRandomString - generates random string of n length
295+
func GenerateRandomString(n int) (string, error) {
296+
const chars = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-"
297+
ret := make([]byte, n)
298+
for i := range ret {
299+
num, err := crand.Int(crand.Reader, big.NewInt(int64(len(chars))))
300+
if err != nil {
301+
return "", err
302+
}
303+
ret[i] = chars[num.Int64()]
304+
}
305+
306+
return string(ret), nil
307+
}
308+
292309
// == Private Methods ==
293310

294311
func getNetworkEgressAndNodes(networkName string) ([]models.Node, []models.Node, error) {

main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func initialize() { // Client Mode Prereq Check
4141
logger.FatalLog("Error connecting to database")
4242
}
4343
logger.Log(0, "database successfully connected")
44+
logic.SetJWTSecret()
4445

4546
var authProvider = auth.InitializeAuthProvider()
4647
if authProvider != "" {

0 commit comments

Comments
 (0)