1 mod fixtures;
2
3 use fixtures::{server, server_no_stderr, Error, FILES};
4 use pretty_assertions::assert_eq;
5 use reqwest::blocking::Client;
6 use reqwest::StatusCode;
7 use rstest::rstest;
8 use select::document::Document;
9 use select::predicate::Text;
10
11 #[rstest(
12 cli_auth_arg, client_username, client_password,
13 case("testuser:testpassword", "testuser", "testpassword"),
14 case(
15 "testuser:sha256:9f735e0df9a1ddc702bf0a1a7b83033f9f7153a00c29de82cedadc9957289b05",
16 "testuser",
17 "testpassword"
18 ),
19 case(
20 "testuser:sha512:e9e633097ab9ceb3e48ec3f70ee2beba41d05d5420efee5da85f97d97005727587fda33ef4ff2322088f4c79e8133cc9cd9f3512f4d3a303cbdb5bc585415a00",
21 "testuser",
22 "testpassword"
23 ),
24 )]
auth_accepts( cli_auth_arg: &str, client_username: &str, client_password: &str, ) -> Result<(), Error>25 fn auth_accepts(
26 cli_auth_arg: &str,
27 client_username: &str,
28 client_password: &str,
29 ) -> Result<(), Error> {
30 let server = server(&["-a", cli_auth_arg]);
31 let client = Client::new();
32 let response = client
33 .get(server.url())
34 .basic_auth(client_username, Some(client_password))
35 .send()?;
36
37 let status_code = response.status();
38 assert_eq!(status_code, StatusCode::OK);
39
40 let body = response.error_for_status()?;
41 let parsed = Document::from_read(body)?;
42 for &file in FILES {
43 assert!(parsed.find(Text).any(|x| x.text() == file));
44 }
45
46 Ok(())
47 }
48
49 #[rstest(
50 cli_auth_arg, client_username, client_password,
51 case("rightuser:rightpassword", "wronguser", "rightpassword"),
52 case(
53 "rightuser:sha256:314eee236177a721d0e58d3ca4ff01795cdcad1e8478ba8183a2e58d69c648c0",
54 "wronguser",
55 "rightpassword"
56 ),
57 case(
58 "rightuser:sha512:84ec4056571afeec9f5b59453305877e9a66c3f9a1d91733fde759b370c1d540b9dc58bfc88c5980ad2d020c3a8ee84f21314a180856f5a82ba29ecba29e2cab",
59 "wronguser",
60 "rightpassword"
61 ),
62 case("rightuser:rightpassword", "rightuser", "wrongpassword"),
63 case(
64 "rightuser:sha256:314eee236177a721d0e58d3ca4ff01795cdcad1e8478ba8183a2e58d69c648c0",
65 "rightuser",
66 "wrongpassword"
67 ),
68 case(
69 "rightuser:sha512:84ec4056571afeec9f5b59453305877e9a66c3f9a1d91733fde759b370c1d540b9dc58bfc88c5980ad2d020c3a8ee84f21314a180856f5a82ba29ecba29e2cab",
70 "rightuser",
71 "wrongpassword"
72 ),
73 )]
auth_rejects( cli_auth_arg: &str, client_username: &str, client_password: &str, ) -> Result<(), Error>74 fn auth_rejects(
75 cli_auth_arg: &str,
76 client_username: &str,
77 client_password: &str,
78 ) -> Result<(), Error> {
79 let server = server_no_stderr(&["-a", cli_auth_arg]);
80 let client = Client::new();
81 let status = client
82 .get(server.url())
83 .basic_auth(client_username, Some(client_password))
84 .send()?
85 .status();
86
87 assert_eq!(status, StatusCode::UNAUTHORIZED);
88
89 Ok(())
90 }
91
92 /// Command line arguments that register multiple accounts
93 static ACCOUNTS: &[&str] = &[
94 "--auth",
95 "usr0:pwd0",
96 "--auth",
97 "usr1:pwd1",
98 "--auth",
99 "usr2:sha256:149d2937d1bce53fa683ae652291bd54cc8754444216a9e278b45776b76375af", // pwd2
100 "--auth",
101 "usr3:sha256:ffc169417b4146cebe09a3e9ffbca33db82e3e593b4d04c0959a89c05b87e15d", // pwd3
102 "--auth",
103 "usr4:sha512:68050a967d061ac480b414bc8f9a6d368ad0082203edcd23860e94c36178aad1a038e061716707d5479e23081a6d920dc6e9f88e5eb789cdd23e211d718d161a", // pwd4
104 "--auth",
105 "usr5:sha512:be82a7dccd06122f9e232e9730e67e69e30ec61b268fd9b21a5e5d42db770d45586a1ce47816649a0107e9fadf079d9cf0104f0a3aaa0f67bad80289c3ba25a8",
106 // pwd5
107 ];
108
109 #[rstest(
110 username,
111 password,
112 case("usr0", "pwd0"),
113 case("usr1", "pwd1"),
114 case("usr2", "pwd2"),
115 case("usr3", "pwd3"),
116 case("usr4", "pwd4"),
117 case("usr5", "pwd5")
118 )]
auth_multiple_accounts_pass(username: &str, password: &str) -> Result<(), Error>119 fn auth_multiple_accounts_pass(username: &str, password: &str) -> Result<(), Error> {
120 let server = server(ACCOUNTS);
121 let client = Client::new();
122
123 let response = client
124 .get(server.url())
125 .basic_auth(username, Some(password))
126 .send()?;
127
128 let status = response.status();
129 assert_eq!(status, StatusCode::OK);
130
131 let body = response.error_for_status()?;
132 let parsed = Document::from_read(body)?;
133 for &file in FILES {
134 assert!(parsed.find(Text).any(|x| x.text() == file));
135 }
136
137 Ok(())
138 }
139
140 #[rstest]
auth_multiple_accounts_wrong_username() -> Result<(), Error>141 fn auth_multiple_accounts_wrong_username() -> Result<(), Error> {
142 let server = server_no_stderr(ACCOUNTS);
143 let client = Client::new();
144
145 let status = client
146 .get(server.url())
147 .basic_auth("unregistered user", Some("pwd0"))
148 .send()?
149 .status();
150
151 assert_eq!(status, StatusCode::UNAUTHORIZED);
152
153 Ok(())
154 }
155
156 #[rstest(
157 username,
158 password,
159 case("usr0", "pwd5"),
160 case("usr1", "pwd4"),
161 case("usr2", "pwd3"),
162 case("usr3", "pwd2"),
163 case("usr4", "pwd1"),
164 case("usr5", "pwd0")
165 )]
auth_multiple_accounts_wrong_password(username: &str, password: &str) -> Result<(), Error>166 fn auth_multiple_accounts_wrong_password(username: &str, password: &str) -> Result<(), Error> {
167 let server = server_no_stderr(ACCOUNTS);
168 let client = Client::new();
169
170 let status = client
171 .get(server.url())
172 .basic_auth(username, Some(password))
173 .send()?
174 .status();
175
176 assert_eq!(status, StatusCode::UNAUTHORIZED);
177
178 Ok(())
179 }
180