diff --git a/Cargo.lock b/Cargo.lock index 1517bf1..1eb6007 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,6 +15,15 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +[[package]] +name = "aho-corasick" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "043164d8ba5c4c3035fec9bbee8647c0261d788f3474306f93bb65901cae0e86" +dependencies = [ + "memchr", +] + [[package]] name = "ansi_term" version = "0.11.0" @@ -41,6 +50,17 @@ dependencies = [ "syn", ] +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi 0.3.9", +] + [[package]] name = "autocfg" version = "1.0.1" @@ -73,6 +93,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +[[package]] +name = "bitstring" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e54f7b7a46d7b183eb41e2d82965261fa8a1597c68b50aced268ee1fc70272d" + [[package]] name = "block-buffer" version = "0.9.0" @@ -124,6 +150,16 @@ dependencies = [ "time", ] +[[package]] +name = "cidr" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6316c62053228eddd526a5e6deb6344c80bf2bc1e9786e7f90b3083e73197c1" +dependencies = [ + "bitstring", + "serde", +] + [[package]] name = "color-eyre" version = "0.5.3" @@ -209,6 +245,19 @@ dependencies = [ "generic-array", ] +[[package]] +name = "env_logger" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + [[package]] name = "eyre" version = "0.6.0" @@ -378,12 +427,37 @@ version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" +[[package]] +name = "h2" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993f9e0baeed60001cf565546b0d3dbe6a6ad23f2bd31644a133c641eccf6d53" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d36fab90f82edc3c747f9d438e06cf0a491055896f2a279638bb5beed6c40177" +[[package]] +name = "hashbrown" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d63df3d41950fb462ed38308eea019113ad1508da725bbedcd0fa5a85ef5f7" + [[package]] name = "hermit-abi" version = "0.1.15" @@ -409,12 +483,82 @@ dependencies = [ "digest", ] +[[package]] +name = "http" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "httparse" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" + +[[package]] +name = "humantime" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] + +[[package]] +name = "hyper" +version = "0.13.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e68a8dd9716185d9e64ea473ea6ef63529252e3e27623295a0378a19665d5eb" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project", + "socket2", + "time", + "tokio", + "tower-service", + "tracing", + "want", +] + [[package]] name = "indenter" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0bd112d44d9d870a6819eb505d04dd92b5e4d94bb8c304924a0872ae7016fb5" +[[package]] +name = "indexmap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "iovec" version = "0.1.4" @@ -424,6 +568,12 @@ dependencies = [ "libc", ] +[[package]] +name = "itoa" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" + [[package]] name = "kernel32-sys" version = "0.2.2" @@ -685,6 +835,16 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c36fa947111f5c62a733b652544dd0016a43ce89619538a8ef92724a6f501a20" +[[package]] +name = "pretty_env_logger" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" +dependencies = [ + "env_logger", + "log", +] + [[package]] name = "proc-macro-hack" version = "0.5.18" @@ -706,6 +866,12 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quote" version = "1.0.7" @@ -762,6 +928,24 @@ version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" +[[package]] +name = "regex" +version = "1.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", +] + +[[package]] +name = "regex-syntax" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" + [[package]] name = "rustc-demangle" version = "0.1.16" @@ -889,6 +1073,15 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "termcolor" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" +dependencies = [ + "winapi-util", +] + [[package]] name = "thread_local" version = "1.0.1" @@ -944,6 +1137,26 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio-util" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower-service" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" + [[package]] name = "tracing" version = "0.1.19" @@ -951,6 +1164,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d79ca061b032d6ce30c660fded31189ca0b9922bf483cd70759f13a2d86786c" dependencies = [ "cfg-if", + "log", "tracing-attributes", "tracing-core", ] @@ -996,6 +1210,12 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + [[package]] name = "typenum" version = "1.12.0" @@ -1030,6 +1250,16 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" @@ -1070,6 +1300,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -1093,13 +1332,17 @@ dependencies = [ "async-trait", "byteorder", "chrono", + "cidr", "color-eyre", "cryptohelpers", "difference", "futures", + "hyper", "libc", + "log", "once_cell", "pin-project", + "pretty_env_logger", "rustc_version", "serde", "serde_cbor", diff --git a/Cargo.toml b/Cargo.toml index e1a99cd..710ff17 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,6 +33,10 @@ futures = "0.3" pin-project = "0.4.23" difference = "2.0.0" color-eyre = "0.5.2" +hyper = "0.13.7" +cidr = {version = "0.1.1", features=["serde"]} +pretty_env_logger = "0.4.0" +log = "0.4.11" [build-dependencies] rustc_version = "0.2" diff --git a/src/config.rs b/src/config.rs index 358d697..b6accb7 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,7 +1,12 @@ use super::*; use std::{ borrow::Cow, + net::{ + SocketAddr, + Ipv4Addr, + }, }; +use cidr::Cidr; //TODO: Use tokio Watcher instead, to allow hotreloading? use once_cell::sync::OnceCell; @@ -23,11 +28,18 @@ pub fn get() -> &'static Config } /// Config for this run -#[derive(Debug, Clone, PartialEq, Eq, Hash)] +#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Config { /// Name for nanashi pub anon_name: Cow<'static, str>, + /// The server will listen on this address + pub listen: SocketAddr, + /// Accept all connections in this match + pub accept_mask: Vec, + /// Deny all connections in this match, even if previously matched by allow + pub deny_mask: Vec, + } impl Default for Config @@ -37,6 +49,9 @@ impl Default for Config { Self { anon_name: Cow::Borrowed("Nanashi"), + listen: SocketAddr::from(([127,0,0,1], 8088)), + accept_mask: vec![cidr::Ipv4Cidr::new(Ipv4Addr::new(127,0,0,1), 32).unwrap().into()], + deny_mask: Vec::new(), } } } diff --git a/src/main.rs b/src/main.rs index e65679d..ed8a1d6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,6 +7,8 @@ #[cfg(all(nightly, test))] extern crate test; +#[macro_use] extern crate log; + use async_trait::async_trait; use serde::{ Serialize, Deserialize, @@ -30,8 +32,20 @@ mod identity; mod post; mod state; -fn main() -> Result<(), eyre::Report>{ +mod web; + +#[tokio::main] +async fn main() -> Result<(), eyre::Report>{ color_eyre::install()?; + pretty_env_logger::init(); + + trace!("Setting default config"); + + config::set(Default::default()); + + web::serve(web::State::new()).await?; + + info!("Server shutdown gracefully"); /* let mut vec = vec![vec![1, 0, 0], vec![0, 0, 1]]; diff --git a/src/web/mod.rs b/src/web/mod.rs new file mode 100644 index 0000000..b6a0ef1 --- /dev/null +++ b/src/web/mod.rs @@ -0,0 +1,74 @@ +//! Handle web serving and managing state of web clients +use super::*; +use std::{ + sync::Arc, +}; +use hyper::{ + service::{ + make_service_fn, + service_fn, + }, + server::{ + Server, + conn::AddrStream, + }, + Request, + Response, + Body, +}; +use futures::{ + TryStreamExt as _, +}; + +#[derive(Debug)] +pub struct State +{ + +} + +impl State +{ + pub fn new() -> Self + { + Self{} + } +} + + +async fn test(req: Request) -> Result, !> +{ + Ok(Response::new("Hi".into())) +} + +pub async fn serve(state: State) -> Result<(), eyre::Report> +{ + let state = Arc::new(state); + + let (addr, accept, deny) = { + let cfg =config::get(); + (cfg.listen, + cfg.accept_mask.clone(), + cfg.deny_mask.clone()) + }; + + let service = make_service_fn(|conn: &AddrStream| { + let state = Arc::clone(&state); + + let remote_addr = conn.remote_addr(); + // TODO: Match config allow and deny masks + + + async move { + Ok::<_, !>(service_fn(test)) + } + }); + + let server = Server::bind(&addr).serve(service) + .with_graceful_shutdown(async { + tokio::signal::ctrl_c().await.expect("Failed to catch SIGINT"); + }); + + server.await?; + + Ok(()) +}