sentc/group/
export.rs

1use std::str::FromStr;
2
3use sentc_crypto::entities::group::GroupKeyDataExport;
4use sentc_crypto::sdk_core::cryptomat::{PwHash, SearchableKeyGen, SortableKeyGen};
5use sentc_crypto::sdk_utils::cryptomat::{
6	KeyToString,
7	PkFromUserKeyWrapper,
8	SearchableKeyComposerWrapper,
9	SignComposerWrapper,
10	SignKeyPairWrapper,
11	SortableKeyComposerWrapper,
12	StaticKeyComposerWrapper,
13	StaticKeyPairWrapper,
14	SymKeyComposerWrapper,
15	SymKeyGenWrapper,
16	VerifyKFromUserKeyWrapper,
17};
18use sentc_crypto::sdk_utils::error::SdkUtilError;
19use sentc_crypto::SdkError;
20use serde::{Deserialize, Serialize};
21
22use crate::crypto_common::GroupId;
23use crate::error::SentcError;
24use crate::group::Group;
25
26#[derive(Serialize, Deserialize)]
27pub struct GroupExportData
28{
29	group_id: GroupId,
30	parent_group_id: Option<GroupId>,
31	from_parent: bool,
32	key_update: bool,
33	created_time: u128,
34	joined_time: u128,
35	rank: i32,
36	is_connected_group: bool,
37	access_by_parent: Option<GroupId>,
38	access_by_group_as_member: Option<GroupId>,
39
40	keys: Vec<GroupKeyDataExport>,
41	hmac_keys: Vec<String>,
42	sortable_keys: Vec<String>,
43
44	base_url: String,
45	app_token: String,
46}
47
48impl<SGen, StGen, SignGen, SearchGen, SortGen, SC, StC, SignC, SearchC, SortC, PC, VC, PwH>
49	TryFrom<Group<SGen, StGen, SignGen, SearchGen, SortGen, SC, StC, SignC, SearchC, SortC, PC, VC, PwH>> for GroupExportData
50where
51	SGen: SymKeyGenWrapper,
52	StGen: StaticKeyPairWrapper,
53	SignGen: SignKeyPairWrapper,
54	SearchGen: SearchableKeyGen,
55	SortGen: SortableKeyGen,
56	SC: SymKeyComposerWrapper,
57	StC: StaticKeyComposerWrapper,
58	SignC: SignComposerWrapper,
59	SearchC: SearchableKeyComposerWrapper,
60	SortC: SortableKeyComposerWrapper,
61	PC: PkFromUserKeyWrapper,
62	VC: VerifyKFromUserKeyWrapper,
63	PwH: PwHash,
64{
65	type Error = SentcError;
66
67	fn try_from(value: Group<SGen, StGen, SignGen, SearchGen, SortGen, SC, StC, SignC, SearchC, SortC, PC, VC, PwH>) -> Result<Self, Self::Error>
68	{
69		Ok(Self {
70			group_id: value.group_id,
71			parent_group_id: value.parent_group_id,
72			from_parent: value.from_parent,
73			key_update: value.key_update,
74			created_time: value.created_time,
75			joined_time: value.joined_time,
76			rank: value.rank,
77			is_connected_group: value.is_connected_group,
78			access_by_parent: value.access_by_parent,
79			access_by_group_as_member: value.access_by_group_as_member,
80			keys: value
81				.keys
82				.into_iter()
83				.map(|k| k.try_into())
84				.collect::<Result<_, SdkError>>()?,
85			hmac_keys: value
86				.hmac_keys
87				.into_iter()
88				.map(|k| k.to_string())
89				.collect::<Result<_, SdkUtilError>>()?,
90			sortable_keys: value
91				.sortable_keys
92				.into_iter()
93				.map(|k| k.to_string())
94				.collect::<Result<_, SdkUtilError>>()?,
95			base_url: value.base_url,
96			app_token: value.app_token,
97		})
98	}
99}
100
101impl<'a, SGen, StGen, SignGen, SearchGen, SortGen, SC, StC, SignC, SearchC, SortC, PC, VC, PwH>
102	TryFrom<&'a Group<SGen, StGen, SignGen, SearchGen, SortGen, SC, StC, SignC, SearchC, SortC, PC, VC, PwH>> for GroupExportData
103where
104	SGen: SymKeyGenWrapper,
105	StGen: StaticKeyPairWrapper,
106	SignGen: SignKeyPairWrapper,
107	SearchGen: SearchableKeyGen,
108	SortGen: SortableKeyGen,
109	SC: SymKeyComposerWrapper,
110	StC: StaticKeyComposerWrapper,
111	SignC: SignComposerWrapper,
112	SearchC: SearchableKeyComposerWrapper,
113	SortC: SortableKeyComposerWrapper,
114	PC: PkFromUserKeyWrapper,
115	VC: VerifyKFromUserKeyWrapper,
116	PwH: PwHash,
117{
118	type Error = SentcError;
119
120	fn try_from(value: &'a Group<SGen, StGen, SignGen, SearchGen, SortGen, SC, StC, SignC, SearchC, SortC, PC, VC, PwH>)
121		-> Result<Self, Self::Error>
122	{
123		Ok(Self {
124			group_id: value.group_id.clone(),
125			parent_group_id: value.parent_group_id.clone(),
126			from_parent: value.from_parent,
127			key_update: value.key_update,
128			created_time: value.created_time,
129			joined_time: value.joined_time,
130			rank: value.rank,
131			is_connected_group: value.is_connected_group,
132			access_by_parent: value.access_by_parent.clone(),
133			access_by_group_as_member: value.access_by_group_as_member.clone(),
134			keys: value
135				.keys
136				.iter()
137				.map(|k| k.try_into())
138				.collect::<Result<_, SdkError>>()?,
139			hmac_keys: value
140				.hmac_keys
141				.iter()
142				.map(|k| k.to_string_ref())
143				.collect::<Result<_, SdkUtilError>>()?,
144			sortable_keys: value
145				.sortable_keys
146				.iter()
147				.map(|k| k.to_string_ref())
148				.collect::<Result<_, SdkUtilError>>()?,
149			base_url: value.base_url.clone(),
150			app_token: value.app_token.clone(),
151		})
152	}
153}
154
155impl<SGen, StGen, SignGen, SearchGen, SortGen, SC, StC, SignC, SearchC, SortC, PC, VC, PwH>
156	TryInto<Group<SGen, StGen, SignGen, SearchGen, SortGen, SC, StC, SignC, SearchC, SortC, PC, VC, PwH>> for GroupExportData
157where
158	SGen: SymKeyGenWrapper,
159	StGen: StaticKeyPairWrapper,
160	SignGen: SignKeyPairWrapper,
161	SearchGen: SearchableKeyGen,
162	SortGen: SortableKeyGen,
163	SC: SymKeyComposerWrapper,
164	StC: StaticKeyComposerWrapper,
165	SignC: SignComposerWrapper,
166	SearchC: SearchableKeyComposerWrapper,
167	SortC: SortableKeyComposerWrapper,
168	PC: PkFromUserKeyWrapper,
169	VC: VerifyKFromUserKeyWrapper,
170	PwH: PwHash,
171{
172	type Error = SentcError;
173
174	fn try_into(self) -> Result<Group<SGen, StGen, SignGen, SearchGen, SortGen, SC, StC, SignC, SearchC, SortC, PC, VC, PwH>, Self::Error>
175	{
176		let mut group = Group::new_group(
177			self.base_url,
178			self.app_token,
179			self.group_id,
180			self.parent_group_id,
181			self.from_parent,
182			self.key_update,
183			self.created_time,
184			self.joined_time,
185			self.rank,
186			self.is_connected_group,
187			self.access_by_parent,
188			self.access_by_group_as_member,
189			self.keys.len(),
190			self.hmac_keys.len(),
191			self.sortable_keys.len(),
192		);
193
194		group.keys = self
195			.keys
196			.into_iter()
197			.map(|k| k.try_into())
198			.collect::<Result<_, SdkError>>()?;
199
200		group.hmac_keys = self
201			.hmac_keys
202			.into_iter()
203			.map(|k| {
204				k.parse()
205					.map_err(|_| SdkUtilError::ImportingKeyFromPemFailed)
206			})
207			.collect::<Result<_, SdkUtilError>>()?;
208
209		group.sortable_keys = self
210			.sortable_keys
211			.into_iter()
212			.map(|k| {
213				k.parse()
214					.map_err(|_| SdkUtilError::ImportingKeyFromPemFailed)
215			})
216			.collect::<Result<_, SdkUtilError>>()?;
217
218		Ok(group)
219	}
220}
221
222impl<SGen, StGen, SignGen, SearchGen, SortGen, SC, StC, SignC, SearchC, SortC, PC, VC, PwH> FromStr
223	for Group<SGen, StGen, SignGen, SearchGen, SortGen, SC, StC, SignC, SearchC, SortC, PC, VC, PwH>
224where
225	SGen: SymKeyGenWrapper,
226	StGen: StaticKeyPairWrapper,
227	SignGen: SignKeyPairWrapper,
228	SearchGen: SearchableKeyGen,
229	SortGen: SortableKeyGen,
230	SC: SymKeyComposerWrapper,
231	StC: StaticKeyComposerWrapper,
232	SignC: SignComposerWrapper,
233	SearchC: SearchableKeyComposerWrapper,
234	SortC: SortableKeyComposerWrapper,
235	PC: PkFromUserKeyWrapper,
236	VC: VerifyKFromUserKeyWrapper,
237	PwH: PwHash,
238{
239	type Err = SentcError;
240
241	fn from_str(s: &str) -> Result<Self, Self::Err>
242	{
243		let data: GroupExportData = serde_json::from_str(s)?;
244
245		data.try_into()
246	}
247}
248
249impl<SGen, StGen, SignGen, SearchGen, SortGen, SC, StC, SignC, SearchC, SortC, PC, VC, PwH>
250	Group<SGen, StGen, SignGen, SearchGen, SortGen, SC, StC, SignC, SearchC, SortC, PC, VC, PwH>
251where
252	SGen: SymKeyGenWrapper,
253	StGen: StaticKeyPairWrapper,
254	SignGen: SignKeyPairWrapper,
255	SearchGen: SearchableKeyGen,
256	SortGen: SortableKeyGen,
257	SC: SymKeyComposerWrapper,
258	StC: StaticKeyComposerWrapper,
259	SignC: SignComposerWrapper,
260	SearchC: SearchableKeyComposerWrapper,
261	SortC: SortableKeyComposerWrapper,
262	PC: PkFromUserKeyWrapper,
263	VC: VerifyKFromUserKeyWrapper,
264	PwH: PwHash,
265{
266	pub fn to_string(self) -> Result<String, SentcError>
267	{
268		Ok(serde_json::to_string(&TryInto::<GroupExportData>::try_into(self)?)?)
269	}
270
271	pub fn to_string_ref(&self) -> Result<String, SentcError>
272	{
273		Ok(serde_json::to_string(&TryInto::<GroupExportData>::try_into(self)?)?)
274	}
275}