Compare commits
No commits in common. "fd1c2d3647156caac9b6ed15af37cf0713cdaad4" and "bc191587478ad3dcab53c1de46676a63de6194e8" have entirely different histories.
fd1c2d3647
...
bc19158747
|
|
@ -16,4 +16,3 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
requests
|
requests
|
||||||
* Packages of architecture "any" are part of every architecture's
|
* Packages of architecture "any" are part of every architecture's
|
||||||
database
|
database
|
||||||
* Bearer authentication for private routes
|
|
||||||
|
|
|
||||||
|
|
@ -243,12 +243,6 @@ dependencies = [
|
||||||
"rustc-demangle",
|
"rustc-demangle",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "base64"
|
|
||||||
version = "0.20.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0ea22880d78093b0cbe17c89f64a7d457941e65759157ec6cb31a31d652b05e5"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "base64"
|
name = "base64"
|
||||||
version = "0.21.2"
|
version = "0.21.2"
|
||||||
|
|
@ -1768,7 +1762,7 @@ version = "1.0.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2"
|
checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.21.2",
|
"base64",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -2261,7 +2255,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8ca69bf415b93b60b80dc8fda3cb4ef52b2336614d8da2de5456cc942a110482"
|
checksum = "8ca69bf415b93b60b80dc8fda3cb4ef52b2336614d8da2de5456cc942a110482"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atoi",
|
"atoi",
|
||||||
"base64 0.21.2",
|
"base64",
|
||||||
"bigdecimal",
|
"bigdecimal",
|
||||||
"bitflags 2.3.3",
|
"bitflags 2.3.3",
|
||||||
"byteorder",
|
"byteorder",
|
||||||
|
|
@ -2308,7 +2302,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a0db2df1b8731c3651e204629dd55e52adbae0462fa1bdcbed56a2302c18181e"
|
checksum = "a0db2df1b8731c3651e204629dd55e52adbae0462fa1bdcbed56a2302c18181e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"atoi",
|
"atoi",
|
||||||
"base64 0.21.2",
|
"base64",
|
||||||
"bigdecimal",
|
"bigdecimal",
|
||||||
"bitflags 2.3.3",
|
"bitflags 2.3.3",
|
||||||
"byteorder",
|
"byteorder",
|
||||||
|
|
@ -2622,7 +2616,6 @@ version = "0.4.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a8bd22a874a2d0b70452d5597b12c537331d49060824a95f49f108994f94aa4c"
|
checksum = "a8bd22a874a2d0b70452d5597b12c537331d49060824a95f49f108994f94aa4c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.20.0",
|
|
||||||
"bitflags 2.3.3",
|
"bitflags 2.3.3",
|
||||||
"bytes",
|
"bytes",
|
||||||
"futures-core",
|
"futures-core",
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ sha256 = "1.1.4"
|
||||||
tokio = { version = "1.29.1", features = ["full"] }
|
tokio = { version = "1.29.1", features = ["full"] }
|
||||||
tokio-util = { version = "0.7.8", features = ["io"] }
|
tokio-util = { version = "0.7.8", features = ["io"] }
|
||||||
tower = { version = "0.4.13", features = ["make"] }
|
tower = { version = "0.4.13", features = ["make"] }
|
||||||
tower-http = { version = "0.4.1", features = ["fs", "trace", "auth"] }
|
tower-http = { version = "0.4.1", features = ["fs", "trace"] }
|
||||||
tracing = "0.1.37"
|
tracing = "0.1.37"
|
||||||
tracing-subscriber = { version = "0.3.17", features = ["env-filter"] }
|
tracing-subscriber = { version = "0.3.17", features = ["env-filter"] }
|
||||||
uuid = { version = "1.4.0", features = ["v4"] }
|
uuid = { version = "1.4.0", features = ["v4"] }
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,6 @@ pub struct Cli {
|
||||||
pub pkg_dir: PathBuf,
|
pub pkg_dir: PathBuf,
|
||||||
/// Directory where repository metadata & SQLite database is stored
|
/// Directory where repository metadata & SQLite database is stored
|
||||||
pub data_dir: PathBuf,
|
pub data_dir: PathBuf,
|
||||||
/// API key to authenticate private routes with
|
|
||||||
pub api_key: String,
|
|
||||||
|
|
||||||
/// Database connection URL; either sqlite:// or postgres://. Defaults to rieter.sqlite in the
|
/// Database connection URL; either sqlite:// or postgres://. Defaults to rieter.sqlite in the
|
||||||
/// data directory
|
/// data directory
|
||||||
|
|
@ -74,7 +72,6 @@ impl Cli {
|
||||||
data_dir: self.data_dir.clone(),
|
data_dir: self.data_dir.clone(),
|
||||||
repo_dir: self.data_dir.join("repos"),
|
repo_dir: self.data_dir.join("repos"),
|
||||||
pkg_dir: self.pkg_dir.clone(),
|
pkg_dir: self.pkg_dir.clone(),
|
||||||
api_key: self.api_key.clone(),
|
|
||||||
};
|
};
|
||||||
let repo_manager = RepoGroupManager::new(&config.repo_dir, &self.pkg_dir);
|
let repo_manager = RepoGroupManager::new(&config.repo_dir, &self.pkg_dir);
|
||||||
|
|
||||||
|
|
@ -87,7 +84,7 @@ impl Cli {
|
||||||
// build our application with a single route
|
// build our application with a single route
|
||||||
let app = Router::new()
|
let app = Router::new()
|
||||||
.nest("/api", crate::api::router())
|
.nest("/api", crate::api::router())
|
||||||
.merge(crate::repo::router(&self.api_key))
|
.merge(crate::repo::router())
|
||||||
.with_state(global)
|
.with_state(global)
|
||||||
.layer(TraceLayer::new_for_http());
|
.layer(TraceLayer::new_for_http());
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,6 @@ pub struct Config {
|
||||||
data_dir: PathBuf,
|
data_dir: PathBuf,
|
||||||
repo_dir: PathBuf,
|
repo_dir: PathBuf,
|
||||||
pkg_dir: PathBuf,
|
pkg_dir: PathBuf,
|
||||||
api_key: String,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
|
|
||||||
|
|
@ -17,28 +17,15 @@ use std::sync::Arc;
|
||||||
use tokio::{fs, io::AsyncWriteExt};
|
use tokio::{fs, io::AsyncWriteExt};
|
||||||
use tower::util::ServiceExt;
|
use tower::util::ServiceExt;
|
||||||
use tower_http::services::{ServeDir, ServeFile};
|
use tower_http::services::{ServeDir, ServeFile};
|
||||||
use tower_http::validate_request::ValidateRequestHeaderLayer;
|
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
pub fn router(api_key: &str) -> Router<crate::Global> {
|
pub fn router() -> Router<crate::Global> {
|
||||||
Router::new()
|
Router::new()
|
||||||
.route(
|
.route("/:repo", post(post_package_archive).delete(delete_repo))
|
||||||
"/:repo",
|
.route("/:repo/:arch", delete(delete_arch_repo))
|
||||||
post(post_package_archive)
|
|
||||||
.delete(delete_repo)
|
|
||||||
.route_layer(ValidateRequestHeaderLayer::bearer(api_key)),
|
|
||||||
)
|
|
||||||
.route(
|
|
||||||
"/:repo/:arch",
|
|
||||||
delete(delete_arch_repo).route_layer(ValidateRequestHeaderLayer::bearer(api_key)),
|
|
||||||
)
|
|
||||||
// Routes added after the layer do not get that layer applied, so the GET requests will not
|
|
||||||
// be authorized
|
|
||||||
.route(
|
.route(
|
||||||
"/:repo/:arch/:filename",
|
"/:repo/:arch/:filename",
|
||||||
delete(delete_package)
|
delete(delete_package).get(get_file),
|
||||||
.route_layer(ValidateRequestHeaderLayer::bearer(api_key))
|
|
||||||
.get(get_file),
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -70,8 +57,6 @@ async fn post_package_archive(
|
||||||
match res {
|
match res {
|
||||||
// Insert the newly added package into the database
|
// Insert the newly added package into the database
|
||||||
Ok(pkg) => {
|
Ok(pkg) => {
|
||||||
tracing::info!("Added '{}' to repository '{}'", pkg.file_name(), repo);
|
|
||||||
|
|
||||||
// Query the repo for its ID, or create it if it does not already exist
|
// Query the repo for its ID, or create it if it does not already exist
|
||||||
let repo_entity = db_repo::Entity::find()
|
let repo_entity = db_repo::Entity::find()
|
||||||
.filter(db_repo::Column::Name.eq(&repo))
|
.filter(db_repo::Column::Name.eq(&repo))
|
||||||
|
|
@ -165,14 +150,10 @@ async fn delete_repo(
|
||||||
) -> crate::Result<StatusCode> {
|
) -> crate::Result<StatusCode> {
|
||||||
let clone = Arc::clone(&global.repo_manager);
|
let clone = Arc::clone(&global.repo_manager);
|
||||||
|
|
||||||
let repo_clone = repo.clone();
|
|
||||||
let repo_removed =
|
let repo_removed =
|
||||||
tokio::task::spawn_blocking(move || clone.write().unwrap().remove_repo(&repo_clone))
|
tokio::task::spawn_blocking(move || clone.write().unwrap().remove_repo(&repo)).await??;
|
||||||
.await??;
|
|
||||||
|
|
||||||
if repo_removed {
|
if repo_removed {
|
||||||
tracing::info!("Removed repository '{}'", repo);
|
|
||||||
|
|
||||||
Ok(StatusCode::OK)
|
Ok(StatusCode::OK)
|
||||||
} else {
|
} else {
|
||||||
Ok(StatusCode::NOT_FOUND)
|
Ok(StatusCode::NOT_FOUND)
|
||||||
|
|
@ -185,14 +166,11 @@ async fn delete_arch_repo(
|
||||||
) -> crate::Result<StatusCode> {
|
) -> crate::Result<StatusCode> {
|
||||||
let clone = Arc::clone(&global.repo_manager);
|
let clone = Arc::clone(&global.repo_manager);
|
||||||
|
|
||||||
let log = format!("Removed architecture '{}' from repository '{}'", arch, repo);
|
|
||||||
let repo_removed =
|
let repo_removed =
|
||||||
tokio::task::spawn_blocking(move || clone.write().unwrap().remove_repo_arch(&repo, &arch))
|
tokio::task::spawn_blocking(move || clone.write().unwrap().remove_repo_arch(&repo, &arch))
|
||||||
.await??;
|
.await??;
|
||||||
|
|
||||||
if repo_removed {
|
if repo_removed {
|
||||||
tracing::info!(log);
|
|
||||||
|
|
||||||
Ok(StatusCode::OK)
|
Ok(StatusCode::OK)
|
||||||
} else {
|
} else {
|
||||||
Ok(StatusCode::NOT_FOUND)
|
Ok(StatusCode::NOT_FOUND)
|
||||||
|
|
@ -212,7 +190,6 @@ async fn delete_package(
|
||||||
}
|
}
|
||||||
|
|
||||||
let name = name_parts[..name_parts.len() - 3].join("-");
|
let name = name_parts[..name_parts.len() - 3].join("-");
|
||||||
let log = format!("Removed '{}' from repository '{}'", file_name, repo);
|
|
||||||
|
|
||||||
let clone = Arc::clone(&global.repo_manager);
|
let clone = Arc::clone(&global.repo_manager);
|
||||||
|
|
||||||
|
|
@ -222,8 +199,6 @@ async fn delete_package(
|
||||||
.await??;
|
.await??;
|
||||||
|
|
||||||
if pkg_removed {
|
if pkg_removed {
|
||||||
tracing::info!(log);
|
|
||||||
|
|
||||||
Ok(StatusCode::OK)
|
Ok(StatusCode::OK)
|
||||||
} else {
|
} else {
|
||||||
Ok(StatusCode::NOT_FOUND)
|
Ok(StatusCode::NOT_FOUND)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue