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