src/api2/node/tasks.rs: allow users to list/access there own tasks
This commit is contained in:
parent
f1490da82a
commit
720af9f69b
|
@ -4,7 +4,7 @@ use std::io::{BufRead, BufReader};
|
||||||
use anyhow::{Error};
|
use anyhow::{Error};
|
||||||
use serde_json::{json, Value};
|
use serde_json::{json, Value};
|
||||||
|
|
||||||
use proxmox::api::{api, Router, RpcEnvironment, Permission};
|
use proxmox::api::{api, Router, RpcEnvironment, Permission, UserInformation};
|
||||||
use proxmox::api::router::SubdirMap;
|
use proxmox::api::router::SubdirMap;
|
||||||
use proxmox::{identity, list_subdirs_api_method, sortable};
|
use proxmox::{identity, list_subdirs_api_method, sortable};
|
||||||
|
|
||||||
|
@ -12,6 +12,8 @@ use crate::tools;
|
||||||
use crate::api2::types::*;
|
use crate::api2::types::*;
|
||||||
use crate::server::{self, UPID};
|
use crate::server::{self, UPID};
|
||||||
use crate::config::acl::{PRIV_SYS_AUDIT, PRIV_SYS_MODIFY};
|
use crate::config::acl::{PRIV_SYS_AUDIT, PRIV_SYS_MODIFY};
|
||||||
|
use crate::config::cached_user_info::CachedUserInfo;
|
||||||
|
|
||||||
|
|
||||||
#[api(
|
#[api(
|
||||||
input: {
|
input: {
|
||||||
|
@ -70,16 +72,25 @@ use crate::config::acl::{PRIV_SYS_AUDIT, PRIV_SYS_MODIFY};
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
access: {
|
access: {
|
||||||
permission: &Permission::Privilege(&["system", "tasks"], PRIV_SYS_AUDIT, false),
|
description: "Users can access there own tasks, or need Sys.Audit on /system/tasks.",
|
||||||
|
permission: &Permission::Anybody,
|
||||||
},
|
},
|
||||||
)]
|
)]
|
||||||
/// Get task status.
|
/// Get task status.
|
||||||
fn get_task_status(
|
fn get_task_status(
|
||||||
param: Value,
|
param: Value,
|
||||||
|
rpcenv: &mut dyn RpcEnvironment,
|
||||||
) -> Result<Value, Error> {
|
) -> Result<Value, Error> {
|
||||||
|
|
||||||
let upid = extract_upid(¶m)?;
|
let upid = extract_upid(¶m)?;
|
||||||
|
|
||||||
|
let username = rpcenv.get_user().unwrap();
|
||||||
|
|
||||||
|
if username != upid.username {
|
||||||
|
let user_info = CachedUserInfo::new()?;
|
||||||
|
user_info.check_privs(&username, &["system", "tasks"], PRIV_SYS_AUDIT, false)?;
|
||||||
|
}
|
||||||
|
|
||||||
let mut result = json!({
|
let mut result = json!({
|
||||||
"upid": param["upid"],
|
"upid": param["upid"],
|
||||||
"node": upid.node,
|
"node": upid.node,
|
||||||
|
@ -138,7 +149,8 @@ fn extract_upid(param: &Value) -> Result<UPID, Error> {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
access: {
|
access: {
|
||||||
permission: &Permission::Privilege(&["system", "tasks"], PRIV_SYS_AUDIT, false),
|
description: "Users can access there own tasks, or need Sys.Audit on /system/tasks.",
|
||||||
|
permission: &Permission::Anybody,
|
||||||
},
|
},
|
||||||
)]
|
)]
|
||||||
/// Read task log.
|
/// Read task log.
|
||||||
|
@ -149,6 +161,13 @@ fn read_task_log(
|
||||||
|
|
||||||
let upid = extract_upid(¶m)?;
|
let upid = extract_upid(¶m)?;
|
||||||
|
|
||||||
|
let username = rpcenv.get_user().unwrap();
|
||||||
|
|
||||||
|
if username != upid.username {
|
||||||
|
let user_info = CachedUserInfo::new()?;
|
||||||
|
user_info.check_privs(&username, &["system", "tasks"], PRIV_SYS_AUDIT, false)?;
|
||||||
|
}
|
||||||
|
|
||||||
let test_status = param["test-status"].as_bool().unwrap_or(false);
|
let test_status = param["test-status"].as_bool().unwrap_or(false);
|
||||||
|
|
||||||
let start = param["start"].as_u64().unwrap_or(0);
|
let start = param["start"].as_u64().unwrap_or(0);
|
||||||
|
@ -203,16 +222,25 @@ fn read_task_log(
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
access: {
|
access: {
|
||||||
permission: &Permission::Privilege(&["system", "tasks"], PRIV_SYS_MODIFY, false),
|
description: "Users can stop there own tasks, or need Sys.Modify on /system/tasks.",
|
||||||
|
permission: &Permission::Anybody,
|
||||||
},
|
},
|
||||||
)]
|
)]
|
||||||
/// Try to stop a task.
|
/// Try to stop a task.
|
||||||
fn stop_task(
|
fn stop_task(
|
||||||
param: Value,
|
param: Value,
|
||||||
|
rpcenv: &mut dyn RpcEnvironment,
|
||||||
) -> Result<Value, Error> {
|
) -> Result<Value, Error> {
|
||||||
|
|
||||||
let upid = extract_upid(¶m)?;
|
let upid = extract_upid(¶m)?;
|
||||||
|
|
||||||
|
let username = rpcenv.get_user().unwrap();
|
||||||
|
|
||||||
|
if username != upid.username {
|
||||||
|
let user_info = CachedUserInfo::new()?;
|
||||||
|
user_info.check_privs(&username, &["system", "tasks"], PRIV_SYS_MODIFY, false)?;
|
||||||
|
}
|
||||||
|
|
||||||
if crate::server::worker_is_active(&upid) {
|
if crate::server::worker_is_active(&upid) {
|
||||||
server::abort_worker_async(upid);
|
server::abort_worker_async(upid);
|
||||||
}
|
}
|
||||||
|
@ -265,7 +293,8 @@ fn stop_task(
|
||||||
items: { type: TaskListItem },
|
items: { type: TaskListItem },
|
||||||
},
|
},
|
||||||
access: {
|
access: {
|
||||||
permission: &Permission::Privilege(&[], PRIV_SYS_AUDIT, false),
|
description: "Users can only see there own tasks, unless the have Sys.Audit on /system/tasks.",
|
||||||
|
permission: &Permission::Anybody,
|
||||||
},
|
},
|
||||||
)]
|
)]
|
||||||
/// List tasks.
|
/// List tasks.
|
||||||
|
@ -279,6 +308,12 @@ pub fn list_tasks(
|
||||||
let errors = param["errors"].as_bool().unwrap_or(false);
|
let errors = param["errors"].as_bool().unwrap_or(false);
|
||||||
let running = param["running"].as_bool().unwrap_or(false);
|
let running = param["running"].as_bool().unwrap_or(false);
|
||||||
|
|
||||||
|
let username = rpcenv.get_user().unwrap();
|
||||||
|
let user_info = CachedUserInfo::new()?;
|
||||||
|
let user_privs = user_info.lookup_privs(&username, &["system", "tasks"]);
|
||||||
|
|
||||||
|
let list_all = (user_privs & PRIV_SYS_AUDIT) != 0;
|
||||||
|
|
||||||
let store = param["store"].as_str();
|
let store = param["store"].as_str();
|
||||||
|
|
||||||
let userfilter = param["userfilter"].as_str();
|
let userfilter = param["userfilter"].as_str();
|
||||||
|
@ -290,6 +325,8 @@ pub fn list_tasks(
|
||||||
let mut count = 0;
|
let mut count = 0;
|
||||||
|
|
||||||
for info in list.iter() {
|
for info in list.iter() {
|
||||||
|
if !list_all && info.upid.username != username { continue; }
|
||||||
|
|
||||||
let mut entry = TaskListItem {
|
let mut entry = TaskListItem {
|
||||||
upid: info.upid_str.clone(),
|
upid: info.upid_str.clone(),
|
||||||
node: "localhost".to_string(),
|
node: "localhost".to_string(),
|
||||||
|
|
Loading…
Reference in New Issue