mirror of
https://github.com/NLnetLabs/krill.git
synced 2026-09-18 07:27:42 +02:00
Fixing clippy warnings. Just a few ;)
This commit is contained in:
@@ -56,6 +56,7 @@ impl PublishDelta {
|
||||
|
||||
//------------ PublishDeltaBuilder -------------------------------------------
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct PublishDeltaBuilder {
|
||||
publishes: Vec<Publish>,
|
||||
updates: Vec<Update>,
|
||||
@@ -64,11 +65,7 @@ pub struct PublishDeltaBuilder {
|
||||
|
||||
impl PublishDeltaBuilder {
|
||||
pub fn new() -> Self {
|
||||
PublishDeltaBuilder {
|
||||
publishes: vec![],
|
||||
updates: vec![],
|
||||
withdraws: vec![]
|
||||
}
|
||||
Self::default()
|
||||
}
|
||||
|
||||
pub fn add_publish(&mut self, publish: Publish) {
|
||||
|
||||
@@ -36,7 +36,7 @@ impl CmsAuthData {
|
||||
|
||||
impl CmsAuthData {
|
||||
pub fn new(tag: Option<String>, id_cert: IdCert) -> Self {
|
||||
let tag = tag.unwrap_or("".to_string());
|
||||
let tag = tag.unwrap_or_else(String::new);
|
||||
CmsAuthData { tag, id_cert }
|
||||
}
|
||||
}
|
||||
@@ -162,7 +162,7 @@ pub struct PublisherList<'a> {
|
||||
|
||||
impl<'a> PublisherList<'a> {
|
||||
pub fn from(
|
||||
publishers: &'a Vec<Arc<Publisher>>,
|
||||
publishers: &'a[Arc<Publisher>],
|
||||
path_publishers: &'a str
|
||||
) -> PublisherList<'a> {
|
||||
let publishers: Vec<PublisherSummaryInfo> = publishers.iter().map(|p|
|
||||
|
||||
+7
-11
@@ -12,8 +12,8 @@ use crate::util::file::{self, RecursorError};
|
||||
use crate::util::ext_serde;
|
||||
use util::sha256;
|
||||
|
||||
const VERSION: &'static str = "1";
|
||||
const NS: &'static str = "http://www.ripe.net/rpki/rrdp";
|
||||
const VERSION: &str = "1";
|
||||
const NS: &str = "http://www.ripe.net/rpki/rrdp";
|
||||
|
||||
#[derive(Clone, Debug, Deserialize, Eq, Serialize, PartialEq)]
|
||||
pub struct PublishedObject {
|
||||
@@ -78,7 +78,7 @@ impl Snapshot {
|
||||
Some(&a),
|
||||
|w| {
|
||||
for uri in self.objects.keys() {
|
||||
let objects = self.objects.get(uri).unwrap();
|
||||
let objects = &self.objects[uri];
|
||||
for cf in objects {
|
||||
let uri = cf.uri.to_string();
|
||||
let a = [ ("uri", uri.as_ref()) ];
|
||||
@@ -401,6 +401,7 @@ impl FileInfo {
|
||||
|
||||
//------------ NotificationBuilder -------------------------------------------
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct NotificationBuilder {
|
||||
serial: Option<usize>,
|
||||
session_id: Option<String>,
|
||||
@@ -410,12 +411,7 @@ pub struct NotificationBuilder {
|
||||
|
||||
impl NotificationBuilder {
|
||||
pub fn new() -> Self {
|
||||
NotificationBuilder {
|
||||
serial: None,
|
||||
session_id: None,
|
||||
snapshot: None,
|
||||
deltas: Vec::new()
|
||||
}
|
||||
Self::default()
|
||||
}
|
||||
|
||||
pub fn with_serial(&mut self, serial: usize) {
|
||||
@@ -457,8 +453,8 @@ impl NotificationBuilder {
|
||||
let mut count = 0;
|
||||
|
||||
self.deltas.retain(|d| {
|
||||
count = count + 1;
|
||||
total_deltas = total_deltas + d.size;
|
||||
count += 1;
|
||||
total_deltas += d.size;
|
||||
count <= 2 || total_deltas < size_snapshot
|
||||
})
|
||||
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ fn main() {
|
||||
let format = options.format().clone();
|
||||
|
||||
match apiclient::execute(options) {
|
||||
Ok(res) => res.report(format),
|
||||
Ok(res) => res.report(&format),
|
||||
Err(e) => {
|
||||
eprintln!("{}", e);
|
||||
::std::process::exit(1);
|
||||
|
||||
+3
-3
@@ -28,7 +28,7 @@ fn main() {
|
||||
}
|
||||
};
|
||||
|
||||
let client = match PubClient::new(config.state_dir()) {
|
||||
let client = match PubClient::build(config.state_dir()) {
|
||||
Ok(client) => client,
|
||||
Err(e) => {
|
||||
eprintln!("{}", e);
|
||||
@@ -63,7 +63,7 @@ fn publisher_request(
|
||||
) -> Result<(), Error> {
|
||||
let req = client.publisher_request()?;
|
||||
let mut file = file::create_file_with_path(&path)?;
|
||||
file.write(&req.encode_vec())?;
|
||||
file.write_all(&req.encode_vec())?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@ fn process_response(
|
||||
let bytes = file::read(path)?;
|
||||
let res = RepositoryResponse::decode(bytes.as_ref())?;
|
||||
res.validate()?;
|
||||
client.process_repo_response(res)?;
|
||||
client.process_repo_response(&res)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
+6
-2
@@ -3,11 +3,13 @@
|
||||
use rpki::uri;
|
||||
use crate::util::ext_serde;
|
||||
use remote::id::IdCert;
|
||||
use std::str::FromStr;
|
||||
|
||||
//------------ ApiResponse ---------------------------------------------------
|
||||
|
||||
/// This type defines all supported responses for the api
|
||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||
#[allow(clippy::large_enum_variant)]
|
||||
pub enum ApiResponse {
|
||||
Health,
|
||||
PublisherDetails(PublisherDetails),
|
||||
@@ -59,8 +61,10 @@ pub enum ReportFormat {
|
||||
Xml
|
||||
}
|
||||
|
||||
impl ReportFormat {
|
||||
pub fn from_str(s: &str) -> Result<Self, ReportError> {
|
||||
impl FromStr for ReportFormat {
|
||||
type Err = ReportError;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, ReportError> {
|
||||
match s {
|
||||
"none" => Ok(ReportFormat::None),
|
||||
"json" => Ok(ReportFormat::Json),
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
use std::path::PathBuf;
|
||||
use std::str::FromStr;
|
||||
use clap::{App, Arg, SubCommand};
|
||||
use rpki::uri;
|
||||
use uuid::Uuid;
|
||||
@@ -210,7 +211,7 @@ impl Options {
|
||||
}
|
||||
if let Some(m) = m.subcommand_matches("response") {
|
||||
let handle = m.value_of("handle").unwrap();
|
||||
let file = m.value_of("out").map(|s| PathBuf::from(s));
|
||||
let file = m.value_of("out").map(PathBuf::from);
|
||||
let response = PublishersCommand::RepositoryResponseXml(
|
||||
handle.to_string(),
|
||||
file
|
||||
|
||||
+2
-2
@@ -6,8 +6,8 @@ use actix_web::http::HeaderMap;
|
||||
use actix_web::middleware::{Middleware, Started};
|
||||
use crate::krilld::krillserver::KrillServer;
|
||||
|
||||
const ADMIN_API_PATH: &'static str = "/api/";
|
||||
const PUBLICATION_API_PATH: &'static str = "/publication/";
|
||||
const ADMIN_API_PATH: &str = "/api/";
|
||||
const PUBLICATION_API_PATH: &str = "/publication/";
|
||||
|
||||
pub struct CheckAuthorisation;
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ use toml;
|
||||
use crate::krilld::http::ssl;
|
||||
use crate::util::ext_serde;
|
||||
|
||||
const SERVER_NAME: &'static str = "Krill";
|
||||
const SERVER_NAME: &str = "Krill";
|
||||
|
||||
//------------ ConfigDefaults ------------------------------------------------
|
||||
|
||||
@@ -199,7 +199,7 @@ impl Config {
|
||||
let config_file = matches.value_of("config")
|
||||
.unwrap_or("./defaults/krill.conf");
|
||||
|
||||
let c = Self::read_config(config_file.as_ref())?;
|
||||
let c = Self::read_config(config_file)?;
|
||||
c.init_logging()?;
|
||||
Ok(c)
|
||||
}
|
||||
@@ -212,7 +212,7 @@ impl Config {
|
||||
let c: Config = toml::from_slice(v.as_slice())?;
|
||||
|
||||
if c.port < 1024 {
|
||||
return Err(ConfigError::from_str("Port number must be >1024"))
|
||||
return Err(ConfigError::other("Port number must be >1024"))
|
||||
}
|
||||
|
||||
Ok(c)
|
||||
@@ -309,7 +309,7 @@ pub enum ConfigError {
|
||||
}
|
||||
|
||||
impl ConfigError {
|
||||
pub fn from_str(s: &str) -> ConfigError {
|
||||
pub fn other(s: &str) -> ConfigError {
|
||||
ConfigError::Other(s.to_string())
|
||||
}
|
||||
}
|
||||
|
||||
+17
-10
@@ -32,13 +32,13 @@ fn render_json<O: Serialize>(object: O) -> HttpResponse {
|
||||
.content_type("application/json")
|
||||
.body(enc)
|
||||
},
|
||||
Err(e) => server_error(Error::JsonError(e))
|
||||
Err(e) => server_error(&Error::JsonError(e))
|
||||
}
|
||||
}
|
||||
|
||||
/// Helper function to render server side errors. Also responsible for
|
||||
/// logging the errors.
|
||||
fn server_error(error: Error) -> HttpResponse {
|
||||
fn server_error(error: &Error) -> HttpResponse {
|
||||
error!("{}", error);
|
||||
error.error_response()
|
||||
}
|
||||
@@ -64,7 +64,7 @@ pub fn health(_r: &HttpRequest) -> HttpResponse {
|
||||
/// Returns a json structure with all publishers in it.
|
||||
pub fn publishers(req: &HttpRequest) -> HttpResponse {
|
||||
match ro_server(req).publishers() {
|
||||
Err(e) => server_error(Error::ServerError(e)),
|
||||
Err(e) => server_error(&Error::ServerError(e)),
|
||||
Ok(publishers) => {
|
||||
render_json(
|
||||
publishers::PublisherList::from(&publishers, "/api/v1/publishers")
|
||||
@@ -75,6 +75,7 @@ pub fn publishers(req: &HttpRequest) -> HttpResponse {
|
||||
|
||||
/// Adds a publisher, expects that an RFC8183 section 5.2.3 Publisher
|
||||
/// Request XML is posted.
|
||||
#[allow(clippy::needless_pass_by_value)]
|
||||
pub fn add_publisher(
|
||||
req: HttpRequest,
|
||||
pbl: publishers::Publisher
|
||||
@@ -82,12 +83,13 @@ pub fn add_publisher(
|
||||
let mut server = rw_server(&req);
|
||||
match server.add_publisher(pbl) {
|
||||
Ok(()) => api_ok(),
|
||||
Err(e) => server_error(Error::ServerError(e))
|
||||
Err(e) => server_error(&Error::ServerError(e))
|
||||
}
|
||||
}
|
||||
|
||||
/// Removes a publisher. Should be idempotent! If if did not exist then
|
||||
/// that's just fine.
|
||||
#[allow(clippy::needless_pass_by_value)]
|
||||
pub fn remove_publisher(
|
||||
req: HttpRequest,
|
||||
handle: PublisherHandle
|
||||
@@ -96,11 +98,12 @@ pub fn remove_publisher(
|
||||
Ok(()) => api_ok(),
|
||||
Err(krillserver::Error::PublisherStore(
|
||||
pubd::Error::UnknownPublisher(_))) => api_ok(),
|
||||
Err(e) => server_error(Error::ServerError(e))
|
||||
Err(e) => server_error(&Error::ServerError(e))
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns a json structure with publisher details
|
||||
#[allow(clippy::needless_pass_by_value)]
|
||||
pub fn publisher_details(
|
||||
req: HttpRequest,
|
||||
handle: PublisherHandle
|
||||
@@ -116,12 +119,13 @@ pub fn publisher_details(
|
||||
server.service_base_uri())
|
||||
)
|
||||
},
|
||||
Err(e) => server_error(Error::ServerError(e))
|
||||
Err(e) => server_error(&Error::ServerError(e))
|
||||
}
|
||||
}
|
||||
|
||||
/// Shows the server's RFC8183 section 5.2.4 Repository Response XML
|
||||
/// file for a known publisher.
|
||||
#[allow(clippy::needless_pass_by_value)]
|
||||
pub fn repository_response(
|
||||
req: HttpRequest,
|
||||
handle: PublisherHandle
|
||||
@@ -137,7 +141,7 @@ pub fn repository_response(
|
||||
api_not_found()
|
||||
},
|
||||
Err(e) => {
|
||||
server_error(Error::ServerError(e))
|
||||
server_error(&Error::ServerError(e))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -146,6 +150,7 @@ pub fn repository_response(
|
||||
//------------ Publication ---------------------------------------------------
|
||||
|
||||
/// Processes an RFC8181 query and returns the appropriate response.
|
||||
#[allow(clippy::needless_pass_by_value)]
|
||||
pub fn handle_rfc8181_request(
|
||||
req: HttpRequest,
|
||||
msg: SignedMessage,
|
||||
@@ -159,12 +164,13 @@ pub fn handle_rfc8181_request(
|
||||
.body(captured.into_bytes())
|
||||
}
|
||||
Err(e) => {
|
||||
server_error(Error::ServerError(e))
|
||||
server_error(&Error::ServerError(e))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Processes a publishdelta request sent to the API.
|
||||
#[allow(clippy::needless_pass_by_value)]
|
||||
pub fn handle_delta(
|
||||
req: HttpRequest,
|
||||
delta: publication::PublishDelta,
|
||||
@@ -172,18 +178,19 @@ pub fn handle_delta(
|
||||
) -> HttpResponse {
|
||||
match rw_server(&req).handle_delta(delta, handle.as_ref()) {
|
||||
Ok(()) => api_ok(),
|
||||
Err(e) => server_error(Error::ServerError(e))
|
||||
Err(e) => server_error(&Error::ServerError(e))
|
||||
}
|
||||
}
|
||||
|
||||
/// Processes a list request sent to the API.
|
||||
#[allow(clippy::needless_pass_by_value)]
|
||||
pub fn handle_list(
|
||||
req: HttpRequest,
|
||||
handle: PublisherHandle
|
||||
) -> HttpResponse {
|
||||
match ro_server(&req).handle_list(handle.as_ref()) {
|
||||
Ok(list) => render_json(list),
|
||||
Err(e) => server_error(Error::ServerError(e))
|
||||
Err(e) => server_error(&Error::ServerError(e))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+18
-18
@@ -25,7 +25,7 @@ use crate::krilld::krillserver::KrillServer;
|
||||
use crate::remote::rfc8183;
|
||||
use crate::remote::sigmsg::SignedMessage;
|
||||
|
||||
const NOT_FOUND: &'static [u8] = include_bytes!("../../../ui/dev/html/404.html");
|
||||
const NOT_FOUND: &[u8] = include_bytes!("../../../ui/dev/html/404.html");
|
||||
|
||||
//------------ PubServerApp --------------------------------------------------
|
||||
|
||||
@@ -80,16 +80,13 @@ impl PubServerApp {
|
||||
});
|
||||
|
||||
use std::env;
|
||||
match env::var("KRILL_DEV_MODE") {
|
||||
Ok(_) => {
|
||||
app = app.handler(
|
||||
"/ui/dev",
|
||||
fs::StaticFiles::new("./ui/dev")
|
||||
.unwrap()
|
||||
.show_files_listing()
|
||||
);
|
||||
},
|
||||
_ => {}
|
||||
if env::var("KRILL_DEV_MODE").is_ok() {
|
||||
app = app.handler(
|
||||
"/ui/dev",
|
||||
fs::StaticFiles::new("./ui/dev")
|
||||
.unwrap()
|
||||
.show_files_listing()
|
||||
);
|
||||
}
|
||||
|
||||
PubServerApp(with_statics(app))
|
||||
@@ -97,7 +94,7 @@ impl PubServerApp {
|
||||
|
||||
pub fn create_server(config: &Config) -> Arc<RwLock<KrillServer>> {
|
||||
let authorizer = Authorizer::new(&config.auth_token);
|
||||
let pub_server = match KrillServer::new(
|
||||
let pub_server = match KrillServer::build(
|
||||
&config.data_dir,
|
||||
&config.rsync_base,
|
||||
config.service_uri(),
|
||||
@@ -121,7 +118,7 @@ impl PubServerApp {
|
||||
|
||||
server::new(move || PubServerApp::new(ps.clone()))
|
||||
.bind(config.socket_addr())
|
||||
.expect(&format!("Cannot bind to: {}", config.socket_addr()))
|
||||
.unwrap_or_else(|_| panic!("Cannot bind to: {}", config.socket_addr()))
|
||||
.shutdown_timeout(0)
|
||||
.start();
|
||||
}
|
||||
@@ -136,7 +133,7 @@ impl PubServerApp {
|
||||
match Self::https_builder(config) {
|
||||
Ok(https_builder) => {
|
||||
server.bind_ssl(config.socket_addr(), https_builder)
|
||||
.expect(&format!("Cannot bind to: {}", config.socket_addr()))
|
||||
.unwrap_or_else(|_| panic!("Cannot bind to: {}", config.socket_addr()))
|
||||
.shutdown_timeout(0)
|
||||
.run();
|
||||
},
|
||||
@@ -148,7 +145,7 @@ impl PubServerApp {
|
||||
|
||||
} else {
|
||||
server.bind(config.socket_addr())
|
||||
.expect(&format!("Cannot bind to: {}", config.socket_addr()))
|
||||
.unwrap_or_else(|_| panic!("Cannot bind to: {}", config.socket_addr()))
|
||||
.shutdown_timeout(0)
|
||||
.run();
|
||||
}
|
||||
@@ -275,7 +272,7 @@ impl<S: 'static> FromRequest<S> for publishers::Publisher {
|
||||
.and_then(|bytes| {
|
||||
let p: publishers::Publisher =
|
||||
serde_json::from_reader(bytes.as_ref())
|
||||
.map_err(|e| Error::JsonError(e))?;
|
||||
.map_err(Error::JsonError)?;
|
||||
Ok(p)
|
||||
})
|
||||
)
|
||||
@@ -327,8 +324,7 @@ impl<S: 'static> FromRequest<S> for publication::PublishDelta {
|
||||
.from_err()
|
||||
.and_then(|bytes| {
|
||||
let delta: publication::PublishDelta =
|
||||
serde_json::from_reader(bytes.as_ref())
|
||||
.map_err(|e| Error::JsonError(e))?;
|
||||
serde_json::from_reader(bytes.as_ref())?;
|
||||
Ok(delta)
|
||||
})
|
||||
)
|
||||
@@ -386,6 +382,10 @@ pub enum Error {
|
||||
Other(String),
|
||||
}
|
||||
|
||||
impl From<serde_json::Error> for Error {
|
||||
fn from(e: serde_json::Error) -> Self { Error::JsonError(e) }
|
||||
}
|
||||
|
||||
impl error::Error for Error {
|
||||
fn description(&self) -> &str {
|
||||
"An error happened"
|
||||
|
||||
+11
-11
@@ -24,9 +24,9 @@ use crate::util::softsigner::SignerKeyId;
|
||||
use crate::remote::builder;
|
||||
|
||||
const KEY_SIZE: u32 = 2048;
|
||||
pub const HTTPS_SUB_DIR: &'static str = "ssl";
|
||||
pub const KEY_FILE: &'static str = "key.pem";
|
||||
pub const CERT_FILE: &'static str = "cert.pem";
|
||||
pub const HTTPS_SUB_DIR: &str = "ssl";
|
||||
pub const KEY_FILE: &str = "key.pem";
|
||||
pub const CERT_FILE: &str = "cert.pem";
|
||||
|
||||
/// Creates a new private key and certificate file if either is found to be
|
||||
/// missing in the base_path directory.
|
||||
@@ -38,7 +38,7 @@ pub fn create_key_cert_if_needed(data_dir: &PathBuf) -> Result<(), HttpsSignerEr
|
||||
let cert_file_path = file::file_path(&https_dir, CERT_FILE);
|
||||
|
||||
if ! key_file_path.exists() || ! cert_file_path.exists() {
|
||||
create_key_and_cert(https_dir)
|
||||
create_key_and_cert(&https_dir)
|
||||
} else {
|
||||
Ok(())
|
||||
}
|
||||
@@ -47,12 +47,12 @@ pub fn create_key_cert_if_needed(data_dir: &PathBuf) -> Result<(), HttpsSignerEr
|
||||
/// Creates a new private key and certificate to be used when serving HTTPS.
|
||||
/// Only call this in case there is no current key and certificate file
|
||||
/// present, or have your files ruthlessly overwritten!
|
||||
fn create_key_and_cert(https_dir: PathBuf) -> Result<(), HttpsSignerError> {
|
||||
fn create_key_and_cert(https_dir: &PathBuf) -> Result<(), HttpsSignerError> {
|
||||
if ! https_dir.exists() {
|
||||
file::create_dir(&https_dir)?;
|
||||
}
|
||||
|
||||
let mut signer = HttpsSigner::new()?;
|
||||
let mut signer = HttpsSigner::build()?;
|
||||
signer.save_private_key(&https_dir)?;
|
||||
signer.save_certificate(&https_dir)?;
|
||||
|
||||
@@ -69,7 +69,7 @@ struct HttpsSigner {
|
||||
}
|
||||
|
||||
impl HttpsSigner {
|
||||
fn new() -> Result<Self, HttpsSignerError> {
|
||||
fn build() -> Result<Self, HttpsSignerError> {
|
||||
let rsa = Rsa::generate(KEY_SIZE)?;
|
||||
let private = PKey::from_rsa(rsa)?;
|
||||
Ok(HttpsSigner { private })
|
||||
@@ -80,7 +80,7 @@ impl HttpsSigner {
|
||||
let mut pem_file = File::create(path)?;
|
||||
|
||||
let pem = self.private.private_key_to_pem_pkcs8()?;
|
||||
pem_file.write(&pem)?;
|
||||
pem_file.write_all(&pem)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -94,9 +94,9 @@ impl HttpsSigner {
|
||||
let der = cert.to_bytes();
|
||||
let cert_pem = base64::encode(&der);
|
||||
|
||||
pem_file.write("-----BEGIN CERTIFICATE-----\n".as_ref())?;
|
||||
pem_file.write(cert_pem.as_bytes())?;
|
||||
pem_file.write("\n-----END CERTIFICATE-----\n".as_ref())?;
|
||||
pem_file.write_all("-----BEGIN CERTIFICATE-----\n".as_ref())?;
|
||||
pem_file.write_all(cert_pem.as_bytes())?;
|
||||
pem_file.write_all("\n-----END CERTIFICATE-----\n".as_ref())?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
+22
-19
@@ -13,7 +13,7 @@ use crate::remote::rfc8183;
|
||||
use crate::remote::sigmsg::SignedMessage;
|
||||
|
||||
/// # Naming things in the keystore.
|
||||
const ACTOR: &'static str = "krill pubd";
|
||||
const ACTOR: &str = "krill pubd";
|
||||
|
||||
|
||||
//------------ KrillServer ---------------------------------------------------
|
||||
@@ -55,16 +55,16 @@ pub struct KrillServer {
|
||||
impl KrillServer {
|
||||
/// Creates a new publication server. Note that state is preserved
|
||||
/// on disk in the work_dir provided.
|
||||
pub fn new(
|
||||
pub fn build(
|
||||
work_dir: &PathBuf,
|
||||
base_uri: &uri::Rsync,
|
||||
service_uri: uri::Http,
|
||||
rrdp_base_uri: &uri::Http,
|
||||
authorizer: Authorizer
|
||||
) -> Result<Self, Error> {
|
||||
let cms_proxy = CmsProxy::new(work_dir)?;
|
||||
let publisher_store = PublisherStore::new(work_dir, base_uri)?;
|
||||
let repository = Repository::new(rrdp_base_uri, work_dir)?;
|
||||
let cms_proxy = CmsProxy::build(work_dir)?;
|
||||
let publisher_store = PublisherStore::build(work_dir, base_uri)?;
|
||||
let repository = Repository::build(rrdp_base_uri, work_dir)?;
|
||||
|
||||
Ok(
|
||||
KrillServer {
|
||||
@@ -152,7 +152,7 @@ impl KrillServer {
|
||||
name: impl AsRef<str>
|
||||
) -> Result<Option<Arc<publishers::Publisher>>, Error> {
|
||||
self.publisher_store.publisher(name)
|
||||
.map_err(|e| Error::PublisherStore(e))
|
||||
.map_err(Error::PublisherStore)
|
||||
}
|
||||
|
||||
/// Returns a repository response for the given publisher.
|
||||
@@ -166,10 +166,10 @@ impl KrillServer {
|
||||
let rrdp_notification = self.repository.rrdp_notification_uri();
|
||||
self.cms_proxy
|
||||
.repository_response(
|
||||
publisher,
|
||||
&publisher,
|
||||
self.service_base_uri(),
|
||||
rrdp_notification)
|
||||
.map_err(|e| Error::CmsProxy(e))
|
||||
.map_err(Error::CmsProxy)
|
||||
}
|
||||
|
||||
pub fn rrdp_base_path(&self) -> PathBuf {
|
||||
@@ -209,23 +209,26 @@ impl KrillServer {
|
||||
};
|
||||
|
||||
match self.cms_proxy.publish_request(sigmsg, id_cert) {
|
||||
Err(e) => self.cms_proxy.wrap_error(e).map_err(|e| Error::CmsProxy(e)),
|
||||
Err(e) => self.cms_proxy.wrap_error(&e).map_err(Error::CmsProxy),
|
||||
Ok(req) => {
|
||||
let reply = match req {
|
||||
publication::PublishRequest::List => {
|
||||
self.handle_list(handle).map(|list|
|
||||
publication::PublishReply::List(list))
|
||||
|
||||
self.handle_list(handle)
|
||||
.map(publication::PublishReply::List)
|
||||
},
|
||||
publication::PublishRequest::Delta(delta) => {
|
||||
self.handle_delta(delta, handle).map(|_|
|
||||
publication::PublishReply::Success)
|
||||
self.handle_delta(delta, handle)
|
||||
.map(|_| publication::PublishReply::Success)
|
||||
}
|
||||
};
|
||||
|
||||
match reply {
|
||||
Ok(reply) => self.cms_proxy.wrap_publish_reply(reply).map_err(|e| Error::CmsProxy(e)),
|
||||
Err(Error::Repository(e)) => self.cms_proxy.wrap_error(e).map_err(|e| Error::CmsProxy(e)),
|
||||
Ok(reply) => {
|
||||
self.cms_proxy.wrap_publish_reply(reply).map_err(Error::CmsProxy)
|
||||
},
|
||||
Err(Error::Repository(e)) => {
|
||||
self.cms_proxy.wrap_error(&e).map_err(Error::CmsProxy)
|
||||
},
|
||||
Err(e) => Err(e)
|
||||
}
|
||||
}
|
||||
@@ -234,6 +237,7 @@ impl KrillServer {
|
||||
|
||||
/// Handles a publish delta request sent to the API, or.. through
|
||||
/// the CmsProxy.
|
||||
#[allow(clippy::needless_pass_by_value)]
|
||||
pub fn handle_delta(
|
||||
&mut self,
|
||||
delta: publication::PublishDelta,
|
||||
@@ -241,8 +245,7 @@ impl KrillServer {
|
||||
) -> Result<(), Error> {
|
||||
let publisher = self.publisher_store.get_publisher(handle)?;
|
||||
let base_uri = publisher.base_uri();
|
||||
self.repository.publish(&delta, base_uri)
|
||||
.map_err(|e| Error::Repository(e))
|
||||
self.repository.publish(&delta, base_uri).map_err(Error::Repository)
|
||||
}
|
||||
|
||||
/// Handles a list request sent to the API, or.. through the CmsProxy.
|
||||
@@ -252,7 +255,7 @@ impl KrillServer {
|
||||
) -> Result<publication::ListReply, Error> {
|
||||
let publisher = self.publisher_store.get_publisher(handle)?;
|
||||
let base_uri = publisher.base_uri();
|
||||
self.repository.list(base_uri).map_err(|e| Error::Repository(e))
|
||||
self.repository.list(base_uri).map_err(Error::Repository)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+12
-12
@@ -12,7 +12,7 @@ use crate::remote::rfc8183;
|
||||
use crate::storage::keystore::{self, Info, Key, KeyStore};
|
||||
use crate::storage::caching_ks::CachingDiskKeyStore;
|
||||
|
||||
pub const RSYNC_FOLDER: &'static str = "rsync";
|
||||
pub const RSYNC_FOLDER: &str = "rsync";
|
||||
|
||||
//------------ PublisherStore -------------------------------------------------
|
||||
|
||||
@@ -28,7 +28,7 @@ pub struct PublisherStore {
|
||||
|
||||
|
||||
impl PublisherStore {
|
||||
pub fn new(
|
||||
pub fn build(
|
||||
work_dir: &PathBuf,
|
||||
base_uri: &uri::Rsync
|
||||
) -> Result<Self, Error> {
|
||||
@@ -40,14 +40,14 @@ impl PublisherStore {
|
||||
|
||||
Ok(
|
||||
PublisherStore {
|
||||
store: CachingDiskKeyStore::new(publisher_dir)?,
|
||||
store: CachingDiskKeyStore::build(publisher_dir)?,
|
||||
base_uri: base_uri.clone()
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
fn verify_handle(&self, handle: &str) -> Result<(), Error> {
|
||||
if handle.contains("/") {
|
||||
if handle.contains('/') {
|
||||
return Err(Error::ForwardSlashInHandle(handle.to_string()))
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ impl PublisherStore {
|
||||
fn verify_base_uri(&self, base_uri: &uri::Rsync) -> Result<(), Error> {
|
||||
let base_uri = base_uri.to_string();
|
||||
if base_uri.starts_with(self.base_uri.to_string().as_str()) &&
|
||||
base_uri.ends_with("/") {
|
||||
base_uri.ends_with('/') {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(Error::InvalidBaseUri)
|
||||
@@ -80,7 +80,7 @@ impl PublisherStore {
|
||||
self.verify_handle(pbl.handle())?;
|
||||
self.verify_base_uri(pbl.base_uri())?;
|
||||
|
||||
let key = Key::from_str(pbl.handle());
|
||||
let key = Key::new(pbl.handle());
|
||||
let info = Info::now(
|
||||
actor,
|
||||
&format!("Added publisher: {}", pbl.handle())
|
||||
@@ -104,7 +104,7 @@ impl PublisherStore {
|
||||
match self.publisher(name)? {
|
||||
None => Err(Error::UnknownPublisher(name.to_string())),
|
||||
Some(_p) => {
|
||||
let key = Key::from_str(name);
|
||||
let key = Key::new(name);
|
||||
|
||||
let info = Info::now(
|
||||
actor,
|
||||
@@ -119,7 +119,7 @@ impl PublisherStore {
|
||||
|
||||
/// Returns whether a publisher exists for this name.
|
||||
pub fn has_publisher(&self, handle: &str) -> bool {
|
||||
let key = Key::from_str(handle);
|
||||
let key = Key::new(handle);
|
||||
match self.store.version(&key) {
|
||||
Ok(Some(version)) => {
|
||||
if version > 0 {
|
||||
@@ -138,7 +138,7 @@ impl PublisherStore {
|
||||
&self,
|
||||
handle: impl AsRef<str>
|
||||
) -> Result<Option<Arc<publishers::Publisher>>, Error> {
|
||||
let key = Key::from_str(handle.as_ref());
|
||||
let key = Key::new(handle.as_ref());
|
||||
self.store.get(&key).map_err(|e| { Error::KeyStoreError(e)})
|
||||
}
|
||||
|
||||
@@ -162,8 +162,8 @@ impl PublisherStore {
|
||||
pub fn publishers(&self) -> Result<Vec<Arc<publishers::Publisher>>, Error> {
|
||||
let mut res = Vec::new();
|
||||
|
||||
for ref k in self.store.keys() {
|
||||
if let Some(arc) = self.store.get(k)? {
|
||||
for k in self.store.keys() {
|
||||
if let Some(arc) = self.store.get(&k)? {
|
||||
res.push(arc);
|
||||
}
|
||||
}
|
||||
@@ -244,7 +244,7 @@ mod tests {
|
||||
|
||||
fn test_publisher_store(dir: &PathBuf) -> PublisherStore {
|
||||
let uri = test::rsync_uri("rsync://host/module/");
|
||||
PublisherStore::new(dir, &uri).unwrap()
|
||||
PublisherStore::build(dir, &uri).unwrap()
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -20,13 +20,13 @@ pub struct Repository {
|
||||
/// # Construct
|
||||
///
|
||||
impl Repository {
|
||||
pub fn new(
|
||||
pub fn build(
|
||||
rrdp_base_uri: &uri::Http,
|
||||
work_dir: &PathBuf
|
||||
) -> Result<Self, Error>
|
||||
{
|
||||
let fs = rsyncd::FileStore::new(work_dir)?;
|
||||
let rrdp = rrdpd::RrdpServer::new(rrdp_base_uri, work_dir)?;
|
||||
let fs = rsyncd::FileStore::build(work_dir)?;
|
||||
let rrdp = rrdpd::RrdpServer::build(rrdp_base_uri, work_dir)?;
|
||||
Ok( Repository { fs, rrdp } )
|
||||
}
|
||||
}
|
||||
@@ -110,7 +110,7 @@ mod tests {
|
||||
fn should_publish() {
|
||||
test::test_with_tmp_dir(|d| {
|
||||
let rrdp_base_uri = test::http_uri("http://localhost:3000/repo/");
|
||||
let mut repo = Repository::new(&rrdp_base_uri, &d).unwrap() ;
|
||||
let mut repo = Repository::build(&rrdp_base_uri, &d).unwrap() ;
|
||||
|
||||
// Publish a file
|
||||
let rsync_for_alice =
|
||||
@@ -185,7 +185,7 @@ mod tests {
|
||||
#[test]
|
||||
fn should_store_list_withdraw_files() {
|
||||
test::test_with_tmp_dir(|d| {
|
||||
let mut file_store = rsyncd::FileStore::new(&d).unwrap();
|
||||
let mut file_store = rsyncd::FileStore::build(&d).unwrap();
|
||||
|
||||
// Using a port here to make sure that it works in mapping
|
||||
// the rsync URI to and from disk.
|
||||
@@ -239,7 +239,7 @@ mod tests {
|
||||
#[test]
|
||||
fn should_not_allow_publishing_or_withdrawing_outside_of_base() {
|
||||
test::test_with_tmp_dir(|d| {
|
||||
let mut file_store = rsyncd::FileStore::new(&d).unwrap();
|
||||
let mut file_store = rsyncd::FileStore::build(&d).unwrap();
|
||||
|
||||
// Using a port here to make sure that it works in mapping
|
||||
// the rsync URI to and from disk.
|
||||
|
||||
+19
-19
@@ -22,11 +22,11 @@ use api::rrdp_data::SnapshotRef;
|
||||
|
||||
//const VERSION: &'static str = "1";
|
||||
//const NS: &'static str = "http://www.ripe.net/rpki/rrdp";
|
||||
const RRDP_FOLDER: &'static str = "rrdp";
|
||||
const FS_FOLDER: &'static str = "rsync";
|
||||
const RRDP_FOLDER: &str = "rrdp";
|
||||
const FS_FOLDER: &str = "rsync";
|
||||
|
||||
const VERSION: &'static str = "1";
|
||||
const NS: &'static str = "http://www.ripe.net/rpki/rrdp";
|
||||
const VERSION: &str = "1";
|
||||
const NS: &str = "http://www.ripe.net/rpki/rrdp";
|
||||
|
||||
|
||||
|
||||
@@ -55,12 +55,12 @@ impl RrdpServer {
|
||||
/// present, or initialise a new server with a random session_id,
|
||||
/// starting at serial 1, and including a snapshot for everything
|
||||
/// currently stored in the rsync file_store.
|
||||
pub fn new(
|
||||
pub fn build(
|
||||
base_uri: &uri::Http,
|
||||
work_dir: &PathBuf
|
||||
) -> Result<Self, Error>
|
||||
{
|
||||
if ! base_uri.to_string().ends_with("/") {
|
||||
if ! base_uri.to_string().ends_with('/') {
|
||||
return Err(Error::UriConfigError)
|
||||
}
|
||||
|
||||
@@ -70,7 +70,7 @@ impl RrdpServer {
|
||||
fs::create_dir_all(&rrdp_store_dir)?;
|
||||
}
|
||||
|
||||
let store = CachingDiskKeyStore::new(rrdp_store_dir)?;
|
||||
let store = CachingDiskKeyStore::build(rrdp_store_dir)?;
|
||||
|
||||
let rrdp_base = file::sub_dir(work_dir, RRDP_FOLDER)?;
|
||||
let fs_base = file::sub_dir(work_dir, FS_FOLDER)?;
|
||||
@@ -85,27 +85,27 @@ impl RrdpServer {
|
||||
// const REL_NOTIFICATION: &'static str = "notification.xml";
|
||||
|
||||
fn key_notification() -> Key {
|
||||
Key::from_str("notification")
|
||||
Key::new("notification")
|
||||
}
|
||||
|
||||
fn key_snapshot(session: &String, serial: usize) -> Key {
|
||||
Key::from_str(&format!("{}-{}-snapshot", session, serial))
|
||||
fn key_snapshot(session: &str, serial: usize) -> Key {
|
||||
Key::new(&format!("{}-{}-snapshot", session, serial))
|
||||
}
|
||||
|
||||
pub fn get_notification(
|
||||
&self
|
||||
) -> Result<Option<Arc<Notification>>, Error> {
|
||||
let key = Self::key_notification();
|
||||
self.store.get(&key).map_err(|e| Error::Keystore(e) )
|
||||
self.store.get(&key).map_err(Error::Keystore)
|
||||
}
|
||||
|
||||
pub fn get_snapshot(
|
||||
&self,
|
||||
session: &String,
|
||||
session: &str,
|
||||
serial: usize
|
||||
) -> Result<Option<Arc<Snapshot>>, Error> {
|
||||
let key = Self::key_snapshot(session, serial);
|
||||
self.store.get(&key).map_err(|e| Error::Keystore(e) )
|
||||
self.store.get(&key).map_err(Error::Keystore )
|
||||
}
|
||||
|
||||
pub fn save_notification(
|
||||
@@ -117,12 +117,12 @@ impl RrdpServer {
|
||||
key,
|
||||
notification,
|
||||
Info::now("server", "notification")
|
||||
).map_err(|e| Error::Keystore(e))
|
||||
).map_err(Error::Keystore)
|
||||
}
|
||||
|
||||
pub fn save_snapshot(
|
||||
&mut self,
|
||||
session: &String,
|
||||
session: &str,
|
||||
serial: usize,
|
||||
snapshot: Snapshot
|
||||
) -> Result<(), Error> {
|
||||
@@ -131,7 +131,7 @@ impl RrdpServer {
|
||||
key,
|
||||
snapshot,
|
||||
Info::now("server", "notification")
|
||||
).map_err(|e| Error::Keystore(e))
|
||||
).map_err(Error::Keystore)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,7 +209,7 @@ impl RrdpServer {
|
||||
match objects.iter().position(|cur| {cur.uri() == u.uri()}) {
|
||||
None => return Err(Error::NoObjectPresent(u.uri().clone())),
|
||||
Some(pos) => {
|
||||
if objects.get(pos).unwrap().hash() != u.hash() {
|
||||
if objects[pos].hash() != u.hash() {
|
||||
return Err(Error::NoObjectMatchingHash)
|
||||
} else {
|
||||
objects.remove(pos);
|
||||
@@ -226,7 +226,7 @@ impl RrdpServer {
|
||||
match objects.iter().position(|cur| {cur.uri() == w.uri()}) {
|
||||
None => return Err(Error::NoObjectPresent(w.uri().clone())),
|
||||
Some(pos) => {
|
||||
if objects.get(pos).unwrap().hash() != w.hash() {
|
||||
if objects[pos].hash() != w.hash() {
|
||||
return Err(Error::NoObjectMatchingHash)
|
||||
} else {
|
||||
objects.remove(pos);
|
||||
@@ -288,7 +288,7 @@ impl RrdpServer {
|
||||
/// Saves the RFC8181 PublishQuery as an RFC8182 delta file.
|
||||
fn save_delta(
|
||||
&mut self,
|
||||
session_id: &String,
|
||||
session_id: &str,
|
||||
serial: usize,
|
||||
delta: &publication::PublishDelta
|
||||
) -> Result<DeltaRef, Error>
|
||||
|
||||
@@ -21,7 +21,7 @@ pub struct FileStore {
|
||||
/// # Construct
|
||||
///
|
||||
impl FileStore {
|
||||
pub fn new(work_dir: &PathBuf) -> Result<Self, Error> {
|
||||
pub fn build(work_dir: &PathBuf) -> Result<Self, Error> {
|
||||
let mut rsync_dir = PathBuf::from(work_dir);
|
||||
rsync_dir.push(RSYNC_FOLDER);
|
||||
if ! rsync_dir.is_dir() {
|
||||
@@ -56,7 +56,7 @@ impl FileStore {
|
||||
Ok(Vec::new())
|
||||
} else {
|
||||
file::crawl_incl_rsync_base(&path, base_uri)
|
||||
.map_err(|e| Error::RecursorError(e))
|
||||
.map_err(Error::RecursorError)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ impl Command {
|
||||
}
|
||||
pub fn sync(dir: &str, base_uri: &str) -> Result<Self, Error> {
|
||||
let dir = PathBuf::from(dir);
|
||||
if ! base_uri.ends_with("/") {
|
||||
if ! base_uri.ends_with('/') {
|
||||
Err(Error::InvalidBaseUri)
|
||||
} else {
|
||||
let uri = uri::Rsync::from_str(base_uri)?;
|
||||
@@ -46,7 +46,7 @@ pub struct Connection {
|
||||
}
|
||||
|
||||
impl Connection {
|
||||
pub fn new(
|
||||
pub fn build(
|
||||
server_uri: &str,
|
||||
handle: &str,
|
||||
token: &str
|
||||
@@ -142,7 +142,7 @@ impl Options {
|
||||
let server_uri = m.value_of("server").unwrap();
|
||||
let handle = m.value_of("handle").unwrap();
|
||||
let token = m.value_of("token").unwrap();
|
||||
Connection::new(server_uri, handle, token)?
|
||||
Connection::build(server_uri, handle, token)?
|
||||
};
|
||||
|
||||
let command = {
|
||||
@@ -194,7 +194,7 @@ pub enum ApiResponse {
|
||||
}
|
||||
|
||||
impl ApiResponse {
|
||||
pub fn report(&self, format: Format) {
|
||||
pub fn report(&self, format: &Format) {
|
||||
match format {
|
||||
Format::None => {}, // done,
|
||||
Format::Json => {
|
||||
@@ -229,7 +229,7 @@ pub fn execute(options: Options) -> Result<ApiResponse, Error> {
|
||||
|
||||
match cmd {
|
||||
Command::List => {
|
||||
list_query(&connection).map(|l| ApiResponse::List(l))
|
||||
list_query(&connection).map(ApiResponse::List)
|
||||
},
|
||||
Command::Sync(dir, rsync_uri) => {
|
||||
sync(&connection, &dir, &rsync_uri)
|
||||
@@ -261,7 +261,7 @@ fn sync(
|
||||
) -> Result<ApiResponse, Error> {
|
||||
let list_reply = list_query(connection)?;
|
||||
let delta = pubc::create_delta(
|
||||
list_reply,
|
||||
&list_reply,
|
||||
dir,
|
||||
base_rsync
|
||||
)?;
|
||||
|
||||
+16
-15
@@ -23,23 +23,23 @@ use pubc;
|
||||
|
||||
|
||||
/// # Some constants for naming resources in the keystore for clients.
|
||||
const ACTOR: &'static str = "publication client";
|
||||
const ACTOR: &str = "publication client";
|
||||
|
||||
fn id_key() -> Key {
|
||||
Key::from_str("my_id")
|
||||
Key::new("my_id")
|
||||
}
|
||||
|
||||
fn parent_key() -> Key {
|
||||
Key::from_str("my_parent")
|
||||
Key::new("my_parent")
|
||||
}
|
||||
|
||||
fn repo_key() -> Key {
|
||||
Key::from_str("my_repo")
|
||||
Key::new("my_repo")
|
||||
}
|
||||
|
||||
const ID_MSG: &'static str = "initialised identity";
|
||||
const PARENT_MSG: &'static str ="updated parent info";
|
||||
const REPO_MSG: &'static str = "update repo info";
|
||||
const ID_MSG: &str = "initialised identity";
|
||||
const PARENT_MSG: &str ="updated parent info";
|
||||
const REPO_MSG: &str = "update repo info";
|
||||
|
||||
|
||||
//------------ PubClient -----------------------------------------------------
|
||||
@@ -68,9 +68,9 @@ pub struct PubClient {
|
||||
|
||||
impl PubClient {
|
||||
/// Creates a new publication client
|
||||
pub fn new(work_dir: &PathBuf) -> Result<Self, Error> {
|
||||
let store = CachingDiskKeyStore::new(work_dir.clone())?;
|
||||
let signer = OpenSslSigner::new(work_dir)?;
|
||||
pub fn build(work_dir: &PathBuf) -> Result<Self, Error> {
|
||||
let store = CachingDiskKeyStore::build(work_dir.clone())?;
|
||||
let signer = OpenSslSigner::build(work_dir)?;
|
||||
Ok(
|
||||
PubClient {
|
||||
signer,
|
||||
@@ -129,7 +129,7 @@ impl PubClient {
|
||||
/// Process the publication server parent response.
|
||||
pub fn process_repo_response(
|
||||
&mut self,
|
||||
response: rfc8183::RepositoryResponse
|
||||
response: &rfc8183::RepositoryResponse
|
||||
) -> Result<(), Error> {
|
||||
|
||||
// Store parent info
|
||||
@@ -182,7 +182,7 @@ impl PubClient {
|
||||
let query = rfc8181::Message::list_query();
|
||||
let signed_request = self.sign_request(query)?;
|
||||
|
||||
let reply = self.send_request(signed_request)?.as_reply()?;
|
||||
let reply = self.send_request(signed_request)?.into_reply()?;
|
||||
|
||||
match reply {
|
||||
rfc8181::ReplyMessage::ErrorReply(e) => Err(Error::ErrorReply(e)),
|
||||
@@ -198,12 +198,13 @@ impl PubClient {
|
||||
let repo = self.get_my_repo()?;
|
||||
let list_reply = self.get_server_list()?;
|
||||
|
||||
let delta = pubc::create_delta(list_reply, base_path, repo.sia_base())?;
|
||||
let delta = pubc::create_delta(&list_reply, base_path, repo.sia_base
|
||||
())?;
|
||||
|
||||
if ! delta.is_empty() {
|
||||
let msg = rfc8181::Message::publish_delta_query(delta);
|
||||
let sgn_msg = self.sign_request(msg)?;
|
||||
let reply = self.send_request(sgn_msg)?.as_reply()?;
|
||||
let reply = self.send_request(sgn_msg)?.into_reply()?;
|
||||
|
||||
match reply {
|
||||
rfc8181::ReplyMessage::ErrorReply(e) => Err(Error::ErrorReply(e)),
|
||||
@@ -245,7 +246,7 @@ impl PubClient {
|
||||
) -> Result<Captured, Error> {
|
||||
let id = self.get_my_id()?;
|
||||
|
||||
let builder = SignedMessageBuilder::new(
|
||||
let builder = SignedMessageBuilder::create(
|
||||
id.key_id(),
|
||||
&mut self.signer,
|
||||
msg
|
||||
|
||||
+3
-3
@@ -7,7 +7,7 @@ use crate::api::publication;
|
||||
use crate::util::file;
|
||||
|
||||
pub fn create_delta(
|
||||
list_reply: publication::ListReply,
|
||||
list_reply: &publication::ListReply,
|
||||
dir: &PathBuf,
|
||||
base_rsync: &uri::Rsync
|
||||
) -> Result<publication::PublishDelta, Error> {
|
||||
@@ -17,7 +17,7 @@ pub fn create_delta(
|
||||
|
||||
// loop through what the server has and find the ones to withdraw
|
||||
for p in list_reply.elements() {
|
||||
if current.iter().find(|c| { c.uri() == p.uri() }).is_none() {
|
||||
if current.iter().find(|c| c.uri() == p.uri()).is_none() {
|
||||
delta_builder.add_withdraw(
|
||||
publication::Withdraw::from_list_element(p)
|
||||
);
|
||||
@@ -28,7 +28,7 @@ pub fn create_delta(
|
||||
// to be added to, which need to be updated at, or for which no change is
|
||||
// needed at the server.
|
||||
for f in current {
|
||||
match list_reply.elements().iter().find(|pbl| { pbl.uri() == f.uri()}) {
|
||||
match list_reply.elements().iter().find(|pbl| pbl.uri() == f.uri()) {
|
||||
None => delta_builder.add_publish(f.as_publish()),
|
||||
Some(pbl) => {
|
||||
if pbl.hash() != f.hash() {
|
||||
|
||||
+12
-11
@@ -31,6 +31,7 @@ use crate::remote::rfc8181::Message;
|
||||
//------------ TbsCertificate ------------------------------------------------
|
||||
|
||||
/// The supported extension types for our RPKI TbsCertificate
|
||||
#[allow(clippy::large_enum_variant)]
|
||||
pub enum RpkiTbsExtension {
|
||||
ResourceExtensions(Extensions),
|
||||
IdExtensions(IdExtensions)
|
||||
@@ -267,14 +268,14 @@ pub struct SignedMessageBuilder {
|
||||
}
|
||||
|
||||
impl SignedMessageBuilder {
|
||||
pub fn new<S: Signer>(
|
||||
pub fn create<S: Signer>(
|
||||
issuing_key: &S::KeyId,
|
||||
signer: &mut S,
|
||||
message: Message
|
||||
) -> Result<SignedMessageBuilder, Error<S::Error>> {
|
||||
let content = OctetString::new(message.into_bytes());
|
||||
|
||||
let signer_info = SignerInfoBuilder::new(
|
||||
let signer_info = SignerInfoBuilder::create(
|
||||
signer,
|
||||
&content.to_bytes()
|
||||
)?;
|
||||
@@ -285,7 +286,7 @@ impl SignedMessageBuilder {
|
||||
signer
|
||||
)?;
|
||||
|
||||
let crl = CrlBuilder::new(issuing_key, signer)?;
|
||||
let crl = CrlBuilder::create(issuing_key, signer)?;
|
||||
|
||||
Ok(
|
||||
SignedMessageBuilder {
|
||||
@@ -464,7 +465,7 @@ impl SignedAttributes {
|
||||
// encoding, rather an EXPLICIT SET OF tag is used...
|
||||
let encode_in_set = encode::set(self.encode()).to_captured(Mode::Der);
|
||||
signer.sign_one_off(SignatureAlgorithm, encode_in_set.as_slice())
|
||||
.map_err(|e| Error::SignerError(e))
|
||||
.map_err(Error::SignerError)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -546,7 +547,7 @@ impl SignerInfoBuilder {
|
||||
///
|
||||
/// A lot of this is pretty well restricted in RFCs 6488 amd 6492. We
|
||||
/// really only require some bits.
|
||||
pub fn new<S: Signer>(
|
||||
pub fn create<S: Signer>(
|
||||
signer: &mut S,
|
||||
message: &Bytes
|
||||
) -> Result<SignedSignerInfo, Error<S::Error>> {
|
||||
@@ -589,7 +590,7 @@ impl CrlBuilder {
|
||||
///
|
||||
/// This will all be changed in future when we implement generating CRLs
|
||||
/// for the RPKI CA.
|
||||
pub fn new<S: Signer>(
|
||||
pub fn create<S: Signer>(
|
||||
issuing_key: &S::KeyId,
|
||||
signer: &mut S
|
||||
) -> Result<Crl, Error<S::Error>>
|
||||
@@ -701,7 +702,7 @@ pub mod tests {
|
||||
#[test]
|
||||
fn should_create_self_signed_ta_id_cert() {
|
||||
test::test_with_tmp_dir(|d| {
|
||||
let mut s = OpenSslSigner::new(&d);
|
||||
let mut s = OpenSslSigner::build(&d);
|
||||
let key_id = s.create_key(&PublicKeyAlgorithm::RsaEncryption).unwrap();
|
||||
|
||||
let id_cert = IdCertBuilder::new_ta_id_cert(&key_id, & mut s).unwrap();
|
||||
@@ -712,11 +713,11 @@ pub mod tests {
|
||||
#[test]
|
||||
fn should_create_crl_for_protocol() {
|
||||
test::test_with_tmp_dir(|d| {
|
||||
let mut s = OpenSslSigner::new(&d);
|
||||
let mut s = OpenSslSigner::build(&d);
|
||||
let key_id = s.create_key(&PublicKeyAlgorithm::RsaEncryption).unwrap();
|
||||
let key_info = s.get_key_info(&key_id).unwrap();
|
||||
|
||||
let crl = CrlBuilder::new(&key_id, & mut s).unwrap();
|
||||
let crl = CrlBuilder::create(&key_id, & mut s).unwrap();
|
||||
crl.validate(&key_info).unwrap();
|
||||
})
|
||||
}
|
||||
@@ -724,13 +725,13 @@ pub mod tests {
|
||||
#[test]
|
||||
fn should_create_signed_publication_message() {
|
||||
test::test_with_tmp_dir(|d| {
|
||||
let mut s = OpenSslSigner::new(&d);
|
||||
let mut s = OpenSslSigner::build(&d);
|
||||
let key_id = s.create_key(&PublicKeyAlgorithm::RsaEncryption).unwrap();
|
||||
let id_cert = IdCertBuilder::new_ta_id_cert(&key_id, & mut s).unwrap();
|
||||
|
||||
let message = ListQuery::build_message();
|
||||
|
||||
let builder = SignedMessageBuilder::new(
|
||||
let builder = SignedMessageBuilder::create(
|
||||
&key_id,
|
||||
&mut s,
|
||||
message.clone()
|
||||
|
||||
@@ -33,7 +33,7 @@ pub struct CmsProxy {
|
||||
|
||||
/// # Set up
|
||||
impl CmsProxy {
|
||||
pub fn new(
|
||||
pub fn build(
|
||||
work_dir: &PathBuf
|
||||
) -> Result<Self, Error> {
|
||||
let responder = Responder::init(work_dir)?;
|
||||
@@ -56,8 +56,8 @@ impl CmsProxy {
|
||||
debug!("Validating Signed Message");
|
||||
msg.validate(id_cert)?;
|
||||
let msg = rfc8181::Message::from_signed_message(&msg)?;
|
||||
let msg = msg.as_query()?;
|
||||
Ok(msg.as_publish_request())
|
||||
let msg = msg.into_query()?;
|
||||
Ok(msg.into_publish_request())
|
||||
}
|
||||
|
||||
/// Handles a PublishReply, and wraps it in an RFC8181 message
|
||||
@@ -75,13 +75,13 @@ impl CmsProxy {
|
||||
}
|
||||
};
|
||||
|
||||
self.responder.sign_msg(msg).map_err(|e| Error::ResponderError(e))
|
||||
self.responder.sign_msg(msg).map_err(Error::ResponderError)
|
||||
}
|
||||
|
||||
/// Converts an error to an RFC8181 response message
|
||||
pub fn wrap_error(
|
||||
&mut self,
|
||||
error: impl ToReportErrorCode
|
||||
error: &impl ToReportErrorCode
|
||||
) -> Result<Captured, Error> {
|
||||
let mut error_builder = rfc8181::ErrorReply::build();
|
||||
error_builder.add(
|
||||
@@ -92,13 +92,13 @@ impl CmsProxy {
|
||||
);
|
||||
let msg = error_builder.build_message();
|
||||
|
||||
self.responder.sign_msg(msg).map_err(|e| Error::ResponderError(e))
|
||||
self.responder.sign_msg(msg).map_err(Error::ResponderError)
|
||||
}
|
||||
|
||||
/// Returns an RFC8183 Repository Response
|
||||
pub fn repository_response(
|
||||
&self,
|
||||
publisher: Arc<publishers::Publisher>,
|
||||
publisher: &Arc<publishers::Publisher>,
|
||||
base_service_uri: &uri::Http,
|
||||
rrdp_notification_uri: uri::Http
|
||||
) -> Result<rfc8183::RepositoryResponse, Error> {
|
||||
@@ -112,10 +112,10 @@ impl CmsProxy {
|
||||
|
||||
self.responder
|
||||
.repository_response(
|
||||
publisher,
|
||||
&publisher,
|
||||
service_uri,
|
||||
rrdp_notification_uri)
|
||||
.map_err(|e| Error::ResponderError(e))
|
||||
.map_err(Error::ResponderError)
|
||||
}
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -422,7 +422,7 @@ impl IdCert {
|
||||
// 4.8.1. Basic Constraints: For a CA it must be present (RFC6487)
|
||||
// und the “cA” flag must be set (RFC5280).
|
||||
if let Some(ref ca) = self.extensions.basic_ca {
|
||||
if ca.ca() == true {
|
||||
if ca.ca() {
|
||||
return Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,13 +18,13 @@ use crate::util::softsigner::{self, OpenSslSigner};
|
||||
|
||||
|
||||
/// # Naming things in the keystore.
|
||||
const ACTOR: &'static str = "publication server";
|
||||
const ACTOR: &str = "publication server";
|
||||
|
||||
fn my_id_key() -> Key {
|
||||
Key::from_str("my_id")
|
||||
Key::new("my_id")
|
||||
}
|
||||
|
||||
const MY_ID_MSG: &'static str = "initialised identity";
|
||||
const MY_ID_MSG: &str = "initialised identity";
|
||||
|
||||
|
||||
//------------ Responder -----------------------------------------------------
|
||||
@@ -53,8 +53,8 @@ impl Responder {
|
||||
fs::create_dir_all(&responder_dir)?;
|
||||
}
|
||||
|
||||
let signer = OpenSslSigner::new(&responder_dir)?;
|
||||
let store = CachingDiskKeyStore::new(responder_dir)?;
|
||||
let signer = OpenSslSigner::build(&responder_dir)?;
|
||||
let store = CachingDiskKeyStore::build(responder_dir)?;
|
||||
|
||||
let mut responder = Responder {
|
||||
signer,
|
||||
@@ -95,7 +95,7 @@ impl Responder {
|
||||
impl Responder {
|
||||
pub fn repository_response(
|
||||
&self,
|
||||
publisher: Arc<Publisher>,
|
||||
publisher: &Arc<Publisher>,
|
||||
service_uri: uri::Http,
|
||||
rrdp_notification_uri: uri::Http
|
||||
) -> Result<RepositoryResponse, Error> {
|
||||
@@ -130,7 +130,7 @@ impl Responder {
|
||||
/// Creates an encoded SignedMessage for a contained Message.
|
||||
pub fn sign_msg(&mut self, msg: Message) -> Result<Captured, Error> {
|
||||
if let Some(id) = self.my_identity()? {
|
||||
let builder = SignedMessageBuilder::new(
|
||||
let builder = SignedMessageBuilder::create(
|
||||
id.key_id(),
|
||||
&mut self.signer,
|
||||
msg
|
||||
@@ -224,7 +224,7 @@ mod tests {
|
||||
let rrdp_uri = test::http_uri("http://host/rrdp/");
|
||||
|
||||
responder.repository_response(
|
||||
publisher,
|
||||
&publisher,
|
||||
service_uri,
|
||||
rrdp_uri
|
||||
).unwrap();
|
||||
|
||||
+11
-16
@@ -13,8 +13,8 @@ use crate::util::xml::{
|
||||
XmlWriter
|
||||
};
|
||||
|
||||
pub const VERSION: &'static str = "4";
|
||||
pub const NS: &'static str = "http://www.hactrn.net/uris/rpki/publication-spec/";
|
||||
pub const VERSION: &str = "4";
|
||||
pub const NS: &str = "http://www.hactrn.net/uris/rpki/publication-spec/";
|
||||
|
||||
|
||||
//------------ Message -------------------------------------------------------
|
||||
@@ -51,7 +51,7 @@ impl Message {
|
||||
Ok(Message::ReplyMessage(ReplyMessage::decode(r)?))
|
||||
}
|
||||
_ => {
|
||||
return Err(MessageError::UnknownMessageType)
|
||||
Err(MessageError::UnknownMessageType)
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -104,7 +104,7 @@ impl Message {
|
||||
|
||||
/// Consumes this message and returns the contained query, or
|
||||
/// an error if you tried this on a reply.
|
||||
pub fn as_query(self) -> Result<QueryMessage, MessageError> {
|
||||
pub fn into_query(self) -> Result<QueryMessage, MessageError> {
|
||||
match self {
|
||||
Message::QueryMessage(q) => Ok(q),
|
||||
_ => Err(MessageError::WrongMessageType)
|
||||
@@ -113,7 +113,7 @@ impl Message {
|
||||
|
||||
/// Consumes this message and returns the contained query, or
|
||||
/// an error if you tried this on a reply.
|
||||
pub fn as_reply(self) -> Result<ReplyMessage, MessageError> {
|
||||
pub fn into_reply(self) -> Result<ReplyMessage, MessageError> {
|
||||
match self {
|
||||
Message::ReplyMessage(r) => Ok(r),
|
||||
_ => Err(MessageError::WrongMessageType)
|
||||
@@ -207,7 +207,7 @@ impl QueryMessage {
|
||||
}
|
||||
|
||||
/// Consumes this and returns this a PublishRequest for our (json) API
|
||||
pub fn as_publish_request(self) -> publication::PublishRequest {
|
||||
pub fn into_publish_request(self) -> publication::PublishRequest {
|
||||
match self {
|
||||
QueryMessage::ListQuery => publication::PublishRequest::List,
|
||||
QueryMessage::PublishDelta(d) => publication::PublishRequest::Delta(d)
|
||||
@@ -321,16 +321,11 @@ impl PublishDeltaXml {
|
||||
) -> Result<publication::PublishDelta, MessageError> {
|
||||
let mut bld = publication::PublishDeltaBuilder::new();
|
||||
|
||||
loop {
|
||||
match Self::decode_opt(r)? {
|
||||
Some(pde) => {
|
||||
match pde {
|
||||
PublishDeltaElement::Publish(p) => bld.add_publish(p),
|
||||
PublishDeltaElement::Update(u) => bld.add_update(u),
|
||||
PublishDeltaElement::Withdraw(w) => bld.add_withdraw(w)
|
||||
}
|
||||
},
|
||||
None => break
|
||||
while let Some(pde) = Self::decode_opt(r)? {
|
||||
match pde {
|
||||
PublishDeltaElement::Publish(p) => bld.add_publish(p),
|
||||
PublishDeltaElement::Update(u) => bld.add_update(u),
|
||||
PublishDeltaElement::Withdraw(w) => bld.add_withdraw(w)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,8 +16,8 @@ use crate::util::xml::{AttributesError, XmlReader, XmlReaderErr, XmlWriter};
|
||||
|
||||
//------------ PublisherRequest ----------------------------------------------
|
||||
|
||||
pub const VERSION: &'static str = "1";
|
||||
pub const NS: &'static str = "http://www.hactrn.net/uris/rpki/rpki-setup/";
|
||||
pub const VERSION: &str = "1";
|
||||
pub const NS: &str = "http://www.hactrn.net/uris/rpki/rpki-setup/";
|
||||
|
||||
/// Type representing a <publisher_request/>
|
||||
///
|
||||
@@ -67,7 +67,7 @@ impl PublisherRequest {
|
||||
|
||||
Ok(PublisherRequest{
|
||||
tag: tag.map(Into::into),
|
||||
publisher_handle: ph.into(),
|
||||
publisher_handle: ph,
|
||||
id_cert: IdCert::decode(cert)?
|
||||
})
|
||||
})
|
||||
@@ -79,7 +79,8 @@ impl PublisherRequest {
|
||||
}
|
||||
|
||||
pub fn validate_at(&self, now: Time) -> Result<(), PublisherRequestError> {
|
||||
Ok(self.id_cert.validate_ta_at(now)?)
|
||||
self.id_cert.validate_ta_at(now)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Encodes a <publisher_request> to a Vec
|
||||
@@ -281,7 +282,7 @@ impl RepositoryResponse {
|
||||
|
||||
Ok(RepositoryResponse{
|
||||
tag: tag.map(Into::into),
|
||||
publisher_handle: publisher_handle.into(),
|
||||
publisher_handle,
|
||||
id_cert: IdCert::decode(id_cert)?,
|
||||
service_uri,
|
||||
sia_base,
|
||||
@@ -300,7 +301,8 @@ impl RepositoryResponse {
|
||||
&self,
|
||||
now: Time
|
||||
) -> Result<(), RepositoryResponseError> {
|
||||
Ok(self.id_cert.validate_ta_at(now)?)
|
||||
self.id_cert.validate_ta_at(now)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Encodes the <repository_response/> to a Vec
|
||||
|
||||
@@ -161,7 +161,7 @@ impl SignedMessage {
|
||||
let msg = self.signer_info.signed_attrs().encode_verify();
|
||||
::ring::signature::verify(
|
||||
&::ring::signature::RSA_PKCS1_2048_8192_SHA256,
|
||||
Input::from(self.id_cert.public_key().as_ref()),
|
||||
Input::from(self.id_cert.public_key()),
|
||||
Input::from(&msg),
|
||||
Input::from(self.signer_info.signature().value().as_ref())
|
||||
).map_err(|_| ValidationError)
|
||||
|
||||
+25
-27
@@ -41,7 +41,7 @@ pub struct CachingDiskKeyStore {
|
||||
|
||||
/// # Creating
|
||||
impl CachingDiskKeyStore {
|
||||
pub fn new(base_dir: PathBuf) -> Result<Self, Error> {
|
||||
pub fn build(base_dir: PathBuf) -> Result<Self, Error> {
|
||||
if ! base_dir.is_dir() {
|
||||
Err(Error::Other("Invalid base_dir for DiskKeyStore".to_string()))
|
||||
} else {
|
||||
@@ -65,7 +65,7 @@ impl CachingDiskKeyStore {
|
||||
let v = Arc::new(value);
|
||||
|
||||
let mut w = self.cache.write()
|
||||
.map_err(|_| Error::from_str("Write Lock error"))?;
|
||||
.map_err(|_| Error::other("Write Lock error"))?;
|
||||
if let Some(current) = w.get_mut(&key) {
|
||||
current.version += 1;
|
||||
current.value = v;
|
||||
@@ -87,14 +87,14 @@ impl CachingDiskKeyStore {
|
||||
key: &Key
|
||||
) -> Result<Option<Arc<V>>, Error> {
|
||||
let r = self.cache.read().map_err(
|
||||
|_| Error::from_str("Can't get read lock"))?;
|
||||
|_| Error::other("Can't get read lock"))?;
|
||||
match r.get(key) {
|
||||
None => Ok(None),
|
||||
Some(ref v) => {
|
||||
if let Ok(res) = v.value_copy().downcast::<V>() {
|
||||
Ok(Some(res))
|
||||
} else {
|
||||
Err(Error::from_str("Object has the wrong type!"))
|
||||
Err(Error::other("Object has the wrong type!"))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -103,7 +103,7 @@ impl CachingDiskKeyStore {
|
||||
/// Gets the version for the current value for a key, if any.
|
||||
fn cache_version(&self, key: &Key) -> Result<Option<i32>, Error> {
|
||||
let r = self.cache.read().map_err(
|
||||
|_| Error::from_str("Can't get read lock"))?;
|
||||
|_| Error::other("Can't get read lock"))?;
|
||||
Ok(r.get(key).map(|c| { c.version }))
|
||||
}
|
||||
}
|
||||
@@ -113,8 +113,8 @@ impl CachingDiskKeyStore {
|
||||
impl CachingDiskKeyStore {
|
||||
/// Verifies that the base directory exists, or tries to create it.
|
||||
fn verify_or_create_dir(&self, key: &Key) -> Result<(), Error> {
|
||||
if key.path().to_string_lossy().contains("/") {
|
||||
return Err(Error::from_str("Key cannot contain subdir."))
|
||||
if key.path().to_string_lossy().contains('/') {
|
||||
return Err(Error::other("Key cannot contain subdir."))
|
||||
}
|
||||
|
||||
let mut full_path = PathBuf::new();
|
||||
@@ -123,10 +123,8 @@ impl CachingDiskKeyStore {
|
||||
|
||||
if !full_path.exists() {
|
||||
fs::create_dir_all(full_path)?;
|
||||
} else {
|
||||
if ! full_path.is_dir() {
|
||||
return Err(Error::from_str("Key is not a dir"));
|
||||
}
|
||||
} else if ! full_path.is_dir() {
|
||||
return Err(Error::other("Key is not a dir"));
|
||||
}
|
||||
|
||||
Ok(())
|
||||
@@ -157,12 +155,12 @@ impl CachingDiskKeyStore {
|
||||
let value_key = self.key_for_value(&key, version);
|
||||
let mut f = File::create(self.full_path(value_key.path()))?;
|
||||
let v = serde_json::to_string(&value)?;
|
||||
f.write(v.as_ref())?;
|
||||
f.write_all(v.as_ref())?;
|
||||
|
||||
let info_key = self.key_for_info(&key, version);
|
||||
let mut f = File::create(self.full_path(info_key.path()))?;
|
||||
let i = serde_json::to_string(&info)?;
|
||||
f.write(i.as_ref())?;
|
||||
f.write_all(i.as_ref())?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -204,22 +202,22 @@ impl CachingDiskKeyStore {
|
||||
/// Archives the current version for a key, by negating the version
|
||||
/// number. Note that versions can be 'revived' simply by storing a new
|
||||
/// value for a key.
|
||||
fn disk_archive(&self, key: &Key, info: Info) -> Result<(), Error> {
|
||||
fn disk_archive(&self, key: &Key, info: &Info) -> Result<(), Error> {
|
||||
if let Some(v) = self.disk_version(key)? {
|
||||
if v > 0 {
|
||||
let version_key = self.key_for_version(key);
|
||||
let mut f = File::create(self.full_path(version_key.path()))?;
|
||||
write!(f, "{}", v * -1)?;
|
||||
write!(f, "{}", -v)?;
|
||||
|
||||
let arch_key = self.key_for_archive_info(&key, v);
|
||||
let mut f = File::create(self.full_path(arch_key.path()))?;
|
||||
let i = serde_json::to_string(&info)?;
|
||||
f.write(i.as_ref())?;
|
||||
f.write_all(i.as_ref())?;
|
||||
|
||||
return Ok(())
|
||||
}
|
||||
}
|
||||
Err(Error::from_str("No version to archive"))
|
||||
Err(Error::other("No version to archive"))
|
||||
}
|
||||
|
||||
}
|
||||
@@ -250,7 +248,7 @@ impl KeyStore for CachingDiskKeyStore {
|
||||
let mut w = self.cache.write().unwrap();
|
||||
w.remove_entry(key); // Don't care if it was actually cached.
|
||||
}
|
||||
self.disk_archive(key, info)
|
||||
self.disk_archive(key, &info)
|
||||
}
|
||||
|
||||
fn get<V: Any + DeserializeOwned + Send + Sync>(
|
||||
@@ -358,8 +356,8 @@ mod tests {
|
||||
#[test]
|
||||
fn should_store_and_retrieve_from_caching_disk() {
|
||||
test::test_with_tmp_dir(|d| {
|
||||
let mut store = CachingDiskKeyStore::new(PathBuf::from(d)).unwrap();
|
||||
let key = Key::from_str("key_name");
|
||||
let mut store = CachingDiskKeyStore::build(PathBuf::from(d)).unwrap();
|
||||
let key = Key::new("key_name");
|
||||
let value = TestStruct::from_str("foo");
|
||||
let info = Info::new(Utc::now(), "me", "A!");
|
||||
|
||||
@@ -375,8 +373,8 @@ mod tests {
|
||||
#[test]
|
||||
fn should_report_keys_from_caching_disk_store() {
|
||||
test::test_with_tmp_dir(|d| {
|
||||
let mut store = CachingDiskKeyStore::new(PathBuf::from(d)).unwrap();
|
||||
let key = Key::from_str("key_name");
|
||||
let mut store = CachingDiskKeyStore::build(PathBuf::from(d)).unwrap();
|
||||
let key = Key::new("key_name");
|
||||
let value = TestStruct::from_str("foo");
|
||||
let info = Info::new(Utc::now(), "me", "A!");
|
||||
store.store(key.clone(), value.clone(), info).unwrap();
|
||||
@@ -391,16 +389,16 @@ mod tests {
|
||||
fn should_read_from_disk() {
|
||||
test::test_with_tmp_dir(|d| {
|
||||
// Store stuff in memory and on disk
|
||||
let mut store = CachingDiskKeyStore::new(PathBuf::from(d.clone()))
|
||||
let mut store = CachingDiskKeyStore::build(PathBuf::from(d.clone()))
|
||||
.unwrap();
|
||||
let key = Key::from_str("key_name");
|
||||
let key = Key::new("key_name");
|
||||
let value = TestStruct::from_str("foo");
|
||||
let info = Info::new(Utc::now(), "me", "A!");
|
||||
store.store(key.clone(), value.clone(), info).unwrap();
|
||||
|
||||
// Initiate a new keystore pointing to the same dir, so it can
|
||||
// read values from there.
|
||||
let store = CachingDiskKeyStore::new(PathBuf::from(d)).unwrap();
|
||||
let store = CachingDiskKeyStore::build(PathBuf::from(d)).unwrap();
|
||||
|
||||
let stored_keys: Vec<Key> = store.keys().collect();
|
||||
assert!(stored_keys.contains(&key));
|
||||
@@ -417,9 +415,9 @@ mod tests {
|
||||
fn should_archive() {
|
||||
test::test_with_tmp_dir(|d| {
|
||||
// Store stuff in memory and on disk
|
||||
let mut store = CachingDiskKeyStore::new(PathBuf::from(d.clone()))
|
||||
let mut store = CachingDiskKeyStore::build(PathBuf::from(d.clone()))
|
||||
.unwrap();
|
||||
let key = Key::from_str("key_name");
|
||||
let key = Key::new("key_name");
|
||||
let value = TestStruct::from_str("foo");
|
||||
let actor = "me";
|
||||
let msg = "created";
|
||||
|
||||
+13
-14
@@ -26,7 +26,7 @@ impl<T: Serialize + DeserializeOwned + Sized> Storable for T { }
|
||||
pub struct AggregateId(String);
|
||||
|
||||
impl AggregateId {
|
||||
pub fn from_str(s: &str) -> Self {
|
||||
pub fn new(s: &str) -> Self {
|
||||
AggregateId(s.to_string())
|
||||
}
|
||||
}
|
||||
@@ -256,9 +256,8 @@ impl<A: 'static + Aggregate, S: 'static + KeyStore> AggregateManager<A, S> {
|
||||
if ! has_key {
|
||||
let init_key = S::key_for_event(id, 0);
|
||||
if let Some(init) = self.store.get::<A::InitEvent>(&init_key)
|
||||
.map_err(|e| AggMgrErr::KeyStoreError(e))? {
|
||||
let mut agg = A::init(init)
|
||||
.map_err(|e| AggMgrErr::AggregateError(e))?;
|
||||
.map_err(AggMgrErr::KeyStoreError)? {
|
||||
let mut agg = A::init(init).map_err(AggMgrErr::AggregateError)?;
|
||||
|
||||
cache.insert(id.clone(), Arc::new(agg));
|
||||
force = true;
|
||||
@@ -275,7 +274,7 @@ impl<A: 'static + Aggregate, S: 'static + KeyStore> AggregateManager<A, S> {
|
||||
let ver = agg.version();
|
||||
let key = S::key_for_event(id, ver);
|
||||
if let Some(event) = self.store.get::<A::Event>(&key)
|
||||
.map_err(|e| AggMgrErr::KeyStoreError(e))? {
|
||||
.map_err(AggMgrErr::KeyStoreError)? {
|
||||
agg.apply(event)
|
||||
} else {
|
||||
break
|
||||
@@ -288,6 +287,7 @@ impl<A: 'static + Aggregate, S: 'static + KeyStore> AggregateManager<A, S> {
|
||||
|
||||
|
||||
/// Get a reference to the latest version of the aggregate.
|
||||
#[allow(clippy::type_complexity)]
|
||||
pub fn get_latest(
|
||||
&self,
|
||||
id: &AggregateId
|
||||
@@ -297,6 +297,7 @@ impl<A: 'static + Aggregate, S: 'static + KeyStore> AggregateManager<A, S> {
|
||||
.map(|arc| AggregateRef { agg: arc.clone() } ))
|
||||
}
|
||||
|
||||
#[allow(clippy::type_complexity)]
|
||||
pub fn create(
|
||||
&self,
|
||||
id: &AggregateId,
|
||||
@@ -309,11 +310,9 @@ impl<A: 'static + Aggregate, S: 'static + KeyStore> AggregateManager<A, S> {
|
||||
Err(AggMgrErr::AggregateAlreadyExists)
|
||||
} else {
|
||||
let key = S::key_for_event(id, 0);
|
||||
self.store.store(&key, &event)
|
||||
.map_err(|e| AggMgrErr::KeyStoreError(e))?;
|
||||
self.store.store(&key, &event).map_err(AggMgrErr::KeyStoreError)?;
|
||||
|
||||
let agg = A::init(event)
|
||||
.map_err(|e| AggMgrErr::AggregateError(e))?;
|
||||
let agg = A::init(event).map_err(AggMgrErr::AggregateError)?;
|
||||
|
||||
cache.insert(id.clone(), Arc::new(agg));
|
||||
Ok(())
|
||||
@@ -322,6 +321,7 @@ impl<A: 'static + Aggregate, S: 'static + KeyStore> AggregateManager<A, S> {
|
||||
|
||||
/// Apply a command to the latest aggregate, save the events and return
|
||||
/// the updated aggregate.
|
||||
#[allow(clippy::type_complexity)]
|
||||
pub fn apply(
|
||||
&self,
|
||||
command: A::Command
|
||||
@@ -345,12 +345,11 @@ impl<A: 'static + Aggregate, S: 'static + KeyStore> AggregateManager<A, S> {
|
||||
}
|
||||
|
||||
let events = agg.process_command(command)
|
||||
.map_err(|e| AggMgrErr::AggregateError(e))?;
|
||||
.map_err(AggMgrErr::AggregateError)?;
|
||||
|
||||
for e in events {
|
||||
let key = S::key_for_event(&id, e.version());
|
||||
self.store.store(&key, &e)
|
||||
.map_err(|e| AggMgrErr::KeyStoreError(e))?;
|
||||
self.store.store(&key, &e).map_err(AggMgrErr::KeyStoreError)?;
|
||||
agg.apply(e);
|
||||
}
|
||||
|
||||
@@ -434,7 +433,7 @@ impl KeyStore for DiskKeyStore {
|
||||
} else {
|
||||
let mut f = file::create_file_with_path(&self.file_path(key))?;
|
||||
let json = serde_json::to_string(value)?;
|
||||
f.write(json.as_ref())?;
|
||||
f.write_all(json.as_ref())?;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
@@ -631,7 +630,7 @@ mod tests {
|
||||
let storage = DiskKeyStore::new(d.clone());
|
||||
let manager = PersonManager::new(storage);
|
||||
|
||||
let id_alice = AggregateId::from_str("alice");
|
||||
let id_alice = AggregateId::new("alice");
|
||||
let alice_init = InitPersonEvent::init(&id_alice, "alice smith");
|
||||
|
||||
manager.create(&id_alice, alice_init).unwrap();
|
||||
|
||||
+16
-16
@@ -22,6 +22,17 @@ pub struct Key {
|
||||
}
|
||||
|
||||
impl Key {
|
||||
/// Creates an instance from a ui str. Will unwrap, and panic, if
|
||||
/// unsafe characters are used. Use [`from_path`] for a method that
|
||||
/// returns a Result instead, and see [`verify_path`] for restrictions.
|
||||
///
|
||||
/// [`from_path`]: struct.Key.html#method.from_path
|
||||
/// [`verify_path`]: struct.Key.html#method.verify_path
|
||||
pub fn new(s: &str) -> Key {
|
||||
let path = PathBuf::from(s);
|
||||
Self::from_path(path).unwrap()
|
||||
}
|
||||
|
||||
/// Creates a new key based on the path.
|
||||
///
|
||||
/// Paths must not contain '/' so that they can be used as a single
|
||||
@@ -35,17 +46,6 @@ impl Key {
|
||||
Ok(Self { path })
|
||||
}
|
||||
|
||||
/// Creates an instance from a ui str. Will unwrap, and panic, if
|
||||
/// unsafe characters are used. Use [`from_path`] for a method that
|
||||
/// returns a Result instead, and see [`verify_path`] for restrictions.
|
||||
///
|
||||
/// [`from_path`]: struct.Key.html#method.from_path
|
||||
/// [`verify_path`]: struct.Key.html#method.verify_path
|
||||
pub fn from_str(s: &str) -> Key {
|
||||
let path = PathBuf::from(s);
|
||||
Self::from_path(path).unwrap()
|
||||
}
|
||||
|
||||
/// Other than this the may contain any character allowed in a
|
||||
/// 'segment' in the 'hier-part' defined in RFC3896 only, i.e:
|
||||
///
|
||||
@@ -63,20 +63,20 @@ impl Key {
|
||||
match path.to_str() {
|
||||
None => { return Err(InvalidKey) },
|
||||
Some(s) => {
|
||||
if ! s.bytes().all(|b| {
|
||||
if ! s.bytes().all(|b|
|
||||
b.is_ascii_alphanumeric() || // ALPHA DIGIT
|
||||
b == b'-' || b == b'.' || b == b'_' || b == b'~' ||
|
||||
b == b'%' || // Not checking against invalid % encoding (e.g. %%)
|
||||
b == b'!' || b == b'$' || b == b'&' || b == b'\'' ||
|
||||
b == b'(' || b == b')' || b == b'*' || b == b'+' ||
|
||||
b == b',' || b == b';' || b == b'='
|
||||
}) {
|
||||
) {
|
||||
return Err(InvalidKey)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if path.components().all(|c| { c == Component::Normal("..".as_ref())})
|
||||
if path.components().all(|c| c == Component::Normal("..".as_ref()))
|
||||
|| ! path.is_relative()
|
||||
{
|
||||
return Err(InvalidKey);
|
||||
@@ -242,7 +242,7 @@ pub trait KeyStore {
|
||||
None => Ok(1),
|
||||
Some(current) => {
|
||||
if current < 0 {
|
||||
Ok(current * -1 + 1)
|
||||
Ok(-current + 1)
|
||||
} else {
|
||||
Ok(current + 1)
|
||||
}
|
||||
@@ -270,7 +270,7 @@ pub enum Error {
|
||||
}
|
||||
|
||||
impl Error {
|
||||
pub fn from_str(s: &str) -> Self {
|
||||
pub fn other(s: &str) -> Self {
|
||||
Error::Other(s.to_string())
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -47,7 +47,7 @@ pub fn file_path(base_path: &PathBuf, file_name: &str) -> PathBuf {
|
||||
/// Saves a file, creating parent dirs as needed
|
||||
pub fn save(content: &Bytes, full_path: &PathBuf) -> Result<(), io::Error> {
|
||||
let mut f = create_file_with_path(full_path)?;
|
||||
f.write(content)?;
|
||||
f.write_all(content)?;
|
||||
|
||||
trace!("Saved file: {}", full_path.to_string_lossy());
|
||||
Ok(())
|
||||
|
||||
@@ -12,7 +12,7 @@ use reqwest::header::{
|
||||
use serde::Serialize;
|
||||
use serde::de::DeserializeOwned;
|
||||
|
||||
const JSON_CONTENT: &'static str = "application/json";
|
||||
const JSON_CONTENT: &str = "application/json";
|
||||
|
||||
|
||||
/// Performs a GET request that expects a json response that can be
|
||||
@@ -137,7 +137,7 @@ fn client() -> Result<Client, Error> {
|
||||
.gzip(true)
|
||||
.timeout(Duration::from_secs(30))
|
||||
.build()
|
||||
.map_err(|e| Error::RequestError(e))
|
||||
.map_err(Error::RequestError)
|
||||
}
|
||||
|
||||
fn headers(
|
||||
|
||||
+11
-11
@@ -53,7 +53,7 @@ pub struct OpenSslSigner {
|
||||
}
|
||||
|
||||
impl OpenSslSigner {
|
||||
pub fn new(work_dir: &PathBuf) -> Result<Self, SignerError> {
|
||||
pub fn build(work_dir: &PathBuf) -> Result<Self, SignerError> {
|
||||
let meta_data = fs::metadata(&work_dir)?;
|
||||
if meta_data.is_dir() {
|
||||
|
||||
@@ -65,7 +65,7 @@ impl OpenSslSigner {
|
||||
|
||||
Ok(
|
||||
OpenSslSigner {
|
||||
store: CachingDiskKeyStore::new(keys_dir)?,
|
||||
store: CachingDiskKeyStore::build(keys_dir)?,
|
||||
}
|
||||
)
|
||||
} else {
|
||||
@@ -104,12 +104,12 @@ impl Signer for OpenSslSigner {
|
||||
_algorithm: PublicKeyFormat
|
||||
) -> Result<Self::KeyId, Self::Error> {
|
||||
|
||||
let kp = OpenSslKeyPair::new()?;
|
||||
let kp = OpenSslKeyPair::build()?;
|
||||
|
||||
let pk = &kp.subject_public_key_info()?;
|
||||
let hex_hash = hex::encode(pk.key_identifier().as_ref());
|
||||
let key_id = SignerKeyId(hex_hash);
|
||||
let store_key = Key::from_str(key_id.as_ref());
|
||||
let store_key = Key::new(key_id.as_ref());
|
||||
let info = Info::now("openssl signer", "created key");
|
||||
|
||||
self.store.store(store_key, kp, info)?;
|
||||
@@ -121,7 +121,7 @@ impl Signer for OpenSslSigner {
|
||||
&self,
|
||||
key_id: &Self::KeyId
|
||||
) -> Result<PublicKey, KeyError<Self::Error>> {
|
||||
let store_key = Key::from_str(key_id.as_ref());
|
||||
let store_key = Key::new(key_id.as_ref());
|
||||
|
||||
let key_pair_option: Option<Arc<OpenSslKeyPair>> =
|
||||
self.store.get(&store_key)
|
||||
@@ -140,7 +140,7 @@ impl Signer for OpenSslSigner {
|
||||
key_id: &Self::KeyId
|
||||
) -> Result<(), KeyError<Self::Error>> {
|
||||
|
||||
let store_key = Key::from_str(key_id.as_ref());
|
||||
let store_key = Key::new(key_id.as_ref());
|
||||
let info = Info::now("openssl signer", "archived key");
|
||||
|
||||
self.store.archive(&store_key, info).map_err(|e| {
|
||||
@@ -154,7 +154,7 @@ impl Signer for OpenSslSigner {
|
||||
_algorithm: SignatureAlgorithm,
|
||||
data: &D
|
||||
) -> Result<Signature, SigningError<Self::Error>> {
|
||||
let store_key = Key::from_str(key_id.as_ref());
|
||||
let store_key = Key::new(key_id.as_ref());
|
||||
let key_pair_option: Option<Arc<OpenSslKeyPair>> =
|
||||
self.store.get(&store_key)
|
||||
.map_err(|e| {
|
||||
@@ -175,7 +175,7 @@ impl Signer for OpenSslSigner {
|
||||
_algorithm: SignatureAlgorithm,
|
||||
data: &D
|
||||
) -> Result<(Signature, PublicKey), SignerError> {
|
||||
let kp = OpenSslKeyPair::new()?;
|
||||
let kp = OpenSslKeyPair::build()?;
|
||||
|
||||
let signature = Self::sign_with_key(
|
||||
kp.pkey.as_ref(),
|
||||
@@ -234,7 +234,7 @@ impl<'de> Deserialize<'de> for OpenSslKeyPair {
|
||||
}
|
||||
|
||||
impl OpenSslKeyPair {
|
||||
fn new() -> Result<OpenSslKeyPair, SignerError> {
|
||||
fn build() -> Result<OpenSslKeyPair, SignerError> {
|
||||
// Issues unwrapping this indicate a bug in the openssl library.
|
||||
// So, there is no way to recover.
|
||||
let rsa = Rsa::generate(2048)?;
|
||||
@@ -309,7 +309,7 @@ pub mod tests {
|
||||
#[test]
|
||||
fn should_return_subject_public_key_info() {
|
||||
test::test_with_tmp_dir(|d| {
|
||||
let mut s = OpenSslSigner::new(&d).unwrap();
|
||||
let mut s = OpenSslSigner::build(&d).unwrap();
|
||||
let ki = s.create_key(PublicKeyFormat).unwrap();
|
||||
s.get_key_info(&ki).unwrap();
|
||||
s.destroy_key(&ki).unwrap();
|
||||
@@ -319,7 +319,7 @@ pub mod tests {
|
||||
#[test]
|
||||
fn should_serialize_and_deserialize_key() {
|
||||
|
||||
let key = OpenSslKeyPair::new().unwrap();
|
||||
let key = OpenSslKeyPair::build().unwrap();
|
||||
let json = serde_json::to_string(&key).unwrap();
|
||||
let key_des: OpenSslKeyPair = serde_json::from_str(json.as_str()).unwrap();
|
||||
let json_from_des = serde_json::to_string(&key_des).unwrap();
|
||||
|
||||
+3
-3
@@ -49,7 +49,7 @@ pub fn http_uri(s: &str) -> uri::Http {
|
||||
pub fn as_bytes(s: &str) -> Bytes { Bytes::from(s) }
|
||||
|
||||
pub fn new_id_cert(work_dir: &PathBuf) -> IdCert {
|
||||
let mut s = OpenSslSigner::new(work_dir).unwrap();
|
||||
let mut s = OpenSslSigner::build(work_dir).unwrap();
|
||||
let key_id = s.create_key(PublicKeyFormat).unwrap();
|
||||
IdCertBuilder::new_ta_id_cert(&key_id, &mut s).unwrap()
|
||||
}
|
||||
@@ -70,7 +70,7 @@ pub fn save_file(base_dir: &PathBuf, file_name: &str, content: &[u8]) {
|
||||
let mut full_name = base_dir.clone();
|
||||
full_name.push(PathBuf::from(file_name));
|
||||
let mut f = File::create(full_name).unwrap();
|
||||
f.write(content).unwrap();
|
||||
f.write_all(content).unwrap();
|
||||
}
|
||||
|
||||
pub fn save_pr(base_dir: &PathBuf, file_name: &str, pr: &PublisherRequest) {
|
||||
@@ -78,5 +78,5 @@ pub fn save_pr(base_dir: &PathBuf, file_name: &str, pr: &PublisherRequest) {
|
||||
full_name.push(PathBuf::from(file_name));
|
||||
let mut f = File::create(full_name).unwrap();
|
||||
let xml = pr.encode_vec();
|
||||
f.write(xml.as_ref()).unwrap();
|
||||
f.write_all(xml.as_ref()).unwrap();
|
||||
}
|
||||
|
||||
+11
-12
@@ -46,7 +46,7 @@ impl <R: io::Read> XmlReader<R> {
|
||||
}
|
||||
|
||||
/// Puts an XmlEvent back so that it can be retrieved by 'next'
|
||||
fn cache(&mut self, e: XmlEvent) -> () {
|
||||
fn cache(&mut self, e: XmlEvent) {
|
||||
self.cached_event = Some(e);
|
||||
}
|
||||
}
|
||||
@@ -61,8 +61,8 @@ impl <R: io::Read> XmlReader<R> {
|
||||
/// Takes the next element and expects a start of document.
|
||||
fn start_document(&mut self) -> Result<(), XmlReaderErr> {
|
||||
match self.next() {
|
||||
Ok(reader::XmlEvent::StartDocument {..}) => { Ok(())},
|
||||
_ => return Err(XmlReaderErr::ExpectedStartDocument)
|
||||
Ok(reader::XmlEvent::StartDocument {..}) => Ok(()),
|
||||
_ => Err(XmlReaderErr::ExpectedStartDocument)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ impl <R: io::Read> XmlReader<R> {
|
||||
Ok(reader::XmlEvent::StartElement { name, attributes, ..}) => {
|
||||
Ok((Tag{name: name.local_name}, Attributes{attributes}))
|
||||
},
|
||||
_ => return Err(XmlReaderErr::ExpectedStart)
|
||||
_ => Err(XmlReaderErr::ExpectedStart)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -212,7 +212,7 @@ impl <R: io::Read> XmlReader<R> {
|
||||
Ok(reader::XmlEvent::Characters(chars)) => {
|
||||
Ok(chars)
|
||||
}
|
||||
_ => return Err(XmlReaderErr::ExpectedCharacters)
|
||||
_ => Err(XmlReaderErr::ExpectedCharacters)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -349,7 +349,7 @@ impl Attributes {
|
||||
/// Takes a required attribute by name
|
||||
pub fn take_req(&mut self, name: &str) -> Result<String, AttributesError> {
|
||||
self.take_opt(name)
|
||||
.ok_or(AttributesError::MissingAttribute(name.to_string()))
|
||||
.ok_or_else(|| AttributesError::MissingAttribute(name.to_string()))
|
||||
}
|
||||
|
||||
/// Takes a required hexencoded attribute and converts it to Bytes
|
||||
@@ -357,20 +357,19 @@ impl Attributes {
|
||||
-> Result<Bytes, AttributesError> {
|
||||
|
||||
match hex::decode(self.take_req(name)?) {
|
||||
Err(e) => return Err(AttributesError::HexError(e)),
|
||||
Err(e) => Err(AttributesError::HexError(e)),
|
||||
Ok(b) => Ok(Bytes::from(b))
|
||||
}
|
||||
}
|
||||
|
||||
/// Verifies that there are no more attributes
|
||||
pub fn exhausted(&self) -> Result<(), AttributesError> {
|
||||
if self.attributes.len() > 0 {
|
||||
return Err(AttributesError::ExtraAttributes)
|
||||
if self.attributes.is_empty() {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(AttributesError::ExtraAttributes)
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ use std::collections::HashSet;
|
||||
use krill::util::httpclient;
|
||||
|
||||
fn list(server_uri: &str, handle: &str, token: &str) -> apiclient::Options {
|
||||
let conn = apiclient::Connection::new(server_uri, handle, token).unwrap();
|
||||
let conn = apiclient::Connection::build(server_uri, handle, token).unwrap();
|
||||
let cmd = apiclient::Command::List;
|
||||
let fmt = apiclient::Format::Json;
|
||||
|
||||
@@ -43,7 +43,7 @@ fn sync(
|
||||
syncdir: &PathBuf,
|
||||
base_uri: &str
|
||||
) -> apiclient::Options {
|
||||
let conn = apiclient::Connection::new(server_uri, handle, token).unwrap();
|
||||
let conn = apiclient::Connection::build(server_uri, handle, token).unwrap();
|
||||
let cmd = apiclient::Command::sync(syncdir.to_str().unwrap(), base_uri).unwrap();
|
||||
let fmt = apiclient::Format::Json;
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ fn client_publish_at_server() {
|
||||
|
||||
// Set up a client
|
||||
let client_dir = test::create_sub_dir(&d);
|
||||
let mut client = PubClient::new(&client_dir).unwrap();
|
||||
let mut client = PubClient::build(&client_dir).unwrap();
|
||||
client.init("alice").unwrap();
|
||||
let pr = client.publisher_request().unwrap();
|
||||
test::save_pr(&d, "alice.xml", &pr);
|
||||
@@ -85,7 +85,7 @@ fn client_publish_at_server() {
|
||||
).unwrap();
|
||||
|
||||
repo_res.validate().unwrap();
|
||||
client.process_repo_response(repo_res).unwrap();
|
||||
client.process_repo_response(&repo_res).unwrap();
|
||||
|
||||
// List files at server
|
||||
let list = client.get_server_list().unwrap();
|
||||
|
||||
@@ -56,7 +56,7 @@ fn manage_publishers() {
|
||||
// Set up a client "alice"
|
||||
{
|
||||
let client_dir = test::create_sub_dir(&d);
|
||||
let mut client = PubClient::new(&client_dir).unwrap();
|
||||
let mut client = PubClient::build(&client_dir).unwrap();
|
||||
client.init("alice").unwrap();
|
||||
let pr = client.publisher_request().unwrap();
|
||||
test::save_pr(&d, "alice.xml", &pr);
|
||||
|
||||
Reference in New Issue
Block a user