Mountain/IPC/Security/PermissionManager/
Manager.rs1
2use 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}