Skip to content

Commit 8ca69ce

Browse files
committed
Expose subject name for MutualTlsUser
This is not necessarily the value stored in the subject name of the certificate, but it is the name for which the provided certifcate was validated.
1 parent aade841 commit 8ca69ce

File tree

4 files changed

+35
-7
lines changed

4 files changed

+35
-7
lines changed

core/http/src/tls.rs

+32-4
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ pub fn find_valid_cert_for_peer<'a>(name: &'a str, certs: &'a [Certificate]) ->
4646
/// ##Examples
4747
///
4848
/// The following short snippet shows `MutualTlsUser` being used as a request guard in a handler to
49-
/// verify the client's certificate.
49+
/// verify the client's certificate and print its subject name.
5050
///
5151
/// ```rust
5252
/// # #![feature(plugin, decl_macro)]
@@ -55,12 +55,40 @@ pub fn find_valid_cert_for_peer<'a>(name: &'a str, certs: &'a [Certificate]) ->
5555
/// use rocket::http::tls::MutualTlsUser;
5656
///
5757
/// #[get("/message")]
58-
/// fn message(mtls:MutualTlsUser) {
59-
/// println!("Authenticated client");
58+
/// fn message(mtls: MutualTlsUser) {
59+
/// println!("{}", mtls.subject_name());
6060
/// }
6161
///
6262
/// # fn main() { }
6363
/// ```
6464
///
6565
#[derive(Debug)]
66-
pub struct MutualTlsUser {}
66+
pub struct MutualTlsUser {
67+
subject_name: String,
68+
}
69+
70+
impl MutualTlsUser {
71+
pub fn new(subject_name: &str) -> MutualTlsUser {
72+
// NOTE: `subject_name` is not necessarily the subject name in the certificate,
73+
// but it is the name for which the certificate was validated.
74+
MutualTlsUser {
75+
subject_name: subject_name.to_string()
76+
}
77+
}
78+
79+
/// Return the client's subject name.
80+
///
81+
/// # Example
82+
///
83+
/// ```rust
84+
/// # extern crate rocket;
85+
/// use rocket::http::tls::MutualTlsUser;
86+
///
87+
/// fn handler(mtls: MutualTlsUser) {
88+
/// let subject_name = mtls.subject_name();
89+
/// }
90+
/// ```
91+
pub fn subject_name(&self) -> &str {
92+
&self.subject_name
93+
}
94+
}

core/lib/src/request/from_request.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,6 @@ impl <'a, 'r> FromRequest<'a, 'r> for MutualTlsUser {
469469
// Validate the name against the provided certs and create a MutualTlsUser
470470
find_valid_cert_for_peer(&name, &certs).or_forward(())?;
471471

472-
Success(MutualTlsUser {})
472+
Success(MutualTlsUser::new(&name))
473473
}
474474
}

examples/mtls/src/main.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use rocket::http::tls::MutualTlsUser;
99

1010
#[get("/")]
1111
fn hello(mtls: MutualTlsUser) -> String {
12-
format!("Hello, MTLS world, {:?}!", mtls)
12+
format!("Hello, MTLS world, {}!", mtls.subject_name())
1313
}
1414

1515
fn main() {

examples/mtls/src/tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,5 @@ fn hello_world() {
3535
.remote(socket)
3636
.dispatch();
3737

38-
assert_eq!(response.body_string(), Some("Hello, MTLS world, MutualTlsUser!".into()));
38+
assert_eq!(response.body_string(), Some("Hello, MTLS world, localhost!".into()));
3939
}

0 commit comments

Comments
 (0)