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 = "Name")]
48 name: String,
49 #[serde(rename = "Results")]
50 results: Vec<Member>,
51 #[serde(rename = "LocalNames")]
52 local_names: Vec<String>,
53 #[serde(rename = "Collected")]
54 collected: bool,
55 #[serde(rename = "FailureReason")]
56 failure_reason: Option<String>,
57}
58
59impl LocalGroup {
60 pub fn new() -> Self {
62 Self {
63 ..Default::default()
64 }
65 }
66
67 pub fn object_identifier(&self) -> &String {
69 &self.object_identifier
70 }
71 pub fn results(&self) -> &Vec<Member> {
72 &self.results
73 }
74 pub fn local_names(&self) -> &Vec<String> {
75 &self.local_names
76 }
77 pub fn collected(&self) -> &bool {
78 &self.collected
79 }
80 pub fn failure_reason(&self) -> &Option<String> {
81 &self.failure_reason
82 }
83
84 pub fn object_identifier_mut(&mut self) -> &mut String {
86 &mut self.object_identifier
87 }
88 pub fn name_mut(&mut self) -> &mut String {
89 &mut self.name
90 }
91 pub fn results_mut(&mut self) -> &mut Vec<Member> {
92 &mut self.results
93 }
94 pub fn local_names_mut(&mut self) -> &mut Vec<String> {
95 &mut self.local_names
96 }
97 pub fn collected_mut(&mut self) -> &mut bool {
98 &mut self.collected
99 }
100 pub fn failure_reason_mut(&mut self) -> &mut Option<String> {
101 &mut self.failure_reason
102 }
103}
104
105#[derive(Debug, Clone, Deserialize, Serialize)]
107pub struct Session {
108 #[serde(rename = "Results")]
109 results: Vec<UserComputerSession>,
110 #[serde(rename = "Collected", default = "default_true")]
111 collected: bool,
112 #[serde(rename = "FailureReason")]
113 failure_reason: Option<String>,
114}
115
116impl Default for Session {
117 fn default() -> Session {
119 Session {
120 results: Vec::new(),
121 collected: true,
122 failure_reason: None,
123 }
124 }
125}
126
127impl Session {
128 pub fn new() -> Self {
130 Self {
131 collected: true,
132 ..Default::default()
133 }
134 }
135
136 pub fn results(&self) -> &Vec<UserComputerSession> {
138 &self.results
139 }
140 pub fn collected(&self) -> &bool {
141 &self.collected
142 }
143 pub fn failure_reason(&self) -> &Option<String> {
144 &self.failure_reason
145 }
146
147 pub fn results_mut(&mut self) -> &mut Vec<UserComputerSession> {
149 &mut self.results
150 }
151 pub fn collected_mut(&mut self) -> &mut bool {
152 &mut self.collected
153 }
154 pub fn failure_reason_mut(&mut self) -> &mut Option<String> {
155 &mut self.failure_reason
156 }
157}
158
159#[derive(Debug, Clone, Deserialize, Serialize, Default)]
161pub struct UserComputerSession {
162 #[serde(rename = "UserSID")]
163 user_sid: String,
164 #[serde(rename = "ComputerSID")]
165 computer_sid: String,
166}
167
168impl UserComputerSession {
169 pub fn new() -> Self {
171 Self {
172 ..Default::default()
173 }
174 }
175
176 pub fn user_sid(&self) -> &String {
178 &self.user_sid
179 }
180 pub fn computer_sid(&self) -> &String {
181 &self.computer_sid
182 }
183
184 pub fn user_sid_mut(&mut self) -> &mut String {
186 &mut self.user_sid
187 }
188 pub fn computer_sid_mut(&mut self) -> &mut String {
189 &mut self.computer_sid
190 }
191
192}
193
194#[derive(Debug, Clone, Deserialize, Serialize, Default)]
196pub struct UserRight {
197 #[serde(rename = "Privilege")]
198 privilege: String,
199 #[serde(rename = "Results")]
200 results: Vec<Member>,
201 #[serde(rename = "LocalNames")]
202 local_names: Vec<String>,
203 #[serde(rename = "Collected", default = "default_true")]
204 collected: bool,
205 #[serde(rename = "FailureReason")]
206 failure_reason: Option<String>,
207}
208
209impl UserRight {
210 pub fn new() -> Self {
212 Self {
213 ..Default::default()
214 }
215 }
216
217 pub fn privilege(&self) -> &String {
219 &self.privilege
220 }
221 pub fn results(&self) -> &Vec<Member> {
222 &self.results
223 }
224 pub fn local_names(&self) -> &Vec<String> {
225 &self.local_names
226 }
227 pub fn collected(&self) -> &bool {
228 &self.collected
229 }
230 pub fn failure_reason(&self) -> &Option<String> {
231 &self.failure_reason
232 }
233
234 pub fn privilege_mut(&mut self) -> &mut String {
236 &mut self.privilege
237 }
238 pub fn results_mut(&mut self) -> &mut Vec<Member> {
239 &mut self.results
240 }
241 pub fn local_names_mut(&mut self) -> &mut Vec<String> {
242 &mut self.local_names
243 }
244 pub fn collected_mut(&mut self) -> &mut bool {
245 &mut self.collected
246 }
247 pub fn failure_reason_mut(&mut self) -> &mut Option<String> {
248 &mut self.failure_reason
249 }
250}
251
252
253#[derive(Debug, Clone, Deserialize, Serialize)]
255pub struct DCRegistryData {
256 #[serde(rename = "CertificateMappingMethods")]
257 certificate_mapping_methods: Option<RegistryData>,
258 #[serde(rename = "StrongCertificateBindingEnforcement")]
259 strong_certificate_binding_enforcement: Option<RegistryData>,
260}
261
262impl Default for DCRegistryData {
263 fn default() -> DCRegistryData {
264 DCRegistryData {
265 certificate_mapping_methods: None,
266 strong_certificate_binding_enforcement: None,
267 }
268 }
269}
270
271#[derive(Debug, Clone, Deserialize, Serialize, Default)]
273pub struct RegistryData {
274 #[serde(rename = "Value")]
275 value: i8,
276 #[serde(rename = "Collected", default = "default_true")]
277 collected: bool,
278 #[serde(rename = "FailureReason")]
279 failure_reason: Option<String>,
280}
281
282impl RegistryData {
283 pub fn new() -> Self {
285 Self {
286 collected: true,
287 ..Default::default()
288 }
289 }
290}
291
292pub fn default_true() -> bool {
294 true
295}
296
297#[derive(Debug, Clone, Deserialize, Serialize, Default)]
299pub struct Member {
300 #[serde(rename = "ObjectIdentifier")]
301 object_identifier: String,
302 #[serde(rename = "ObjectType")]
303 object_type: String,
304}
305
306impl Member {
307 pub fn new() -> Self {
309 Self {
310 object_identifier: "SID".to_string(),
311 ..Default::default()
312 }
313 }
314
315 pub fn object_identifier(&self) -> &String {
317 &self.object_identifier
318 }
319 pub fn object_type(&self) -> &String {
320 &self.object_type
321 }
322
323 pub fn object_identifier_mut(&mut self) -> &mut String {
325 &mut self.object_identifier
326 }
327 pub fn object_type_mut(&mut self) -> &mut String {
328 &mut self.object_type
329 }
330}
331
332const OWNER_RIGHTS_SID: &str = "S-1-3-4";
335
336fn is_owner_rights_sid(sid: &str) -> bool {
339 sid == OWNER_RIGHTS_SID || sid.ends_with(&format!("-{OWNER_RIGHTS_SID}"))
340}
341
342#[derive(Debug, Clone, Deserialize, Serialize, Default)]
344pub struct AceTemplate {
345 #[serde(rename = "PrincipalSID")]
346 principal_sid: String,
347 #[serde(rename = "PrincipalType")]
348 principal_type: String,
349 #[serde(rename = "RightName")]
350 right_name: String,
351 #[serde(rename = "IsInherited")]
352 is_inherited: bool,
353 #[serde(rename = "InheritanceHash")]
354 inheritance_hash: String,
355 #[serde(rename = "IsPermissionForOwnerRightsSid")]
356 is_permission_for_owner_rights_sid: bool,
357 #[serde(rename = "IsInheritedPermissionForOwnerRightsSid")]
358 is_inherited_permission_for_owner_rights_sid: bool,
359}
360
361impl AceTemplate {
362 pub fn new(
364 principal_sid: String,
365 principal_type: String,
366 right_name: String,
367 is_inherited: bool,
368 inheritance_hash: String,
369 ) -> Self {
370 let is_owner_rights = is_owner_rights_sid(&principal_sid);
373 Self {
374 principal_sid,
375 principal_type,
376 right_name,
377 is_inherited,
378 inheritance_hash,
379 is_permission_for_owner_rights_sid: is_owner_rights,
380 is_inherited_permission_for_owner_rights_sid: is_owner_rights && is_inherited,
381 }
382 }
383
384 pub fn principal_sid(&self) -> &String {
386 &self.principal_sid
387 }
388 pub fn principal_type(&self) -> &String {
389 &self.principal_type
390 }
391 pub fn right_name(&self) -> &String {
392 &self.right_name
393 }
394 pub fn is_inherited(&self) -> &bool {
395 &self.is_inherited
396 }
397 pub fn inheritance_hash(&self) -> &String {
398 &self.inheritance_hash
399 }
400 pub fn is_permission_for_owner_rights_sid(&self) -> bool {
401 self.is_permission_for_owner_rights_sid
402 }
403 pub fn is_inherited_permission_for_owner_rights_sid(&self) -> bool {
404 self.is_inherited_permission_for_owner_rights_sid
405 }
406
407 pub fn principal_sid_mut(&mut self) -> &mut String {
409 &mut self.principal_sid
410 }
411 pub fn principal_type_mut(&mut self) -> &mut String {
412 &mut self.principal_type
413 }
414 pub fn right_name_mut(&mut self) -> &mut String {
415 &mut self.right_name
416 }
417 pub fn is_inherited_mut(&mut self) -> &mut bool {
418 &mut self.is_inherited
419 }
420 pub fn inheritance_hash_mut(&mut self) -> &mut String {
421 &mut self.inheritance_hash
422 }
423}
424
425#[derive(Debug, Clone, Deserialize, Serialize)]
427pub struct Link {
428 #[serde(rename = "IsEnforced")]
429 is_enforced: bool,
430 #[serde(rename = "GUID")]
431 guid: String,
432}
433
434impl Link {
435 pub fn new(is_enforced: bool, guid: String) -> Self { Self { is_enforced, guid } }
437
438 pub fn is_enforced(&self) -> &bool {
440 &self.is_enforced
441 }
442 pub fn guid(&self) -> &String {
443 &self.guid
444 }
445
446 pub fn is_enforced_mut(&mut self) -> &mut bool {
448 &mut self.is_enforced
449 }
450 pub fn guid_mut(&mut self) -> &mut String {
451 &mut self.guid
452 }
453}
454
455#[derive(Debug, Clone, Deserialize, Serialize, Default)]
457pub struct GPOChange {
458 #[serde(rename = "LocalAdmins")]
459 local_admins: Vec<Member>,
460 #[serde(rename = "RemoteDesktopUsers")]
461 remote_desktop_users: Vec<Member>,
462 #[serde(rename = "DcomUsers")]
463 dcom_users: Vec<Member>,
464 #[serde(rename = "PSRemoteUsers")]
465 psremote_users: Vec<Member>,
466 #[serde(rename = "AffectedComputers")]
467 affected_computers: Vec<Member>,
468}
469
470impl GPOChange {
471 pub fn new() -> Self {
473 Self {
474 ..Default::default()
475 }
476 }
477
478 pub fn local_admins(&self) -> &Vec<Member> {
480 &self.local_admins
481 }
482 pub fn remote_desktop_users(&self) -> &Vec<Member> {
483 &self.remote_desktop_users
484 }
485 pub fn dcom_users(&self) -> &Vec<Member> {
486 &self.dcom_users
487 }
488 pub fn psremote_users(&self) -> &Vec<Member> {
489 &self.psremote_users
490 }
491 pub fn affected_computers(&self) -> &Vec<Member> {
492 &self.affected_computers
493 }
494
495 pub fn local_admins_mut(&mut self) -> &mut Vec<Member> {
497 &mut self.local_admins
498 }
499 pub fn remote_desktop_users_mut(&mut self) -> &mut Vec<Member> {
500 &mut self.remote_desktop_users
501 }
502 pub fn dcom_users_mut(&mut self) -> &mut Vec<Member> {
503 &mut self.dcom_users
504 }
505 pub fn psremote_users_mut(&mut self) -> &mut Vec<Member> {
506 &mut self.psremote_users
507 }
508 pub fn affected_computers_mut(&mut self) -> &mut Vec<Member> {
509 &mut self.affected_computers
510 }
511}
512
513#[derive(Debug, Clone, Deserialize, Serialize)]
515pub struct SPNTarget {
516 #[serde(rename = "ComputerSID")]
517 computer_sid: String,
518 #[serde(rename = "Port")]
519 port: i32,
520 #[serde(rename = "Service")]
521 service: String,
522}
523
524impl SPNTarget {
525 pub fn new() -> Self {
527 Self {
528 computer_sid: "SID".to_string(),
529 port: 1433,
530 service: "SQLAdmin".to_string()
531 }
532 }
533
534 pub fn computer_sid(&self) -> &String {
536 &self.computer_sid
537 }
538 pub fn port(&self) -> &i32 {
539 &self.port
540 }
541 pub fn service(&self) -> &String {
542 &self.service
543 }
544
545 pub fn computer_sid_mut(&mut self) -> &mut String {
547 &mut self.computer_sid
548 }
549 pub fn port_mut(&mut self) -> &mut i32 {
550 &mut self.port
551 }
552 pub fn service_mut(&mut self) -> &mut String {
553 &mut self.service
554 }
555}
556
557#[derive(Debug, Clone, Deserialize, Serialize, Default)]
559pub struct FinalJson{
560 data: Vec<Value>,
561 meta: Meta,
562}
563
564impl FinalJson {
565 pub fn new(data: Vec<Value>, meta: Meta) -> Self {
567 Self {
568 data,
569 meta
570 }
571 }
572 pub fn data(&self) -> &Vec<Value> {
574 &self.data
575 }
576 pub fn meta(&self) -> &Meta {
577 &self.meta
578 }
579
580 pub fn data_mut(&mut self) -> &mut Vec<Value> {
582 &mut self.data
583 }
584 pub fn meta_mut(&mut self) -> &mut Meta {
585 &mut self.meta
586 }
587}
588
589#[derive(Debug, Clone, Deserialize, Serialize, Default)]
591pub struct Meta {
592 methods: i32,
593 #[serde(rename = "type")]
594 mtype: String,
595 count: i32,
596 version: i8,
597 collectorversion: String
598}
599
600impl Meta {
601 pub fn new(
603 methods: i32,
604 mtype: String,
605 count: i32,
606 version: i8,
607 collectorversion: String
608 ) -> Self {
609 Self {
610 methods,
611 mtype,
612 count,
613 version,
614 collectorversion
615 }
616 }
617
618 pub fn methods(&self) -> &i32 {
620 &self.methods
621 }
622 pub fn mtype(&self) -> &String {
623 &self.mtype
624 }
625 pub fn count(&self) -> &i32 {
626 &self.count
627 }
628 pub fn version(&self) -> &i8 {
629 &self.version
630 }
631
632 pub fn methods_mut(&mut self) -> &mut i32 {
634 &mut self.methods
635 }
636 pub fn mtype_mut(&mut self) -> &mut String {
637 &mut self.mtype
638 }
639 pub fn count_mut(&mut self) -> &mut i32 {
640 &mut self.count
641 }
642 pub fn version_mut(&mut self) -> &mut i8 {
643 &mut self.version
644 }
645}
646
647
648pub fn parse_unknown(result: SearchEntry, _domain: &str) -> serde_json::value::Value {
650
651 let _result_dn = result.dn.to_uppercase();
652 let _result_attrs: HashMap<String, Vec<String>> = result.attrs;
653 let _result_bin: HashMap<String, Vec<Vec<u8>>> = result.bin_attrs;
654
655 let unknown_json = json!({
656 "unknown": null,
657 });
658
659 trace!("Parse Unknown object: {}", _result_dn);
661 unknown_json
670}