pub use crate::internal::document_api::{
DocumentAccessUnmanagedResult, DocumentDecryptUnmanagedResult, DocumentEncryptUnmanagedResult,
DocumentId, DocumentMetadataUnmanagedResult, UserOrGroup,
};
use crate::{
IronOxideErr, Result, SdkOperation,
document::{DocumentEncryptOpts, partition_user_or_group},
internal::{
self, add_optional_timeout,
document_api::{self},
},
proto::transform::EncryptedDeks as EncryptedDeksP,
};
use itertools::EitherOrBoth;
use protobuf::Message;
pub trait DocumentAdvancedOps {
fn document_encrypt_unmanaged(
&self,
data: Vec<u8>,
encrypt_opts: &DocumentEncryptOpts,
) -> impl Future<Output = Result<DocumentEncryptUnmanagedResult>> + Send;
fn document_decrypt_unmanaged(
&self,
encrypted_data: &[u8],
encrypted_deks: &[u8],
) -> impl Future<Output = Result<DocumentDecryptUnmanagedResult>> + Send;
fn document_get_metadata_unmanaged(
&self,
encrypted_deks: &[u8],
) -> Result<DocumentMetadataUnmanagedResult>;
fn document_get_id_from_bytes_unmanaged(&self, encrypted_document: &[u8])
-> Result<DocumentId>;
fn document_get_id_from_edeks_unmanaged(&self, edeks: &[u8]) -> Result<DocumentId>;
fn document_grant_access_unmanaged(
&self,
edeks: &[u8],
grant_list: &[UserOrGroup],
) -> impl Future<Output = Result<DocumentAccessUnmanagedResult>> + Send;
fn document_revoke_access_unmanaged(
&self,
edeks: &[u8],
revoke_list: &[UserOrGroup],
) -> Result<DocumentAccessUnmanagedResult>;
}
impl DocumentAdvancedOps for crate::IronOxide {
async fn document_encrypt_unmanaged(
&self,
data: Vec<u8>,
encrypt_opts: &DocumentEncryptOpts,
) -> Result<DocumentEncryptUnmanagedResult> {
let (explicit_users, explicit_groups, grant_to_author, policy_grants) =
match &encrypt_opts.grants {
EitherOrBoth::Left(explicit_grants) => {
let (users, groups) = partition_user_or_group(&explicit_grants.grants);
(users, groups, explicit_grants.grant_to_author, None)
}
EitherOrBoth::Right(policy_grant) => (vec![], vec![], false, Some(policy_grant)),
EitherOrBoth::Both(explicit_grants, policy_grant) => {
let (users, groups) = partition_user_or_group(&explicit_grants.grants);
(
users,
groups,
explicit_grants.grant_to_author,
Some(policy_grant),
)
}
};
add_optional_timeout(
internal::document_api::encrypt_document_unmanaged(
self.device.auth(),
&self.recrypt,
&self.user_master_pub_key,
&self.rng,
data,
encrypt_opts.id.clone(),
grant_to_author,
&explicit_users,
&explicit_groups,
policy_grants,
&self.policy_eval_cache,
&self.public_key_cache,
),
self.config.sdk_operation_timeout,
SdkOperation::DocumentEncryptUnmanaged,
)
.await?
}
async fn document_decrypt_unmanaged(
&self,
encrypted_data: &[u8],
encrypted_deks: &[u8],
) -> Result<DocumentDecryptUnmanagedResult> {
add_optional_timeout(
internal::document_api::decrypt_document_unmanaged(
self.device.auth(),
&self.recrypt,
self.device().device_private_key(),
encrypted_data,
encrypted_deks,
),
self.config.sdk_operation_timeout,
SdkOperation::DocumentDecryptUnmanaged,
)
.await?
}
fn document_get_metadata_unmanaged(
&self,
edeks: &[u8],
) -> Result<DocumentMetadataUnmanagedResult> {
document_api::document_get_metadata_unmanaged(edeks)
}
fn document_get_id_from_bytes_unmanaged(
&self,
encrypted_document: &[u8],
) -> Result<DocumentId> {
document_api::get_id_from_bytes(encrypted_document)
}
fn document_get_id_from_edeks_unmanaged(&self, edeks: &[u8]) -> Result<DocumentId> {
let proto_edeks = EncryptedDeksP::parse_from_bytes(edeks).map_err(IronOxideErr::from)?;
(*proto_edeks.documentId).try_into()
}
async fn document_grant_access_unmanaged(
&self,
edeks: &[u8],
grant_list: &[UserOrGroup],
) -> Result<DocumentAccessUnmanagedResult> {
let (users, groups) = partition_user_or_group(grant_list);
add_optional_timeout(
internal::document_api::document_grant_access_unmanaged(
self.device.auth(),
&self.recrypt,
&self.user_master_pub_key,
self.device.device_private_key(),
edeks,
&users,
&groups,
&self.public_key_cache,
self.config.clone(),
),
self.config.sdk_operation_timeout,
SdkOperation::DocumentEncryptUnmanaged,
)
.await?
}
fn document_revoke_access_unmanaged(
&self,
edeks: &[u8],
revoke_list: &[UserOrGroup],
) -> Result<DocumentAccessUnmanagedResult> {
document_api::document_revoke_access_unmanaged(edeks, revoke_list)
}
}