diff options
Diffstat (limited to 'rust/src')
-rw-r--r-- | rust/src/auth.rs | 4 | ||||
-rw-r--r-- | rust/src/bin/fatcat-auth.rs | 6 | ||||
-rw-r--r-- | rust/src/bin/fatcat-export.rs | 4 | ||||
-rw-r--r-- | rust/src/bin/fatcatd.rs | 12 | ||||
-rw-r--r-- | rust/src/editing.rs | 9 | ||||
-rw-r--r-- | rust/src/endpoint_handlers.rs | 3 | ||||
-rw-r--r-- | rust/src/endpoints.rs | 4 | ||||
-rw-r--r-- | rust/src/entity_crud.rs | 14 | ||||
-rw-r--r-- | rust/src/errors.rs | 11 | ||||
-rw-r--r-- | rust/src/server.rs | 4 |
10 files changed, 49 insertions, 22 deletions
diff --git a/rust/src/auth.rs b/rust/src/auth.rs index e7526389..8e7160bb 100644 --- a/rust/src/auth.rs +++ b/rust/src/auth.rs @@ -1,4 +1,8 @@ //! Editor bearer token authentication +//! +//! Code for dealing with API bearer tokens (macaroons), which encode the editor identifier as well +//! as additional constraints (eg, to a particular endpoint or time span). Includes helpers for +//! role-based authentication (RBAC). use data_encoding::BASE64; use macaroon::{Format, Macaroon, Verifier}; diff --git a/rust/src/bin/fatcat-auth.rs b/rust/src/bin/fatcat-auth.rs index 85132023..0ba543b4 100644 --- a/rust/src/bin/fatcat-auth.rs +++ b/rust/src/bin/fatcat-auth.rs @@ -2,9 +2,9 @@ use clap::{App, SubCommand}; -use fatcat::{auth, editing, server}; use fatcat::errors::Result; use fatcat::identifiers::FatcatId; +use fatcat::{auth, editing, server}; use std::process; use std::str::FromStr; @@ -66,7 +66,9 @@ fn main() -> Result<()> { } // Then the ones that do - let db_conn = server::database_worker_pool()?.get().expect("database pool"); + let db_conn = server::database_worker_pool()? + .get() + .expect("database pool"); let confectionary = auth::env_confectionary()?; match m.subcommand() { ("list-editors", Some(_subm)) => { diff --git a/rust/src/bin/fatcat-export.rs b/rust/src/bin/fatcat-export.rs index d6764dc6..0f5d04ac 100644 --- a/rust/src/bin/fatcat-export.rs +++ b/rust/src/bin/fatcat-export.rs @@ -15,15 +15,15 @@ use clap::{App, Arg}; use fatcat::entity_crud::*; use fatcat::errors::Result; use fatcat::identifiers::FatcatId; -use fatcat::server::{DbConn, self}; +use fatcat::server::{self, DbConn}; use fatcat_api_spec::models::*; use std::str::FromStr; use uuid::Uuid; -use std::thread; use crossbeam_channel as channel; use std::io::prelude::*; use std::io::{BufReader, BufWriter}; +use std::thread; const CHANNEL_BUFFER_LEN: usize = 200; diff --git a/rust/src/bin/fatcatd.rs b/rust/src/bin/fatcatd.rs index 816ea1f0..75a6f000 100644 --- a/rust/src/bin/fatcatd.rs +++ b/rust/src/bin/fatcatd.rs @@ -5,6 +5,8 @@ extern crate slog; #[macro_use] extern crate hyper; +use cadence::prelude::*; +use cadence::{BufferedUdpMetricSink, QueuingMetricSink, StatsdClient}; use clap::{App, Arg}; use fatcat::errors::Result; use fatcat::server; @@ -15,8 +17,6 @@ use iron_slog::{DefaultLogFormatter, LoggerMiddleware}; use sentry::integrations::panic; use slog::{Drain, Logger}; use std::env; -use cadence::{StatsdClient, QueuingMetricSink, BufferedUdpMetricSink}; -use cadence::prelude::*; use std::net::UdpSocket; // HTTP header middleware @@ -32,7 +32,6 @@ impl AfterMiddleware for XClacksOverheadMiddleware { } } - /// Create custom server, wire it to the autogenerated router, /// and pass it to the web server. fn main() -> Result<()> { @@ -70,7 +69,7 @@ fn main() -> Result<()> { match env::var("FATCAT_STATSD_HOST") { Err(_) => { info!(logger, "no metrics recipient configured"); - }, + } Ok(host) => { let port: u16 = match env::var("FATCAT_STATSD_PORT") { Err(_) => cadence::DEFAULT_PORT, @@ -80,7 +79,10 @@ fn main() -> Result<()> { socket.set_nonblocking(true).unwrap(); let udp_sink = BufferedUdpMetricSink::from((host.as_ref(), port), socket).unwrap(); let queuing_sink = QueuingMetricSink::from(udp_sink); - info!(logger, "sending statsd metrics via UDP to: {}:{}", host, port); + info!( + logger, + "sending statsd metrics via UDP to: {}:{}", host, port + ); server.metrics = StatsdClient::from_sink("fatcat.api", queuing_sink); //server.metrics = StatsdClient::from_udp_host("fatcat.api", (host.as_ref(), port))?; server.metrics.incr("restart").unwrap(); diff --git a/rust/src/editing.rs b/rust/src/editing.rs index 9dac30ac..4fca30d6 100644 --- a/rust/src/editing.rs +++ b/rust/src/editing.rs @@ -1,8 +1,13 @@ +//! Helpers and types for dealing with the edit lifecycle. +//! +//! Does not contain the core code for creating/updating/reading/deleting the Editor, Annotation, +//! and Changelog objects, which lives under `editing_crud`. + use crate::database_models::*; use crate::database_schema::*; use crate::entity_crud::EntityCrud; -use crate::errors::{Result, FatcatError}; -use crate::identifiers::{FatcatId, check_username}; +use crate::errors::{FatcatError, Result}; +use crate::identifiers::{check_username, FatcatId}; use crate::server::DbConn; use diesel; use diesel::prelude::*; diff --git a/rust/src/endpoint_handlers.rs b/rust/src/endpoint_handlers.rs index 78044054..01b5eb5c 100644 --- a/rust/src/endpoint_handlers.rs +++ b/rust/src/endpoint_handlers.rs @@ -1,6 +1,9 @@ //! API endpoint handlers //! //! This module contains actual implementations of endpoints with rust-style type signatures. +//! +//! The remaining functions here should probably be refactored away. The 'get_release_files' style +//! functions should go in entity_crud (or some new use crate::database_models::*; use crate::database_schema::*; diff --git a/rust/src/endpoints.rs b/rust/src/endpoints.rs index 8c7700f1..3a95f746 100644 --- a/rust/src/endpoints.rs +++ b/rust/src/endpoints.rs @@ -14,6 +14,7 @@ use crate::entity_crud::{EntityCrud, ExpandFlags, HideFlags}; use crate::errors::*; use crate::identifiers::FatcatId; use crate::server::*; +use cadence::prelude::*; use diesel::Connection; use fatcat_api_spec::models; use fatcat_api_spec::models::*; @@ -22,7 +23,6 @@ use futures::{self, Future}; use sentry::integrations::failure::capture_fail; use std::str::FromStr; use uuid::{self, Uuid}; -use cadence::prelude::*; // This makes response matching below *much* more terse use crate::errors::FatcatError::*; @@ -764,7 +764,7 @@ impl Api for Server { success: true, message: "horray!".to_string(), }) - }, + } Err(fe) => generic_auth_err_responses!(fe, AcceptEditgroupResponse), }; Box::new(futures::done(Ok(ret))) diff --git a/rust/src/entity_crud.rs b/rust/src/entity_crud.rs index a0101de8..3d9b5165 100644 --- a/rust/src/entity_crud.rs +++ b/rust/src/entity_crud.rs @@ -1,3 +1,10 @@ +//! Create/Update/Read/Delete methods for all entity types +//! +//! This module is very large (perhaps it should be split into per-entity files?), but it basically +//! comes down to implementing the EntityCrud trait for each of the entity types. *All* entity +//! reads and mutations should go through this file, which defines the mechanics of translation +//! between the SQL schema and API (swagger) JSON models. + use crate::database_models::*; use crate::database_schema::*; use crate::editing::EditContext; @@ -5,7 +12,6 @@ use crate::endpoint_handlers::get_release_files; use crate::errors::*; use crate::identifiers::*; use crate::server::DbConn; -use chrono; use diesel::prelude::*; use diesel::{self, insert_into}; use fatcat_api_spec::models::*; @@ -295,8 +301,10 @@ macro_rules! generic_db_get_rev { fn db_get_rev(conn: &DbConn, rev_id: Uuid, hide: HideFlags) -> Result<Self> { let rev = match $rev_table::table.find(rev_id).first(conn) { Ok(rev) => rev, - Err(diesel::result::Error::NotFound) => - Err(FatcatError::NotFound(stringify!($rev_table).to_string(), rev_id.to_string()))?, + Err(diesel::result::Error::NotFound) => Err(FatcatError::NotFound( + stringify!($rev_table).to_string(), + rev_id.to_string(), + ))?, Err(e) => Err(e)?, }; diff --git a/rust/src/errors.rs b/rust/src/errors.rs index 19ba2f82..ec2b949b 100644 --- a/rust/src/errors.rs +++ b/rust/src/errors.rs @@ -116,9 +116,13 @@ impl Into<models::ErrorResponse> for FatcatError { impl From<diesel::result::Error> for FatcatError { fn from(inner: diesel::result::Error) -> FatcatError { match inner { - diesel::result::Error::NotFound => FatcatError::NotFound("unknown".to_string(), "N/A".to_string()), - diesel::result::Error::DatabaseError(_, _) => FatcatError::ConstraintViolation(inner.to_string()), - _ => FatcatError::InternalError(inner.to_string()) + diesel::result::Error::NotFound => { + FatcatError::NotFound("unknown".to_string(), "N/A".to_string()) + } + diesel::result::Error::DatabaseError(_, _) => { + FatcatError::ConstraintViolation(inner.to_string()) + } + _ => FatcatError::InternalError(inner.to_string()), } } } @@ -178,4 +182,3 @@ impl From<failure::Error> for FatcatError { FatcatError::InternalError(error.to_string()) } } - diff --git a/rust/src/server.rs b/rust/src/server.rs index c7cfa363..42ae9a07 100644 --- a/rust/src/server.rs +++ b/rust/src/server.rs @@ -1,14 +1,14 @@ //! API endpoint handlers -use crate::auth::{AuthConfectionary, self}; +use crate::auth::{self, AuthConfectionary}; use crate::errors::Result; +use cadence::{NopMetricSink, StatsdClient}; use chrono; use diesel; use diesel::pg::PgConnection; use diesel::r2d2::ConnectionManager; use dotenv::dotenv; use std::env; -use cadence::{StatsdClient, NopMetricSink}; #[cfg(feature = "postgres")] embed_migrations!("../migrations/"); |