code.vegaprotocol.io/vega@v0.79.0/wallet/api/admin_update_passphrase.go (about) 1 // Copyright (C) 2023 Gobalsky Labs Limited 2 // 3 // This program is free software: you can redistribute it and/or modify 4 // it under the terms of the GNU Affero General Public License as 5 // published by the Free Software Foundation, either version 3 of the 6 // License, or (at your option) any later version. 7 // 8 // This program is distributed in the hope that it will be useful, 9 // but WITHOUT ANY WARRANTY; without even the implied warranty of 10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 // GNU Affero General Public License for more details. 12 // 13 // You should have received a copy of the GNU Affero General Public License 14 // along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16 package api 17 18 import ( 19 "context" 20 "fmt" 21 22 "code.vegaprotocol.io/vega/libs/jsonrpc" 23 24 "github.com/mitchellh/mapstructure" 25 ) 26 27 type AdminUpdatePassphraseParams struct { 28 Wallet string `json:"wallet"` 29 NewPassphrase string `json:"newPassphrase"` 30 } 31 32 type AdminUpdatePassphrase struct { 33 walletStore WalletStore 34 } 35 36 func (h *AdminUpdatePassphrase) Handle(ctx context.Context, rawParams jsonrpc.Params) (jsonrpc.Result, *jsonrpc.ErrorDetails) { 37 params, err := validateUpdatePassphraseParams(rawParams) 38 if err != nil { 39 return nil, InvalidParams(err) 40 } 41 42 if exist, err := h.walletStore.WalletExists(ctx, params.Wallet); err != nil { 43 return nil, InternalError(fmt.Errorf("could not verify the wallet exists: %w", err)) 44 } else if !exist { 45 return nil, InvalidParams(ErrWalletDoesNotExist) 46 } 47 48 alreadyUnlocked, err := h.walletStore.IsWalletAlreadyUnlocked(ctx, params.Wallet) 49 if err != nil { 50 return nil, InternalError(fmt.Errorf("could not verify whether the wallet is already unlock or not: %w", err)) 51 } 52 if !alreadyUnlocked { 53 return nil, RequestNotPermittedError(ErrWalletIsLocked) 54 } 55 56 if err := h.walletStore.UpdatePassphrase(ctx, params.Wallet, params.NewPassphrase); err != nil { 57 return nil, InternalError(fmt.Errorf("could not save the wallet with the new passphrase: %w", err)) 58 } 59 60 return nil, nil 61 } 62 63 func validateUpdatePassphraseParams(rawParams jsonrpc.Params) (AdminUpdatePassphraseParams, error) { 64 if rawParams == nil { 65 return AdminUpdatePassphraseParams{}, ErrParamsRequired 66 } 67 68 params := AdminUpdatePassphraseParams{} 69 if err := mapstructure.Decode(rawParams, ¶ms); err != nil { 70 return AdminUpdatePassphraseParams{}, ErrParamsDoNotMatch 71 } 72 73 if params.Wallet == "" { 74 return AdminUpdatePassphraseParams{}, ErrWalletIsRequired 75 } 76 77 if params.NewPassphrase == "" { 78 return AdminUpdatePassphraseParams{}, ErrNewPassphraseIsRequired 79 } 80 81 return params, nil 82 } 83 84 func NewAdminUpdatePassphrase( 85 walletStore WalletStore, 86 ) *AdminUpdatePassphrase { 87 return &AdminUpdatePassphrase{ 88 walletStore: walletStore, 89 } 90 }