@@ -219,6 +219,7 @@ func NewHandlers(
219219 getAPIRouterNoError (apiRouter )("/dev-servers" , handlers .getDevServers ).Methods ("GET" )
220220 getAPIRouterNoError (apiRouter )("/account-add" , handlers .postAddAccount ).Methods ("POST" )
221221 getAPIRouterNoError (apiRouter )("/keystores" , handlers .getKeystores ).Methods ("GET" )
222+ getAPIRouterNoError (apiRouter )("/keystore/{rootFingerprint}/features" , handlers .getKeystoreFeatures ).Methods ("GET" )
222223 getAPIRouterNoError (apiRouter )("/accounts" , handlers .getAccounts ).Methods ("GET" )
223224 getAPIRouter (apiRouter )("/accounts/balance-summary" , handlers .getAccountsBalanceSummary ).Methods ("GET" )
224225 getAPIRouterNoError (apiRouter )("/set-account-active" , handlers .postSetAccountActive ).Methods ("POST" )
@@ -605,6 +606,55 @@ func (handlers *Handlers) getKeystores(*http.Request) interface{} {
605606 return keystores
606607}
607608
609+ func (handlers * Handlers ) getKeystoreFeatures (r * http.Request ) interface {} {
610+ type response struct {
611+ Success bool `json:"success"`
612+ ErrorMessage string `json:"errorMessage,omitempty"`
613+ Features * keystore.Features `json:"features,omitempty"`
614+ }
615+
616+ rootFingerprintHex := mux .Vars (r )["rootFingerprint" ]
617+ rootFingerprint , err := hex .DecodeString (rootFingerprintHex )
618+ if err != nil {
619+ handlers .log .WithError (err ).Error ("invalid root fingerprint for features request" )
620+ return response {
621+ Success : false ,
622+ ErrorMessage : err .Error (),
623+ }
624+ }
625+
626+ connectedKeystore := handlers .backend .Keystore ()
627+ if connectedKeystore == nil {
628+ handlers .log .Warn ("features requested but no keystore connected" )
629+ return response {
630+ Success : false ,
631+ ErrorMessage : "keystore not connected" ,
632+ }
633+ }
634+
635+ connectedRootFingerprint , err := connectedKeystore .RootFingerprint ()
636+ if err != nil {
637+ handlers .log .WithError (err ).Error ("could not determine connected keystore root fingerprint" )
638+ return response {
639+ Success : false ,
640+ ErrorMessage : err .Error (),
641+ }
642+ }
643+
644+ if ! bytes .Equal (rootFingerprint , connectedRootFingerprint ) {
645+ handlers .log .WithField ("requested" , rootFingerprintHex ).Warn ("features requested for non-connected keystore" )
646+ return response {
647+ Success : false ,
648+ ErrorMessage : "wrong keystore connected" ,
649+ }
650+ }
651+
652+ return response {
653+ Success : true ,
654+ Features : connectedKeystore .Features (),
655+ }
656+ }
657+
608658func (handlers * Handlers ) getAccounts (* http.Request ) interface {} {
609659 persistedAccounts := handlers .backend .Config ().AccountsConfig ()
610660
0 commit comments