From d1ba2e608f87147f533d2cb621f86aaab5c73a08 Mon Sep 17 00:00:00 2001
From: Katharina Renk <katharina.renk@stud.h-da.de>
Date: Fri, 10 Feb 2023 15:13:38 +0000
Subject: [PATCH] added environment variable to set admin password manually via
 password.env, modified controller.go for this use case

See merge request danet/gosdn!423

Co-authored-by: Malte Bauch <malte.bauch@stud.h-da.de>
---
 .gitignore                        |  1 +
 controller/controller.go          | 25 +++++++++++++++++--------
 dev_env_data/clab/gosdn.clab.yaml |  2 ++
 models/YangModels                 |  2 +-
 models/openconfig                 |  2 +-
 5 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/.gitignore b/.gitignore
index bc4b63227..cb721c0bf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,7 @@ clab-gosdn*/
 
 # non vimmers
 .vscode/
+.idea/
 
 # MacOS
 .DS_Store
diff --git a/controller/controller.go b/controller/controller.go
index 2798cf80e..965540a62 100644
--- a/controller/controller.go
+++ b/controller/controller.go
@@ -291,13 +291,22 @@ func ensureDefaultUserExists() error {
 	if err != nil {
 		log.Info(err)
 	}
-
 	if adminUser == nil {
-		// Generate a password that is 16 characters long with 3 digits, 0 symbols,
-		// allowing upper and lower case letters, disallowing repeat characters.
-		generatedPassword, err := password.Generate(16, 3, 0, true, false)
-		if err != nil {
-			log.Fatal(err)
+		// Getting the password from the environment variable which is set in gosdn.clab.yaml.
+		var preDefinedPassword = os.Getenv("GOSDN_ADMIN_PASSWORD")
+		var usedPassword string
+
+		// If environment variable is set and password is not 0, the password from the environment variable will be used.
+		if len(preDefinedPassword) == 0 {
+			// Generate a password that is 16 characters long with 3 digits, 0 symbols,
+			// allowing upper and lower case letters, disallowing repeat characters.
+			generatedPassword, err := password.Generate(16, 3, 0, true, false)
+			if err != nil {
+				log.Fatal(err)
+			}
+			usedPassword = generatedPassword
+		} else {
+			usedPassword = preDefinedPassword
 		}
 
 		salt, err := password.Generate(16, 3, 0, true, false)
@@ -305,14 +314,14 @@ func ensureDefaultUserExists() error {
 			log.Fatal(err)
 		}
 
-		hashedPassword := base64.RawStdEncoding.EncodeToString(argon2.IDKey([]byte(generatedPassword), []byte(salt), 1, 64*1024, 4, 32))
+		hashedPassword := base64.RawStdEncoding.EncodeToString(argon2.IDKey([]byte(usedPassword), []byte(salt), 1, 64*1024, 4, 32))
 
 		err = c.userService.Add(rbacImpl.NewUser(uuid.New(), defaultUserName, map[string]string{config.BasePndUUID.String(): "admin"}, string(hashedPassword), "", salt, conflict.Metadata{}))
 		if err != nil {
 			return err
 		}
 
-		fmt.Printf("########\n Generated admin password: %s\n########\n", generatedPassword)
+		fmt.Printf("########\n Generated admin password: %s\n########\n", usedPassword)
 	}
 
 	return nil
diff --git a/dev_env_data/clab/gosdn.clab.yaml b/dev_env_data/clab/gosdn.clab.yaml
index 7f7d771f5..991c217e2 100644
--- a/dev_env_data/clab/gosdn.clab.yaml
+++ b/dev_env_data/clab/gosdn.clab.yaml
@@ -42,6 +42,8 @@ topology:
       cmd:
         --config /gosdn/configs/containerlab-gosdn.toml
       mgmt_ipv4: 172.100.0.5
+      env:
+        GOSDN_ADMIN_PASSWORD: TestPassword
 
     gnmi-target:
       kind: linux
diff --git a/models/YangModels b/models/YangModels
index 1f247060d..f97866171 160000
--- a/models/YangModels
+++ b/models/YangModels
@@ -1 +1 @@
-Subproject commit 1f247060d80be7d7f368135dcdba9a939d24e4c9
+Subproject commit f978661713bcc520a6fb0c7ad44a25b6abd6c57d
diff --git a/models/openconfig b/models/openconfig
index f04dff4e7..d9701d1fa 160000
--- a/models/openconfig
+++ b/models/openconfig
@@ -1 +1 @@
-Subproject commit f04dff4e782f9795da6e06323353c44000853a07
+Subproject commit d9701d1fa0f50dfb56818f5b440d1ef922051108
-- 
GitLab