github.com/prysmaticlabs/prysm@v1.4.4/validator/rpc/auth_test.go (about) 1 package rpc 2 3 import ( 4 "context" 5 "os" 6 "path/filepath" 7 "testing" 8 9 "github.com/form3tech-oss/jwt-go" 10 "github.com/golang/protobuf/ptypes/empty" 11 pb "github.com/prysmaticlabs/prysm/proto/validator/accounts/v2" 12 "github.com/prysmaticlabs/prysm/shared/event" 13 "github.com/prysmaticlabs/prysm/shared/fileutil" 14 "github.com/prysmaticlabs/prysm/shared/testutil/assert" 15 "github.com/prysmaticlabs/prysm/shared/testutil/require" 16 "github.com/prysmaticlabs/prysm/validator/accounts" 17 "github.com/prysmaticlabs/prysm/validator/accounts/wallet" 18 dbtest "github.com/prysmaticlabs/prysm/validator/db/testing" 19 "github.com/prysmaticlabs/prysm/validator/keymanager" 20 ) 21 22 func setupWalletDir(t testing.TB) string { 23 walletDir := filepath.Join(t.TempDir(), "wallet") 24 require.NoError(t, os.MkdirAll(walletDir, os.ModePerm)) 25 return walletDir 26 } 27 28 func TestServer_SignupAndLogin_RoundTrip(t *testing.T) { 29 valDB := dbtest.SetupDB(t, [][48]byte{}) 30 ctx := context.Background() 31 32 localWalletDir := setupWalletDir(t) 33 defaultWalletPath = localWalletDir 34 35 ss := &Server{ 36 valDB: valDB, 37 walletInitializedFeed: new(event.Feed), 38 walletDir: defaultWalletPath, 39 } 40 weakPass := "password" 41 _, err := ss.Signup(ctx, &pb.AuthRequest{ 42 Password: weakPass, 43 PasswordConfirmation: weakPass, 44 }) 45 require.ErrorContains(t, "Could not validate RPC password input", err) 46 47 // We assert we are able to signup with a strong password. 48 _, err = ss.Signup(ctx, &pb.AuthRequest{ 49 Password: strongPass, 50 PasswordConfirmation: strongPass, 51 }) 52 require.NoError(t, err) 53 54 // Assert we stored the hashed password. 55 passwordHashExists := fileutil.FileExists(filepath.Join(defaultWalletPath, HashedRPCPassword)) 56 assert.Equal(t, true, passwordHashExists) 57 58 // We attempt to create the wallet. 59 _, err = accounts.CreateWalletWithKeymanager(ctx, &accounts.CreateWalletConfig{ 60 WalletCfg: &wallet.Config{ 61 WalletDir: defaultWalletPath, 62 KeymanagerKind: keymanager.Derived, 63 WalletPassword: strongPass, 64 }, 65 SkipMnemonicConfirm: true, 66 }) 67 require.NoError(t, err) 68 69 // We assert we are able to login. 70 _, err = ss.Login(ctx, &pb.AuthRequest{ 71 Password: strongPass, 72 }) 73 require.NoError(t, err) 74 } 75 76 func TestServer_Logout(t *testing.T) { 77 key, err := createRandomJWTKey() 78 require.NoError(t, err) 79 ss := &Server{ 80 jwtKey: key, 81 } 82 tokenString, _, err := ss.createTokenString() 83 require.NoError(t, err) 84 checkParsedKey := func(*jwt.Token) (interface{}, error) { 85 return ss.jwtKey, nil 86 } 87 _, err = jwt.Parse(tokenString, checkParsedKey) 88 assert.NoError(t, err) 89 90 _, err = ss.Logout(context.Background(), &empty.Empty{}) 91 require.NoError(t, err) 92 93 // Attempting to validate the same token string after logout should fail. 94 _, err = jwt.Parse(tokenString, checkParsedKey) 95 assert.ErrorContains(t, "signature is invalid", err) 96 } 97 98 func TestServer_ChangePassword_Preconditions(t *testing.T) { 99 localWalletDir := setupWalletDir(t) 100 defaultWalletPath = localWalletDir 101 ctx := context.Background() 102 ss := &Server{ 103 walletDir: defaultWalletPath, 104 } 105 require.NoError(t, ss.SaveHashedPassword(strongPass)) 106 _, err := ss.ChangePassword(ctx, &pb.ChangePasswordRequest{ 107 CurrentPassword: strongPass, 108 Password: "", 109 }) 110 assert.ErrorContains(t, "Could not validate password input", err) 111 _, err = ss.ChangePassword(ctx, &pb.ChangePasswordRequest{ 112 CurrentPassword: strongPass, 113 Password: "abc", 114 PasswordConfirmation: "def", 115 }) 116 assert.ErrorContains(t, "does not match", err) 117 } 118 119 func TestServer_ChangePassword_OK(t *testing.T) { 120 localWalletDir := setupWalletDir(t) 121 defaultWalletPath = localWalletDir 122 ss := &Server{ 123 walletDir: defaultWalletPath, 124 } 125 password := "Passw0rdz%%%%pass" 126 newPassword := "NewPassw0rdz%%%%pass" 127 ctx := context.Background() 128 require.NoError(t, ss.SaveHashedPassword(password)) 129 _, err := ss.ChangePassword(ctx, &pb.ChangePasswordRequest{ 130 CurrentPassword: password, 131 Password: newPassword, 132 PasswordConfirmation: newPassword, 133 }) 134 require.NoError(t, err) 135 _, err = ss.Login(ctx, &pb.AuthRequest{ 136 Password: newPassword, 137 }) 138 require.NoError(t, err) 139 }