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  }