DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/IPC/Security/PermissionManager/
Manager.rs1use 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}