Skip to main content

middleware_core/stack/
namespace.rs

1use super::MiddlewareStack;
2
3impl MiddlewareStack {
4    pub fn enforce_namespace_boundary(
5        &self,
6        requester_namespace: &str,
7        resolved_name: &str,
8    ) -> String {
9        if !self.namespace_isolation || !resolved_name.starts_with('/') {
10            return resolved_name.to_string();
11        }
12
13        let Some(requester_tenant) = tenant_root(requester_namespace) else {
14            return resolved_name.to_string();
15        };
16
17        let segments = split_absolute_segments(resolved_name);
18        if segments.is_empty() {
19            return format!("/{requester_tenant}");
20        }
21        if segments[0] == requester_tenant {
22            return resolved_name.to_string();
23        }
24        if segments.len() == 1 {
25            return format!("/{requester_tenant}");
26        }
27
28        format!("/{requester_tenant}/{}", segments[1..].join("/"))
29    }
30}
31
32fn tenant_root(namespace: &str) -> Option<&str> {
33    namespace
34        .trim_matches('/')
35        .split('/')
36        .find(|segment| !segment.is_empty())
37}
38
39fn split_absolute_segments(name: &str) -> Vec<&str> {
40    name.trim_matches('/')
41        .split('/')
42        .filter(|segment| !segment.is_empty())
43        .collect()
44}