diff --git a/Cargo.lock b/Cargo.lock index ce8c901..3249f6a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3309,6 +3309,7 @@ dependencies = [ "tokio", "tonic 0.12.3", "tonic-build", + "tonic-web", ] [[package]] @@ -3799,6 +3800,26 @@ dependencies = [ "syn 2.0.89", ] +[[package]] +name = "tonic-web" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5299dd20801ad736dccb4a5ea0da7376e59cd98f213bf1c3d478cf53f4834b58" +dependencies = [ + "base64 0.22.1", + "bytes", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "pin-project", + "tokio-stream", + "tonic 0.12.3", + "tower-http", + "tower-layer", + "tower-service", + "tracing", +] + [[package]] name = "tower" version = "0.4.13" @@ -3819,6 +3840,22 @@ dependencies = [ "tracing", ] +[[package]] +name = "tower-http" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +dependencies = [ + "bitflags 2.6.0", + "bytes", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "pin-project-lite", + "tower-layer", + "tower-service", +] + [[package]] name = "tower-layer" version = "0.3.3" diff --git a/proto/burrowweb.proto b/proto/burrowweb.proto index f9cfe85..2dd1250 100644 --- a/proto/burrowweb.proto +++ b/proto/burrowweb.proto @@ -12,6 +12,7 @@ service BurrowWeb { rpc CreateDevice (CreateDeviceRequest) returns (CreateDeviceResponse); rpc DeleteDevice (JWTInfo) returns (Empty); rpc ListDevices (JWTInfo) returns (ListDevicesResponse); + rpc Status(Empty) returns (ServerStatus); } message Peer { @@ -88,3 +89,7 @@ message CreateDeviceResponse { message ListDevicesResponse { repeated Device devices = 1; } + +message ServerStatus { + string status = 1; +} diff --git a/server/Cargo.toml b/server/Cargo.toml index 3f1d072..fbeaa57 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -31,6 +31,7 @@ dotenvy = "0.15.7" config = "0.14.1" prost = "0.13.3" prost-types = "0.13.3" +tonic-web = "0.12.3" [features] diff --git a/server/server.sqlite3 b/server/server.sqlite3 new file mode 100644 index 0000000..cf93d67 Binary files /dev/null and b/server/server.sqlite3 differ diff --git a/server/src/main.rs b/server/src/main.rs index 49d2b8d..3d3060c 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -2,7 +2,7 @@ pub mod client; pub mod server; use anyhow::Result; use clap::{Args, Parser, Subcommand}; -use server::providers::gen_keypem; +use server::{providers::gen_keypem, serve}; #[derive(Parser)] #[command(name = "Burrow Server")] @@ -44,7 +44,9 @@ async fn main() -> Result<()> { println!("Generated PEM:\n{pem}") } } - Commands::StartServer => todo!(), + Commands::StartServer => { + serve().await?; + } }; Ok(()) } diff --git a/server/src/server/grpc_server.rs b/server/src/server/grpc_server.rs index d710529..3aec7dc 100644 --- a/server/src/server/grpc_server.rs +++ b/server/src/server/grpc_server.rs @@ -4,21 +4,32 @@ use jwt_simple::prelude::Ed25519KeyPair; use tonic::{Request, Response, Status}; use super::providers::{KeypairT, OpenIdUser}; +use std::fmt::Debug; use super::{ grpc_defs::{ burrowwebrpc::burrow_web_server::BurrowWeb, CreateDeviceRequest, CreateDeviceResponse, - Empty, JwtInfo, ListDevicesResponse, SlackAuthRequest, + Empty, JwtInfo, ListDevicesResponse, ServerStatus, SlackAuthRequest, }, providers::slack::auth, settings::BurrowAuthServerConfig, }; -struct BurrowGrpcServer { +#[derive(Clone)] +pub struct BurrowGrpcServer { config: Arc, jwt_keypair: Arc, } +impl Debug for BurrowGrpcServer { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BurrowGrpcServer") + .field("config", &self.config) + .field("jwt_keypair", &"") + .finish() + } +} + impl BurrowGrpcServer { pub fn new() -> anyhow::Result { let config = BurrowAuthServerConfig::new_dotenv()?; @@ -62,4 +73,10 @@ impl BurrowWeb for BurrowGrpcServer { ) -> Result, Status> { todo!() } + + async fn status(&self, _req: Request) -> Result, Status> { + Ok(Response::new(ServerStatus { + status: "Nobody expects the Spanish Inquisition".into(), + })) + } } diff --git a/server/src/server/mod.rs b/server/src/server/mod.rs index 7c8cdd8..1d6c1d9 100644 --- a/server/src/server/mod.rs +++ b/server/src/server/mod.rs @@ -5,13 +5,22 @@ pub mod providers; pub mod settings; use anyhow::Result; -use providers::slack::auth; +use grpc_defs::burrow_web_server::BurrowWebServer; +use grpc_server::BurrowGrpcServer; use tokio::signal; +use tonic::transport::Server; pub async fn serve() -> Result<()> { db::init_db()?; - let listener = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap(); + let addr = "[::1]:8080".parse()?; log::info!("Starting auth server on port 8080"); + let burrow_grpc_server = BurrowGrpcServer::new()?; + let svc = BurrowWebServer::new(burrow_grpc_server); + Server::builder() + .accept_http1(true) + .add_service(tonic_web::enable(svc)) + .serve(addr) + .await?; Ok(()) }