Skip to main content

DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/IPC/Security/PermissionManager/
Manager.rs

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