middleware_core/stack/
namespace.rs1use 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}