diff --git a/services/identity/src/client_service.rs b/services/identity/src/client_service.rs --- a/services/identity/src/client_service.rs +++ b/services/identity/src/client_service.rs @@ -2,25 +2,34 @@ tonic::include_proto!("identity.client"); } -use crate::client_service::client_proto::{ - DeleteUserRequest, Empty, GenerateNonceResponse, KeyserverKeysRequest, - KeyserverKeysResponse, OpaqueLoginFinishRequest, OpaqueLoginFinishResponse, - OpaqueLoginStartRequest, OpaqueLoginStartResponse, - ReceiverKeysForUserRequest, ReceiverKeysForUserResponse, - RefreshUserPreKeysRequest, RegistrationFinishRequest, - RegistrationFinishResponse, RegistrationStartRequest, - RegistrationStartResponse, SenderKeysForUserRequest, - SenderKeysForUserResponse, UpdateUserPasswordFinishRequest, - UpdateUserPasswordFinishResponse, UpdateUserPasswordStartRequest, - UpdateUserPasswordStartResponse, UploadOneTimeKeysRequest, - WalletLoginRequest, WalletLoginResponse, +use crate::{ + client_service::client_proto::{ + DeleteUserRequest, Empty, GenerateNonceResponse, KeyserverKeysRequest, + KeyserverKeysResponse, OpaqueLoginFinishRequest, OpaqueLoginFinishResponse, + OpaqueLoginStartRequest, OpaqueLoginStartResponse, + ReceiverKeysForUserRequest, ReceiverKeysForUserResponse, + RefreshUserPreKeysRequest, RegistrationFinishRequest, + RegistrationFinishResponse, RegistrationStartRequest, + RegistrationStartResponse, SenderKeysForUserRequest, + SenderKeysForUserResponse, UpdateUserPasswordFinishRequest, + UpdateUserPasswordFinishResponse, UpdateUserPasswordStartRequest, + UpdateUserPasswordStartResponse, UploadOneTimeKeysRequest, + WalletLoginRequest, WalletLoginResponse, + }, + database::DatabaseClient, + nonce::generate_nonce_data, + service::handle_db_error, }; pub use client_proto::identity_client_service_server::{ IdentityClientService, IdentityClientServiceServer, }; +use rand::rngs::OsRng; +use tonic::Response; #[derive(derive_more::Constructor)] -pub struct ClientService {} +pub struct ClientService { + client: DatabaseClient, +} #[tonic::async_trait] impl IdentityClientService for ClientService { @@ -86,7 +95,17 @@ &self, _request: tonic::Request, ) -> Result, tonic::Status> { - unimplemented!(); + let nonce_data = generate_nonce_data(&mut OsRng); + match self + .client + .add_nonce_to_nonces_table(nonce_data.clone()) + .await + { + Ok(_) => Ok(Response::new(GenerateNonceResponse { + nonce: nonce_data.nonce, + })), + Err(e) => Err(handle_db_error(e)), + } } async fn get_receiver_keys_for_user( diff --git a/services/identity/src/main.rs b/services/identity/src/main.rs --- a/services/identity/src/main.rs +++ b/services/identity/src/main.rs @@ -59,11 +59,11 @@ let addr = IDENTITY_SERVICE_SOCKET_ADDR.parse()?; let aws_config = aws_config::from_env().region("us-east-2").load().await; let database_client = DatabaseClient::new(&aws_config); - let server = MyIdentityService::new(database_client); + let server = MyIdentityService::new(database_client.clone()); let keyserver_service = IdentityKeyserverServiceServer::with_interceptor(server, check_auth); let client_server = - IdentityClientServiceServer::new(ClientService::new()); + IdentityClientServiceServer::new(ClientService::new(database_client)); info!("Listening to gRPC traffic on {}", addr); Server::builder() .add_service(keyserver_service) diff --git a/services/identity/src/service.rs b/services/identity/src/service.rs --- a/services/identity/src/service.rs +++ b/services/identity/src/service.rs @@ -575,7 +575,7 @@ } } -fn handle_db_error(db_error: DBError) -> Status { +pub fn handle_db_error(db_error: DBError) -> Status { match db_error { DBError::AwsSdk(DynamoDBError::InternalServerError(_)) | DBError::AwsSdk(DynamoDBError::ProvisionedThroughputExceededException(