test: create keys on runtime

Carlos Alexandro Becker created

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

Change summary

server/backend/sqlite/user.go                    |  3 
testscript/script_test.go                        | 37 ++++------
testscript/testdata/admin1                       |  7 --
testscript/testdata/admin1.pub                   |  1 
testscript/testdata/admin2                       |  7 --
testscript/testdata/admin2.pub                   |  1 
testscript/testdata/script/repo-collab.txtar     |  2 
testscript/testdata/script/set-username.txtar    | 11 +-
testscript/testdata/script/user_management.txtar | 60 +++++++----------
testscript/testdata/user1                        |  7 --
testscript/testdata/user1.pub                    |  1 
testscript/testdata/user2                        |  7 --
testscript/testdata/user2.pub                    |  1 
13 files changed, 51 insertions(+), 94 deletions(-)

Detailed changes

server/backend/sqlite/user.go 🔗

@@ -42,7 +42,8 @@ func (u *User) PublicKeys() []ssh.PublicKey {
 		if err := tx.Select(&keyStrings, `SELECT public_key
 			FROM public_key
 			INNER JOIN user ON user.id = public_key.user_id
-			WHERE user.username = ?;`, u.username); err != nil {
+			WHERE user.username = ?
+			ORDER BY public_key.id asc;`, u.username); err != nil {
 			return err
 		}
 

testscript/script_test.go 🔗

@@ -14,6 +14,7 @@ import (
 	"testing"
 	"time"
 
+	"github.com/charmbracelet/keygen"
 	"github.com/charmbracelet/soft-serve/server"
 	"github.com/charmbracelet/soft-serve/server/config"
 	"github.com/charmbracelet/soft-serve/server/test"
@@ -28,26 +29,19 @@ func TestScript(t *testing.T) {
 
 	t.Setenv("SOFT_SERVE_TEST_NO_HOOKS", "1")
 
-	// we'll use this key to talk with soft serve, and since testscript changes
-	// the cwd, we need to get its full path here
-	key, err := filepath.Abs("./testdata/admin1")
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// git does not handle 0600, and on clone, will save the files with its
-	// default perm, 0644, which is too open for ssh.
-	for _, f := range []string{
-		"admin1",
-		"admin2",
-		"user1",
-		"user2",
-	} {
-		if err := os.Chmod(filepath.Join("./testdata/", f), 0o600); err != nil {
+	mkkey := func(name string) (string, *keygen.SSHKeyPair) {
+		path := filepath.Join(t.TempDir(), name)
+		pair, err := keygen.New(path, keygen.WithKeyType(keygen.Ed25519), keygen.WithWrite())
+		if err != nil {
 			t.Fatal(err)
 		}
+		return path, pair
 	}
 
+	key, admin1 := mkkey("admin1")
+	_, admin2 := mkkey("admin2")
+	_, user1 := mkkey("user1")
+
 	sshArgs := []string{
 		"-F", "/dev/null",
 		"-o", "StrictHostKeyChecking=no",
@@ -108,13 +102,14 @@ func TestScript(t *testing.T) {
 		Setup: func(e *testscript.Env) error {
 			sshPort := test.RandomPort()
 			e.Setenv("SSH_PORT", fmt.Sprintf("%d", sshPort))
+			e.Setenv("ADMIN1_AUTHORIZED_KEY", admin1.AuthorizedKey())
+			e.Setenv("ADMIN2_AUTHORIZED_KEY", admin2.AuthorizedKey())
+			e.Setenv("USER1_AUTHORIZED_KEY", user1.AuthorizedKey())
 			data := t.TempDir()
 			cfg := config.Config{
-				Name:     "Test Soft Serve",
-				DataPath: data,
-				InitialAdminKeys: []string{
-					"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJI/1tawpdPmzuJcTGTJ+QReqB6cRUdKj4iQIdJUFdrl",
-				},
+				Name:             "Test Soft Serve",
+				DataPath:         data,
+				InitialAdminKeys: []string{admin1.AuthorizedKey()},
 				SSH: config.SSHConfig{
 					ListenAddr:    fmt.Sprintf("localhost:%d", sshPort),
 					PublicURL:     fmt.Sprintf("ssh://localhost:%d", sshPort),

testscript/testdata/admin1 🔗

@@ -1,7 +0,0 @@
------BEGIN OPENSSH PRIVATE KEY-----
-b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
-QyNTUxOQAAACCSP9bWsKXT5s7iXExkyfkEXqgenEVHSo+IkCHSVBXa5QAAAJiqgq7EqoKu
-xAAAAAtzc2gtZWQyNTUxOQAAACCSP9bWsKXT5s7iXExkyfkEXqgenEVHSo+IkCHSVBXa5Q
-AAAEDzMZNK49XhgnQJruAFQr04Eijji5ZMZzN9dA/tmEP0m5I/1tawpdPmzuJcTGTJ+QRe
-qB6cRUdKj4iQIdJUFdrlAAAAD2Nhcmxvc0BkYXJrc3RhcgECAwQFBg==
------END OPENSSH PRIVATE KEY-----

testscript/testdata/admin2 🔗

@@ -1,7 +0,0 @@
------BEGIN OPENSSH PRIVATE KEY-----
-b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
-QyNTUxOQAAACD41Hl4Qc49fP1mW6nA9WjyZQgC8wTDGcYaWlOOSoFaiwAAAJjWOn0F1jp9
-BQAAAAtzc2gtZWQyNTUxOQAAACD41Hl4Qc49fP1mW6nA9WjyZQgC8wTDGcYaWlOOSoFaiw
-AAAEDC5WZCusu7Dwmj1M6tEqPietXnnklOhfnAzBqUtoNpl/jUeXhBzj18/WZbqcD1aPJl
-CALzBMMZxhpaU45KgVqLAAAAD2Nhcmxvc0BkYXJrc3RhcgECAwQFBg==
------END OPENSSH PRIVATE KEY-----

testscript/testdata/script/repo-collab.txtar 🔗

@@ -1,7 +1,7 @@
 # vi: set ft=conf
 # setup
 soft repo import test https://github.com/charmbracelet/catwalk.git
-soft user create foo --key "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAzXnhJ/6SrlHZI+DnTb1n/0KL6/VOQTea8qLovTiZix"
+soft user create foo --key "$USER1_AUTHORIZED_KEY"
 
 # list collabs
 soft repo collab list test

testscript/testdata/script/set-username.txtar 🔗

@@ -1,19 +1,20 @@
 # vi: set ft=conf
-# set-username
+# get original username
 soft info
-cmp stdout info1.txt
+cmpenv stdout info1.txt
 
+# set another username
 soft set-username test
 soft info
-cmp stdout info2.txt
+cmpenv stdout info2.txt
 
 -- info1.txt --
 Username: admin
 Admin: true
 Public keys:
-  ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJI/1tawpdPmzuJcTGTJ+QReqB6cRUdKj4iQIdJUFdrl
+  $ADMIN1_AUTHORIZED_KEY
 -- info2.txt --
 Username: test
 Admin: true
 Public keys:
-  ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJI/1tawpdPmzuJcTGTJ+QReqB6cRUdKj4iQIdJUFdrl
+  $ADMIN1_AUTHORIZED_KEY

testscript/testdata/script/user_management.txtar 🔗

@@ -1,78 +1,71 @@
 # vi: set ft=conf
 # add key to admin
-soft user add-pubkey admin "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPjUeXhBzj18/WZbqcD1aPJlCALzBMMZxhpaU45KgVqL"
+soft user add-pubkey admin "$ADMIN2_AUTHORIZED_KEY"
 soft user info admin
 soft info
-cmp stdout info.txt
+cmpenv stdout info.txt
 
 
 # list admin pubkeys
 soft pubkey list
-cmp stdout admin_key_list1.txt
+cmpenv stdout admin_key_list1.txt
 
 # remove key
-soft pubkey remove "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPjUeXhBzj18/WZbqcD1aPJlCALzBMMZxhpaU45KgVqL"
+soft pubkey remove $ADMIN2_AUTHORIZED_KEY
 soft pubkey list
-cmp stdout admin_key_list2.txt
+cmpenv stdout admin_key_list2.txt
 
 # add key back key
-soft pubkey add "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPjUeXhBzj18/WZbqcD1aPJlCALzBMMZxhpaU45KgVqL"
+soft pubkey add $ADMIN2_AUTHORIZED_KEY
 soft pubkey list
-cmp stdout admin_key_list1.txt
-
+cmpenv stdout admin_key_list1.txt
 
 # list users
 soft user list
-cmp stdout list1.txt
-
+cmpenv stdout list1.txt
 
 # create a new user
-soft user create foo --key "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAzXnhJ/6SrlHZI+DnTb1n/0KL6/VOQTea8qLovTiZix"
+soft user create foo --key "$USER1_AUTHORIZED_KEY"
 soft user list
-cmp stdout list2.txt
-
+cmpenv stdout list2.txt
 
 # get new user info
 soft user info foo
-cmp stdout foo_info1.txt
-
+cmpenv stdout foo_info1.txt
 
 # make user admin
 soft user set-admin foo true
 soft user info foo
-cmp stdout foo_info2.txt
-
+cmpenv stdout foo_info2.txt
 
 # remove admin
 soft user set-admin foo false
 soft user info foo
-cmp stdout foo_info3.txt
-
+cmpenv stdout foo_info3.txt
 
 # remove key from user
-soft user remove-pubkey foo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAzXnhJ/6SrlHZI+DnTb1n/0KL6/VOQTea8qLovTiZix"
+soft user remove-pubkey foo "$USER1_AUTHORIZED_KEY"
 soft user info foo
-cmp stdout foo_info4.txt
+cmpenv stdout foo_info4.txt
 
 # rename user
 soft user set-username foo foo2
 soft user info foo2
-cmp stdout foo_info5.txt
-
+cmpenv stdout foo_info5.txt
 
 # remove user
 soft user delete foo2
-cmp stdout foo_delete.txt
+! stdout .
 soft user list
-cmp stdout list1.txt
+cmpenv stdout list1.txt
 
 
 -- info.txt --
 Username: admin
 Admin: true
 Public keys:
-  ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJI/1tawpdPmzuJcTGTJ+QReqB6cRUdKj4iQIdJUFdrl
-  ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPjUeXhBzj18/WZbqcD1aPJlCALzBMMZxhpaU45KgVqL
+  $ADMIN1_AUTHORIZED_KEY
+  $ADMIN2_AUTHORIZED_KEY
 -- list1.txt --
 admin
 -- list2.txt --
@@ -82,17 +75,17 @@ foo
 Username: foo
 Admin: false
 Public keys:
-  ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAzXnhJ/6SrlHZI+DnTb1n/0KL6/VOQTea8qLovTiZix
+  $USER1_AUTHORIZED_KEY
 -- foo_info2.txt --
 Username: foo
 Admin: true
 Public keys:
-  ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAzXnhJ/6SrlHZI+DnTb1n/0KL6/VOQTea8qLovTiZix
+  $USER1_AUTHORIZED_KEY
 -- foo_info3.txt --
 Username: foo
 Admin: false
 Public keys:
-  ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAzXnhJ/6SrlHZI+DnTb1n/0KL6/VOQTea8qLovTiZix
+  $USER1_AUTHORIZED_KEY
 -- foo_info4.txt --
 Username: foo
 Admin: false
@@ -102,8 +95,7 @@ Username: foo2
 Admin: false
 Public keys:
 -- admin_key_list1.txt --
-ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJI/1tawpdPmzuJcTGTJ+QReqB6cRUdKj4iQIdJUFdrl
-ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPjUeXhBzj18/WZbqcD1aPJlCALzBMMZxhpaU45KgVqL
+$ADMIN1_AUTHORIZED_KEY
+$ADMIN2_AUTHORIZED_KEY
 -- admin_key_list2.txt --
-ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJI/1tawpdPmzuJcTGTJ+QReqB6cRUdKj4iQIdJUFdrl
--- foo_delete.txt --
+$ADMIN1_AUTHORIZED_KEY

testscript/testdata/user1 🔗

@@ -1,7 +0,0 @@
------BEGIN OPENSSH PRIVATE KEY-----
-b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
-QyNTUxOQAAACAM154Sf+kq5R2SPg5029Z/9Ci+v1TkE3mvKi6L04mYsQAAAJgAOMy/ADjM
-vwAAAAtzc2gtZWQyNTUxOQAAACAM154Sf+kq5R2SPg5029Z/9Ci+v1TkE3mvKi6L04mYsQ
-AAAECH03vQo8gCmxbUqHWlcM2buCgIi4x6IR4WWkXlXqhzoAzXnhJ/6SrlHZI+DnTb1n/0
-KL6/VOQTea8qLovTiZixAAAAD2Nhcmxvc0BkYXJrc3RhcgECAwQFBg==
------END OPENSSH PRIVATE KEY-----

testscript/testdata/user2 🔗

@@ -1,7 +0,0 @@
------BEGIN OPENSSH PRIVATE KEY-----
-b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
-QyNTUxOQAAACChLkp+T1IWDQ5I5BI5Q8YQrP7aKdQLVe7+Pn9/xEM5LwAAAJiupdpmrqXa
-ZgAAAAtzc2gtZWQyNTUxOQAAACChLkp+T1IWDQ5I5BI5Q8YQrP7aKdQLVe7+Pn9/xEM5Lw
-AAAECrufZjft7PHyL8FQLnR/D73VySS1A6UZdEQmL+W/+gJ6EuSn5PUhYNDkjkEjlDxhCs
-/top1AtV7v4+f3/EQzkvAAAAD2Nhcmxvc0BkYXJrc3RhcgECAwQFBg==
------END OPENSSH PRIVATE KEY-----