Skip to content

Commit 8dd2f82

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

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use std::sync::Arc;
1616

1717
use chrono_tz::Tz::UTC;
18+
use log::info;
1819
use databend_common_catalog::plan::PushDownInfo;
1920
use databend_common_catalog::table::Table;
2021
use databend_common_catalog::table_context::TableContext;
@@ -194,10 +195,13 @@ impl AsyncSystemTable for TaskHistoryTable {
194195
.any(|role| role.to_lowercase() == BUILTIN_ROLE_ACCOUNT_ADMIN)
195196
&& !owned_tasks_names.contains(task_name)
196197
{
198+
info!("--task_history:198 all_effective_roles is {:?}, owned_tasks_names is {:?}, task_name is {:?}", all_effective_roles.clone(), owned_tasks_names.clone(), task_name.clone());
197199
return parse_task_runs_to_datablock(vec![]);
198200
}
199201
}
200202

203+
info!("--task_history:203 all_effective_roles is {:?}, owned_tasks_names is {:?}, task_name is {:?}", all_effective_roles.clone(), owned_tasks_names.clone(), task_name.clone());
204+
201205
let req = ShowTaskRunsRequest {
202206
tenant_id: tenant.tenant_name().to_string(),
203207
scheduled_time_start: scheduled_time_start.unwrap_or("".to_string()),

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

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414

1515
use std::sync::Arc;
16+
use log::info;
1617

1718
use databend_common_catalog::plan::PushDownInfo;
1819
use databend_common_catalog::table::Table;
@@ -32,14 +33,19 @@ use databend_common_expression::types::UInt64Type;
3233
use databend_common_expression::types::VariantType;
3334
use databend_common_expression::DataBlock;
3435
use databend_common_expression::FromData;
36+
use databend_common_expression::Scalar;
37+
use databend_common_functions::BUILTIN_FUNCTIONS;
3538
use databend_common_meta_app::schema::TableIdent;
3639
use databend_common_meta_app::schema::TableInfo;
3740
use databend_common_meta_app::schema::TableMeta;
3841
use databend_common_sql::plans::task_schema;
3942
use databend_common_users::UserApiProvider;
43+
use databend_common_users::BUILTIN_ROLE_ACCOUNT_ADMIN;
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,33 @@ 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!("--tasks:171 all_effective_roles is {:?}, owned_tasks_names is {:?}, task_name is {:?}", all_effective_roles.clone(), owned_tasks_names.clone(), task_name.clone());
172+
return parse_task_runs_to_datablock(vec![]);
173+
}
174+
}
175+
info!("--tasks:175 all_effective_roles is {:?}, owned_tasks_names is {:?}, task_name is {:?}", all_effective_roles.clone(), owned_tasks_names.clone(), task_name.clone());
144176

145177
let req = ShowTasksRequest {
146178
tenant_id: tenant.tenant_name().to_string(),

0 commit comments

Comments
 (0)