1use std::{collections::HashMap, sync::Arc};
40
41use serde::{Deserialize, Serialize};
42use tokio::sync::RwLock;
43
44use super::{Permission::Permission, Role::Role};
45use crate::dev_log;
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
67pub struct SecurityContext {
68 pub user_id:String,
70
71 pub roles:Vec<String>,
73
74 pub permissions:Vec<String>,
76
77 pub ip_address:String,
79
80 pub timestamp:std::time::SystemTime,
82}
83
84impl SecurityContext {
85 pub fn new(user_id:String, roles:Vec<String>, permissions:Vec<String>, ip_address:String) -> Self {
87 Self { user_id, roles, permissions, ip_address, timestamp:std::time::SystemTime::now() }
88 }
89
90 pub fn has_role(&self, role:&str) -> bool { self.roles.iter().any(|r| r == role) }
92
93 pub fn has_permission(&self, permission:&str) -> bool { self.permissions.iter().any(|p| p == permission) }
95
96 pub fn ipc_default() -> Self {
99 Self {
100 user_id:"ipc-connection".to_string(),
101 roles:vec!["user".to_string()],
102 permissions:vec![],
103 ip_address:"127.0.0.1".to_string(),
104 timestamp:std::time::SystemTime::now(),
105 }
106 }
107}
108
109#[derive(Debug, Clone, Serialize, Deserialize)]
114pub struct SecurityEvent {
115 pub event_type:SecurityEventType,
117
118 pub user_id:String,
120
121 pub operation:String,
123
124 pub timestamp:std::time::SystemTime,
126
127 pub details:Option<String>,
129}
130
131impl SecurityEvent {
132 pub fn new(event_type:SecurityEventType, user_id:String, operation:String, details:Option<String>) -> Self {
134 Self { event_type, user_id, operation, timestamp:std::time::SystemTime::now(), details }
135 }
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize)]
140pub enum SecurityEventType {
141 PermissionDenied,
143
144 AccessGranted,
146
147 ConfigurationChange,
149
150 SecurityViolation,
152
153 PerformanceAnomaly,
155}
156
157pub struct PermissionManager {
199 roles:Arc<RwLock<HashMap<String, Role>>>,
201
202 permissions:Arc<RwLock<HashMap<String, Permission>>>,
204
205 audit_log:Arc<RwLock<Vec<SecurityEvent>>>,
207}
208
209impl PermissionManager {
210 pub fn new() -> Self {
212 dev_log!("ipc", "[PermissionManager] Creating new PermissionManager instance");
213
214 Self {
215 roles:Arc::new(RwLock::new(HashMap::new())),
216 permissions:Arc::new(RwLock::new(HashMap::new())),
217 audit_log:Arc::new(RwLock::new(Vec::new())),
218 }
219 }
220
221 pub async fn validate_permission(&self, operation:&str, context:&SecurityContext) -> Result<(), String> {
242 let required_permissions = self.get_required_permissions(operation).await;
244
245 if required_permissions.is_empty() {
246 dev_log!(
247 "ipc",
248 "[PermissionManager] Operation '{}' requires no special permissions",
249 operation
250 );
251 return Ok(()); }
253
254 let mut user_permissions:Vec<String> = context.permissions.iter().cloned().collect();
256
257 for role in context.roles.iter() {
258 let role_perms = self.get_role_permissions(role).await;
259 user_permissions.extend(role_perms);
260 }
261
262 for required in &required_permissions {
264 if !user_permissions.contains(required) {
265 let error = format!("Missing permission: {}", required);
266 dev_log!(
267 "ipc",
268 "[PermissionManager] Permission denied for user '{}' on operation '{}': {}",
269 context.user_id,
270 operation,
271 error
272 );
273
274 self.log_security_event(SecurityEvent {
276 event_type:SecurityEventType::PermissionDenied,
277 user_id:context.user_id.clone(),
278 operation:operation.to_string(),
279 timestamp:std::time::SystemTime::now(),
280 details:Some(format!("Permission denied: {}", error)),
281 })
282 .await;
283
284 return Err(error);
285 }
286 }
287
288 self.log_security_event(SecurityEvent {
290 event_type:SecurityEventType::AccessGranted,
291 user_id:context.user_id.clone(),
292 operation:operation.to_string(),
293 timestamp:std::time::SystemTime::now(),
294 details:Some(format!("Access granted for operation: {}", operation)),
295 })
296 .await;
297
298 dev_log!(
299 "ipc",
300 "[PermissionManager] Access granted for user '{}' on operation '{}'",
301 context.user_id,
302 operation
303 );
304
305 Ok(())
306 }
307
308 async fn get_required_permissions(&self, operation:&str) -> Vec<String> {
323 match operation {
324 "file:write" | "file:delete" => vec!["file.write".to_string()],
325 "configuration:update" => vec!["config.update".to_string()],
326 "storage:set" => vec!["storage.write".to_string()],
327 "native:openExternal" => vec!["system.external".to_string()],
328 _ => Vec::new(),
330 }
331 }
332
333 async fn get_role_permissions(&self, role_name:&str) -> Vec<String> {
335 let roles = self.roles.read().await;
336 roles.get(role_name).map(|role| role.permissions.clone()).unwrap_or_default()
337 }
338
339 pub async fn log_security_event(&self, event:SecurityEvent) {
341 let mut audit_log = self.audit_log.write().await;
342 audit_log.push(event.clone());
343
344 if audit_log.len() > 1000 {
346 audit_log.remove(0);
347 }
348
349 match event.event_type {
350 SecurityEventType::PermissionDenied => {
351 dev_log!(
352 "ipc",
353 "warn: [SecurityEvent] Permission denied - User: {}, Operation: {}, Details: {:?}",
354 event.user_id,
355 event.operation,
356 event.details
357 );
358 },
359 SecurityEventType::SecurityViolation => {
360 dev_log!(
361 "ipc",
362 "error: [SecurityEvent] Security violation - User: {}, Operation: {}, Details: {:?}",
363 event.user_id,
364 event.operation,
365 event.details
366 );
367 },
368 SecurityEventType::AccessGranted => {
369 dev_log!(
370 "ipc",
371 "[SecurityEvent] Access granted - User: {}, Operation: {}",
372 event.user_id,
373 event.operation
374 );
375 },
376 _ => {
377 dev_log!(
378 "ipc",
379 "[SecurityEvent] {:?} - User: {}, Operation: {}",
380 event.event_type,
381 event.user_id,
382 event.operation
383 );
384 },
385 }
386 }
387
388 pub async fn get_audit_log(&self, limit:usize) -> Vec<SecurityEvent> {
392 let audit_log = self.audit_log.read().await;
393 audit_log.iter().rev().take(limit).cloned().collect()
394 }
395
396 pub async fn initialize_defaults(&self) {
401 dev_log!("ipc", "[PermissionManager] Initializing default roles and permissions");
402
403 let mut permissions = self.permissions.write().await;
404 let mut roles = self.roles.write().await;
405
406 let standard_permissions = vec![
408 ("file.read", "Read file operations"),
409 ("file.write", "Write file operations"),
410 ("config.read", "Read configuration"),
411 ("config.update", "Update configuration"),
412 ("storage.read", "Read storage"),
413 ("storage.write", "Write storage"),
414 ("system.external", "Access external system resources"),
415 ];
416
417 for (name, description) in standard_permissions {
418 permissions.insert(
419 name.to_string(),
420 Permission {
421 name:name.to_string(),
422 description:description.to_string(),
423 category:"standard".to_string(),
424 },
425 );
426 }
427
428 let standard_roles = vec![
430 ("user", vec!["file.read", "config.read", "storage.read"]),
431 (
432 "developer",
433 vec!["file.read", "file.write", "config.read", "storage.read", "storage.write"],
434 ),
435 (
436 "admin",
437 vec![
438 "file.read",
439 "file.write",
440 "config.read",
441 "config.update",
442 "storage.read",
443 "storage.write",
444 "system.external",
445 ],
446 ),
447 ];
448
449 for (name, role_permissions) in standard_roles {
450 roles.insert(
451 name.to_string(),
452 Role {
453 name:name.to_string(),
454 permissions:role_permissions.iter().map(|p| p.to_string()).collect(),
455 description:format!("{} role with standard permissions", name),
456 },
457 );
458 }
459
460 dev_log!(
461 "ipc",
462 "[PermissionManager] Initialized {} permissions and {} roles",
463 permissions.len(),
464 roles.len()
465 );
466 }
467
468 pub async fn add_role(&self, role:Role) {
470 let role_name = role.name.clone();
471 let mut roles = self.roles.write().await;
472 roles.insert(role_name.clone(), role);
473 dev_log!("ipc", "[PermissionManager] Added role: {}", role_name);
474 }
475
476 pub async fn add_permission(&self, permission:Permission) {
478 let permission_name = permission.name.clone();
479 let mut permissions = self.permissions.write().await;
480 permissions.insert(permission_name.clone(), permission);
481 dev_log!("ipc", "[PermissionManager] Added permission: {}", permission_name);
482 }
483
484 pub async fn clear_audit_log(&self) {
486 let mut audit_log = self.audit_log.write().await;
487 audit_log.clear();
488 dev_log!("ipc", "[PermissionManager] Audit log cleared");
489 }
490
491 pub async fn get_audit_log_stats(&self) -> (usize, Vec<(&'static str, usize)>) {
493 let audit_log = self.audit_log.read().await;
494
495 let mut type_counts:Vec<(&'static str, usize)> = vec![
496 ("PermissionDenied", 0),
497 ("AccessGranted", 0),
498 ("ConfigurationChange", 0),
499 ("SecurityViolation", 0),
500 ("PerformanceAnomaly", 0),
501 ];
502
503 for event in audit_log.iter() {
504 let type_name = match event.event_type {
505 SecurityEventType::PermissionDenied => "PermissionDenied",
506 SecurityEventType::AccessGranted => "AccessGranted",
507 SecurityEventType::ConfigurationChange => "ConfigurationChange",
508 SecurityEventType::SecurityViolation => "SecurityViolation",
509 SecurityEventType::PerformanceAnomaly => "PerformanceAnomaly",
510 };
511 if let Some((_, count)) = type_counts.iter_mut().find(|(name, _)| *name == type_name) {
512 *count += 1;
513 }
514 }
515
516 (audit_log.len(), type_counts)
517 }
518}
519
520#[cfg(test)]
521mod tests {
522 use super::*;
523
524 #[tokio::test]
525 async fn test_permission_manager_creation() {
526 let manager = PermissionManager::new();
527 assert_eq!(manager.get_audit_log(10).await.len(), 0);
528 }
529
530 #[tokio::test]
531 async fn test_initialize_defaults() {
532 let manager = PermissionManager::new();
533 manager.initialize_defaults().await;
534
535 let log = manager.get_audit_log(10).await;
536 assert!(!log.is_empty());
538 }
539
540 #[tokio::test]
541 async fn test_security_context_ipc_default() {
542 let context = SecurityContext::ipc_default();
543 assert_eq!(context.user_id, "ipc-connection");
544 assert!(context.has_role("user"));
545 assert_eq!(context.ip_address, "127.0.0.1");
546 }
547
548 #[tokio::test]
549 async fn test_permission_validation_access_granted() {
550 let manager = PermissionManager::new();
551 manager.initialize_defaults().await;
552
553 let context = SecurityContext::new(
554 "test-user".to_string(),
555 vec!["admin".to_string()],
556 vec![],
557 "127.0.0.1".to_string(),
558 );
559
560 let result = manager.validate_permission("file:write", &context).await;
562 assert!(result.is_ok());
563
564 let log = manager.get_audit_log(10).await;
566 assert!(log.iter().any(|e| matches!(e.event_type, SecurityEventType::AccessGranted)));
567 }
568
569 #[tokio::test]
570 async fn test_permission_validation_access_denied() {
571 let manager = PermissionManager::new();
572 manager.initialize_defaults().await;
573
574 let context = SecurityContext::new(
575 "test-user".to_string(),
576 vec!["user".to_string()], vec![],
578 "127.0.0.1".to_string(),
579 );
580
581 let result = manager.validate_permission("file:write", &context).await;
583 assert!(result.is_err());
584
585 let log = manager.get_audit_log(10).await;
587 assert!(log.iter().any(|e| matches!(e.event_type, SecurityEventType::PermissionDenied)));
588 }
589
590 #[tokio::test]
591 async fn test_operations_without_permissions() {
592 let manager = PermissionManager::new();
593 manager.initialize_defaults().await;
594
595 let context = SecurityContext::ipc_default();
596
597 let result = manager.validate_permission("custom_operation", &context).await;
599 assert!(result.is_ok());
600 }
601
602 #[tokio::test]
603 async fn test_audit_log_limit() {
604 let manager = PermissionManager::new();
605 manager.initialize_defaults().await;
606
607 for i in 0..1100 {
609 manager
610 .log_security_event(SecurityEvent {
611 event_type:SecurityEventType::AccessGranted,
612 user_id:format!("user-{}", i),
613 operation:"test".to_string(),
614 timestamp:std::time::SystemTime::now(),
615 details:None,
616 })
617 .await;
618 }
619
620 let log = manager.get_audit_log(2000).await;
622 assert_eq!(log.len(), 1000);
623 }
624
625 #[tokio::test]
626 async fn test_custom_role() {
627 let manager = PermissionManager::new();
628 manager.initialize_defaults().await;
629
630 let custom_role = Role {
631 name:"custom".to_string(),
632 permissions:vec!["file.read".to_string()],
633 description:"Custom role".to_string(),
634 };
635
636 manager.add_role(custom_role).await;
637
638 let context = SecurityContext::new(
639 "test-user".to_string(),
640 vec!["custom".to_string()],
641 vec![],
642 "127.0.0.1".to_string(),
643 );
644
645 let result = manager.validate_permission("file:read", &context).await;
647 assert!(result.is_ok());
648 }
649}