Mountain/IPC/Security/PermissionManager/
Manager.rs1#![allow(non_snake_case)]
2
3use 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}