Skip to main content

Mountain/IPC/Security/PermissionManager/
Manager.rs

1#![allow(non_snake_case)]
2
3//! `Manager::Struct` - the IPC RBAC enforcement core. Holds
4//! the role / permission tables and the rolling 1k audit log;
5//! `validate_permission` is the gate every IPC operation
6//! passes through before dispatch. The struct + impl + tests
7//! stay in one file - tightly coupled cluster.
8
9use std::{collections::HashMap, sync::Arc};
10
11use tokio::sync::RwLock;
12
13use crate::{
14	IPC::Security::{
15		Permission::Permission,
16		PermissionManager::{
17			SecurityContext::Struct as SecurityContext,
18			SecurityEvent::Struct as SecurityEvent,
19			SecurityEventType::Enum as SecurityEventType,
20		},
21		Role::Role,
22	},
23	dev_log,
24};
25
26pub struct Struct {
27	pub(super) roles:Arc<RwLock<HashMap<String, Role>>>,
28
29	pub(super) permissions:Arc<RwLock<HashMap<String, Permission>>>,
30
31	pub(super) audit_log:Arc<RwLock<Vec<SecurityEvent>>>,
32}
33
34impl Struct {
35	pub fn new() -> Self {
36		dev_log!("ipc", "[PermissionManager] Creating new PermissionManager instance");
37
38		Self {
39			roles:Arc::new(RwLock::new(HashMap::new())),
40
41			permissions:Arc::new(RwLock::new(HashMap::new())),
42
43			audit_log:Arc::new(RwLock::new(Vec::new())),
44		}
45	}
46
47	pub async fn validate_permission(&self, operation:&str, context:&SecurityContext) -> Result<(), String> {
48		let required_permissions = self.get_required_permissions(operation).await;
49
50		if required_permissions.is_empty() {
51			dev_log!(
52				"ipc",
53				"[PermissionManager] Operation '{}' requires no special permissions",
54				operation
55			);
56
57			return Ok(());
58		}
59
60		let mut user_permissions:Vec<String> = context.permissions.iter().cloned().collect();
61
62		for role in context.roles.iter() {
63			let role_perms = self.get_role_permissions(role).await;
64
65			user_permissions.extend(role_perms);
66		}
67
68		for required in &required_permissions {
69			if !user_permissions.contains(required) {
70				let error = format!("Missing permission: {}", required);
71
72				dev_log!(
73					"ipc",
74					"[PermissionManager] Permission denied for user '{}' on operation '{}': {}",
75					context.user_id,
76					operation,
77					error
78				);
79
80				self.log_security_event(SecurityEvent {
81					event_type:SecurityEventType::PermissionDenied,
82					user_id:context.user_id.clone(),
83					operation:operation.to_string(),
84					timestamp:std::time::SystemTime::now(),
85					details:Some(format!("Permission denied: {}", error)),
86				})
87				.await;
88
89				return Err(error);
90			}
91		}
92
93		self.log_security_event(SecurityEvent {
94			event_type:SecurityEventType::AccessGranted,
95			user_id:context.user_id.clone(),
96			operation:operation.to_string(),
97			timestamp:std::time::SystemTime::now(),
98			details:Some(format!("Access granted for operation: {}", operation)),
99		})
100		.await;
101
102		dev_log!(
103			"ipc",
104			"[PermissionManager] Access granted for user '{}' on operation '{}'",
105			context.user_id,
106			operation
107		);
108
109		Ok(())
110	}
111
112	async fn get_required_permissions(&self, operation:&str) -> Vec<String> {
113		match operation {
114			"file:write" | "file:delete" => vec!["file.write".to_string()],
115
116			"configuration:update" => vec!["config.update".to_string()],
117
118			"storage:set" => vec!["storage.write".to_string()],
119
120			"native:openExternal" => vec!["system.external".to_string()],
121
122			_ => Vec::new(),
123		}
124	}
125
126	async fn get_role_permissions(&self, role_name:&str) -> Vec<String> {
127		let roles = self.roles.read().await;
128
129		roles.get(role_name).map(|role| role.permissions.clone()).unwrap_or_default()
130	}
131
132	pub async fn log_security_event(&self, event:SecurityEvent) {
133		let mut audit_log = self.audit_log.write().await;
134
135		audit_log.push(event.clone());
136
137		if audit_log.len() > 1000 {
138			audit_log.remove(0);
139		}
140
141		match event.event_type {
142			SecurityEventType::PermissionDenied => {
143				dev_log!(
144					"ipc",
145					"warn: [SecurityEvent] Permission denied - User: {}, Operation: {}, Details: {:?}",
146					event.user_id,
147					event.operation,
148					event.details
149				);
150			},
151
152			SecurityEventType::SecurityViolation => {
153				dev_log!(
154					"ipc",
155					"error: [SecurityEvent] Security violation - User: {}, Operation: {}, Details: {:?}",
156					event.user_id,
157					event.operation,
158					event.details
159				);
160			},
161
162			SecurityEventType::AccessGranted => {
163				dev_log!(
164					"ipc",
165					"[SecurityEvent] Access granted - User: {}, Operation: {}",
166					event.user_id,
167					event.operation
168				);
169			},
170
171			_ => {
172				dev_log!(
173					"ipc",
174					"[SecurityEvent] {:?} - User: {}, Operation: {}",
175					event.event_type,
176					event.user_id,
177					event.operation
178				);
179			},
180		}
181	}
182
183	pub async fn get_audit_log(&self, limit:usize) -> Vec<SecurityEvent> {
184		let audit_log = self.audit_log.read().await;
185
186		audit_log.iter().rev().take(limit).cloned().collect()
187	}
188
189	pub async fn initialize_defaults(&self) {
190		dev_log!("ipc", "[PermissionManager] Initializing default roles and permissions");
191
192		let mut permissions = self.permissions.write().await;
193
194		let mut roles = self.roles.write().await;
195
196		let standard_permissions = vec![
197			("file.read", "Read file operations"),
198			("file.write", "Write file operations"),
199			("config.read", "Read configuration"),
200			("config.update", "Update configuration"),
201			("storage.read", "Read storage"),
202			("storage.write", "Write storage"),
203			("system.external", "Access external system resources"),
204		];
205
206		for (name, description) in standard_permissions {
207			permissions.insert(
208				name.to_string(),
209				Permission {
210					name:name.to_string(),
211					description:description.to_string(),
212					category:"standard".to_string(),
213				},
214			);
215		}
216
217		let standard_roles = vec![
218			("user", vec!["file.read", "config.read", "storage.read"]),
219			(
220				"developer",
221				vec!["file.read", "file.write", "config.read", "storage.read", "storage.write"],
222			),
223			(
224				"admin",
225				vec![
226					"file.read",
227					"file.write",
228					"config.read",
229					"config.update",
230					"storage.read",
231					"storage.write",
232					"system.external",
233				],
234			),
235		];
236
237		for (name, role_permissions) in standard_roles {
238			roles.insert(
239				name.to_string(),
240				Role {
241					name:name.to_string(),
242					permissions:role_permissions.iter().map(|p| p.to_string()).collect(),
243					description:format!("{} role with standard permissions", name),
244				},
245			);
246		}
247
248		dev_log!(
249			"ipc",
250			"[PermissionManager] Initialized {} permissions and {} roles",
251			permissions.len(),
252			roles.len()
253		);
254	}
255
256	pub async fn add_role(&self, role:Role) {
257		let role_name = role.name.clone();
258
259		let mut roles = self.roles.write().await;
260
261		roles.insert(role_name.clone(), role);
262
263		dev_log!("ipc", "[PermissionManager] Added role: {}", role_name);
264	}
265
266	pub async fn add_permission(&self, permission:Permission) {
267		let permission_name = permission.name.clone();
268
269		let mut permissions = self.permissions.write().await;
270
271		permissions.insert(permission_name.clone(), permission);
272
273		dev_log!("ipc", "[PermissionManager] Added permission: {}", permission_name);
274	}
275
276	pub async fn clear_audit_log(&self) {
277		let mut audit_log = self.audit_log.write().await;
278
279		audit_log.clear();
280
281		dev_log!("ipc", "[PermissionManager] Audit log cleared");
282	}
283
284	pub async fn get_audit_log_stats(&self) -> (usize, Vec<(&'static str, usize)>) {
285		let audit_log = self.audit_log.read().await;
286
287		let mut type_counts:Vec<(&'static str, usize)> = vec![
288			("PermissionDenied", 0),
289			("AccessGranted", 0),
290			("ConfigurationChange", 0),
291			("SecurityViolation", 0),
292			("PerformanceAnomaly", 0),
293		];
294
295		for event in audit_log.iter() {
296			let type_name = match event.event_type {
297				SecurityEventType::PermissionDenied => "PermissionDenied",
298
299				SecurityEventType::AccessGranted => "AccessGranted",
300
301				SecurityEventType::ConfigurationChange => "ConfigurationChange",
302
303				SecurityEventType::SecurityViolation => "SecurityViolation",
304
305				SecurityEventType::PerformanceAnomaly => "PerformanceAnomaly",
306			};
307
308			if let Some((_, count)) = type_counts.iter_mut().find(|(name, _)| *name == type_name) {
309				*count += 1;
310			}
311		}
312
313		(audit_log.len(), type_counts)
314	}
315}