Skip to content

Commit 50b75b3

Browse files
committed
Auto merge of #1927 - integer32llc:fix_cookie_user_requests, r=jtgeibel
Missed a conversion from UserNoEmailType to User When reviewing #1911, I missed a spot. I reverted the PR merge on master, so this PR reverts the revert and adds the fix. I tried to write a test that would have caught this, but I utterly failed at making a real-enough app/request that would have `.user()` but would let me set the `session()` :( Also a lot of this code is temporary and will be undone once I've rebased #1891, but this needs to be deployed separately from #1891 to ensure there aren't any uses of the email column. r? @jtgeibel
2 parents f939089 + fcf5e96 commit 50b75b3

File tree

12 files changed

+143
-51
lines changed

12 files changed

+143
-51
lines changed

src/bin/transfer-crates.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
use cargo_registry::{
99
db,
10-
models::{Crate, OwnerKind, User},
10+
models::{user, Crate, OwnerKind, User},
1111
schema::{crate_owners, crates, users},
1212
};
1313
use std::{
@@ -16,6 +16,7 @@ use std::{
1616
process::exit,
1717
};
1818

19+
use cargo_registry::models::user::UserNoEmailType;
1920
use diesel::prelude::*;
2021

2122
fn main() {
@@ -44,12 +45,16 @@ fn transfer(conn: &PgConnection) {
4445
};
4546

4647
let from = users::table
48+
.select(user::ALL_COLUMNS)
4749
.filter(users::gh_login.eq(from))
48-
.first::<User>(conn)
50+
.first::<UserNoEmailType>(conn)
51+
.map(User::from)
4952
.unwrap();
5053
let to = users::table
54+
.select(user::ALL_COLUMNS)
5155
.filter(users::gh_login.eq(to))
52-
.first::<User>(conn)
56+
.first::<UserNoEmailType>(conn)
57+
.map(User::from)
5358
.unwrap();
5459

5560
if from.gh_id != to.gh_id {

src/controllers/krate/metadata.rs

+12-10
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
//! `Cargo.toml` file.
66
77
use crate::controllers::prelude::*;
8+
use crate::models::user;
9+
use crate::models::user::UserNoEmailType;
810
use crate::models::{
911
Category, Crate, CrateCategory, CrateKeyword, CrateVersions, Keyword, RecentCrateDownloads,
10-
User, Version,
12+
Version,
1113
};
1214
use crate::schema::*;
1315
use crate::views::{
@@ -105,10 +107,10 @@ pub fn show(req: &mut dyn Request) -> CargoResult<Response> {
105107
let conn = req.db_conn()?;
106108
let krate = Crate::by_name(name).first::<Crate>(&*conn)?;
107109

108-
let mut versions_and_publishers: Vec<(Version, Option<User>)> = krate
110+
let mut versions_and_publishers: Vec<(Version, Option<UserNoEmailType>)> = krate
109111
.all_versions()
110112
.left_outer_join(users::table)
111-
.select((versions::all_columns, users::all_columns.nullable()))
113+
.select((versions::all_columns, user::ALL_COLUMNS.nullable()))
112114
.load(&*conn)?;
113115
versions_and_publishers.sort_by(|a, b| b.0.num.cmp(&a.0.num));
114116
let ids = versions_and_publishers.iter().map(|v| v.0.id).collect();
@@ -151,7 +153,7 @@ pub fn show(req: &mut dyn Request) -> CargoResult<Response> {
151153
),
152154
versions: versions_and_publishers
153155
.into_iter()
154-
.map(|(v, pb)| v.encodable(&krate.name, pb))
156+
.map(|(v, pb)| v.encodable(&krate.name, pb.map(From::from)))
155157
.collect(),
156158
keywords: kws.into_iter().map(Keyword::encodable).collect(),
157159
categories: cats.into_iter().map(Category::encodable).collect(),
@@ -187,15 +189,15 @@ pub fn versions(req: &mut dyn Request) -> CargoResult<Response> {
187189
let crate_name = &req.params()["crate_id"];
188190
let conn = req.db_conn()?;
189191
let krate = Crate::by_name(crate_name).first::<Crate>(&*conn)?;
190-
let mut versions_and_publishers: Vec<(Version, Option<User>)> = krate
192+
let mut versions_and_publishers: Vec<(Version, Option<UserNoEmailType>)> = krate
191193
.all_versions()
192194
.left_outer_join(users::table)
193-
.select((versions::all_columns, users::all_columns.nullable()))
195+
.select((versions::all_columns, user::ALL_COLUMNS.nullable()))
194196
.load(&*conn)?;
195197
versions_and_publishers.sort_by(|a, b| b.0.num.cmp(&a.0.num));
196198
let versions = versions_and_publishers
197199
.into_iter()
198-
.map(|(v, pb)| v.encodable(crate_name, pb))
200+
.map(|(v, pb)| v.encodable(crate_name, pb.map(From::from)))
199201
.collect();
200202

201203
#[derive(Serialize)]
@@ -227,11 +229,11 @@ pub fn reverse_dependencies(req: &mut dyn Request) -> CargoResult<Response> {
227229
.select((
228230
versions::all_columns,
229231
crates::name,
230-
users::all_columns.nullable(),
232+
user::ALL_COLUMNS.nullable(),
231233
))
232-
.load::<(Version, String, Option<User>)>(&*conn)?
234+
.load::<(Version, String, Option<UserNoEmailType>)>(&*conn)?
233235
.into_iter()
234-
.map(|(version, krate_name, published_by)| version.encodable(&krate_name, published_by))
236+
.map(|(version, krate_name, user)| version.encodable(&krate_name, user.map(From::from)))
235237
.collect();
236238

237239
#[derive(Serialize)]

src/controllers/user/me.rs

+13-11
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::email;
77
use crate::util::bad_request;
88
use crate::util::errors::CargoError;
99

10+
use crate::models::user::{UserNoEmailType, ALL_COLUMNS};
1011
use crate::models::{CrateOwner, Email, Follow, NewEmail, OwnerKind, User, Version};
1112
use crate::schema::{crate_owners, crates, emails, follows, users, versions};
1213
use crate::views::{EncodableMe, EncodableVersion, OwnedCrate};
@@ -31,12 +32,12 @@ pub fn me(req: &mut dyn Request) -> CargoResult<Response> {
3132
.find(user_id)
3233
.left_join(emails::table)
3334
.select((
34-
users::all_columns,
35+
ALL_COLUMNS,
3536
emails::verified.nullable(),
3637
emails::email.nullable(),
3738
emails::token_generated_at.nullable().is_not_null(),
3839
))
39-
.first::<(User, Option<bool>, Option<String>, bool)>(&*conn)?;
40+
.first::<(UserNoEmailType, Option<bool>, Option<String>, bool)>(&*conn)?;
4041

4142
let owned_crates = crate_owners::table
4243
.inner_join(crates::table)
@@ -55,10 +56,13 @@ pub fn me(req: &mut dyn Request) -> CargoResult<Response> {
5556

5657
let verified = verified.unwrap_or(false);
5758
let verification_sent = verified || verification_sent;
58-
let user = User { email, ..user };
59+
// PR :: https://github.com/rust-lang/crates.io/pull/1891
60+
// Will modify this so that we don't need this kind of conversion anymore...
61+
// In fact, the PR will use the email that we obtained from the above SQL queries
62+
// and pass it along the encodable_private function below.
5963

6064
Ok(req.json(&EncodableMe {
61-
user: user.encodable_private(verified, verification_sent),
65+
user: User::from(user).encodable_private(email, verified, verification_sent),
6266
owned_crates,
6367
}))
6468
}
@@ -76,19 +80,17 @@ pub fn updates(req: &mut dyn Request) -> CargoResult<Response> {
7680
.left_outer_join(users::table)
7781
.filter(crates::id.eq(any(followed_crates)))
7882
.order(versions::created_at.desc())
79-
.select((
80-
versions::all_columns,
81-
crates::name,
82-
users::all_columns.nullable(),
83-
))
83+
.select((versions::all_columns, crates::name, ALL_COLUMNS.nullable()))
8484
.paginate(&req.query())?
85-
.load::<(Version, String, Option<User>)>(&*conn)?;
85+
.load::<(Version, String, Option<UserNoEmailType>)>(&*conn)?;
8686

8787
let more = data.next_page_params().is_some();
8888

8989
let versions = data
9090
.into_iter()
91-
.map(|(version, crate_name, published_by)| version.encodable(&crate_name, published_by))
91+
.map(|(version, crate_name, published_by)| {
92+
version.encodable(&crate_name, published_by.map(From::from))
93+
})
9294
.collect();
9395

9496
#[derive(Serialize)]

src/controllers/user/other.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use crate::controllers::prelude::*;
22

3+
use crate::models::user;
4+
use crate::models::user::UserNoEmailType;
35
use crate::models::{OwnerKind, User};
46
use crate::schema::{crate_owners, crates, users};
57
use crate::views::EncodablePublicUser;
@@ -11,16 +13,17 @@ pub fn show(req: &mut dyn Request) -> CargoResult<Response> {
1113
let name = &req.params()["user_id"].to_lowercase();
1214
let conn = req.db_conn()?;
1315
let user = users
16+
.select(user::ALL_COLUMNS)
1417
.filter(crate::lower(gh_login).eq(name))
1518
.order(id.desc())
16-
.first::<User>(&*conn)?;
19+
.first::<UserNoEmailType>(&*conn)?;
1720

1821
#[derive(Serialize)]
1922
struct R {
2023
user: EncodablePublicUser,
2124
}
2225
Ok(req.json(&R {
23-
user: user.encodable_public(),
26+
user: User::from(user).encodable_public(),
2427
}))
2528
}
2629

src/controllers/user/session.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use crate::github;
44
use conduit_cookie::RequestSession;
55
use oauth2::{prelude::*, AuthorizationCode, TokenResponse};
66

7+
use crate::models::user;
8+
use crate::models::user::UserNoEmailType;
79
use crate::models::{NewUser, User};
810
use crate::schema::users;
911
use crate::util::errors::{CargoError, ReadOnlyMode};
@@ -130,10 +132,11 @@ impl GithubUser {
130132
// just look for an existing user
131133
if e.is::<ReadOnlyMode>() {
132134
users::table
135+
.select(user::ALL_COLUMNS)
133136
.filter(users::gh_id.eq(self.id))
134-
.first(conn)
135-
.optional()?
136-
.ok_or(e)
137+
.first::<UserNoEmailType>(conn)
138+
.map(User::from)
139+
.map_err(|_| e)
137140
} else {
138141
Err(e)
139142
}

src/controllers/version/deprecated.rs

+11-7
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
88
use crate::controllers::prelude::*;
99

10-
use crate::models::{Crate, User, Version};
10+
use crate::models::user;
11+
use crate::models::user::UserNoEmailType;
12+
use crate::models::{Crate, Version};
1113
use crate::schema::*;
1214
use crate::views::EncodableVersion;
1315

@@ -28,12 +30,14 @@ pub fn index(req: &mut dyn Request) -> CargoResult<Response> {
2830
.select((
2931
versions::all_columns,
3032
crates::name,
31-
users::all_columns.nullable(),
33+
user::ALL_COLUMNS.nullable(),
3234
))
3335
.filter(versions::id.eq(any(ids)))
34-
.load::<(Version, String, Option<User>)>(&*conn)?
36+
.load::<(Version, String, Option<UserNoEmailType>)>(&*conn)?
3537
.into_iter()
36-
.map(|(version, crate_name, published_by)| version.encodable(&crate_name, published_by))
38+
.map(|(version, crate_name, published_by)| {
39+
version.encodable(&crate_name, published_by.map(From::from))
40+
})
3741
.collect();
3842

3943
#[derive(Serialize)]
@@ -50,14 +54,14 @@ pub fn show_by_id(req: &mut dyn Request) -> CargoResult<Response> {
5054
let id = &req.params()["version_id"];
5155
let id = id.parse().unwrap_or(0);
5256
let conn = req.db_conn()?;
53-
let (version, krate, published_by): (Version, Crate, Option<User>) = versions::table
57+
let (version, krate, published_by): (Version, Crate, Option<UserNoEmailType>) = versions::table
5458
.find(id)
5559
.inner_join(crates::table)
5660
.left_outer_join(users::table)
5761
.select((
5862
versions::all_columns,
5963
crate::models::krate::ALL_COLUMNS,
60-
users::all_columns.nullable(),
64+
user::ALL_COLUMNS.nullable(),
6165
))
6266
.first(&*conn)?;
6367

@@ -66,6 +70,6 @@ pub fn show_by_id(req: &mut dyn Request) -> CargoResult<Response> {
6670
version: EncodableVersion,
6771
}
6872
Ok(req.json(&R {
69-
version: version.encodable(&krate.name, published_by),
73+
version: version.encodable(&krate.name, published_by.map(From::from)),
7074
}))
7175
}

src/middleware/current_user.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use diesel::prelude::*;
66
use crate::db::RequestTransaction;
77
use crate::util::errors::{std_error, CargoResult, ChainError, Unauthorized};
88

9+
use crate::models::user::{UserNoEmailType, ALL_COLUMNS};
910
use crate::models::User;
1011
use crate::schema::users;
1112

@@ -31,9 +32,13 @@ impl Middleware for CurrentUser {
3132

3233
if let Some(id) = id {
3334
// If it did, look for a user in the database with the given `user_id`
34-
let maybe_user = users::table.find(id).first::<User>(&*conn);
35+
let maybe_user = users::table
36+
.select(ALL_COLUMNS)
37+
.find(id)
38+
.first::<UserNoEmailType>(&*conn);
3539
drop(conn);
3640
if let Ok(user) = maybe_user {
41+
let user = User::from(user);
3742
// Attach the `User` model from the database to the request
3843
req.mut_extensions().insert(user);
3944
req.mut_extensions()

src/models.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,5 @@ mod owner;
3131
mod rights;
3232
mod team;
3333
mod token;
34-
mod user;
34+
pub mod user;
3535
mod version;

src/models/krate.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ use url::Url;
88

99
use crate::app::App;
1010
use crate::email;
11+
use crate::models::user;
12+
use crate::models::user::UserNoEmailType;
1113
use crate::util::{human, CargoResult};
1214

1315
use crate::models::{
@@ -399,9 +401,10 @@ impl Crate {
399401
let users = CrateOwner::by_owner_kind(OwnerKind::User)
400402
.filter(crate_owners::crate_id.eq(self.id))
401403
.inner_join(users::table)
402-
.select(users::all_columns)
403-
.load(conn)?
404+
.select(user::ALL_COLUMNS)
405+
.load::<UserNoEmailType>(conn)?
404406
.into_iter()
407+
.map(User::from)
405408
.map(Owner::User);
406409
let teams = CrateOwner::by_owner_kind(OwnerKind::Team)
407410
.filter(crate_owners::crate_id.eq(self.id))

src/models/owner.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::app::App;
55
use crate::github;
66
use crate::util::{human, CargoResult};
77

8+
use crate::models::user::{UserNoEmailType, ALL_COLUMNS};
89
use crate::models::{Crate, Team, User};
910
use crate::schema::{crate_owners, users};
1011
use crate::views::EncodableOwner;
@@ -71,8 +72,10 @@ impl Owner {
7172
)?))
7273
} else {
7374
users::table
75+
.select(ALL_COLUMNS)
7476
.filter(users::gh_login.eq(name))
75-
.first(conn)
77+
.first::<UserNoEmailType>(conn)
78+
.map(User::from)
7679
.map(Owner::User)
7780
.map_err(|_| human(&format_args!("could not find user with login `{}`", name)))
7881
}

0 commit comments

Comments
 (0)