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  }