github.com/kbehouse/nsc@v0.0.6/cmd/exportkeys_test.go (about) 1 /* 2 * Copyright 2018-2019 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 "io/ioutil" 21 "os" 22 "path/filepath" 23 "testing" 24 25 "github.com/nats-io/nkeys" 26 "github.com/stretchr/testify/require" 27 ) 28 29 func requireEmptyDir(t *testing.T, dir string) { 30 infos, err := ioutil.ReadDir(dir) 31 require.NoError(t, err) 32 require.Len(t, infos, 0) 33 } 34 35 func requireExportedKey(t *testing.T, dir string, pk string) { 36 kf := filepath.Join(dir, fmt.Sprintf("%s.nk", pk)) 37 require.FileExists(t, kf) 38 39 d, err := Read(kf) 40 require.NoError(t, err) 41 nk, err := nkeys.FromSeed(d) 42 require.NoError(t, err) 43 vpk, err := nk.PublicKey() 44 require.NoError(t, err) 45 require.Equal(t, pk, vpk) 46 } 47 48 func requireNotExportedKey(t *testing.T, dir string, pk string) { 49 kf := filepath.Join(dir, fmt.Sprintf("%s.nk", pk)) 50 _, err := os.Stat(kf) 51 require.True(t, os.IsNotExist(err)) 52 } 53 54 func Test_ExportContext(t *testing.T) { 55 ts := NewTestStore(t, "O") 56 defer ts.Done(t) 57 ts.AddAccount(t, "A") 58 ts.AddUser(t, "A", "U") 59 60 exportDir := filepath.Join(ts.Dir, "export") 61 _, _, err := ExecuteCmd(createExportKeysCmd(), "--dir", exportDir) 62 require.NoError(t, err) 63 64 opk := ts.GetOperatorPublicKey(t) 65 requireExportedKey(t, exportDir, opk) 66 67 apk := ts.GetAccountPublicKey(t, "A") 68 requireExportedKey(t, exportDir, apk) 69 70 upk := ts.GetUserPublicKey(t, "A", "U") 71 requireExportedKey(t, exportDir, upk) 72 } 73 74 func Test_ExportOnlyContext(t *testing.T) { 75 ts := NewTestStore(t, "O") 76 defer ts.Done(t) 77 ts.AddAccount(t, "AA") 78 ts.AddUser(t, "AA", "UU") 79 ts.AddAccount(t, "A") 80 ts.AddUser(t, "A", "U") 81 82 exportDir := filepath.Join(ts.Dir, "export") 83 _, _, err := ExecuteCmd(createExportKeysCmd(), "--dir", exportDir) 84 require.NoError(t, err) 85 86 opk := ts.GetOperatorPublicKey(t) 87 requireExportedKey(t, exportDir, opk) 88 89 apk := ts.GetAccountPublicKey(t, "A") 90 requireExportedKey(t, exportDir, apk) 91 92 upk := ts.GetUserPublicKey(t, "A", "U") 93 requireExportedKey(t, exportDir, upk) 94 95 aapk := ts.GetAccountPublicKey(t, "AA") 96 requireNotExportedKey(t, exportDir, aapk) 97 98 uupk := ts.GetUserPublicKey(t, "AA", "UU") 99 requireNotExportedKey(t, exportDir, uupk) 100 } 101 102 func Test_ExportAllContext(t *testing.T) { 103 ts := NewTestStore(t, "O") 104 defer ts.Done(t) 105 ts.AddAccount(t, "AA") 106 ts.AddUser(t, "AA", "UU") 107 ts.AddAccount(t, "A") 108 ts.AddUser(t, "A", "U") 109 110 exportDir := filepath.Join(ts.Dir, "export") 111 _, _, err := ExecuteCmd(createExportKeysCmd(), "--all", "--dir", exportDir) 112 require.NoError(t, err) 113 114 opk := ts.GetOperatorPublicKey(t) 115 requireExportedKey(t, exportDir, opk) 116 117 apk := ts.GetAccountPublicKey(t, "A") 118 requireExportedKey(t, exportDir, apk) 119 120 upk := ts.GetUserPublicKey(t, "A", "U") 121 requireExportedKey(t, exportDir, upk) 122 123 aapk := ts.GetAccountPublicKey(t, "AA") 124 requireExportedKey(t, exportDir, aapk) 125 126 uupk := ts.GetUserPublicKey(t, "AA", "UU") 127 requireExportedKey(t, exportDir, uupk) 128 } 129 130 func Test_ExportAccount(t *testing.T) { 131 ts := NewTestStore(t, "O") 132 defer ts.Done(t) 133 ts.AddAccount(t, "AA") 134 ts.AddUser(t, "AA", "UU") 135 ts.AddAccount(t, "A") 136 ts.AddUser(t, "A", "U") 137 138 exportDir := filepath.Join(ts.Dir, "export") 139 _, _, err := ExecuteCmd(createExportKeysCmd(), "--account", "AA", "--dir", exportDir) 140 require.NoError(t, err) 141 142 opk := ts.GetOperatorPublicKey(t) 143 requireExportedKey(t, exportDir, opk) 144 145 apk := ts.GetAccountPublicKey(t, "A") 146 requireNotExportedKey(t, exportDir, apk) 147 148 upk := ts.GetUserPublicKey(t, "A", "U") 149 requireNotExportedKey(t, exportDir, upk) 150 151 aapk := ts.GetAccountPublicKey(t, "AA") 152 requireExportedKey(t, exportDir, aapk) 153 154 uupk := ts.GetUserPublicKey(t, "AA", "UU") 155 requireExportedKey(t, exportDir, uupk) 156 } 157 158 func Test_ExportRemove(t *testing.T) { 159 ts := NewTestStore(t, "O") 160 defer ts.Done(t) 161 ts.AddAccount(t, "A") 162 ts.AddUser(t, "A", "U") 163 164 opk := ts.GetOperatorPublicKey(t) 165 apk := ts.GetAccountPublicKey(t, "A") 166 upk := ts.GetUserPublicKey(t, "A", "U") 167 168 exportDir := filepath.Join(ts.Dir, "export") 169 _, _, err := ExecuteCmd(createExportKeysCmd(), "--dir", exportDir, "--remove") 170 require.NoError(t, err) 171 172 requireExportedKey(t, exportDir, opk) 173 requireExportedKey(t, exportDir, apk) 174 requireExportedKey(t, exportDir, upk) 175 176 kr := filepath.Join(ts.Dir, "keys", "keys") 177 requireEmptyDir(t, filepath.Join(kr, "O")) 178 requireEmptyDir(t, filepath.Join(kr, "A")) 179 requireEmptyDir(t, filepath.Join(kr, "U")) 180 } 181 182 func Test_ExportNoKeyStore(t *testing.T) { 183 ts := NewEmptyStore(t) 184 defer ts.Done(t) 185 186 require.NoError(t, os.Remove(filepath.Join(ts.Dir, "keys"))) 187 _, _, err := ExecuteCmd(createExportKeysCmd(), "--dir", ts.Dir) 188 require.Error(t, err) 189 require.Contains(t, err.Error(), "does not exist") 190 }