1use std::collections::HashMap;
2
3use ldap3::SearchEntry;
4use log::trace;
5use serde_json::{json,value::Value};
6use serde::{Deserialize, Serialize};
7
8
9pub trait LdapObject {
11 fn to_json(&self) -> Value;
13
14 fn get_object_identifier(&self) -> &String;
16 fn get_is_acl_protected(&self) -> &bool;
17 fn get_aces(&self) -> &Vec<AceTemplate>;
18 fn get_spntargets(&self) -> &Vec<SPNTarget>;
19 fn get_allowed_to_delegate(&self) -> &Vec<Member>;
20 fn get_links(&self) -> &Vec<Link>;
21 fn get_contained_by(&self) -> &Option<Member>;
22 fn get_child_objects(&self) -> &Vec<Member>;
23 fn get_haslaps(&self) -> &bool;
25
26 fn get_aces_mut(&mut self) -> &mut Vec<AceTemplate>;
28 fn get_spntargets_mut(&mut self) -> &mut Vec<SPNTarget>;
29 fn get_allowed_to_delegate_mut(&mut self) -> &mut Vec<Member>;
30
31 fn set_is_acl_protected(&mut self, is_acl_protected: bool);
33 fn set_aces(&mut self, aces: Vec<AceTemplate>);
34 fn set_spntargets(&mut self, spn_targets: Vec<SPNTarget>);
35 fn set_allowed_to_delegate(&mut self, allowed_to_delegate: Vec<Member>);
36 fn set_links(&mut self, links: Vec<Link>);
37 fn set_contained_by(&mut self, contained_by: Option<Member>);
38 fn set_child_objects(&mut self, child_objects: Vec<Member>);
39 fn set_owner_rights_flags(&mut self, _any: bool, _any_inherited: bool);
40}
41
42#[derive(Debug, Clone, Deserialize, Serialize, Default)]
44pub struct LocalGroup {
45 #[serde(rename = "ObjectIdentifier")]
46 object_identifier: String,
47 #[serde(rename = "Results")]
48 results: Vec<Member>,
49 #[serde(rename = "LocalNames")]
50 local_names: Vec<String>,
51 #[serde(rename = "Collected")]
52 collected: bool,
53 #[serde(rename = "FailureReason")]
54 failure_reason: Option<String>,
55}
56
57impl LocalGroup {
58 pub fn new() -> Self {
60 Self {
61 ..Default::default()
62 }
63 }
64
65 pub fn object_identifier(&self) -> &String {
67 &self.object_identifier
68 }
69 pub fn results(&self) -> &Vec<Member> {
70 &self.results
71 }
72 pub fn local_names(&self) -> &Vec<String> {
73 &self.local_names
74 }
75 pub fn collected(&self) -> &bool {
76 &self.collected
77 }
78 pub fn failure_reason(&self) -> &Option<String> {
79 &self.failure_reason
80 }
81
82 pub fn object_identifier_mut(&mut self) -> &mut String {
84 &mut self.object_identifier
85 }
86 pub fn results_mut(&mut self) -> &mut Vec<Member> {
87 &mut self.results
88 }
89 pub fn local_names_mut(&mut self) -> &mut Vec<String> {
90 &mut self.local_names
91 }
92 pub fn collected_mut(&mut self) -> &mut bool {
93 &mut self.collected
94 }
95 pub fn failure_reason_mut(&mut self) -> &mut Option<String> {
96 &mut self.failure_reason
97 }
98}
99
100#[derive(Debug, Clone, Deserialize, Serialize)]
102pub struct Session {
103 #[serde(rename = "Results")]
104 results: Vec<UserComputerSession>,
105 #[serde(rename = "Collected", default = "default_true")]
106 collected: bool,
107 #[serde(rename = "FailureReason")]
108 failure_reason: Option<String>,
109}
110
111impl Default for Session {
112 fn default() -> Session {
114 Session {
115 results: Vec::new(),
116 collected: true,
117 failure_reason: None,
118 }
119 }
120}
121
122impl Session {
123 pub fn new() -> Self {
125 Self {
126 collected: true,
127 ..Default::default()
128 }
129 }
130
131 pub fn results(&self) -> &Vec<UserComputerSession> {
133 &self.results
134 }
135 pub fn collected(&self) -> &bool {
136 &self.collected
137 }
138 pub fn failure_reason(&self) -> &Option<String> {
139 &self.failure_reason
140 }
141
142 pub fn results_mut(&mut self) -> &mut Vec<UserComputerSession> {
144 &mut self.results
145 }
146 pub fn collected_mut(&mut self) -> &mut bool {
147 &mut self.collected
148 }
149 pub fn failure_reason_mut(&mut self) -> &mut Option<String> {
150 &mut self.failure_reason
151 }
152}
153
154#[derive(Debug, Clone, Deserialize, Serialize, Default)]
156pub struct UserComputerSession {
157 #[serde(rename = "UserSID")]
158 user_sid: String,
159 #[serde(rename = "ComputerSID")]
160 computer_sid: String,
161}
162
163impl UserComputerSession {
164 pub fn new() -> Self {
166 Self {
167 ..Default::default()
168 }
169 }
170
171 pub fn user_sid(&self) -> &String {
173 &self.user_sid
174 }
175 pub fn computer_sid(&self) -> &String {
176 &self.computer_sid
177 }
178
179 pub fn user_sid_mut(&mut self) -> &mut String {
181 &mut self.user_sid
182 }
183 pub fn computer_sid_mut(&mut self) -> &mut String {
184 &mut self.computer_sid
185 }
186
187}
188
189#[derive(Debug, Clone, Deserialize, Serialize, Default)]
191pub struct UserRight {
192 #[serde(rename = "Privilege")]
193 privilege: String,
194 #[serde(rename = "Results")]
195 results: Vec<Member>,
196 #[serde(rename = "LocalNames")]
197 local_names: Vec<String>,
198 #[serde(rename = "Collected", default = "default_true")]
199 collected: bool,
200 #[serde(rename = "FailureReason")]
201 failure_reason: Option<String>,
202}
203
204impl UserRight {
205 pub fn new() -> Self {
207 Self {
208 ..Default::default()
209 }
210 }
211
212 pub fn privilege(&self) -> &String {
214 &self.privilege
215 }
216 pub fn results(&self) -> &Vec<Member> {
217 &self.results
218 }
219 pub fn local_names(&self) -> &Vec<String> {
220 &self.local_names
221 }
222 pub fn collected(&self) -> &bool {
223 &self.collected
224 }
225 pub fn failure_reason(&self) -> &Option<String> {
226 &self.failure_reason
227 }
228
229 pub fn privilege_mut(&mut self) -> &mut String {
231 &mut self.privilege
232 }
233 pub fn results_mut(&mut self) -> &mut Vec<Member> {
234 &mut self.results
235 }
236 pub fn local_names_mut(&mut self) -> &mut Vec<String> {
237 &mut self.local_names
238 }
239 pub fn collected_mut(&mut self) -> &mut bool {
240 &mut self.collected
241 }
242 pub fn failure_reason_mut(&mut self) -> &mut Option<String> {
243 &mut self.failure_reason
244 }
245}
246
247
248#[derive(Debug, Clone, Deserialize, Serialize)]
250pub struct DCRegistryData {
251 #[serde(rename = "CertificateMappingMethods")]
252 certificate_mapping_methods: Option<RegistryData>,
253 #[serde(rename = "StrongCertificateBindingEnforcement")]
254 strong_certificate_binding_enforcement: Option<RegistryData>,
255}
256
257impl Default for DCRegistryData {
258 fn default() -> DCRegistryData {
259 DCRegistryData {
260 certificate_mapping_methods: None,
261 strong_certificate_binding_enforcement: None,
262 }
263 }
264}
265
266#[derive(Debug, Clone, Deserialize, Serialize, Default)]
268pub struct RegistryData {
269 #[serde(rename = "Value")]
270 value: i8,
271 #[serde(rename = "Collected", default = "default_true")]
272 collected: bool,
273 #[serde(rename = "FailureReason")]
274 failure_reason: Option<String>,
275}
276
277impl RegistryData {
278 pub fn new() -> Self {
280 Self {
281 collected: true,
282 ..Default::default()
283 }
284 }
285}
286
287pub fn default_true() -> bool {
289 true
290}
291
292#[derive(Debug, Clone, Deserialize, Serialize, Default)]
294pub struct Member {
295 #[serde(rename = "ObjectIdentifier")]
296 object_identifier: String,
297 #[serde(rename = "ObjectType")]
298 object_type: String,
299}
300
301impl Member {
302 pub fn new() -> Self {
304 Self {
305 object_identifier: "SID".to_string(),
306 ..Default::default()
307 }
308 }
309
310 pub fn object_identifier(&self) -> &String {
312 &self.object_identifier
313 }
314 pub fn object_type(&self) -> &String {
315 &self.object_type
316 }
317
318 pub fn object_identifier_mut(&mut self) -> &mut String {
320 &mut self.object_identifier
321 }
322 pub fn object_type_mut(&mut self) -> &mut String {
323 &mut self.object_type
324 }
325}
326
327const OWNER_RIGHTS_SID: &str = "S-1-3-4";
330
331fn is_owner_rights_sid(sid: &str) -> bool {
334 sid == OWNER_RIGHTS_SID || sid.ends_with(&format!("-{OWNER_RIGHTS_SID}"))
335}
336
337#[derive(Debug, Clone, Deserialize, Serialize, Default)]
339pub struct AceTemplate {
340 #[serde(rename = "PrincipalSID")]
341 principal_sid: String,
342 #[serde(rename = "PrincipalType")]
343 principal_type: String,
344 #[serde(rename = "RightName")]
345 right_name: String,
346 #[serde(rename = "IsInherited")]
347 is_inherited: bool,
348 #[serde(rename = "InheritanceHash")]
349 inheritance_hash: String,
350 #[serde(rename = "IsPermissionForOwnerRightsSid")]
351 is_permission_for_owner_rights_sid: bool,
352 #[serde(rename = "IsInheritedPermissionForOwnerRightsSid")]
353 is_inherited_permission_for_owner_rights_sid: bool,
354}
355
356impl AceTemplate {
357 pub fn new(
359 principal_sid: String,
360 principal_type: String,
361 right_name: String,
362 is_inherited: bool,
363 inheritance_hash: String,
364 ) -> Self {
365 let is_owner_rights = is_owner_rights_sid(&principal_sid);
368 Self {
369 principal_sid,
370 principal_type,
371 right_name,
372 is_inherited,
373 inheritance_hash,
374 is_permission_for_owner_rights_sid: is_owner_rights,
375 is_inherited_permission_for_owner_rights_sid: is_owner_rights && is_inherited,
376 }
377 }
378
379 pub fn principal_sid(&self) -> &String {
381 &self.principal_sid
382 }
383 pub fn principal_type(&self) -> &String {
384 &self.principal_type
385 }
386 pub fn right_name(&self) -> &String {
387 &self.right_name
388 }
389 pub fn is_inherited(&self) -> &bool {
390 &self.is_inherited
391 }
392 pub fn inheritance_hash(&self) -> &String {
393 &self.inheritance_hash
394 }
395 pub fn is_permission_for_owner_rights_sid(&self) -> bool {
396 self.is_permission_for_owner_rights_sid
397 }
398 pub fn is_inherited_permission_for_owner_rights_sid(&self) -> bool {
399 self.is_inherited_permission_for_owner_rights_sid
400 }
401
402 pub fn principal_sid_mut(&mut self) -> &mut String {
404 &mut self.principal_sid
405 }
406 pub fn principal_type_mut(&mut self) -> &mut String {
407 &mut self.principal_type
408 }
409 pub fn right_name_mut(&mut self) -> &mut String {
410 &mut self.right_name
411 }
412 pub fn is_inherited_mut(&mut self) -> &mut bool {
413 &mut self.is_inherited
414 }
415 pub fn inheritance_hash_mut(&mut self) -> &mut String {
416 &mut self.inheritance_hash
417 }
418}
419
420#[derive(Debug, Clone, Deserialize, Serialize)]
422pub struct Link {
423 #[serde(rename = "IsEnforced")]
424 is_enforced: bool,
425 #[serde(rename = "GUID")]
426 guid: String,
427}
428
429impl Link {
430 pub fn new(is_enforced: bool, guid: String) -> Self { Self { is_enforced, guid } }
432
433 pub fn is_enforced(&self) -> &bool {
435 &self.is_enforced
436 }
437 pub fn guid(&self) -> &String {
438 &self.guid
439 }
440
441 pub fn is_enforced_mut(&mut self) -> &mut bool {
443 &mut self.is_enforced
444 }
445 pub fn guid_mut(&mut self) -> &mut String {
446 &mut self.guid
447 }
448}
449
450#[derive(Debug, Clone, Deserialize, Serialize, Default)]
452pub struct GPOChange {
453 #[serde(rename = "LocalAdmins")]
454 local_admins: Vec<Member>,
455 #[serde(rename = "RemoteDesktopUsers")]
456 remote_desktop_users: Vec<Member>,
457 #[serde(rename = "DcomUsers")]
458 dcom_users: Vec<Member>,
459 #[serde(rename = "PSRemoteUsers")]
460 psremote_users: Vec<Member>,
461 #[serde(rename = "AffectedComputers")]
462 affected_computers: Vec<Member>,
463}
464
465impl GPOChange {
466 pub fn new() -> Self {
468 Self {
469 ..Default::default()
470 }
471 }
472
473 pub fn local_admins(&self) -> &Vec<Member> {
475 &self.local_admins
476 }
477 pub fn remote_desktop_users(&self) -> &Vec<Member> {
478 &self.remote_desktop_users
479 }
480 pub fn dcom_users(&self) -> &Vec<Member> {
481 &self.dcom_users
482 }
483 pub fn psremote_users(&self) -> &Vec<Member> {
484 &self.psremote_users
485 }
486 pub fn affected_computers(&self) -> &Vec<Member> {
487 &self.affected_computers
488 }
489
490 pub fn local_admins_mut(&mut self) -> &mut Vec<Member> {
492 &mut self.local_admins
493 }
494 pub fn remote_desktop_users_mut(&mut self) -> &mut Vec<Member> {
495 &mut self.remote_desktop_users
496 }
497 pub fn dcom_users_mut(&mut self) -> &mut Vec<Member> {
498 &mut self.dcom_users
499 }
500 pub fn psremote_users_mut(&mut self) -> &mut Vec<Member> {
501 &mut self.psremote_users
502 }
503 pub fn affected_computers_mut(&mut self) -> &mut Vec<Member> {
504 &mut self.affected_computers
505 }
506}
507
508#[derive(Debug, Clone, Deserialize, Serialize)]
510pub struct SPNTarget {
511 #[serde(rename = "ComputerSID")]
512 computer_sid: String,
513 #[serde(rename = "Port")]
514 port: i32,
515 #[serde(rename = "Service")]
516 service: String,
517}
518
519impl SPNTarget {
520 pub fn new() -> Self {
522 Self {
523 computer_sid: "SID".to_string(),
524 port: 1433,
525 service: "SQLAdmin".to_string()
526 }
527 }
528
529 pub fn computer_sid(&self) -> &String {
531 &self.computer_sid
532 }
533 pub fn port(&self) -> &i32 {
534 &self.port
535 }
536 pub fn service(&self) -> &String {
537 &self.service
538 }
539
540 pub fn computer_sid_mut(&mut self) -> &mut String {
542 &mut self.computer_sid
543 }
544 pub fn port_mut(&mut self) -> &mut i32 {
545 &mut self.port
546 }
547 pub fn service_mut(&mut self) -> &mut String {
548 &mut self.service
549 }
550}
551
552#[derive(Debug, Clone, Deserialize, Serialize, Default)]
554pub struct FinalJson{
555 data: Vec<Value>,
556 meta: Meta,
557}
558
559impl FinalJson {
560 pub fn new(data: Vec<Value>, meta: Meta) -> Self {
562 Self {
563 data,
564 meta
565 }
566 }
567 pub fn data(&self) -> &Vec<Value> {
569 &self.data
570 }
571 pub fn meta(&self) -> &Meta {
572 &self.meta
573 }
574
575 pub fn data_mut(&mut self) -> &mut Vec<Value> {
577 &mut self.data
578 }
579 pub fn meta_mut(&mut self) -> &mut Meta {
580 &mut self.meta
581 }
582}
583
584#[derive(Debug, Clone, Deserialize, Serialize, Default)]
586pub struct Meta {
587 methods: i32,
588 #[serde(rename = "type")]
589 mtype: String,
590 count: i32,
591 version: i8,
592 collectorversion: String
593}
594
595impl Meta {
596 pub fn new(
598 methods: i32,
599 mtype: String,
600 count: i32,
601 version: i8,
602 collectorversion: String
603 ) -> Self {
604 Self {
605 methods,
606 mtype,
607 count,
608 version,
609 collectorversion
610 }
611 }
612
613 pub fn methods(&self) -> &i32 {
615 &self.methods
616 }
617 pub fn mtype(&self) -> &String {
618 &self.mtype
619 }
620 pub fn count(&self) -> &i32 {
621 &self.count
622 }
623 pub fn version(&self) -> &i8 {
624 &self.version
625 }
626
627 pub fn methods_mut(&mut self) -> &mut i32 {
629 &mut self.methods
630 }
631 pub fn mtype_mut(&mut self) -> &mut String {
632 &mut self.mtype
633 }
634 pub fn count_mut(&mut self) -> &mut i32 {
635 &mut self.count
636 }
637 pub fn version_mut(&mut self) -> &mut i8 {
638 &mut self.version
639 }
640}
641
642
643pub fn parse_unknown(result: SearchEntry, _domain: &str) -> serde_json::value::Value {
645
646 let _result_dn = result.dn.to_uppercase();
647 let _result_attrs: HashMap<String, Vec<String>> = result.attrs;
648 let _result_bin: HashMap<String, Vec<Vec<u8>>> = result.bin_attrs;
649
650 let unknown_json = json!({
651 "unknown": null,
652 });
653
654 trace!("Parse Unknown object: {}", _result_dn);
656 unknown_json
665}