Skip to content

Commit 3c29c98

Browse files
committed
fix: formalize tenant header
1 parent d176a46 commit 3c29c98

8 files changed

Lines changed: 17 additions & 16 deletions

File tree

src/connectors/kafka/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
*/
1818

1919
use crate::connectors::kafka::config::KafkaConfig;
20+
use crate::handlers::TENANT_ID;
2021
use derive_more::Constructor;
2122
use rdkafka::client::OAuthToken;
2223
use rdkafka::consumer::{ConsumerContext, Rebalance};
@@ -151,7 +152,7 @@ pub struct ConsumerRecord {
151152
impl ConsumerRecord {
152153
pub fn from_borrowed_msg(msg: BorrowedMessage) -> Self {
153154
let tenant_id = if let Some(headers) = extract_headers(&msg)
154-
&& let Some(tenant_id) = headers.get("tenant")
155+
&& let Some(tenant_id) = headers.get(TENANT_ID)
155156
{
156157
tenant_id.clone()
157158
} else {

src/handlers/http/middleware.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use futures_util::future::LocalBoxFuture;
3131
use crate::{
3232
handlers::{
3333
AUTHORIZATION_KEY, KINESIS_COMMON_ATTRIBUTES_KEY, LOG_SOURCE_KEY, LOG_SOURCE_KINESIS,
34-
STREAM_NAME_HEADER_KEY,
34+
STREAM_NAME_HEADER_KEY, TENANT_ID,
3535
http::{ingest::PostError, modal::OIDC_CLIENT, rbac::RBACError},
3636
},
3737
option::Mode,
@@ -237,7 +237,7 @@ fn get_user_and_tenant(
237237
if PARSEABLE.options.is_multi_tenant() {
238238
// if ingestion then tenant MUST be present and should not be DEFAULT_TENANT
239239
let tenant = if action.eq(&Action::Ingest) {
240-
if let Some(tenant) = request.headers().get("tenant")
240+
if let Some(tenant) = request.headers().get(TENANT_ID)
241241
&& let Ok(tenant) = tenant.to_str()
242242
{
243243
if tenant.eq(DEFAULT_TENANT) {
@@ -262,23 +262,23 @@ fn get_user_and_tenant(
262262
&& let Some(tid) = tenant.as_ref()
263263
{
264264
request.headers_mut().insert(
265-
HeaderName::from_static("tenant"),
265+
HeaderName::from_static(TENANT_ID),
266266
HeaderValue::from_str(tid).unwrap(),
267267
);
268268
t = tenant;
269269
} else {
270270
// remove the header if already present
271-
request.headers_mut().remove("tenant");
271+
request.headers_mut().remove(TENANT_ID);
272272
}
273273
t
274274
};
275275
let userid = get_user_from_request(request.request());
276276
Ok((userid, tenant))
277277
} else {
278278
// not multi-tenant, tenant header should NOT be present
279-
if request.headers().get("tenant").is_some() {
279+
if request.headers().get(TENANT_ID).is_some() {
280280
*header_error = Some(actix_web::Error::from(PostError::Header(
281-
crate::utils::header_parsing::ParseHeaderError::UnexpectedHeader("tenant".into()),
281+
crate::utils::header_parsing::ParseHeaderError::UnexpectedHeader(TENANT_ID.into()),
282282
)));
283283
}
284284
let userid = get_user_from_request(request.request());
@@ -381,7 +381,7 @@ pub async fn refresh_token(
381381

382382
#[inline(always)]
383383
pub fn check_suspension(req: &HttpRequest, action: Action) -> rbac::Response {
384-
if let Some(tenant) = req.headers().get("tenant")
384+
if let Some(tenant) = req.headers().get(TENANT_ID)
385385
&& let Ok(tenant) = tenant.to_str()
386386
{
387387
if let Ok(Some(suspension)) = TENANT_METADATA.is_action_suspended(tenant, &action) {

src/handlers/http/modal/query/querier_role.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ pub async fn put(
5959
return Err(RoleError::ProtectedRole);
6060
} else {
6161
// role exists and is not internal, can proceed with modification
62-
role.append_privileges(body.privileges());
62+
*role = body;
6363
role.clone()
6464
}
6565
} else {

src/handlers/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ pub const UPDATE_STREAM_KEY: &str = "x-p-update-stream";
3636
pub const STREAM_TYPE_KEY: &str = "x-p-stream-type";
3737
pub const TELEMETRY_TYPE_KEY: &str = "x-p-telemetry-type";
3838
pub const DATASET_TAG_KEY: &str = "x-p-dataset-tag";
39+
pub const TENANT_ID: &str = "x-p-tenant";
3940
const COOKIE_AGE_DAYS: usize = 7;
4041
const SESSION_COOKIE_NAME: &str = "session";
4142
const USER_COOKIE_NAME: &str = "username";

src/rbac/map.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*
1717
*/
1818

19+
use crate::handlers::TENANT_ID;
1920
use crate::parseable::DEFAULT_TENANT;
2021
use crate::rbac::role::ParseableResourceType;
2122
use crate::rbac::role::model::Role;
@@ -429,7 +430,7 @@ impl Sessions {
429430
pub fn mutate_request_with_tenant(&self, key: &SessionKey, req: &mut ServiceRequest) {
430431
if let Some((_, tenant, _)) = self.active_sessions.get(key) {
431432
req.headers_mut().insert(
432-
HeaderName::from_static("tenant"),
433+
HeaderName::from_static(TENANT_ID),
433434
HeaderValue::from_bytes(tenant.as_bytes()).unwrap(),
434435
);
435436
}

src/rbac/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ use rayon::iter::{IntoParallelRefIterator, ParallelBridge, ParallelIterator};
3131
use serde::Serialize;
3232
use url::Url;
3333

34+
use crate::handlers::TENANT_ID;
3435
use crate::parseable::DEFAULT_TENANT;
3536
use crate::rbac::map::{mut_sessions, mut_users, read_user_groups, roles, sessions, users};
3637
use crate::rbac::role::Action;
@@ -318,7 +319,7 @@ impl Users {
318319
.is_some()
319320
}) {
320321
req.headers_mut().insert(
321-
HeaderName::from_static("tenant"),
322+
HeaderName::from_static(TENANT_ID),
322323
HeaderValue::from_bytes(tenant.as_bytes()).unwrap(),
323324
);
324325
};

src/rbac/role.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -256,10 +256,6 @@ pub mod model {
256256
.iter()
257257
.any(|p| p.eq(&DefaultPrivilege::SuperAdmin))
258258
}
259-
260-
pub fn append_privileges(&mut self, new_actions: &[DefaultPrivilege]) {
261-
self.actions.extend_from_slice(new_actions);
262-
}
263259
}
264260

265261
impl<'de> Deserialize<'de> for Role {

src/utils/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ pub mod uid;
2727
pub mod update;
2828

2929
use crate::INTRA_CLUSTER_CLIENT;
30+
use crate::handlers::TENANT_ID;
3031
use crate::handlers::http::base_path_without_preceding_slash;
3132
use crate::handlers::http::cluster::for_each_live_node;
3233
use crate::handlers::http::rbac::RBACError;
@@ -118,7 +119,7 @@ pub fn get_user_and_tenant_from_request(
118119

119120
pub fn get_tenant_id_from_request(req: &HttpRequest) -> Option<String> {
120121
req.headers()
121-
.get("tenant")
122+
.get(TENANT_ID)
122123
.map(|tenant_value| tenant_value.to_str().unwrap().to_owned())
123124
}
124125

0 commit comments

Comments
 (0)