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}