From 29f800ba7f9adfe5c0e61723733721b7b2ecec82 Mon Sep 17 00:00:00 2001 From: Glenn Griffin Date: Fri, 8 Nov 2019 14:10:46 -0800 Subject: [PATCH] Some more improvements to reduce unnecessary allocations. --- src/authenticator.rs | 3 +-- src/device.rs | 10 +++++----- src/installed.rs | 10 +++++----- src/refresh.rs | 8 ++++---- src/service_account.rs | 18 +++++++++--------- src/storage.rs | 4 ++-- 6 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/authenticator.rs b/src/authenticator.rs index 7fd25f3..4b5a5ac 100644 --- a/src/authenticator.rs +++ b/src/authenticator.rs @@ -211,11 +211,10 @@ where return Ok(t); } // Implement refresh flow. - let refresh_token = t.refresh_token.clone(); let rr = RefreshFlow::refresh_token( client, appsecret, - refresh_token.unwrap(), + &t.refresh_token.as_ref().unwrap(), ) .await?; match rr { diff --git a/src/device.rs b/src/device.rs index c8573f2..44700c0 100644 --- a/src/device.rs +++ b/src/device.rs @@ -142,7 +142,7 @@ where let (pollinf, device_code) = Self::request_code( application_secret, client.clone(), - self.device_code_url.clone(), + &self.device_code_url, scopes, ) .await?; @@ -155,7 +155,7 @@ where let r = Self::poll_token( application_secret, client.clone(), - device_code.clone(), + &device_code, pollinf.clone(), fd.clone(), ) @@ -196,7 +196,7 @@ where async fn request_code( application_secret: &ApplicationSecret, client: hyper::Client, - device_code_url: String, + device_code_url: &str, scopes: &[T], ) -> Result<(PollInformation, String), RequestError> where @@ -278,7 +278,7 @@ where async fn poll_token<'a>( application_secret: &ApplicationSecret, client: hyper::Client, - device_code: String, + device_code: &str, pi: PollInformation, fd: FD, ) -> Result, PollError> { @@ -292,7 +292,7 @@ where .extend_pairs(&[ ("client_id", application_secret.client_id.as_str()), ("client_secret", application_secret.client_secret.as_str()), - ("code", &device_code), + ("code", device_code), ("grant_type", "http://oauth.net/grant_type/device/1.0"), ]) .finish(); diff --git a/src/installed.rs b/src/installed.rs index 0f1db98..3a2a5f0 100644 --- a/src/installed.rs +++ b/src/installed.rs @@ -214,7 +214,7 @@ where } _ => return Err(RequestError::UserError("couldn't read code".to_string())), }; - self.exchange_auth_code(authcode, None).await + self.exchange_auth_code(&authcode, None).await } async fn ask_auth_code_via_http( @@ -249,12 +249,12 @@ where .await; let auth_code = server.wait_for_auth_code().await; - self.exchange_auth_code(auth_code, Some(bound_port)).await + self.exchange_auth_code(&auth_code, Some(bound_port)).await } async fn exchange_auth_code( &self, - authcode: String, + authcode: &str, port: Option, ) -> Result { let appsec = &self.appsecret; @@ -307,7 +307,7 @@ where /// Sends the authorization code to the provider in order to obtain access and refresh tokens. fn request_token<'a>( appsecret: &ApplicationSecret, - authcode: String, + authcode: &str, custom_redirect_uri: Option<&str>, port: Option, ) -> hyper::Request { @@ -320,7 +320,7 @@ where let body = form_urlencoded::Serializer::new(String::new()) .extend_pairs(vec![ - ("code", authcode.as_str()), + ("code", authcode), ("client_id", appsecret.client_id.as_str()), ("client_secret", appsecret.client_secret.as_str()), ("redirect_uri", redirect_uri.as_ref()), diff --git a/src/refresh.rs b/src/refresh.rs index 3f60561..8963f92 100644 --- a/src/refresh.rs +++ b/src/refresh.rs @@ -33,14 +33,14 @@ impl RefreshFlow { pub async fn refresh_token( client: &hyper::Client, client_secret: &ApplicationSecret, - refresh_token: String, + refresh_token: &str, ) -> Result { // TODO: Does this function ever return RequestError? Maybe have it just return RefreshResult. let req = form_urlencoded::Serializer::new(String::new()) .extend_pairs(&[ ("client_id", client_secret.client_id.as_str()), ("client_secret", client_secret.client_secret.as_str()), - ("refresh_token", refresh_token.as_str()), + ("refresh_token", refresh_token), ("grant_type", "refresh_token"), ]) .finish(); @@ -106,7 +106,7 @@ mod tests { let app_secret = r#"{"installed":{"client_id":"902216714886-k2v9uei3p1dk6h686jbsn9mo96tnbvto.apps.googleusercontent.com","project_id":"yup-test-243420","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"iuMPN6Ne1PD7cos29Tk9rlqH","redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"]}}"#; let mut app_secret = helper::parse_application_secret(app_secret).unwrap(); app_secret.token_uri = format!("{}/token", server_url); - let refresh_token = "my-refresh-token".to_string(); + let refresh_token = "my-refresh-token"; let https = HttpsConnector::new(); let client = hyper::Client::builder() @@ -131,7 +131,7 @@ mod tests { let rr = RefreshFlow::refresh_token( &client, &app_secret, - refresh_token.clone(), + refresh_token, ) .await .unwrap(); diff --git a/src/service_account.rs b/src/service_account.rs index 0c2298d..eee3fe4 100644 --- a/src/service_account.rs +++ b/src/service_account.rs @@ -270,16 +270,16 @@ where { /// Send a request for a new Bearer token to the OAuth provider. async fn request_token( - client: hyper::client::Client, - sub: Option, - key: ServiceAccountKey, + client: &hyper::client::Client, + sub: Option<&str>, + key: &ServiceAccountKey, scopes: &[T], ) -> Result where T: AsRef, { let mut claims = init_claims_from_key(&key, scopes); - claims.sub = sub.clone(); + claims.sub = sub.map(|x| x.to_owned()); let signed = JWT::new(claims) .sign(key.private_key.as_ref().unwrap()) .map_err(RequestError::LowLevelError)?; @@ -289,7 +289,7 @@ where ("assertion".to_string(), signed), ]) .finish(); - let request = hyper::Request::post(key.token_uri.unwrap()) + let request = hyper::Request::post(key.token_uri.as_ref().unwrap()) .header(header::CONTENT_TYPE, "application/x-www-form-urlencoded") .body(hyper::Body::from(rqbody)) .unwrap(); @@ -341,7 +341,7 @@ where T: AsRef, { let hash = hash_scopes(scopes); - let cache = self.cache.clone(); + let cache = &self.cache; match cache .lock() .unwrap() @@ -351,9 +351,9 @@ where _ => {} } let token = Self::request_token( - self.client.clone(), - self.sub.clone(), - self.key.clone(), + &self.client, + self.sub.as_ref().map(|x| x.as_str()), + &self.key, scopes, ) .await?; diff --git a/src/storage.rs b/src/storage.rs index c1403ca..51afac4 100644 --- a/src/storage.rs +++ b/src/storage.rs @@ -113,7 +113,7 @@ impl TokenStorage for MemoryStorage { tokens.push(JSONToken { hash: scope_hash, scopes: Some(scopes.into_iter().map(|x| x.as_ref().to_string()).collect()), - token: t.clone(), + token: t, }); () } @@ -244,7 +244,7 @@ impl TokenStorage for DiskTokenStorage { tokens.push(JSONToken { hash: scope_hash, scopes: Some(scopes.into_iter().map(|x| x.as_ref().to_string()).collect()), - token: t.clone(), + token: t, }); () }