Skip to content

Commit d12ab68

Browse files
authored
fix(query): align roles api with table functions (#17843)
1 parent f87f844 commit d12ab68

File tree

3 files changed

+28
-35
lines changed

3 files changed

+28
-35
lines changed

src/query/service/src/servers/http/v1/roles.rs

+19-31
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
// limitations under the License.
1414

1515
use databend_common_exception::Result;
16-
use databend_common_users::UserApiProvider;
1716
use poem::error::InternalServerError;
1817
use poem::error::Result as PoemResult;
1918
use poem::web::Json;
@@ -23,6 +22,8 @@ use serde::Serialize;
2322

2423
use crate::servers::http::v1::HttpQueryContext;
2524

25+
const PUBLIC_ROLE: &str = "public";
26+
2627
#[derive(Serialize, Deserialize, Debug, Clone)]
2728
pub struct ListRolesResponse {
2829
pub roles: Vec<RoleInfo>,
@@ -35,47 +36,34 @@ pub struct RoleInfo {
3536
pub is_default: bool,
3637
}
3738

39+
/// same as `show_roles` in
40+
/// src/query/service/src/table_functions/show_roles/show_roles_table.rs
3841
#[async_backtrace::framed]
3942
async fn handle(ctx: &HttpQueryContext) -> Result<ListRolesResponse> {
40-
let user = ctx.session.get_current_user()?;
43+
let mut all_roles = ctx.session.get_all_available_roles().await?;
44+
all_roles.sort_by(|a, b| a.name.cmp(&b.name));
45+
let current_user = ctx.session.get_current_user()?;
4146
let current_role = ctx
4247
.session
4348
.get_current_role()
44-
.map_or("public".to_string(), |role| role.name);
45-
let default_role = user
49+
.map_or(PUBLIC_ROLE.to_string(), |role| role.name);
50+
let default_role = current_user
4651
.option
4752
.default_role()
48-
.map_or("public".to_string(), |role| role.to_string());
53+
.map_or(PUBLIC_ROLE.to_string(), |role| role.to_string());
4954
let mut roles = vec![];
50-
if user.is_account_admin() {
51-
// return all roles for account admin
52-
let user_api = UserApiProvider::instance();
53-
let all_roles = user_api
54-
.get_roles(&ctx.session.get_current_tenant())
55-
.await?;
56-
for role in all_roles {
57-
let is_current = role.name == current_role;
58-
let is_default = role.name == default_role;
59-
roles.push(RoleInfo {
60-
name: role.name,
61-
is_current,
62-
is_default,
63-
});
64-
}
65-
} else {
66-
for role in user.grants.roles() {
67-
let is_current = role == current_role;
68-
let is_default = role == default_role;
69-
roles.push(RoleInfo {
70-
name: role.clone(),
71-
is_current,
72-
is_default,
73-
});
74-
}
55+
for role in all_roles {
56+
let is_current = role.name == current_role;
57+
let is_default = role.name == default_role;
58+
roles.push(RoleInfo {
59+
name: role.name,
60+
is_current,
61+
is_default,
62+
});
7563
}
7664
if roles.is_empty() {
7765
roles.push(RoleInfo {
78-
name: "public".to_string(),
66+
name: PUBLIC_ROLE.to_string(),
7967
is_current: true,
8068
is_default: true,
8169
});

src/query/service/src/servers/http/v1/users.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ pub struct UserItem {
5353
pub hostname: String,
5454
pub auth_type: String,
5555
pub default_role: String,
56-
pub roles: Vec<String>,
56+
pub grant_roles: Vec<String>,
5757
pub disabled: bool,
5858
pub network_policy: Option<String>,
5959
pub password_policy: Option<String>,
@@ -71,7 +71,7 @@ async fn handle(ctx: &HttpQueryContext) -> Result<ListUsersResponse> {
7171
hostname: user.hostname.clone(),
7272
auth_type: user.auth_info.get_type().to_str().to_string(),
7373
default_role: user.option.default_role().cloned().unwrap_or_default(),
74-
roles: user.grants.roles(),
74+
grant_roles: user.grants.roles(),
7575
disabled: user.option.disabled().cloned().unwrap_or_default(),
7676
network_policy: user.option.network_policy().cloned(),
7777
password_policy: user.option.password_policy().cloned(),

src/query/service/src/servers/http/v1/verify.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,14 @@ pub async fn verify_handler(ctx: &HttpQueryContext) -> PoemResult<impl IntoRespo
3535
.session
3636
.get_current_user()
3737
.map_err(HttpErrorCode::server_error)?;
38+
let roles = ctx
39+
.session
40+
.get_all_effective_roles()
41+
.await
42+
.map_err(HttpErrorCode::server_error)?;
3843
Ok(Json(VerifyResponse {
3944
tenant: tenant.tenant_name().to_string(),
40-
user: user.name.to_string(),
41-
roles: user.grants.roles(),
45+
user: user.name,
46+
roles: roles.into_iter().map(|r| r.name).collect(),
4247
}))
4348
}

0 commit comments

Comments
 (0)