From 7f5daa3c0e1e5d0884d0960207e87ff8bad8575d Mon Sep 17 00:00:00 2001 From: Adrian Heine Date: Mon, 3 Aug 2020 19:28:05 +0200 Subject: [PATCH] Hide Path implementation --- src/artifacts/mod.rs | 31 ++++++++++++++++- src/builder.rs | 82 ++++++++++++++++++++------------------------ src/locator.rs | 57 +++++++++++++++++------------- tests/setup.rs | 15 ++++++-- 4 files changed, 113 insertions(+), 72 deletions(-) diff --git a/src/artifacts/mod.rs b/src/artifacts/mod.rs index c02538b..20ed4fa 100644 --- a/src/artifacts/mod.rs +++ b/src/artifacts/mod.rs @@ -1,7 +1,36 @@ use std::path::{Path as ActualPath, PathBuf}; #[derive(Clone, Debug)] -pub struct Path(pub PathBuf); +pub struct Path(PathBuf); + +// FIXME: This is a specialization since with Path: Into +// it would overwrite impl From for T +//impl> From for Path { +// fn from(v: T) -> Self { +// Path(v.into()) +// } +//} + +macro_rules! path_from { + ( $t:ty ) => { + impl From<$t> for Path { + fn from(v: $t) -> Self { + Self(v.into()) + } + } + }; +} + +path_from!(String); +path_from!(&str); +path_from!(PathBuf); + +impl From for PathBuf { + fn from(v: Path) -> Self { + v.0 + } +} + impl AsRef for Path { fn as_ref(&self) -> &ActualPath { &self.0 diff --git a/src/builder.rs b/src/builder.rs index c9bd89e..6bea5c4 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -65,7 +65,7 @@ impl SymbolBuilder> for DefaultBuilder { target: & as Resource>::Artifact, (): ::Artifact, ) -> Self::Symbol { - KeySymbol::new(StdCommandRunner, target.0.clone()) + KeySymbol::new(StdCommandRunner, target.clone().into()) } } @@ -84,8 +84,8 @@ impl SymbolBuilder> for DefaultBuilder { CsrSymbol::new( StdCommandRunner, resource.0.clone(), - key.0, - target.0.clone(), + key.into(), + target.clone().into(), ) } } @@ -124,11 +124,11 @@ impl SymbolBuilder> for DefaultBuilder { CertSymbol::new( resource.0.clone(), SetuidCommandRunner::new(user_name.0, &StdCommandRunner), - root_cert.0, - account_key.0, - challenges_dir.0, - csr.0, - target.0.clone(), + root_cert.into(), + account_key.into(), + challenges_dir.into(), + csr.into(), + target.clone().into(), ) } } @@ -145,7 +145,7 @@ impl SymbolBuilder> for DefaultBuilder { target: & as Resource>::Artifact, (cert, root_cert): ::Artifact, ) -> Self::Symbol { - ConcatSymbol::new([cert.0, root_cert.0], target.0.clone()) + ConcatSymbol::new([cert.into(), root_cert.into()], target.clone().into()) } } @@ -161,7 +161,7 @@ impl SymbolBuilder> for DefaultBuilder { target: & as Resource>::Artifact, (cert_chain, key): ::Artifact, ) -> Self::Symbol { - ConcatSymbol::new([key.0, cert_chain.0], target.0.clone()) + ConcatSymbol::new([key.into(), cert_chain.into()], target.clone().into()) } } @@ -210,7 +210,7 @@ impl SymbolBuilder for DefaultBuilder { ) -> Self::Symbol { ( FileSymbol::new( - target.0.clone(), + target.clone().into(), nginx::default_server(challenges_snippet_path), ), ReloadServiceSymbol::new(StdCommandRunner, "nginx"), @@ -239,14 +239,8 @@ impl + Clone + Display> SymbolBuilder> for DefaultB ) -> Self::Symbol { ( FileSymbol::new( - target.0.clone(), - nginx::server_config( - &resource.0, - cert.0, - key.0, - &resource.1, - challenges_snippet_path, - ), + target.clone().into(), + nginx::server_config(&resource.0, cert, key, &resource.1, challenges_snippet_path), ), ReloadServiceSymbol::new(StdCommandRunner, "nginx"), ) @@ -280,11 +274,11 @@ impl> SymbolBuilder> for Defau ) -> Self::Symbol { ( FileSymbol::new( - target.0.clone(), + target.clone().into(), nginx::server_config( &resource.0, - cert.0, - key.0, + cert, + key, nginx::php_snippet(resource.2, &pool.0, &resource.1) + &resource.3, challenges_snippet_path, ), @@ -329,11 +323,11 @@ impl> SymbolBuilder Self::Symbol { ( FileSymbol::new( - target.0.clone(), + target.clone().into(), nginx::server_config( &resource.0, - cert.0, - key.0, + cert, + key, nginx::proxy_snippet(&socket.0, &resource.3), challenges_snippet_path, ), @@ -364,11 +358,11 @@ impl + Clone + Display> SymbolBuilder> for DefaultBu ) -> Self::Symbol { ( FileSymbol::new( - target.0.clone(), + target.clone().into(), nginx::server_config( &resource.0, - cert.0, - key.0, + cert, + key, nginx::redir_snippet(resource.1.as_ref()), challenges_snippet_path, ), @@ -401,11 +395,11 @@ impl + Clone + Display, P: AsRef> SymbolBuilder Self::Symbol { ( FileSymbol::new( - target.0.clone(), + target.clone().into(), nginx::server_config( &resource.0, - cert.0, - key.0, + cert, + key, nginx::static_snippet(resource.1.as_ref()), challenges_snippet_path, ), @@ -430,8 +424,8 @@ impl SymbolBuilder> for DefaultBuilder { ) -> Self::Symbol { ( FileSymbol::new( - conf_path.0.clone(), - php_fpm_pool_config(&user_name.0, &socket_path.0, resource.1), + conf_path.clone().into(), + php_fpm_pool_config(&user_name.0, &socket_path, resource.1), ), ReloadServiceSymbol::new(StdCommandRunner, service_name.0.clone()), ) @@ -454,7 +448,7 @@ impl> SymbolBuilder> for DefaultBui ) -> Self::Symbol { ( FileSymbol::new( - conf_path.0.clone(), + conf_path.clone().into(), if resource.4 { systemd_nodejs_service(&resource.2, socket_path, &resource.3) } else { @@ -468,7 +462,7 @@ impl> SymbolBuilder> for DefaultBui ), SystemdUserSessionSymbol::new(user_name.0.clone(), &StdCommandRunner), UserServiceSymbol::new( - socket_path.0.clone(), + socket_path.clone().into(), user_name.0.clone(), resource.1, &StdCommandRunner, @@ -517,7 +511,7 @@ impl> SymbolBuilder> for DefaultBuilde ) -> Self::Symbol { SavedDirectorySymbol::new( resource.1.clone(), - SimpleStorage::new(target.0.clone()), + SimpleStorage::new(target.clone().into()), StorageDirection::Store, StdCommandRunner, ) @@ -536,7 +530,7 @@ impl> SymbolBuilder> for DefaultBuilde ) -> Self::Symbol { SavedDirectorySymbol::new( resource.1.clone(), - SimpleStorage::new(target.0.clone()), + SimpleStorage::new(target.clone().into()), StorageDirection::Load, StdCommandRunner, ) @@ -615,8 +609,8 @@ impl SymbolBuilder for DefaultBuilder { user_name: ::Artifact, ) -> Self::Symbol { ( - DirSymbol::new(target.0.clone()), - OwnerSymbol::new(target.0.clone(), user_name.0, StdCommandRunner), + DirSymbol::new(target.clone().into()), + OwnerSymbol::new(target.clone().into(), user_name.0, StdCommandRunner), ) } } @@ -634,7 +628,7 @@ impl SymbolBuilder for DefaultBuilder { challenges_dir: ::Artifact, ) -> Self::Symbol { FileSymbol::new( - target.0.clone(), + target.clone().into(), nginx::acme_challenges_snippet(challenges_dir), ) } @@ -656,8 +650,8 @@ impl SymbolBuilder for DefaultBuilder { user_name: ::Artifact, ) -> Self::Symbol { ( - KeySymbol::new(StdCommandRunner, target.0.clone()), - OwnerSymbol::new(target.0.clone(), user_name.0, StdCommandRunner), + KeySymbol::new(StdCommandRunner, target.clone().into()), + OwnerSymbol::new(target.clone().into(), user_name.0, StdCommandRunner), ) } } @@ -672,7 +666,7 @@ impl SymbolBuilder for DefaultBuilder { target: &::Artifact, (): ::Artifact, ) -> Self::Symbol { - FileSymbol::new(target.0.clone(), LETS_ENCRYPT_X3_CROSS_SIGNED) + FileSymbol::new(target.clone().into(), LETS_ENCRYPT_X3_CROSS_SIGNED) } } @@ -705,7 +699,7 @@ impl SymbolBuilder> for DefaultBuilder { (db_name, _, data_path): & as Resource>::Artifact, _: ::Artifact, ) -> Self::Symbol { - let db_dump = SimpleStorage::new(data_path.0.clone()); + let db_dump = SimpleStorage::new(data_path.clone().into()); ( MariaDbDatabaseSymbol::new(db_name.0.clone(), db_dump.clone(), &StdCommandRunner), MariaDbDumpSymbol::new(db_name.0.clone(), db_dump, &StdCommandRunner), diff --git a/src/locator.rs b/src/locator.rs index 4340cdb..eaaddeb 100644 --- a/src/locator.rs +++ b/src/locator.rs @@ -54,7 +54,7 @@ impl> ResourceLocator> for DefaultLocator

{ type Prerequisites = Dir; fn locate(resource: &Key) -> ( as Resource>::Artifact, Self::Prerequisites) { ( - PathArtifact(format!("/etc/ssl/private/{}.key", resource.0.as_ref()).into()), + PathArtifact::from(format!("/etc/ssl/private/{}.key", resource.0.as_ref())), Dir("/etc/ssl/private".into()), ) } @@ -64,7 +64,7 @@ impl> ResourceLocator> for DefaultLocator

{ type Prerequisites = Dir; fn locate(resource: &Csr) -> ( as Resource>::Artifact, Self::Prerequisites) { ( - PathArtifact(format!("/etc/ssl/local_certs/{}.csr", resource.0.as_ref()).into()), + PathArtifact::from(format!("/etc/ssl/local_certs/{}.csr", resource.0.as_ref())), Dir("/etc/ssl/local_certs".into()), ) } @@ -74,7 +74,7 @@ impl> ResourceLocator> for DefaultLocator

{ type Prerequisites = Dir; fn locate(resource: &Cert) -> ( as Resource>::Artifact, Self::Prerequisites) { ( - PathArtifact(format!("/etc/ssl/local_certs/{}.crt", resource.0.as_ref()).into()), + PathArtifact::from(format!("/etc/ssl/local_certs/{}.crt", resource.0.as_ref())), Dir("/etc/ssl/local_certs".into()), ) } @@ -86,7 +86,10 @@ impl> ResourceLocator> for DefaultLocator

{ resource: &CertChain, ) -> ( as Resource>::Artifact, Self::Prerequisites) { ( - PathArtifact(format!("/etc/ssl/local_certs/{}.chained.crt", resource.0.as_ref()).into()), + PathArtifact::from(format!( + "/etc/ssl/local_certs/{}.chained.crt", + resource.0.as_ref() + )), Dir("/etc/ssl/local_certs".into()), ) } @@ -101,7 +104,10 @@ impl> ResourceLocator> for DefaultLocator

> ResourceLocator> as Resource>::Artifact, Self::Prerequisites, ) { - (PathArtifact(POLICY::path_for_data(resource.0)), ()) + (PathArtifact::from(POLICY::path_for_data(resource.0)), ()) } } @@ -167,7 +173,7 @@ impl> ResourceLocator> Self::Prerequisites, ) { ( - PathArtifact(POLICY::path_for_data(resource.0)), + PathArtifact::from(POLICY::path_for_data(resource.0)), Dir(resource.1.as_ref().parent().unwrap().into()), ) } @@ -180,7 +186,7 @@ impl ResourceLocator for DefaultLocator

{ ) -> (::Artifact, Self::Prerequisites) { let acme_user = P::acme_user(); let home = P::user_home(acme_user); - (PathArtifact(home.join("account.key")), Dir(home)) + (PathArtifact::from(home.join("account.key")), Dir(home)) } } @@ -202,7 +208,7 @@ impl ResourceLocator for DefaultLocator

{ ) { let acme_user = P::acme_user(); let home = P::user_home(acme_user); - (PathArtifact(home.join("challenges")), Dir(home)) + (PathArtifact::from(home.join("challenges")), Dir(home)) } } @@ -215,7 +221,7 @@ impl ResourceLocator for DefaultLocator

ResourceLocator for DefaultLocator

{ let acme_user = P::acme_user(); let home = P::user_home(acme_user); ( - PathArtifact(home.join("lets_encrypt_x3_cross_signed.pem")), + PathArtifact::from(home.join("lets_encrypt_x3_cross_signed.pem")), Dir(home), ) } @@ -245,7 +251,7 @@ impl> ResourceLocator> for DefaultLoca ) { let user_name = P::user_name_for_domain(resource.0.as_ref()); let home = P::user_home(&user_name); - ((UserNameArtifact(user_name), PathArtifact(home)), ()) + ((UserNameArtifact(user_name), PathArtifact::from(home)), ()) } } @@ -268,7 +274,7 @@ impl

ResourceLocator for DefaultLocator

{ fn locate( _resource: &DefaultServer, ) -> (::Artifact, Self::Prerequisites) { - (PathArtifact("/etc/nginx/sites-enabled/default".into()), ()) + (PathArtifact::from("/etc/nginx/sites-enabled/default"), ()) } } @@ -278,7 +284,7 @@ impl, POLICY> ResourceLocator> for DefaultLocator< resource: &ServeCustom, ) -> ( as Resource>::Artifact, Self::Prerequisites) { ( - PathArtifact(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), + PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), (), ) } @@ -290,7 +296,7 @@ impl, P, POLICY> ResourceLocator> for DefaultLocat resource: &ServePhp, ) -> ( as Resource>::Artifact, Self::Prerequisites) { ( - PathArtifact(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), + PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), (), ) } @@ -305,7 +311,7 @@ impl, P, POLICY> ResourceLocator> for DefaultL Self::Prerequisites, ) { ( - PathArtifact(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), + PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), (), ) } @@ -317,7 +323,7 @@ impl, POLICY> ResourceLocator> for DefaultLocator

, ) -> ( as Resource>::Artifact, Self::Prerequisites) { ( - PathArtifact(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), + PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), (), ) } @@ -332,7 +338,7 @@ impl, P, POLICY> ResourceLocator> for DefaultLo Self::Prerequisites, ) { ( - PathArtifact(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), + PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), (), ) } @@ -347,8 +353,11 @@ impl, P: Policy> ResourceLocator> for Defaul let php_version = P::php_version(); ( ( - PathArtifact(format!("/run/php/{}.sock", user.0).into()), - PathArtifact(format!("/etc/php/{}/fpm/pool.d/{}.conf", php_version, user.0).into()), + PathArtifact::from(format!("/run/php/{}.sock", user.0)), + PathArtifact::from(format!( + "/etc/php/{}/fpm/pool.d/{}.conf", + php_version, user.0 + )), user, ServiceNameArtifact(format!("php{}-fpm", php_version)), ), @@ -368,12 +377,12 @@ impl, P, POLICY: Policy> ResourceLocator, P: Policy> ResourceLocator> for DefaultLo ( DatabaseNameArtifact(user_name.0.clone()), user_name.clone(), - PathArtifact(P::path_for_data(format!("{}.sql", user_name.0))), + PathArtifact::from(P::path_for_data(format!("{}.sql", user_name.0))), ), (), ) diff --git a/tests/setup.rs b/tests/setup.rs index b8aadf7..52e7aaf 100644 --- a/tests/setup.rs +++ b/tests/setup.rs @@ -30,11 +30,17 @@ fn runs_only_once() { }; let mut setup = Setup::new(runner); assert_eq!( - (setup.add(Csr("somehost")).unwrap().0).0.to_str().unwrap(), + (setup.add(Csr("somehost")).unwrap().0) + .as_ref() + .to_str() + .unwrap(), "/etc/ssl/local_certs/somehost.csr", ); assert_eq!( - (setup.add(Csr("somehost")).unwrap().0).0.to_str().unwrap(), + (setup.add(Csr("somehost")).unwrap().0) + .as_ref() + .to_str() + .unwrap(), "/etc/ssl/local_certs/somehost.csr", ); assert_eq!(*count.borrow(), 2 + 5); // Key and CSR + 5 dirs @@ -48,7 +54,10 @@ fn can_create_an_acme_cert() { }; let mut setup = Setup::new(runner); assert_eq!( - (setup.add(Cert("somehost")).unwrap().0).0.to_str().unwrap(), + (setup.add(Cert("somehost")).unwrap().0) + .as_ref() + .to_str() + .unwrap(), "/etc/ssl/local_certs/somehost.crt", ); assert_eq!(*count.borrow(), 15);