Revise config construction
This commit is contained in:
parent
08c9c6e8fd
commit
445516e9e9
|
@ -13,11 +13,9 @@ repository = "https://github.com/masalachai/epp-client"
|
||||||
epp-client-macros = "0.1" # { path = "../epp-client-macros" }
|
epp-client-macros = "0.1" # { path = "../epp-client-macros" }
|
||||||
bytes = "1"
|
bytes = "1"
|
||||||
chrono = "0.4"
|
chrono = "0.4"
|
||||||
confy = "0.4"
|
|
||||||
futures = "0.3"
|
futures = "0.3"
|
||||||
env_logger = "0.9"
|
env_logger = "0.9"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
lazy_static = "1.4"
|
|
||||||
quick-xml = { version = "0.22", features = [ "serialize" ] }
|
quick-xml = { version = "0.22", features = [ "serialize" ] }
|
||||||
rustls = "0.20"
|
rustls = "0.20"
|
||||||
rustls-pemfile = "0.2"
|
rustls-pemfile = "0.2"
|
||||||
|
|
|
@ -47,24 +47,13 @@
|
||||||
//! let tls = registry.tls_files().unwrap();
|
//! let tls = registry.tls_files().unwrap();
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
use confy;
|
|
||||||
use lazy_static::lazy_static;
|
|
||||||
use rustls::{Certificate, PrivateKey};
|
use rustls::{Certificate, PrivateKey};
|
||||||
use rustls_pemfile;
|
use rustls_pemfile;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::default;
|
|
||||||
use std::io::{Seek, SeekFrom};
|
use std::io::{Seek, SeekFrom};
|
||||||
use std::{fs, io};
|
use std::{fs, io};
|
||||||
|
|
||||||
lazy_static! {
|
|
||||||
/// Static reference to the config file
|
|
||||||
pub static ref CONFIG: EppClientConfig = match confy::load("epp-client") {
|
|
||||||
Ok(cfg) => cfg,
|
|
||||||
Err(e) => panic!("Config read error: {}", e),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Paths to the client certificate and client key PEM files
|
/// Paths to the client certificate and client key PEM files
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub struct EppClientTlsFiles {
|
pub struct EppClientTlsFiles {
|
||||||
|
@ -75,12 +64,12 @@ pub struct EppClientTlsFiles {
|
||||||
/// Connection details to connect to and authenticate with a registry
|
/// Connection details to connect to and authenticate with a registry
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub struct EppClientConnection {
|
pub struct EppClientConnection {
|
||||||
host: String,
|
pub host: String,
|
||||||
port: u16,
|
pub port: u16,
|
||||||
username: String,
|
pub username: String,
|
||||||
password: String,
|
pub password: String,
|
||||||
ext_uris: Option<Vec<String>>,
|
pub ext_uris: Option<Vec<String>>,
|
||||||
tls_files: Option<EppClientTlsFiles>,
|
pub tls_files: Option<EppClientTlsFiles>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Config that stores settings for multiple registries
|
/// Config that stores settings for multiple registries
|
||||||
|
@ -89,27 +78,6 @@ pub struct EppClientConfig {
|
||||||
pub registry: HashMap<String, EppClientConnection>,
|
pub registry: HashMap<String, EppClientConnection>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl default::Default for EppClientConfig {
|
|
||||||
fn default() -> Self {
|
|
||||||
let mut registries: HashMap<String, EppClientConnection> = HashMap::new();
|
|
||||||
let registrar = EppClientConnection {
|
|
||||||
host: "epphost".to_string(),
|
|
||||||
port: 700,
|
|
||||||
username: "username".to_string(),
|
|
||||||
password: "password".to_string(),
|
|
||||||
ext_uris: Some(vec![]),
|
|
||||||
tls_files: Some(EppClientTlsFiles {
|
|
||||||
cert_chain: "/path/to/certificate/chain/pemfile".to_string(),
|
|
||||||
key: "/path/to/private/key/pemfile".to_string(),
|
|
||||||
}),
|
|
||||||
};
|
|
||||||
registries.insert("verisign".to_string(), registrar);
|
|
||||||
Self {
|
|
||||||
registry: registries,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl EppClientConnection {
|
impl EppClientConnection {
|
||||||
/// Returns the EPP host and port no as a tuple
|
/// Returns the EPP host and port no as a tuple
|
||||||
pub fn connection_details(&self) -> (String, u16) {
|
pub fn connection_details(&self) -> (String, u16) {
|
||||||
|
|
|
@ -28,12 +28,10 @@
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
use futures::executor::block_on;
|
use futures::executor::block_on;
|
||||||
use std::sync::mpsc;
|
|
||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
use std::{error::Error, fmt::Debug};
|
use std::{error::Error, fmt::Debug};
|
||||||
// use std::sync::Arc;
|
|
||||||
|
|
||||||
use crate::config::CONFIG;
|
use crate::config::EppClientConfig;
|
||||||
use crate::connection::registry::{epp_connect, EppConnection};
|
use crate::connection::registry::{epp_connect, EppConnection};
|
||||||
use crate::epp::request::{generate_client_tr_id, EppHello, EppLogin, EppLogout};
|
use crate::epp::request::{generate_client_tr_id, EppHello, EppLogin, EppLogout};
|
||||||
use crate::epp::response::{
|
use crate::epp::response::{
|
||||||
|
@ -41,40 +39,6 @@ use crate::epp::response::{
|
||||||
};
|
};
|
||||||
use crate::epp::xml::EppXml;
|
use crate::epp::xml::EppXml;
|
||||||
use crate::error;
|
use crate::error;
|
||||||
|
|
||||||
/// Connects to the registry and returns an logged-in instance of EppClient for further transactions
|
|
||||||
async fn connect(registry: &'static str) -> Result<EppClient, Box<dyn Error>> {
|
|
||||||
let registry_creds = match CONFIG.registry(registry) {
|
|
||||||
Some(creds) => creds,
|
|
||||||
None => return Err(format!("missing credentials for {}", registry).into()),
|
|
||||||
};
|
|
||||||
|
|
||||||
let (tx, rx) = mpsc::channel();
|
|
||||||
|
|
||||||
tokio::spawn(async move {
|
|
||||||
let stream = epp_connect(registry_creds).await.unwrap();
|
|
||||||
let credentials = registry_creds.credentials();
|
|
||||||
let ext_uris = registry_creds.ext_uris();
|
|
||||||
|
|
||||||
let ext_uris =
|
|
||||||
ext_uris.map(|uris| uris.iter().map(|u| u.to_string()).collect::<Vec<String>>());
|
|
||||||
|
|
||||||
let connection = EppConnection::new(registry.to_string(), stream)
|
|
||||||
.await
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let client = EppClient::build(connection, credentials, ext_uris)
|
|
||||||
.await
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
tx.send(client).unwrap();
|
|
||||||
});
|
|
||||||
|
|
||||||
let client = rx.recv()?;
|
|
||||||
|
|
||||||
Ok(client)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Instances of the EppClient type are used to transact with the registry.
|
/// Instances of the EppClient type are used to transact with the registry.
|
||||||
/// Once initialized, the EppClient instance can serialize EPP requests to XML and send them
|
/// Once initialized, the EppClient instance can serialize EPP requests to XML and send them
|
||||||
/// to the registry and deserialize the XML responses from the registry to local types
|
/// to the registry and deserialize the XML responses from the registry to local types
|
||||||
|
@ -82,7 +46,6 @@ pub struct EppClient {
|
||||||
credentials: (String, String),
|
credentials: (String, String),
|
||||||
ext_uris: Option<Vec<String>>,
|
ext_uris: Option<Vec<String>>,
|
||||||
connection: EppConnection,
|
connection: EppConnection,
|
||||||
// pub client_tr_id_fn: Arc<dyn Fn(&EppClient) -> String + Send + Sync>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A function to generate a simple client TRID. Should only be used for testing, library users
|
/// A function to generate a simple client TRID. Should only be used for testing, library users
|
||||||
|
@ -96,20 +59,26 @@ pub fn default_client_tr_id_fn(client: &EppClient) -> String {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EppClient {
|
impl EppClient {
|
||||||
/// Fetches the username used in the registry connection
|
|
||||||
pub fn username(&self) -> String {
|
|
||||||
self.credentials.0.to_string()
|
|
||||||
}
|
|
||||||
|
|
||||||
// pub fn set_client_tr_id_fn<F>(&mut self, func: F)
|
|
||||||
// where F: Fn(&EppClient) -> String + Send + Sync + 'static {
|
|
||||||
// self.client_tr_id_fn = Arc::new(func);
|
|
||||||
// }
|
|
||||||
|
|
||||||
/// Creates a new EppClient object and does an EPP Login to a given registry to become ready
|
/// Creates a new EppClient object and does an EPP Login to a given registry to become ready
|
||||||
/// for subsequent transactions on this client instance
|
/// for subsequent transactions on this client instance
|
||||||
pub async fn new(registry: &'static str) -> Result<EppClient, Box<dyn Error>> {
|
pub async fn new(
|
||||||
connect(registry).await
|
config: &EppClientConfig,
|
||||||
|
registry: &str,
|
||||||
|
) -> Result<EppClient, Box<dyn Error>> {
|
||||||
|
let registry_creds = match config.registry(registry) {
|
||||||
|
Some(creds) => creds,
|
||||||
|
None => return Err(format!("missing credentials for {}", registry).into()),
|
||||||
|
};
|
||||||
|
|
||||||
|
let stream = epp_connect(registry_creds).await?;
|
||||||
|
let credentials = registry_creds.credentials();
|
||||||
|
let ext_uris = registry_creds.ext_uris();
|
||||||
|
|
||||||
|
let ext_uris =
|
||||||
|
ext_uris.map(|uris| uris.iter().map(|u| u.to_string()).collect::<Vec<String>>());
|
||||||
|
|
||||||
|
let connection = EppConnection::new(registry.to_string(), stream).await?;
|
||||||
|
EppClient::build(connection, credentials, ext_uris).await
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Makes a login request to the registry and initializes an EppClient instance with it
|
/// Makes a login request to the registry and initializes an EppClient instance with it
|
||||||
|
@ -171,6 +140,11 @@ impl EppClient {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Fetches the username used in the registry connection
|
||||||
|
pub fn username(&self) -> String {
|
||||||
|
self.credentials.0.to_string()
|
||||||
|
}
|
||||||
|
|
||||||
/// Accepts raw EPP XML and returns the raw EPP XML response to it.
|
/// Accepts raw EPP XML and returns the raw EPP XML response to it.
|
||||||
/// Not recommended for direct use but sometimes can be useful for debugging
|
/// Not recommended for direct use but sometimes can be useful for debugging
|
||||||
pub async fn transact_xml(&mut self, xml: &str) -> Result<String, Box<dyn Error>> {
|
pub async fn transact_xml(&mut self, xml: &str) -> Result<String, Box<dyn Error>> {
|
||||||
|
|
Loading…
Reference in New Issue