1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
// Copyright 2017 Dmitry Tantsur <divius.inside@gmail.com> // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //! Base code for authentication. use std::fmt::Debug; use reqwest::{Method, Url}; use super::super::Result; use super::super::session::RequestBuilder; /// Trait for an authentication method. /// /// An OpenStack authentication method is expected to be able to: /// /// 1. get an authentication token to use when accessing services, /// 2. get an endpoint URL for the given service type. /// /// An authentication method should cache the token as long as it's valid. pub trait AuthMethod: BoxedClone + Debug { /// Default endpoint interface that is used when none is provided. fn default_endpoint_interface(&self) -> String { String::from("public") } /// Region used with this authentication (if any). fn region(&self) -> Option<String> { None } /// Get a URL for the requested service. fn get_endpoint(&self, service_type: String, endpoint_interface: Option<String>) -> Result<Url>; /// Create an authenticated request. fn request(&self, method: Method, url: Url) -> Result<RequestBuilder>; /// Refresh the authentication (renew the token, etc). fn refresh(&mut self) -> Result<()>; } /// Helper trait to allow cloning of sessions. pub trait BoxedClone { /// Clone the authentication method. fn boxed_clone(&self) -> Box<AuthMethod>; } impl<T> BoxedClone for T where T: 'static + AuthMethod + Clone { fn boxed_clone(&self) -> Box<AuthMethod> { Box::new(self.clone()) } } impl Clone for Box<AuthMethod> { fn clone(&self) -> Box<AuthMethod> { self.boxed_clone() } }