1- use super :: { types:: * , PK_LEN , SECRET_PREFIX } ;
1+ use super :: types:: * ;
22use crate :: Error ;
33use account_utils:: ZeroizeString ;
4- use bytes:: Bytes ;
5- use libsecp256k1:: { Message , PublicKey , Signature } ;
64use reqwest:: {
75 header:: { HeaderMap , HeaderValue } ,
86 IntoUrl ,
97} ;
10- use ring:: digest:: { digest, SHA256 } ;
118use sensitive_url:: SensitiveUrl ;
129use serde:: { de:: DeserializeOwned , Serialize } ;
1310use std:: fmt:: { self , Display } ;
@@ -24,8 +21,7 @@ use types::graffiti::GraffitiString;
2421pub struct ValidatorClientHttpClient {
2522 client : reqwest:: Client ,
2623 server : SensitiveUrl ,
27- secret : Option < ZeroizeString > ,
28- server_pubkey : Option < PublicKey > ,
24+ api_token : Option < ZeroizeString > ,
2925 authorization_header : AuthorizationHeader ,
3026}
3127
@@ -46,45 +42,13 @@ impl Display for AuthorizationHeader {
4642 }
4743}
4844
49- /// Parse an API token and return a secp256k1 public key.
50- ///
51- /// If the token does not start with the Lighthouse token prefix then `Ok(None)` will be returned.
52- /// An error will be returned if the token looks like a Lighthouse token but doesn't correspond to a
53- /// valid public key.
54- pub fn parse_pubkey ( secret : & str ) -> Result < Option < PublicKey > , Error > {
55- let secret = if !secret. starts_with ( SECRET_PREFIX ) {
56- return Ok ( None ) ;
57- } else {
58- & secret[ SECRET_PREFIX . len ( ) ..]
59- } ;
60-
61- serde_utils:: hex:: decode ( secret)
62- . map_err ( |e| Error :: InvalidSecret ( format ! ( "invalid hex: {:?}" , e) ) )
63- . and_then ( |bytes| {
64- if bytes. len ( ) != PK_LEN {
65- return Err ( Error :: InvalidSecret ( format ! (
66- "expected {} bytes not {}" ,
67- PK_LEN ,
68- bytes. len( )
69- ) ) ) ;
70- }
71-
72- let mut arr = [ 0 ; PK_LEN ] ;
73- arr. copy_from_slice ( & bytes) ;
74- PublicKey :: parse_compressed ( & arr)
75- . map_err ( |e| Error :: InvalidSecret ( format ! ( "invalid secp256k1 pubkey: {:?}" , e) ) )
76- } )
77- . map ( Some )
78- }
79-
8045impl ValidatorClientHttpClient {
8146 /// Create a new client pre-initialised with an API token.
8247 pub fn new ( server : SensitiveUrl , secret : String ) -> Result < Self , Error > {
8348 Ok ( Self {
8449 client : reqwest:: Client :: new ( ) ,
8550 server,
86- server_pubkey : parse_pubkey ( & secret) ?,
87- secret : Some ( secret. into ( ) ) ,
51+ api_token : Some ( secret. into ( ) ) ,
8852 authorization_header : AuthorizationHeader :: Bearer ,
8953 } )
9054 }
@@ -96,8 +60,7 @@ impl ValidatorClientHttpClient {
9660 Ok ( Self {
9761 client : reqwest:: Client :: new ( ) ,
9862 server,
99- secret : None ,
100- server_pubkey : None ,
63+ api_token : None ,
10164 authorization_header : AuthorizationHeader :: Omit ,
10265 } )
10366 }
@@ -110,15 +73,14 @@ impl ValidatorClientHttpClient {
11073 Ok ( Self {
11174 client,
11275 server,
113- server_pubkey : parse_pubkey ( & secret) ?,
114- secret : Some ( secret. into ( ) ) ,
76+ api_token : Some ( secret. into ( ) ) ,
11577 authorization_header : AuthorizationHeader :: Bearer ,
11678 } )
11779 }
11880
11981 /// Get a reference to this client's API token, if any.
12082 pub fn api_token ( & self ) -> Option < & ZeroizeString > {
121- self . secret . as_ref ( )
83+ self . api_token . as_ref ( )
12284 }
12385
12486 /// Read an API token from the specified `path`, stripping any trailing whitespace.
@@ -128,19 +90,11 @@ impl ValidatorClientHttpClient {
12890 }
12991
13092 /// Add an authentication token to use when making requests.
131- ///
132- /// If the token is Lighthouse-like, a pubkey derivation will be attempted. In the case
133- /// of failure the token will still be stored, and the client can continue to be used to
134- /// communicate with non-Lighthouse nodes.
13593 pub fn add_auth_token ( & mut self , token : ZeroizeString ) -> Result < ( ) , Error > {
136- let pubkey_res = parse_pubkey ( token. as_str ( ) ) ;
137-
138- self . secret = Some ( token) ;
94+ self . api_token = Some ( token) ;
13995 self . authorization_header = AuthorizationHeader :: Bearer ;
14096
141- pubkey_res. map ( |opt_pubkey| {
142- self . server_pubkey = opt_pubkey;
143- } )
97+ Ok ( ( ) )
14498 }
14599
146100 /// Set to `false` to disable sending the `Authorization` header on requests.
@@ -160,49 +114,17 @@ impl ValidatorClientHttpClient {
160114 self . authorization_header = AuthorizationHeader :: Basic ;
161115 }
162116
163- async fn signed_body ( & self , response : Response ) -> Result < Bytes , Error > {
164- let server_pubkey = self . server_pubkey . as_ref ( ) . ok_or ( Error :: NoServerPubkey ) ?;
165- let sig = response
166- . headers ( )
167- . get ( "Signature" )
168- . ok_or ( Error :: MissingSignatureHeader ) ?
169- . to_str ( )
170- . map_err ( |_| Error :: InvalidSignatureHeader ) ?
171- . to_string ( ) ;
172-
173- let body = response. bytes ( ) . await . map_err ( Error :: from) ?;
174-
175- let message =
176- Message :: parse_slice ( digest ( & SHA256 , & body) . as_ref ( ) ) . expect ( "sha256 is 32 bytes" ) ;
177-
178- serde_utils:: hex:: decode ( & sig)
179- . ok ( )
180- . and_then ( |bytes| {
181- let sig = Signature :: parse_der ( & bytes) . ok ( ) ?;
182- Some ( libsecp256k1:: verify ( & message, & sig, server_pubkey) )
183- } )
184- . filter ( |is_valid| * is_valid)
185- . ok_or ( Error :: InvalidSignatureHeader ) ?;
186-
187- Ok ( body)
188- }
189-
190- async fn signed_json < T : DeserializeOwned > ( & self , response : Response ) -> Result < T , Error > {
191- let body = self . signed_body ( response) . await ?;
192- serde_json:: from_slice ( & body) . map_err ( Error :: InvalidJson )
193- }
194-
195117 fn headers ( & self ) -> Result < HeaderMap , Error > {
196118 let mut headers = HeaderMap :: new ( ) ;
197119
198120 if self . authorization_header == AuthorizationHeader :: Basic
199121 || self . authorization_header == AuthorizationHeader :: Bearer
200122 {
201- let secret = self . secret . as_ref ( ) . ok_or ( Error :: NoToken ) ?;
123+ let auth_header_token = self . api_token ( ) . ok_or ( Error :: NoToken ) ?;
202124 let header_value = HeaderValue :: from_str ( & format ! (
203125 "{} {}" ,
204126 self . authorization_header,
205- secret . as_str( )
127+ auth_header_token . as_str( )
206128 ) )
207129 . map_err ( |e| {
208130 Error :: InvalidSecret ( format ! ( "secret is invalid as a header value: {}" , e) )
@@ -240,7 +162,8 @@ impl ValidatorClientHttpClient {
240162
241163 async fn get < T : DeserializeOwned , U : IntoUrl > ( & self , url : U ) -> Result < T , Error > {
242164 let response = self . get_response ( url) . await ?;
243- self . signed_json ( response) . await
165+ let body = response. bytes ( ) . await . map_err ( Error :: from) ?;
166+ serde_json:: from_slice ( & body) . map_err ( Error :: InvalidJson )
244167 }
245168
246169 async fn delete < U : IntoUrl > ( & self , url : U ) -> Result < ( ) , Error > {
@@ -263,7 +186,14 @@ impl ValidatorClientHttpClient {
263186 /// Perform a HTTP GET request, returning `None` on a 404 error.
264187 async fn get_opt < T : DeserializeOwned , U : IntoUrl > ( & self , url : U ) -> Result < Option < T > , Error > {
265188 match self . get_response ( url) . await {
266- Ok ( resp) => self . signed_json ( resp) . await . map ( Option :: Some ) ,
189+ Ok ( resp) => {
190+ let body = resp. bytes ( ) . await . map ( Option :: Some ) ?;
191+ if let Some ( body) = body {
192+ serde_json:: from_slice ( & body) . map_err ( Error :: InvalidJson )
193+ } else {
194+ Ok ( None )
195+ }
196+ }
267197 Err ( err) => {
268198 if err. status ( ) == Some ( StatusCode :: NOT_FOUND ) {
269199 Ok ( None )
@@ -297,7 +227,8 @@ impl ValidatorClientHttpClient {
297227 body : & T ,
298228 ) -> Result < V , Error > {
299229 let response = self . post_with_raw_response ( url, body) . await ?;
300- self . signed_json ( response) . await
230+ let body = response. bytes ( ) . await . map_err ( Error :: from) ?;
231+ serde_json:: from_slice ( & body) . map_err ( Error :: InvalidJson )
301232 }
302233
303234 async fn post_with_unsigned_response < T : Serialize , U : IntoUrl , V : DeserializeOwned > (
@@ -319,8 +250,7 @@ impl ValidatorClientHttpClient {
319250 . send ( )
320251 . await
321252 . map_err ( Error :: from) ?;
322- let response = ok_or_error ( response) . await ?;
323- self . signed_body ( response) . await ?;
253+ ok_or_error ( response) . await ?;
324254 Ok ( ( ) )
325255 }
326256
0 commit comments