You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@teaclave.apache.org by ms...@apache.org on 2020/03/25 03:10:45 UTC

[incubator-teaclave] branch develop updated: [services] Introduce ensure/bail macro in service to handle err

This is an automated email from the ASF dual-hosted git repository.

mssun pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/incubator-teaclave.git


The following commit(s) were added to refs/heads/develop by this push:
     new b2b02ce  [services] Introduce ensure/bail macro in service to handle err
b2b02ce is described below

commit b2b02cec081f3174d48c8f312d280b182a71b10b
Author: Mingshen Sun <bo...@mssun.me>
AuthorDate: Tue Mar 24 19:46:36 2020 -0700

    [services] Introduce ensure/bail macro in service to handle err
---
 services/access_control/enclave/src/service.rs     |   8 +-
 services/authentication/enclave/src/api_service.rs |  27 ++--
 services/frontend/enclave/src/service.rs           |   4 +-
 services/management/enclave/src/service.rs         | 149 ++++++++++++---------
 services/storage/enclave/src/service.rs            |   4 +-
 utils/service_enclave_utils/src/lib.rs             |   2 +
 utils/service_enclave_utils/src/macros.rs          |  15 +++
 7 files changed, 124 insertions(+), 85 deletions(-)

diff --git a/services/access_control/enclave/src/service.rs b/services/access_control/enclave/src/service.rs
index 8f27532..84119b8 100644
--- a/services/access_control/enclave/src/service.rs
+++ b/services/access_control/enclave/src/service.rs
@@ -23,7 +23,7 @@ use teaclave_proto::teaclave_access_control_service::{
     AuthorizeTaskRequest, AuthorizeTaskResponse, TeaclaveAccessControl,
 };
 use teaclave_rpc::Request;
-use teaclave_service_enclave_utils::teaclave_service;
+use teaclave_service_enclave_utils::{bail, teaclave_service};
 use teaclave_types::{TeaclaveServiceResponseError, TeaclaveServiceResponseResult};
 use thiserror::Error;
 
@@ -119,7 +119,7 @@ impl TeaclaveAccessControl for TeaclaveAccessControlService {
                     return Ok(AuthorizeStagedTaskResponse::new(false));
                 }
             }
-            Err(_) => return Err(TeaclavAccessControlError::AccessControlError.into()),
+            Err(_) => bail!(TeaclavAccessControlError::AccessControlError),
         }
         for object_data_id in request.object_input_data_id_list.iter() {
             let enforce_access_data_request = EnforceRequest::TaskAccessData(
@@ -135,7 +135,7 @@ impl TeaclaveAccessControl for TeaclaveAccessControlService {
                         return Ok(AuthorizeStagedTaskResponse::new(false));
                     }
                 }
-                Err(_) => return Err(TeaclavAccessControlError::AccessControlError.into()),
+                Err(_) => bail!(TeaclavAccessControlError::AccessControlError),
             }
         }
         for object_data_id in request.object_output_data_id_list.iter() {
@@ -152,7 +152,7 @@ impl TeaclaveAccessControl for TeaclaveAccessControlService {
                         return Ok(AuthorizeStagedTaskResponse::new(false));
                     }
                 }
-                Err(_) => return Err(TeaclavAccessControlError::AccessControlError.into()),
+                Err(_) => bail!(TeaclavAccessControlError::AccessControlError),
             }
         }
         Ok(AuthorizeStagedTaskResponse { accept: true })
diff --git a/services/authentication/enclave/src/api_service.rs b/services/authentication/enclave/src/api_service.rs
index 3dd8cfb..a97e663 100644
--- a/services/authentication/enclave/src/api_service.rs
+++ b/services/authentication/enclave/src/api_service.rs
@@ -25,7 +25,7 @@ use teaclave_proto::teaclave_authentication_service::{
     UserRegisterResponse,
 };
 use teaclave_rpc::Request;
-use teaclave_service_enclave_utils::teaclave_service;
+use teaclave_service_enclave_utils::{bail, ensure, teaclave_service};
 use teaclave_types::{TeaclaveServiceResponseError, TeaclaveServiceResponseResult};
 use thiserror::Error;
 
@@ -73,11 +73,12 @@ impl TeaclaveAuthenticationApi for TeaclaveAuthenticationApiService {
         request: Request<UserRegisterRequest>,
     ) -> TeaclaveServiceResponseResult<UserRegisterResponse> {
         let request = request.message;
-        if request.id.is_empty() {
-            return Err(TeaclaveAuthenticationApiError::InvalidUserId.into());
-        }
+        ensure!(
+            !request.id.is_empty(),
+            TeaclaveAuthenticationApiError::InvalidUserId
+        );
         if self.db_client.get_user(&request.id).is_ok() {
-            return Err(TeaclaveAuthenticationApiError::InvalidUserId.into());
+            bail!(TeaclaveAuthenticationApiError::InvalidUserId);
         }
         let new_user = UserInfo::new(&request.id, &request.password);
         match self.db_client.create_user(&new_user) {
@@ -92,18 +93,20 @@ impl TeaclaveAuthenticationApi for TeaclaveAuthenticationApiService {
         request: Request<UserLoginRequest>,
     ) -> TeaclaveServiceResponseResult<UserLoginResponse> {
         let request = request.message;
-        if request.id.is_empty() {
-            return Err(TeaclaveAuthenticationApiError::InvalidUserId.into());
-        }
-        if request.password.is_empty() {
-            return Err(TeaclaveAuthenticationApiError::InvalidPassword.into());
-        }
+        ensure!(
+            !request.id.is_empty(),
+            TeaclaveAuthenticationApiError::InvalidUserId
+        );
+        ensure!(
+            !request.password.is_empty(),
+            TeaclaveAuthenticationApiError::InvalidPassword
+        );
         let user = self
             .db_client
             .get_user(&request.id)
             .map_err(|_| TeaclaveAuthenticationApiError::PermissionDenied)?;
         if !user.verify_password(&request.password) {
-            Err(TeaclaveAuthenticationApiError::PermissionDenied.into())
+            bail!(TeaclaveAuthenticationApiError::PermissionDenied)
         } else {
             let now = SystemTime::now()
                 .duration_since(UNIX_EPOCH)
diff --git a/services/frontend/enclave/src/service.rs b/services/frontend/enclave/src/service.rs
index f31d817..1b3a1ea 100644
--- a/services/frontend/enclave/src/service.rs
+++ b/services/frontend/enclave/src/service.rs
@@ -37,7 +37,7 @@ use teaclave_proto::teaclave_frontend_service::{
 use teaclave_proto::teaclave_management_service::TeaclaveManagementClient;
 use teaclave_rpc::endpoint::Endpoint;
 use teaclave_rpc::Request;
-use teaclave_service_enclave_utils::teaclave_service;
+use teaclave_service_enclave_utils::{bail, teaclave_service};
 use teaclave_types::{TeaclaveServiceResponseError, TeaclaveServiceResponseResult};
 
 #[derive(Error, Debug)]
@@ -65,7 +65,7 @@ macro_rules! authentication_and_forward_to_management {
     ($service: ident, $request: ident, $func: ident) => {{
         match $service.authenticate(&$request) {
             Ok(true) => (),
-            _ => return Err(TeaclaveFrontendError::AuthenticationError.into()),
+            _ => bail!(TeaclaveFrontendError::AuthenticationError),
         }
 
         let client = $service.management_client.clone();
diff --git a/services/management/enclave/src/service.rs b/services/management/enclave/src/service.rs
index 04fff61..081b9a3 100644
--- a/services/management/enclave/src/service.rs
+++ b/services/management/enclave/src/service.rs
@@ -40,7 +40,7 @@ use teaclave_proto::teaclave_storage_service::{
 };
 use teaclave_rpc::endpoint::Endpoint;
 use teaclave_rpc::Request;
-use teaclave_service_enclave_utils::teaclave_service;
+use teaclave_service_enclave_utils::{bail, ensure, teaclave_service};
 use teaclave_types::Function;
 #[cfg(test_mode)]
 use teaclave_types::{FunctionInput, FunctionOutput};
@@ -140,9 +140,10 @@ impl TeaclaveManagement for TeaclaveManagementService {
             .to_string();
 
         let owner_list = request.message.owner_list;
-        if !owner_list.contains(&user_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            owner_list.contains(&user_id),
+            TeaclaveManagementError::PermissionDenied
+        );
 
         let output_file = TeaclaveOutputFile::new_fusion_data(owner_list)
             .map_err(|_| TeaclaveManagementError::DataError)?;
@@ -166,15 +167,17 @@ impl TeaclaveManagement for TeaclaveManagementService {
             .get("id")
             .ok_or_else(|| TeaclaveManagementError::InvalidRequest)?
             .to_string();
-        if !TeaclaveOutputFile::match_prefix(&request.message.data_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            TeaclaveOutputFile::match_prefix(&request.message.data_id),
+            TeaclaveManagementError::PermissionDenied
+        );
         let output: TeaclaveOutputFile = self
             .read_from_db(request.message.data_id.as_bytes())
             .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
-        if !output.owner.contains(&user_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            output.owner.contains(&user_id),
+            TeaclaveManagementError::PermissionDenied
+        );
 
         let input = TeaclaveInputFile::from_output(output)
             .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
@@ -197,17 +200,19 @@ impl TeaclaveManagement for TeaclaveManagementService {
             .ok_or_else(|| TeaclaveManagementError::InvalidRequest)?
             .to_string();
 
-        if !TeaclaveOutputFile::match_prefix(&request.message.data_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            TeaclaveOutputFile::match_prefix(&request.message.data_id),
+            TeaclaveManagementError::PermissionDenied
+        );
 
         let output_file: TeaclaveOutputFile = self
             .read_from_db(&request.message.data_id.as_bytes())
             .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
 
-        if !output_file.owner.contains(&user_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            output_file.owner.contains(&user_id),
+            TeaclaveManagementError::PermissionDenied
+        );
         let response = GetOutputFileResponse {
             owner: output_file.owner,
             hash: output_file.hash.unwrap_or_else(|| "".to_string()),
@@ -226,17 +231,19 @@ impl TeaclaveManagement for TeaclaveManagementService {
             .ok_or_else(|| TeaclaveManagementError::InvalidRequest)?
             .to_string();
 
-        if !TeaclaveInputFile::match_prefix(&request.message.data_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            TeaclaveInputFile::match_prefix(&request.message.data_id),
+            TeaclaveManagementError::PermissionDenied
+        );
 
         let input_file: TeaclaveInputFile = self
             .read_from_db(&request.message.data_id.as_bytes())
             .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
 
-        if !input_file.owner.contains(&user_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            input_file.owner.contains(&user_id),
+            TeaclaveManagementError::PermissionDenied
+        );
         let response = GetInputFileResponse {
             owner: input_file.owner,
             hash: input_file.hash,
@@ -285,16 +292,18 @@ impl TeaclaveManagement for TeaclaveManagementService {
             .get("id")
             .ok_or_else(|| TeaclaveManagementError::InvalidRequest)?
             .to_string();
-        if !Function::match_prefix(&request.message.function_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            Function::match_prefix(&request.message.function_id),
+            TeaclaveManagementError::PermissionDenied
+        );
 
         let function: Function = self
             .read_from_db(request.message.function_id.as_bytes())
             .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
-        if !(function.public || function.owner == user_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            (function.public || function.owner == user_id),
+            TeaclaveManagementError::PermissionDenied
+        );
         let response = GetFunctionResponse {
             name: function.name,
             description: function.description,
@@ -352,15 +361,17 @@ impl TeaclaveManagement for TeaclaveManagementService {
             .ok_or_else(|| TeaclaveManagementError::InvalidRequest)?
             .to_string();
 
-        if !Task::match_prefix(&request.message.task_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            Task::match_prefix(&request.message.task_id),
+            TeaclaveManagementError::PermissionDenied
+        );
         let task: Task = self
             .read_from_db(request.message.task_id.as_bytes())
             .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
-        if !task.participants.contains(&user_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            task.participants.contains(&user_id),
+            TeaclaveManagementError::PermissionDenied
+        );
         let response = GetTaskResponse {
             task_id: task.external_id(),
             creator: task.creator,
@@ -398,19 +409,21 @@ impl TeaclaveManagement for TeaclaveManagementService {
             .ok_or_else(|| TeaclaveManagementError::InvalidRequest)?
             .to_string();
         let request = request.message;
-        if !Task::match_prefix(&request.task_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            Task::match_prefix(&request.task_id),
+            TeaclaveManagementError::PermissionDenied
+        );
         let mut task: Task = self
             .read_from_db(request.task_id.as_bytes())
             .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
 
-        if !task.participants.contains(&user_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            task.participants.contains(&user_id),
+            TeaclaveManagementError::PermissionDenied
+        );
         match task.status {
             TaskStatus::Created => {}
-            _ => return Err(TeaclaveManagementError::PermissionDenied.into()),
+            _ => bail!(TeaclaveManagementError::PermissionDenied),
         }
         for (data_name, data_id) in request.input_map.iter() {
             if TeaclaveInputFile::match_prefix(data_id) {
@@ -420,7 +433,7 @@ impl TeaclaveManagement for TeaclaveManagementService {
                 assign_input_to_task(&mut task, data_name, &input_file, &user_id)
                     .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
             } else {
-                return Err(TeaclaveManagementError::PermissionDenied.into());
+                bail!(TeaclaveManagementError::PermissionDenied);
             }
         }
         for (data_name, data_id) in request.output_map.iter() {
@@ -431,7 +444,7 @@ impl TeaclaveManagement for TeaclaveManagementService {
                 assign_output_to_task(&mut task, data_name, &output_file, &user_id)
                     .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
             } else {
-                return Err(TeaclaveManagementError::PermissionDenied.into());
+                bail!(TeaclaveManagementError::PermissionDenied);
             }
         }
         try_update_task_to_ready_status(&mut task);
@@ -453,19 +466,21 @@ impl TeaclaveManagement for TeaclaveManagementService {
             .ok_or_else(|| TeaclaveManagementError::InvalidRequest)?
             .to_string();
         let request = request.message;
-        if !Task::match_prefix(&request.task_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            Task::match_prefix(&request.task_id),
+            TeaclaveManagementError::PermissionDenied
+        );
         let mut task: Task = self
             .read_from_db(request.task_id.as_bytes())
             .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
 
-        if !task.participants.contains(&user_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            task.participants.contains(&user_id),
+            TeaclaveManagementError::PermissionDenied
+        );
         match task.status {
             TaskStatus::Ready => {}
-            _ => return Err(TeaclaveManagementError::PermissionDenied.into()),
+            _ => bail!(TeaclaveManagementError::PermissionDenied),
         }
         task.approved_user_list.insert(user_id);
         try_update_task_to_approved_status(&mut task);
@@ -487,23 +502,26 @@ impl TeaclaveManagement for TeaclaveManagementService {
             .ok_or_else(|| TeaclaveManagementError::InvalidRequest)?
             .to_string();
         let request = request.message;
-        if !Task::match_prefix(&request.task_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            Task::match_prefix(&request.task_id),
+            TeaclaveManagementError::PermissionDenied
+        );
         let mut task: Task = self
             .read_from_db(request.task_id.as_bytes())
             .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
 
-        if task.creator != user_id {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
-        }
+        ensure!(
+            task.creator == user_id,
+            TeaclaveManagementError::PermissionDenied
+        );
         match task.status {
             TaskStatus::Approved => {}
-            _ => return Err(TeaclaveManagementError::PermissionDenied.into()),
-        }
-        if !Function::match_prefix(&task.function_id) {
-            return Err(TeaclaveManagementError::PermissionDenied.into());
+            _ => bail!(TeaclaveManagementError::PermissionDenied),
         }
+        ensure!(
+            Function::match_prefix(&task.function_id),
+            TeaclaveManagementError::PermissionDenied
+        );
         let function: Function = self
             .read_from_db(task.function_id.as_bytes())
             .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
@@ -518,7 +536,7 @@ impl TeaclaveManagement for TeaclaveManagementService {
                     .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
                 FunctionInputFile::from_teaclave_input_file(&input_file)
             } else {
-                return Err(TeaclaveManagementError::PermissionDenied.into());
+                bail!(TeaclaveManagementError::PermissionDenied);
             };
             input_map.insert(data_name.to_string(), input_data);
         }
@@ -528,12 +546,13 @@ impl TeaclaveManagement for TeaclaveManagementService {
                 let output_file: TeaclaveOutputFile = self
                     .read_from_db(data_id.as_bytes())
                     .map_err(|_| TeaclaveManagementError::PermissionDenied)?;
-                if output_file.hash.is_some() {
-                    return Err(TeaclaveManagementError::PermissionDenied.into());
-                }
+                ensure!(
+                    output_file.hash.is_none(),
+                    TeaclaveManagementError::PermissionDenied
+                );
                 FunctionOutputFile::from_teaclave_output_file(&output_file)
             } else {
-                return Err(TeaclaveManagementError::PermissionDenied.into());
+                bail!(TeaclaveManagementError::PermissionDenied);
             };
             output_map.insert(data_name.to_string(), output_data);
         }
diff --git a/services/storage/enclave/src/service.rs b/services/storage/enclave/src/service.rs
index 7227339..87b30f8 100644
--- a/services/storage/enclave/src/service.rs
+++ b/services/storage/enclave/src/service.rs
@@ -25,7 +25,7 @@ use teaclave_proto::teaclave_storage_service::{
     EnqueueResponse, GetRequest, GetResponse, PutRequest, PutResponse, TeaclaveStorage,
 };
 use teaclave_rpc::Request;
-use teaclave_service_enclave_utils::teaclave_service;
+use teaclave_service_enclave_utils::{bail, teaclave_service};
 use teaclave_types::{TeaclaveServiceResponseError, TeaclaveServiceResponseResult};
 use thiserror::Error;
 
@@ -141,7 +141,7 @@ impl<'a> DBQueue<'a> {
             let element_key = self.get_element_key(head_index);
             let result = match self.database.get(&element_key) {
                 Some(value) => value,
-                None => return Err(TeaclaveStorageError::None.into()),
+                None => bail!(TeaclaveStorageError::None),
             };
             // update head
             head_index += 1;
diff --git a/utils/service_enclave_utils/src/lib.rs b/utils/service_enclave_utils/src/lib.rs
index b014a55..51e9fa1 100644
--- a/utils/service_enclave_utils/src/lib.rs
+++ b/utils/service_enclave_utils/src/lib.rs
@@ -28,6 +28,8 @@ use teaclave_rpc::config::SgxTrustedTlsClientConfig;
 use teaclave_rpc::endpoint::Endpoint;
 use teaclave_types::EnclaveInfo;
 
+mod macros;
+
 #[cfg(feature = "cov")]
 use sgx_trts::global_dtors_object;
 #[cfg(feature = "cov")]
diff --git a/utils/service_enclave_utils/src/macros.rs b/utils/service_enclave_utils/src/macros.rs
new file mode 100644
index 0000000..ef1877c
--- /dev/null
+++ b/utils/service_enclave_utils/src/macros.rs
@@ -0,0 +1,15 @@
+#[macro_export]
+macro_rules! bail {
+    ($err:expr $(,)?) => {
+        return std::result::Result::Err($err.into());
+    };
+}
+
+#[macro_export]
+macro_rules! ensure {
+    ($cond:expr, $err:expr $(,)?) => {
+        if !$cond {
+            return std::result::Result::Err($err.into());
+        }
+    };
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@teaclave.apache.org
For additional commands, e-mail: commits-help@teaclave.apache.org