Skip to content

Commit 917171d

Browse files
committed
Allow admin users to yank/unyank versions
1 parent 54b6958 commit 917171d

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

src/controllers/version/yank.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,12 @@ fn modify_yank(
7070
let owners = krate.owners(conn)?;
7171

7272
if Handle::current().block_on(user.rights(state, &owners))? < Rights::Publish {
73-
return Err(cargo_err("must already be an owner to yank or unyank"));
73+
if user.is_admin {
74+
let action = if yanked { "yanking" } else { "unyanking" };
75+
warn!("Admin {} is {action} crate {}", user.gh_login, krate.name);
76+
} else {
77+
return Err(cargo_err("must already be an owner to yank or unyank"));
78+
}
7479
}
7580

7681
if version.yanked == yanked {

src/tests/routes/crates/versions/yank_unyank.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ mod auth {
9797
use crate::util::{MockAnonymousUser, MockCookieUser};
9898
use chrono::{Duration, Utc};
9999
use crates_io::models::token::{CrateScope, EndpointScope};
100-
use crates_io::schema::{crates, versions};
100+
use crates_io::schema::{crates, users, versions};
101101
use diesel::prelude::*;
102102

103103
const CRATE_NAME: &str = "fyk";
@@ -360,4 +360,28 @@ mod auth {
360360
);
361361
assert!(!is_yanked(&app));
362362
}
363+
364+
#[test]
365+
fn admin() {
366+
let (app, _, _) = prepare();
367+
368+
let admin = app.db_new_user("admin");
369+
370+
app.db(|conn| {
371+
diesel::update(admin.as_model())
372+
.set(users::is_admin.eq(true))
373+
.execute(conn)
374+
.unwrap();
375+
});
376+
377+
let response = admin.yank(CRATE_NAME, CRATE_VERSION);
378+
assert_eq!(response.status(), StatusCode::OK);
379+
assert_eq!(response.into_json(), json!({ "ok": true }));
380+
assert!(is_yanked(&app));
381+
382+
let response = admin.unyank(CRATE_NAME, CRATE_VERSION);
383+
assert_eq!(response.status(), StatusCode::OK);
384+
assert_eq!(response.into_json(), json!({ "ok": true }));
385+
assert!(!is_yanked(&app));
386+
}
363387
}

0 commit comments

Comments
 (0)