features: app engine #1
| @ -1,11 +1,13 @@ | |||||||
| use std::sync::Arc; | use detee_shared::app_proto::brain_app_cli_server::BrainAppCliServer; | ||||||
| 
 | use detee_shared::app_proto::brain_app_daemon_server::BrainAppDaemonServer; | ||||||
| use detee_shared::general_proto::brain_general_cli_server::BrainGeneralCliServer; | use detee_shared::general_proto::brain_general_cli_server::BrainGeneralCliServer; | ||||||
| use detee_shared::vm_proto::brain_vm_cli_server::BrainVmCliServer; | use detee_shared::vm_proto::brain_vm_cli_server::BrainVmCliServer; | ||||||
| use detee_shared::vm_proto::brain_vm_daemon_server::BrainVmDaemonServer; | use detee_shared::vm_proto::brain_vm_daemon_server::BrainVmDaemonServer; | ||||||
| use dotenv::dotenv; | use dotenv::dotenv; | ||||||
|  | use std::sync::Arc; | ||||||
| use surreal_brain::constants::{BRAIN_GRPC_ADDR, CERT_KEY_PATH, CERT_PATH}; | use surreal_brain::constants::{BRAIN_GRPC_ADDR, CERT_KEY_PATH, CERT_PATH}; | ||||||
| use surreal_brain::db; | use surreal_brain::db; | ||||||
|  | use surreal_brain::grpc::app::{AppCliServer, AppDaemonServer}; | ||||||
| use surreal_brain::grpc::general::GeneralCliServer; | use surreal_brain::grpc::general::GeneralCliServer; | ||||||
| use surreal_brain::grpc::vm::{VmCliServer, VmDaemonServer}; | use surreal_brain::grpc::vm::{VmCliServer, VmDaemonServer}; | ||||||
| use tonic::transport::{Identity, Server, ServerTlsConfig}; | use tonic::transport::{Identity, Server, ServerTlsConfig}; | ||||||
| @ -31,6 +33,8 @@ async fn main() { | |||||||
|     let snp_daemon_server = BrainVmDaemonServer::new(VmDaemonServer::new(db_arc.clone())); |     let snp_daemon_server = BrainVmDaemonServer::new(VmDaemonServer::new(db_arc.clone())); | ||||||
|     let snp_cli_server = BrainVmCliServer::new(VmCliServer::new(db_arc.clone())); |     let snp_cli_server = BrainVmCliServer::new(VmCliServer::new(db_arc.clone())); | ||||||
|     let general_service_server = BrainGeneralCliServer::new(GeneralCliServer::new(db_arc.clone())); |     let general_service_server = BrainGeneralCliServer::new(GeneralCliServer::new(db_arc.clone())); | ||||||
|  |     let sgx_daemon_server = BrainAppDaemonServer::new(AppDaemonServer::new(db_arc.clone())); | ||||||
|  |     let sgx_cli_server = BrainAppCliServer::new(AppCliServer::new(db_arc.clone())); | ||||||
| 
 | 
 | ||||||
|     let cert_path = std::env::var("CERT_PATH").unwrap_or(CERT_PATH.to_string()); |     let cert_path = std::env::var("CERT_PATH").unwrap_or(CERT_PATH.to_string()); | ||||||
|     let key_path = std::env::var("CERT_KEY_PATH").unwrap_or(CERT_KEY_PATH.to_string()); |     let key_path = std::env::var("CERT_KEY_PATH").unwrap_or(CERT_KEY_PATH.to_string()); | ||||||
| @ -45,6 +49,8 @@ async fn main() { | |||||||
|         .add_service(snp_daemon_server) |         .add_service(snp_daemon_server) | ||||||
|         .add_service(snp_cli_server) |         .add_service(snp_cli_server) | ||||||
|         .add_service(general_service_server) |         .add_service(general_service_server) | ||||||
|  |         .add_service(sgx_daemon_server) | ||||||
|  |         .add_service(sgx_cli_server) | ||||||
|         .serve(addr) |         .serve(addr) | ||||||
|         .await |         .await | ||||||
|         .unwrap(); |         .unwrap(); | ||||||
|  | |||||||
							
								
								
									
										153
									
								
								src/grpc/app.rs
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										153
									
								
								src/grpc/app.rs
									
									
									
									
									
								
							| @ -1 +1,154 @@ | |||||||
|  | use crate::grpc::{check_sig_from_parts, check_sig_from_req}; | ||||||
|  | use detee_shared::app_proto::brain_app_cli_server::BrainAppCli; | ||||||
|  | use detee_shared::app_proto::brain_app_daemon_server::BrainAppDaemon; | ||||||
|  | use detee_shared::app_proto::{ | ||||||
|  |     daemon_message_app, AppContract, AppNodeFilters, AppNodeListResp, BrainMessageApp, DaemonAuth, | ||||||
|  |     DaemonMessageApp, DelAppReq, ListAppContractsReq, RegisterAppNodeReq, | ||||||
|  | }; | ||||||
|  | use detee_shared::common_proto::Empty; | ||||||
|  | use log::info; | ||||||
|  | use std::pin::Pin; | ||||||
|  | use std::sync::Arc; | ||||||
|  | use surrealdb::engine::remote::ws::Client; | ||||||
|  | use surrealdb::Surreal; | ||||||
|  | use tokio_stream::{Stream, StreamExt}; | ||||||
|  | use tonic::{Status, Streaming}; | ||||||
| 
 | 
 | ||||||
|  | pub struct AppDaemonServer { | ||||||
|  |     pub db: Arc<Surreal<Client>>, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl AppDaemonServer { | ||||||
|  |     pub fn new(db: Arc<Surreal<Client>>) -> Self { | ||||||
|  |         Self { db } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[tonic::async_trait] | ||||||
|  | impl BrainAppDaemon for AppDaemonServer { | ||||||
|  |     type RegisterAppNodeStream = Pin<Box<dyn Stream<Item = Result<AppContract, Status>> + Send>>; | ||||||
|  |     type BrainMessagesStream = Pin<Box<dyn Stream<Item = Result<BrainMessageApp, Status>> + Send>>; | ||||||
|  | 
 | ||||||
|  |     async fn register_app_node( | ||||||
|  |         &self, | ||||||
|  |         req: tonic::Request<RegisterAppNodeReq>, | ||||||
|  |     ) -> Result<tonic::Response<<Self as BrainAppDaemon>::RegisterAppNodeStream>, tonic::Status> | ||||||
|  |     { | ||||||
|  |         let req = check_sig_from_req(req)?; | ||||||
|  |         info!("Starting app_node registration process for {:?}", req); | ||||||
|  | 
 | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     async fn brain_messages( | ||||||
|  |         &self, | ||||||
|  |         req: tonic::Request<DaemonAuth>, | ||||||
|  |     ) -> Result<tonic::Response<<Self as BrainAppDaemon>::BrainMessagesStream>, tonic::Status> { | ||||||
|  |         let auth = req.into_inner(); | ||||||
|  |         let pubkey = auth.pubkey.clone(); | ||||||
|  |         check_sig_from_parts( | ||||||
|  |             &pubkey, | ||||||
|  |             &auth.timestamp, | ||||||
|  |             &format!("{:?}", auth.contracts), | ||||||
|  |             &auth.signature, | ||||||
|  |         )?; | ||||||
|  | 
 | ||||||
|  |         info!("App Daemon {} connected to receive brain messages", pubkey); | ||||||
|  | 
 | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     async fn daemon_messages( | ||||||
|  |         &self, | ||||||
|  |         req: tonic::Request<Streaming<DaemonMessageApp>>, | ||||||
|  |     ) -> Result<tonic::Response<Empty>, tonic::Status> { | ||||||
|  |         let mut req_stream = req.into_inner(); | ||||||
|  |         let pubkey: String; | ||||||
|  |         if let Some(Ok(msg)) = req_stream.next().await { | ||||||
|  |             log::debug!("App daemon_messages received auth message: {:?}", msg); | ||||||
|  |             if let Some(daemon_message_app::Msg::Auth(auth)) = msg.msg { | ||||||
|  |                 pubkey = auth.pubkey.clone(); | ||||||
|  |                 check_sig_from_parts( | ||||||
|  |                     &pubkey, | ||||||
|  |                     &auth.timestamp, | ||||||
|  |                     &format!("{:?}", &auth.contracts), | ||||||
|  |                     &auth.signature, | ||||||
|  |                 )?; | ||||||
|  |             } else { | ||||||
|  |                 return Err(Status::unauthenticated( | ||||||
|  |                     "Could not authenticate the app daemon: could not extract auth signature", | ||||||
|  |                 )); | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             return Err(Status::unauthenticated("Could not authenticate the app daemon")); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub struct AppCliServer { | ||||||
|  |     pub db: Arc<Surreal<Client>>, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | impl AppCliServer { | ||||||
|  |     pub fn new(db: Arc<Surreal<Client>>) -> Self { | ||||||
|  |         Self { db } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[tonic::async_trait] | ||||||
|  | impl BrainAppCli for AppCliServer { | ||||||
|  |     type ListAppContractsStream = Pin<Box<dyn Stream<Item = Result<AppContract, Status>> + Send>>; | ||||||
|  |     type ListAppNodesStream = Pin<Box<dyn Stream<Item = Result<AppNodeListResp, Status>> + Send>>; | ||||||
|  | 
 | ||||||
|  |     async fn deploy_app( | ||||||
|  |         &self, | ||||||
|  |         req: tonic::Request<detee_shared::app_proto::NewAppReq>, | ||||||
|  |     ) -> Result<tonic::Response<detee_shared::app_proto::NewAppRes>, tonic::Status> { | ||||||
|  |         let req = check_sig_from_req(req)?; | ||||||
|  |         info!("deploy_app process starting for {:?}", req); | ||||||
|  | 
 | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     async fn delete_app( | ||||||
|  |         &self, | ||||||
|  |         req: tonic::Request<DelAppReq>, | ||||||
|  |     ) -> Result<tonic::Response<detee_shared::common_proto::Empty>, tonic::Status> { | ||||||
|  |         let req = check_sig_from_req(req)?; | ||||||
|  |         info!("delete_app process starting for {:?}", req); | ||||||
|  | 
 | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     async fn list_app_contracts( | ||||||
|  |         &self, | ||||||
|  |         req: tonic::Request<ListAppContractsReq>, | ||||||
|  |     ) -> Result<tonic::Response<<Self as BrainAppCli>::ListAppContractsStream>, tonic::Status> { | ||||||
|  |         let req = check_sig_from_req(req)?; | ||||||
|  |         info!("list_app_contracts process starting for {:?}", req); | ||||||
|  | 
 | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     async fn list_app_nodes( | ||||||
|  |         &self, | ||||||
|  |         req: tonic::Request<AppNodeFilters>, | ||||||
|  |     ) -> Result<tonic::Response<<Self as BrainAppCli>::ListAppNodesStream>, tonic::Status> { | ||||||
|  |         let req = check_sig_from_req(req)?; | ||||||
|  |         info!("list_app_nodes process starting for {:?}", req); | ||||||
|  | 
 | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     async fn get_one_app_node( | ||||||
|  |         &self, | ||||||
|  |         req: tonic::Request<AppNodeFilters>, | ||||||
|  |     ) -> Result<tonic::Response<AppNodeListResp>, tonic::Status> { | ||||||
|  |         let req = check_sig_from_req(req)?; | ||||||
|  |         info!("get_one_app_node process starting for {:?}", req); | ||||||
|  | 
 | ||||||
|  |         todo!() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | |||||||
| @ -4,11 +4,12 @@ pub mod types; | |||||||
| pub mod vm; | pub mod vm; | ||||||
| 
 | 
 | ||||||
| use crate::constants::ADMIN_ACCOUNTS; | use crate::constants::ADMIN_ACCOUNTS; | ||||||
|  | use detee_shared::app_proto::*; | ||||||
| use detee_shared::common_proto::{Empty, Pubkey}; | use detee_shared::common_proto::{Empty, Pubkey}; | ||||||
| use detee_shared::general_proto::{ | use detee_shared::general_proto::{ | ||||||
|     AirdropReq, BanUserReq, KickReq, RegOperatorReq, ReportNodeReq, SlashReq, |     AirdropReq, BanUserReq, KickReq, RegOperatorReq, ReportNodeReq, SlashReq, | ||||||
| }; | }; | ||||||
| use detee_shared::vm_proto::{ListVmContractsReq, *}; | use detee_shared::vm_proto::*; | ||||||
| use tonic::{Request, Status}; | use tonic::{Request, Status}; | ||||||
| 
 | 
 | ||||||
| pub trait PubkeyGetter { | pub trait PubkeyGetter { | ||||||
| @ -49,12 +50,12 @@ impl_pubkey_getter!(Empty); | |||||||
| impl_pubkey_getter!(AirdropReq); | impl_pubkey_getter!(AirdropReq); | ||||||
| impl_pubkey_getter!(SlashReq); | impl_pubkey_getter!(SlashReq); | ||||||
| 
 | 
 | ||||||
| // impl_pubkey_getter!(NewAppReq, admin_pubkey);
 | impl_pubkey_getter!(NewAppReq, admin_pubkey); | ||||||
| // impl_pubkey_getter!(DelAppReq, admin_pubkey);
 | impl_pubkey_getter!(DelAppReq, admin_pubkey); | ||||||
| // impl_pubkey_getter!(ListAppContractsReq, admin_pubkey);
 | impl_pubkey_getter!(ListAppContractsReq, admin_pubkey); | ||||||
| //
 | 
 | ||||||
| // impl_pubkey_getter!(RegisterAppNodeReq);
 | impl_pubkey_getter!(RegisterAppNodeReq); | ||||||
| // impl_pubkey_getter!(AppNodeFilters);
 | impl_pubkey_getter!(AppNodeFilters); | ||||||
| 
 | 
 | ||||||
| pub fn check_sig_from_req<T: std::fmt::Debug + PubkeyGetter>(req: Request<T>) -> Result<T, Status> { | pub fn check_sig_from_req<T: std::fmt::Debug + PubkeyGetter>(req: Request<T>) -> Result<T, Status> { | ||||||
|     let time = match req.metadata().get("timestamp") { |     let time = match req.metadata().get("timestamp") { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user