Skip to main content

Mountain/IPC/Security/PermissionManager/
Manager.rs

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