mirror of
https://github.com/dani-garcia/vaultwarden.git
synced 2026-03-29 15:29:43 -06:00
Merge 07f39d8ccc into 1583fe4af3
This commit is contained in:
commit
fb94a41ff7
@ -347,56 +347,47 @@ fn logout(cookies: &CookieJar<'_>) -> Redirect {
|
||||
Redirect::to(admin_path())
|
||||
}
|
||||
|
||||
#[get("/users")]
|
||||
async fn get_users_json(_token: AdminToken, conn: DbConn) -> Json<Value> {
|
||||
let users = User::get_all(&conn).await;
|
||||
async fn enrich_users_json(users: Vec<(User, Option<SsoUser>)>, conn: &DbConn) -> Vec<Value> {
|
||||
let mut users_json = Vec::with_capacity(users.len());
|
||||
for (u, _) in users {
|
||||
let mut usr = u.to_json(&conn).await;
|
||||
for (u, sso_u) in users {
|
||||
let mut usr = u.to_json(conn).await;
|
||||
usr["cipherCount"] = json!(Cipher::count_owned_by_user(&u.uuid, conn).await);
|
||||
usr["attachmentCount"] = json!(Attachment::count_by_user(&u.uuid, conn).await);
|
||||
usr["attachmentSize"] = json!(get_display_size(Attachment::size_by_user(&u.uuid, conn).await));
|
||||
usr["userEnabled"] = json!(u.enabled);
|
||||
usr["createdAt"] = json!(format_naive_datetime_local(&u.created_at, DT_FMT));
|
||||
usr["lastActive"] = match u.last_active(&conn).await {
|
||||
usr["lastActive"] = match u.last_active(conn).await {
|
||||
Some(dt) => json!(format_naive_datetime_local(&dt, DT_FMT)),
|
||||
None => json!(None::<String>),
|
||||
};
|
||||
|
||||
usr["ssoIdentifier"] = json!(sso_u.map(|u| u.identifier.to_string()).unwrap_or(String::new()));
|
||||
|
||||
users_json.push(usr);
|
||||
}
|
||||
users_json
|
||||
}
|
||||
|
||||
#[get("/users")]
|
||||
async fn get_users_json(_token: AdminToken, conn: DbConn) -> Json<Value> {
|
||||
let users = User::get_all(&conn).await;
|
||||
let users_json = enrich_users_json(users, &conn).await;
|
||||
Json(Value::Array(users_json))
|
||||
}
|
||||
|
||||
#[get("/users/overview")]
|
||||
async fn users_overview(_token: AdminToken, conn: DbConn) -> ApiResult<Html<String>> {
|
||||
let users = User::get_all(&conn).await;
|
||||
let mut users_json = Vec::with_capacity(users.len());
|
||||
for (u, sso_u) in users {
|
||||
let mut usr = u.to_json(&conn).await;
|
||||
usr["cipher_count"] = json!(Cipher::count_owned_by_user(&u.uuid, &conn).await);
|
||||
usr["attachment_count"] = json!(Attachment::count_by_user(&u.uuid, &conn).await);
|
||||
usr["attachment_size"] = json!(get_display_size(Attachment::size_by_user(&u.uuid, &conn).await));
|
||||
usr["user_enabled"] = json!(u.enabled);
|
||||
usr["created_at"] = json!(format_naive_datetime_local(&u.created_at, DT_FMT));
|
||||
usr["last_active"] = match u.last_active(&conn).await {
|
||||
Some(dt) => json!(format_naive_datetime_local(&dt, DT_FMT)),
|
||||
None => json!("Never"),
|
||||
};
|
||||
|
||||
usr["sso_identifier"] = json!(sso_u.map(|u| u.identifier.to_string()).unwrap_or(String::new()));
|
||||
|
||||
users_json.push(usr);
|
||||
}
|
||||
|
||||
let users_json = enrich_users_json(users, &conn).await;
|
||||
let text = AdminTemplateData::new("admin/users", json!(users_json)).render()?;
|
||||
Ok(Html(text))
|
||||
}
|
||||
|
||||
#[get("/users/by-mail/<mail>")]
|
||||
async fn get_user_by_mail_json(mail: &str, _token: AdminToken, conn: DbConn) -> JsonResult {
|
||||
if let Some(u) = User::find_by_mail(mail, &conn).await {
|
||||
let mut usr = u.to_json(&conn).await;
|
||||
usr["userEnabled"] = json!(u.enabled);
|
||||
usr["createdAt"] = json!(format_naive_datetime_local(&u.created_at, DT_FMT));
|
||||
Ok(Json(usr))
|
||||
if let Some((u, sso)) = SsoUser::find_by_mail(mail, &conn).await {
|
||||
let user_json = enrich_users_json(vec![(u, sso)], &conn).await[0].clone();
|
||||
Ok(Json(user_json))
|
||||
} else {
|
||||
err_code!("User doesn't exist", Status::NotFound.code);
|
||||
}
|
||||
@ -404,11 +395,11 @@ async fn get_user_by_mail_json(mail: &str, _token: AdminToken, conn: DbConn) ->
|
||||
|
||||
#[get("/users/<user_id>")]
|
||||
async fn get_user_json(user_id: UserId, _token: AdminToken, conn: DbConn) -> JsonResult {
|
||||
let u = get_user_or_404(&user_id, &conn).await?;
|
||||
let mut usr = u.to_json(&conn).await;
|
||||
usr["userEnabled"] = json!(u.enabled);
|
||||
usr["createdAt"] = json!(format_naive_datetime_local(&u.created_at, DT_FMT));
|
||||
Ok(Json(usr))
|
||||
let user = get_user_or_404(&user_id, &conn).await?;
|
||||
let sso_user = SsoUser::find_by_uuid(&user_id, &conn).await;
|
||||
let user_json = enrich_users_json(vec![(user, sso_user)], &conn).await[0].clone();
|
||||
|
||||
Ok(Json(user_json))
|
||||
}
|
||||
|
||||
#[post("/users/<user_id>/delete", format = "application/json")]
|
||||
|
||||
@ -550,6 +550,15 @@ impl SsoUser {
|
||||
}}
|
||||
}
|
||||
|
||||
pub async fn find_by_uuid(uuid: &UserId, conn: &DbConn) -> Option<Self> {
|
||||
db_run! { conn: {
|
||||
sso_users::table
|
||||
.filter(sso_users::user_uuid.eq(uuid))
|
||||
.first::<Self>(conn)
|
||||
.ok()
|
||||
}}
|
||||
}
|
||||
|
||||
pub async fn delete(user_uuid: &UserId, conn: &DbConn) -> EmptyResult {
|
||||
db_run! { conn: {
|
||||
diesel::delete(sso_users::table.filter(sso_users::user_uuid.eq(user_uuid)))
|
||||
|
||||
@ -26,7 +26,7 @@
|
||||
<strong>{{name}}</strong>
|
||||
<span class="d-block">{{email}}</span>
|
||||
<span class="d-block">
|
||||
{{#unless user_enabled}}
|
||||
{{#unless userEnabled}}
|
||||
<span class="badge bg-danger me-2" title="User is disabled">Disabled</span>
|
||||
{{/unless}}
|
||||
{{#if twoFactorEnabled}}
|
||||
@ -43,22 +43,28 @@
|
||||
</td>
|
||||
{{#if ../sso_enabled}}
|
||||
<td>
|
||||
<span class="d-block">{{sso_identifier}}</span>
|
||||
<span class="d-block">{{ssoIdentifier}}</span>
|
||||
</td>
|
||||
{{/if}}
|
||||
<td>
|
||||
<span class="d-block">{{created_at}}</span>
|
||||
<span class="d-block">{{createdAt}}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="d-block">{{last_active}}</span>
|
||||
<span class="d-block">
|
||||
{{#if lastActive}}
|
||||
{{lastActive}}
|
||||
{{else}}
|
||||
Never
|
||||
{{/if}}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="d-block">{{cipher_count}}</span>
|
||||
<span class="d-block">{{cipherCount}}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span class="d-block"><strong>Amount:</strong> {{attachment_count}}</span>
|
||||
<span class="d-block"><strong>Amount:</strong> {{attachmentCount}}</span>
|
||||
{{#if attachment_count}}
|
||||
<span class="d-block"><strong>Size:</strong> {{attachment_size}}</span>
|
||||
<span class="d-block"><strong>Size:</strong> {{attachmentSize}}</span>
|
||||
{{/if}}
|
||||
</td>
|
||||
<td>
|
||||
@ -78,7 +84,7 @@
|
||||
{{#if ../sso_enabled}}
|
||||
<button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-delete-sso-user>Delete SSO Association</button><br>
|
||||
{{/if}}
|
||||
{{#if user_enabled}}
|
||||
{{#if userEnabled}}
|
||||
<button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-disable-user>Disable User</button><br>
|
||||
{{else}}
|
||||
<button type="button" class="btn btn-sm btn-link p-0 border-0 float-right" vw-enable-user>Enable User</button><br>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user