Skip to content

Commit 41ec48c

Browse files
committed
Create AdminUsers that are hardcoded to be me, Toby, or Justin
1 parent 2310d24 commit 41ec48c

File tree

5 files changed

+64
-3
lines changed

5 files changed

+64
-3
lines changed

src/controllers/util.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use conduit_cookie::RequestSession;
44
use super::prelude::*;
55

66
use crate::middleware::log_request;
7-
use crate::models::{ApiToken, User};
7+
use crate::models::{AdminUser, ApiToken, User};
88
use crate::util::errors::{
99
account_locked, forbidden, internal, AppError, AppResult, InsecurelyGeneratedTokenRevoked,
1010
};
@@ -28,6 +28,10 @@ impl AuthenticatedUser {
2828
self.user
2929
}
3030

31+
pub fn admin_user(self) -> AppResult<AdminUser> {
32+
AdminUser::new(&self.user)
33+
}
34+
3135
/// Disallows token authenticated users
3236
pub fn forbid_api_token_auth(self) -> AppResult<Self> {
3337
if self.token_id.is_none() {

src/models.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub use self::owner::{CrateOwner, Owner, OwnerKind};
1212
pub use self::rights::Rights;
1313
pub use self::team::{NewTeam, Team};
1414
pub use self::token::{ApiToken, CreatedApiToken};
15-
pub use self::user::{NewUser, User};
15+
pub use self::user::{AdminUser, NewUser, User};
1616
pub use self::version::{NewVersion, TopVersions, Version};
1717

1818
pub mod helpers;

src/models/user.rs

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::borrow::Cow;
44

55
use crate::app::App;
66
use crate::email::Emails;
7-
use crate::util::errors::AppResult;
7+
use crate::util::errors::{forbidden, AppResult};
88

99
use crate::models::{ApiToken, Crate, CrateOwner, Email, NewEmail, Owner, OwnerKind, Rights};
1010
use crate::schema::{crate_owners, emails, users};
@@ -177,4 +177,52 @@ impl User {
177177
.first(conn)
178178
.optional()?)
179179
}
180+
181+
/// Attempt to turn this user into an AdminUser
182+
pub fn admin(&self) -> AppResult<AdminUser> {
183+
AdminUser::new(self)
184+
}
185+
}
186+
187+
pub struct AdminUser(User);
188+
189+
impl AdminUser {
190+
pub fn new(user: &User) -> AppResult<Self> {
191+
match user.gh_login.as_str() {
192+
"carols10cents" | "jtgeibel" | "Turbo87" => Ok(Self(user.clone())),
193+
_ => Err(forbidden()),
194+
}
195+
}
196+
}
197+
198+
#[cfg(test)]
199+
mod tests {
200+
use super::*;
201+
202+
#[test]
203+
fn hardcoded_admins() {
204+
let user = User {
205+
id: 3,
206+
gh_access_token: "arbitrary".into(),
207+
gh_login: "literally_anything".into(),
208+
name: None,
209+
gh_avatar: None,
210+
gh_id: 7,
211+
account_lock_reason: None,
212+
account_lock_until: None,
213+
};
214+
assert!(user.admin().is_err());
215+
216+
let sneaky_user = User {
217+
gh_login: "carols10cents_plus_extra_stuff".into(),
218+
..user
219+
};
220+
assert!(sneaky_user.admin().is_err());
221+
222+
let real_real_real = User {
223+
gh_login: "carols10cents".into(),
224+
..sneaky_user
225+
};
226+
assert!(real_real_real.admin().is_ok());
227+
}
180228
}

src/tests/user.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ fn me() {
117117
let user = app.db_new_user("foo");
118118
let json = user.show_me();
119119

120+
assert!(!json.user.admin);
120121
assert_eq!(json.owned_crates.len(), 0);
121122

122123
app.db(|conn| {
@@ -126,6 +127,11 @@ fn me() {
126127
let updated_json = user.show_me();
127128

128129
assert_eq!(updated_json.owned_crates.len(), 1);
130+
131+
let admin_user = app.db_new_user("carols10cents");
132+
let admin_json = admin_user.show_me();
133+
134+
assert!(admin_json.user.admin);
129135
}
130136

131137
#[test]

src/views.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,7 @@ pub struct EncodablePrivateUser {
503503
pub email: Option<String>,
504504
pub avatar: Option<String>,
505505
pub url: Option<String>,
506+
pub admin: bool,
506507
}
507508

508509
impl EncodablePrivateUser {
@@ -513,6 +514,7 @@ impl EncodablePrivateUser {
513514
email_verified: bool,
514515
email_verification_sent: bool,
515516
) -> Self {
517+
let admin = user.admin().is_ok();
516518
let User {
517519
id,
518520
name,
@@ -531,6 +533,7 @@ impl EncodablePrivateUser {
531533
login: gh_login,
532534
name,
533535
url: Some(url),
536+
admin,
534537
}
535538
}
536539
}

0 commit comments

Comments
 (0)