#![allow(unsafe_code)]
use crate::core_structs::{
access_container_entry_clone_from_repr_c, access_container_entry_into_repr_c, AccessContInfo,
AccessContainerEntry, AppKeys,
};
use crate::ffi::ipc::resp as ffi;
use crate::ipc::{BootstrapConfig, IpcError};
use bincode::{deserialize, serialize};
use ffi_utils::{vec_into_raw_parts, ReprC};
use serde::{Deserialize, Serialize};
use std::slice;
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum IpcResp {
Auth(Result<AuthGranted, IpcError>),
Containers(Result<(), IpcError>),
Unregistered(Result<BootstrapConfig, IpcError>),
ShareMData(Result<(), IpcError>),
}
#[derive(Clone, Serialize, Deserialize, Debug, PartialEq, Eq)]
pub struct AuthGranted {
pub app_keys: AppKeys,
pub bootstrap_config: BootstrapConfig,
pub access_container_info: AccessContInfo,
pub access_container_entry: AccessContainerEntry,
}
impl AuthGranted {
pub fn into_repr_c(self) -> Result<ffi::AuthGranted, IpcError> {
let Self {
app_keys,
bootstrap_config,
access_container_info,
access_container_entry,
} = self;
let bootstrap_config = serialize(&bootstrap_config)?;
let (ptr, len) = vec_into_raw_parts(bootstrap_config);
Ok(ffi::AuthGranted {
app_keys: app_keys.into_repr_c()?,
access_container_info: access_container_info.into_repr_c(),
access_container_entry: access_container_entry_into_repr_c(access_container_entry)?,
bootstrap_config: ptr,
bootstrap_config_len: len,
})
}
}
impl ReprC for AuthGranted {
type C = *const ffi::AuthGranted;
type Error = IpcError;
unsafe fn clone_from_repr_c(repr_c: Self::C) -> Result<Self, Self::Error> {
let ffi::AuthGranted {
ref app_keys,
bootstrap_config,
bootstrap_config_len,
access_container_info,
ref access_container_entry,
..
} = *repr_c;
let bootstrap_config = slice::from_raw_parts(bootstrap_config, bootstrap_config_len);
let bootstrap_config = deserialize(bootstrap_config)?;
Ok(Self {
app_keys: AppKeys::clone_from_repr_c(app_keys)?,
bootstrap_config,
access_container_info: AccessContInfo::clone_from_repr_c(access_container_info)?,
access_container_entry: access_container_entry_clone_from_repr_c(
access_container_entry,
)?,
})
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::utils;
use crate::utils::test_utils::gen_client_id;
use unwrap::unwrap;
use xor_name::{XorName, XOR_NAME_LEN};
#[test]
fn auth_granted() {
let client_id = gen_client_id();
let ak = AppKeys::new(client_id.public_id().clone());
let ac = AccessContInfo {
id: XorName([2; XOR_NAME_LEN]),
tag: 681,
nonce: utils::generate_nonce(),
};
let ag = AuthGranted {
app_keys: ak,
bootstrap_config: BootstrapConfig::default(),
access_container_info: ac,
access_container_entry: AccessContainerEntry::default(),
};
let ffi = unwrap!(ag.into_repr_c());
assert_eq!(ffi.access_container_info.tag, 681);
let ag = unsafe { unwrap!(AuthGranted::clone_from_repr_c(&ffi)) };
assert_eq!(ag.access_container_info.tag, 681);
}
}