github.com/nats-io/nsc@v0.0.0-20221206222106-35db9400b257/cmd/exportkeys_test.go (about) 1 /* 2 * Copyright 2018-2022 The NATS Authors 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 package cmd 17 18 import ( 19 "fmt" 20 "os" 21 "path/filepath" 22 "testing" 23 24 "github.com/nats-io/nsc/cmd/store" 25 26 "github.com/nats-io/nkeys" 27 "github.com/stretchr/testify/require" 28 ) 29 30 func requireEmptyDir(t *testing.T, dir string) { 31 dirEntries, err := os.ReadDir(dir) 32 require.NoError(t, err) 33 require.Len(t, dirEntries, 0) 34 } 35 36 func requireExportedKey(t *testing.T, dir string, pk string) { 37 kf := filepath.Join(dir, fmt.Sprintf("%s.nk", pk)) 38 require.FileExists(t, kf) 39 40 d, err := Read(kf) 41 require.NoError(t, err) 42 nk, err := nkeys.FromSeed(d) 43 require.NoError(t, err) 44 vpk, err := nk.PublicKey() 45 require.NoError(t, err) 46 require.Equal(t, pk, vpk) 47 } 48 49 func requireNotExportedKey(t *testing.T, dir string, pk string) { 50 kf := filepath.Join(dir, fmt.Sprintf("%s.nk", pk)) 51 _, err := os.Stat(kf) 52 require.True(t, os.IsNotExist(err)) 53 } 54 55 func Test_ExportContext(t *testing.T) { 56 ts := NewTestStore(t, "O") 57 defer ts.Done(t) 58 ts.AddAccount(t, "A") 59 ts.AddUser(t, "A", "U") 60 61 exportDir := filepath.Join(ts.Dir, "export") 62 _, _, err := ExecuteCmd(createExportKeysCmd(), "--dir", exportDir) 63 require.NoError(t, err) 64 65 opk := ts.GetOperatorPublicKey(t) 66 requireExportedKey(t, exportDir, opk) 67 68 apk := ts.GetAccountPublicKey(t, "A") 69 requireExportedKey(t, exportDir, apk) 70 71 upk := ts.GetUserPublicKey(t, "A", "U") 72 requireExportedKey(t, exportDir, upk) 73 } 74 75 func Test_ExportOnlyContext(t *testing.T) { 76 ts := NewTestStore(t, "O") 77 defer ts.Done(t) 78 ts.AddAccount(t, "AA") 79 ts.AddUser(t, "AA", "UU") 80 ts.AddAccount(t, "A") 81 ts.AddUser(t, "A", "U") 82 83 exportDir := filepath.Join(ts.Dir, "export") 84 _, _, err := ExecuteCmd(createExportKeysCmd(), "--dir", exportDir) 85 require.NoError(t, err) 86 87 opk := ts.GetOperatorPublicKey(t) 88 requireExportedKey(t, exportDir, opk) 89 90 apk := ts.GetAccountPublicKey(t, "A") 91 requireExportedKey(t, exportDir, apk) 92 93 upk := ts.GetUserPublicKey(t, "A", "U") 94 requireExportedKey(t, exportDir, upk) 95 96 aapk := ts.GetAccountPublicKey(t, "AA") 97 requireNotExportedKey(t, exportDir, aapk) 98 99 uupk := ts.GetUserPublicKey(t, "AA", "UU") 100 requireNotExportedKey(t, exportDir, uupk) 101 } 102 103 func Test_ExportAllContext(t *testing.T) { 104 ts := NewTestStore(t, "O") 105 defer ts.Done(t) 106 ts.AddAccount(t, "AA") 107 ts.AddUser(t, "AA", "UU") 108 ts.AddAccount(t, "A") 109 ts.AddUser(t, "A", "U") 110 111 exportDir := filepath.Join(ts.Dir, "export") 112 _, _, err := ExecuteCmd(createExportKeysCmd(), "--all", "--dir", exportDir) 113 require.NoError(t, err) 114 115 opk := ts.GetOperatorPublicKey(t) 116 requireExportedKey(t, exportDir, opk) 117 118 apk := ts.GetAccountPublicKey(t, "A") 119 requireExportedKey(t, exportDir, apk) 120 121 upk := ts.GetUserPublicKey(t, "A", "U") 122 requireExportedKey(t, exportDir, upk) 123 124 aapk := ts.GetAccountPublicKey(t, "AA") 125 requireExportedKey(t, exportDir, aapk) 126 127 uupk := ts.GetUserPublicKey(t, "AA", "UU") 128 requireExportedKey(t, exportDir, uupk) 129 } 130 131 func Test_ExportAccount(t *testing.T) { 132 ts := NewTestStore(t, "O") 133 defer ts.Done(t) 134 ts.AddAccount(t, "AA") 135 ts.AddUser(t, "AA", "UU") 136 ts.AddAccount(t, "A") 137 ts.AddUser(t, "A", "U") 138 139 exportDir := filepath.Join(ts.Dir, "export") 140 _, _, err := ExecuteCmd(createExportKeysCmd(), "--account", "AA", "--dir", exportDir) 141 require.NoError(t, err) 142 143 opk := ts.GetOperatorPublicKey(t) 144 requireExportedKey(t, exportDir, opk) 145 146 apk := ts.GetAccountPublicKey(t, "A") 147 requireNotExportedKey(t, exportDir, apk) 148 149 upk := ts.GetUserPublicKey(t, "A", "U") 150 requireNotExportedKey(t, exportDir, upk) 151 152 aapk := ts.GetAccountPublicKey(t, "AA") 153 requireExportedKey(t, exportDir, aapk) 154 155 uupk := ts.GetUserPublicKey(t, "AA", "UU") 156 requireExportedKey(t, exportDir, uupk) 157 } 158 159 func Test_ExportRemove(t *testing.T) { 160 ts := NewTestStore(t, "O") 161 defer ts.Done(t) 162 ts.AddAccount(t, "A") 163 ts.AddUser(t, "A", "U") 164 165 opk := ts.GetOperatorPublicKey(t) 166 apk := ts.GetAccountPublicKey(t, "A") 167 upk := ts.GetUserPublicKey(t, "A", "U") 168 169 exportDir := filepath.Join(ts.Dir, "export") 170 _, _, err := ExecuteCmd(createExportKeysCmd(), "--dir", exportDir, "--remove") 171 require.NoError(t, err) 172 173 requireExportedKey(t, exportDir, opk) 174 requireExportedKey(t, exportDir, apk) 175 requireExportedKey(t, exportDir, upk) 176 177 requireEmptyDir(t, filepath.Join(ts.KeysDir, "keys", "O")) 178 requireEmptyDir(t, filepath.Join(ts.KeysDir, "keys", "A")) 179 requireEmptyDir(t, filepath.Join(ts.KeysDir, "keys", "U")) 180 } 181 182 func Test_ExportNoKeyStore(t *testing.T) { 183 ts := NewEmptyStore(t) 184 defer ts.Done(t) 185 186 store.KeyStorePath = ts.KeysDir 187 _, _, err := ExecuteCmd(createExportKeysCmd(), "--dir", ts.Dir) 188 require.Error(t, err) 189 require.Equal(t, err.Error(), fmt.Sprintf("keystore `%s` does not exist", ts.KeysDir)) 190 }