Skip to content

Commit aef34a3

Browse files
committed
fix execute/desc task access bug & tasks table bug
1 parent 59eee4a commit aef34a3

File tree

3 files changed

+61
-7
lines changed

3 files changed

+61
-7
lines changed

src/query/service/src/interpreters/access/privilege_access.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -722,21 +722,19 @@ impl AccessChecker for PrivilegeAccess {
722722
}
723723
Plan::DescribeTask(plan) => {
724724
let session = self.ctx.get_current_session();
725-
if self
725+
if !self
726726
.has_ownership(&session, &GrantObject::Task(plan.task_name.to_owned()))
727-
.await
728-
.is_err()
727+
.await?
729728
{
730729
self.validate_access(&GrantObject::Global, UserPrivilegeType::Super)
731730
.await?;
732731
}
733732
}
734733
Plan::ExecuteTask(plan) => {
735734
let session = self.ctx.get_current_session();
736-
if self
735+
if !self
737736
.has_ownership(&session, &GrantObject::Task(plan.task_name.to_owned()))
738-
.await
739-
.is_err()
737+
.await?
740738
{
741739
self.validate_access(&GrantObject::Global, UserPrivilegeType::Super)
742740
.await?;

src/query/storages/system/src/task_history_table.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ use databend_common_meta_app::schema::TableMeta;
4343
use databend_common_sql::plans::task_run_schema;
4444
use databend_common_users::UserApiProvider;
4545
use databend_common_users::BUILTIN_ROLE_ACCOUNT_ADMIN;
46+
use log::info;
4647

4748
use crate::table::AsyncOneBlockSystemTable;
4849
use crate::table::AsyncSystemTable;
@@ -194,10 +195,23 @@ impl AsyncSystemTable for TaskHistoryTable {
194195
.any(|role| role.to_lowercase() == BUILTIN_ROLE_ACCOUNT_ADMIN)
195196
&& !owned_tasks_names.contains(task_name)
196197
{
198+
info!(
199+
"--task_history:198 all_effective_roles is {:?}, owned_tasks_names is {:?}, task_name is {:?}",
200+
all_effective_roles.clone(),
201+
owned_tasks_names.clone(),
202+
task_name.clone()
203+
);
197204
return parse_task_runs_to_datablock(vec![]);
198205
}
199206
}
200207

208+
info!(
209+
"--task_history:203 all_effective_roles is {:?}, owned_tasks_names is {:?}, task_name is {:?}",
210+
all_effective_roles.clone(),
211+
owned_tasks_names.clone(),
212+
task_name.clone()
213+
);
214+
201215
let req = ShowTaskRunsRequest {
202216
tenant_id: tenant.tenant_name().to_string(),
203217
scheduled_time_start: scheduled_time_start.unwrap_or("".to_string()),

src/query/storages/system/src/tasks_table.rs

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,20 @@ use databend_common_expression::types::UInt64Type;
3232
use databend_common_expression::types::VariantType;
3333
use databend_common_expression::DataBlock;
3434
use databend_common_expression::FromData;
35+
use databend_common_expression::Scalar;
36+
use databend_common_functions::BUILTIN_FUNCTIONS;
3537
use databend_common_meta_app::schema::TableIdent;
3638
use databend_common_meta_app::schema::TableInfo;
3739
use databend_common_meta_app::schema::TableMeta;
3840
use databend_common_sql::plans::task_schema;
3941
use databend_common_users::UserApiProvider;
42+
use databend_common_users::BUILTIN_ROLE_ACCOUNT_ADMIN;
43+
use log::info;
4044

45+
use crate::parse_task_runs_to_datablock;
4146
use crate::table::AsyncOneBlockSystemTable;
4247
use crate::table::AsyncSystemTable;
48+
use crate::util::find_eq_filter;
4349
use crate::util::get_owned_task_names;
4450

4551
pub fn parse_tasks_to_datablock(tasks: Vec<Task>) -> Result<DataBlock> {
@@ -120,7 +126,7 @@ impl AsyncSystemTable for TasksTable {
120126
async fn get_full_data(
121127
&self,
122128
ctx: Arc<dyn TableContext>,
123-
_push_downs: Option<PushDownInfo>,
129+
push_downs: Option<PushDownInfo>,
124130
) -> Result<DataBlock> {
125131
let user_api = UserApiProvider::instance();
126132
let config = GlobalConfig::instance();
@@ -140,7 +146,43 @@ impl AsyncSystemTable for TasksTable {
140146
.map(|x| x.identity().to_string())
141147
.collect();
142148

149+
let mut task_name = None;
150+
if let Some(push_downs) = push_downs {
151+
if let Some(filter) = push_downs.filters.as_ref().map(|f| &f.filter) {
152+
let expr = filter.as_expr(&BUILTIN_FUNCTIONS);
153+
find_eq_filter(&expr, &mut |col_name, scalar| {
154+
if col_name == "name" {
155+
if let Scalar::String(s) = scalar {
156+
task_name = Some(s.clone());
157+
}
158+
}
159+
});
160+
}
161+
}
143162
let owned_tasks_names = get_owned_task_names(user_api, &tenant, &all_effective_roles).await;
163+
if let Some(task_name) = &task_name {
164+
// The user does not have admin role and not own the task_name
165+
// Need directly return empty block
166+
if !all_effective_roles
167+
.iter()
168+
.any(|role| role.to_lowercase() == BUILTIN_ROLE_ACCOUNT_ADMIN)
169+
&& !owned_tasks_names.contains(task_name)
170+
{
171+
info!(
172+
"--tasks:171 all_effective_roles is {:?}, owned_tasks_names is {:?}, task_name is {:?}",
173+
all_effective_roles.clone(),
174+
owned_tasks_names.clone(),
175+
task_name.clone()
176+
);
177+
return parse_task_runs_to_datablock(vec![]);
178+
}
179+
}
180+
info!(
181+
"--tasks:175 all_effective_roles is {:?}, owned_tasks_names is {:?}, task_name is {:?}",
182+
all_effective_roles.clone(),
183+
owned_tasks_names.clone(),
184+
task_name.clone()
185+
);
144186

145187
let req = ShowTasksRequest {
146188
tenant_id: tenant.tenant_name().to_string(),

0 commit comments

Comments
 (0)