399c33e8c052d0da5d051a4e2074b2fd32f4993e

Author
Ayman Bagabas <ayman.bagabas@gmail.com>
Committer
Ayman Bagabas <ayman.bagabas@gmail.com>
Date

Message

feat(backend): create default admin user with initial admin keys

Diff

 1diff --git a/server/backend/sqlite/db.go b/server/backend/sqlite/db.go
 2index a8fe46bb499183946fbea1827cfbe51d05094c54..a7f971890281eb19cf2ed67c163586b7fecabcfc 100644
 3--- a/server/backend/sqlite/db.go
 4+++ b/server/backend/sqlite/db.go
 5@@ -44,6 +44,48 @@ func (d *SqliteBackend) init() error {
 6 			return err
 7 		}
 8 
 9+		var init bool
10+		if err := tx.Get(&init, "SELECT value FROM settings WHERE key = 'init'"); err != nil && !errors.Is(err, sql.ErrNoRows) {
11+			return err
12+		}
13+
14+		// Create default user.
15+		if !init {
16+			r, err := tx.Exec("INSERT OR IGNORE INTO user (username, admin, updated_at) VALUES (?, ?, CURRENT_TIMESTAMP);", "admin", true)
17+			if err != nil {
18+				return err
19+			}
20+			userID, err := r.LastInsertId()
21+			if err != nil {
22+				return err
23+			}
24+
25+			// Add initial keys
26+			for _, k := range d.cfg.InitialAdminKeys {
27+				pk, _, err := backend.ParseAuthorizedKey(k)
28+				if err != nil {
29+					logger.Error("error parsing initial admin key, skipping", "key", k, "err", err)
30+					continue
31+				}
32+
33+				stmt, err := tx.Prepare(`INSERT INTO public_key (user_id, public_key, updated_at)
34+					VALUES (?, ?, CURRENT_TIMESTAMP);`)
35+				if err != nil {
36+					return err
37+				}
38+
39+				defer stmt.Close() // nolint: errcheck
40+				if _, err := stmt.Exec(userID, backend.MarshalAuthorizedKey(pk)); err != nil {
41+					return err
42+				}
43+			}
44+		}
45+
46+		// set init flag
47+		if _, err := tx.Exec("INSERT OR IGNORE INTO settings (key, value, updated_at) VALUES (?, ?, CURRENT_TIMESTAMP)", "init", true); err != nil {
48+			return err
49+		}
50+
51 		return nil
52 	})
53 }