Skip to content

Commit 9ec3d43

Browse files
committed
quotes_handler: Move the /quotes scope configuration to quotes_handler
Move the /quotes scope configuration from main to quotes_handler module. This is a preparation to support multiple API versions. Also, make the methods that are not required outside the module private. Signed-off-by: Anderson Toshiyuki Sasaki <[email protected]>
1 parent 974f85c commit 9ec3d43

File tree

3 files changed

+80
-51
lines changed

3 files changed

+80
-51
lines changed

keylime-agent/src/errors_handler.rs

-36
Original file line numberDiff line numberDiff line change
@@ -96,37 +96,6 @@ pub(crate) async fn api_default(req: HttpRequest) -> impl Responder {
9696
response
9797
}
9898

99-
pub(crate) async fn quotes_default(req: HttpRequest) -> impl Responder {
100-
let error;
101-
let response;
102-
let message;
103-
104-
match req.head().method {
105-
http::Method::GET => {
106-
error = 400;
107-
message = "URI not supported, only /identity and /integrity are supported for GET in /quotes/ interface";
108-
response = HttpResponse::BadRequest()
109-
.json(JsonWrapper::error(error, message));
110-
}
111-
_ => {
112-
error = 405;
113-
message = "Method is not supported in /quotes/ interface";
114-
response = HttpResponse::MethodNotAllowed()
115-
.insert_header(http::header::Allow(vec![http::Method::GET]))
116-
.json(JsonWrapper::error(error, message));
117-
}
118-
};
119-
120-
warn!(
121-
"{} returning {} response. {}",
122-
req.head().method,
123-
error,
124-
message
125-
);
126-
127-
response
128-
}
129-
13099
pub(crate) async fn agent_default(req: HttpRequest) -> impl Responder {
131100
let error;
132101
let response;
@@ -319,11 +288,6 @@ mod tests {
319288
test_default(web::resource("/").to(api_default), "GET, POST").await
320289
}
321290

322-
#[actix_rt::test]
323-
async fn test_quotes_default() {
324-
test_default(web::resource("/").to(quotes_default), "GET").await
325-
}
326-
327291
#[actix_rt::test]
328292
async fn test_notifications_default() {
329293
test_default(web::resource("/").to(notifications_default), "POST")

keylime-agent/src/main.rs

+3-12
Original file line numberDiff line numberDiff line change
@@ -920,18 +920,9 @@ async fn main() -> Result<()> {
920920
errors_handler::notifications_default,
921921
)),
922922
)
923-
.service(
924-
web::scope("/quotes")
925-
.service(web::resource("/identity").route(
926-
web::get().to(quotes_handler::identity),
927-
))
928-
.service(web::resource("/integrity").route(
929-
web::get().to(quotes_handler::integrity),
930-
))
931-
.default_service(web::to(
932-
errors_handler::quotes_default,
933-
)),
934-
)
923+
.service(web::scope("/quotes").configure(
924+
quotes_handler::configure_quotes_endpoints,
925+
))
935926
.default_service(web::to(
936927
errors_handler::api_default,
937928
)),

keylime-agent/src/quotes_handler.rs

+77-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::common::JsonWrapper;
55
use crate::crypto;
66
use crate::serialization::serialize_maybe_base64;
77
use crate::{tpm, Error as KeylimeError, QuoteData};
8-
use actix_web::{web, HttpRequest, HttpResponse, Responder};
8+
use actix_web::{http, web, HttpRequest, HttpResponse, Responder};
99
use base64::{engine::general_purpose, Engine as _};
1010
use log::*;
1111
use serde::{Deserialize, Serialize};
@@ -47,7 +47,7 @@ pub(crate) struct KeylimeQuote {
4747
// This is a Quote request from the tenant, which does not check
4848
// integrity measurement. It should return this data:
4949
// { QuoteAIK(nonce, 16:H(NK_pub)), NK_pub }
50-
pub async fn identity(
50+
async fn identity(
5151
req: HttpRequest,
5252
param: web::Query<Ident>,
5353
data: web::Data<QuoteData>,
@@ -136,7 +136,7 @@ pub async fn identity(
136136
// by the mask. It should return this data:
137137
// { QuoteAIK(nonce, 16:H(NK_pub), xi:yi), NK_pub}
138138
// where xi:yi are additional PCRs to be included in the quote.
139-
pub async fn integrity(
139+
async fn integrity(
140140
req: HttpRequest,
141141
param: web::Query<Integ>,
142142
data: web::Data<QuoteData>,
@@ -336,13 +336,54 @@ pub async fn integrity(
336336
HttpResponse::Ok().json(response)
337337
}
338338

339+
/// Handles the default case for the /quotes scope
340+
async fn quotes_default(req: HttpRequest) -> impl Responder {
341+
let error;
342+
let response;
343+
let message;
344+
345+
match req.head().method {
346+
http::Method::GET => {
347+
error = 400;
348+
message = "URI not supported, only /identity and /integrity are supported for GET in /quotes/ interface";
349+
response = HttpResponse::BadRequest()
350+
.json(JsonWrapper::error(error, message));
351+
}
352+
_ => {
353+
error = 405;
354+
message = "Method is not supported in /quotes/ interface";
355+
response = HttpResponse::MethodNotAllowed()
356+
.insert_header(http::header::Allow(vec![http::Method::GET]))
357+
.json(JsonWrapper::error(error, message));
358+
}
359+
};
360+
361+
warn!(
362+
"{} returning {} response. {}",
363+
req.head().method,
364+
error,
365+
message
366+
);
367+
368+
response
369+
}
370+
371+
/// Configure the endpoints for the /quotes scope
372+
pub(crate) fn configure_quotes_endpoints(cfg: &mut web::ServiceConfig) {
373+
_ = cfg
374+
.service(web::resource("/identity").route(web::get().to(identity)))
375+
.service(web::resource("/integrity").route(web::get().to(integrity)))
376+
.default_service(web::to(quotes_default));
377+
}
378+
339379
#[cfg(feature = "testing")]
340380
#[cfg(test)]
341381
mod tests {
342382
use super::*;
343383
use crate::common::API_VERSION;
344384
use actix_web::{test, web, App};
345385
use keylime::{crypto::testing::pkey_pub_from_pem, tpm};
386+
use serde_json::{json, Value};
346387

347388
#[actix_rt::test]
348389
async fn test_identity() {
@@ -523,4 +564,37 @@ mod tests {
523564
assert!(result.results.ima_measurement_list.is_none());
524565
assert!(result.results.ima_measurement_list_entry.is_none());
525566
}
567+
568+
#[actix_rt::test]
569+
async fn test_keys_default() {
570+
let mut app = test::init_service(
571+
App::new().service(web::resource("/").to(quotes_default)),
572+
)
573+
.await;
574+
575+
let req = test::TestRequest::get().uri("/").to_request();
576+
577+
let resp = test::call_service(&app, req).await;
578+
assert!(resp.status().is_client_error());
579+
580+
let result: JsonWrapper<Value> = test::read_body_json(resp).await;
581+
582+
assert_eq!(result.results, json!({}));
583+
assert_eq!(result.code, 400);
584+
585+
let req = test::TestRequest::delete().uri("/").to_request();
586+
587+
let resp = test::call_service(&app, req).await;
588+
assert!(resp.status().is_client_error());
589+
590+
let headers = resp.headers();
591+
592+
assert!(headers.contains_key("allow"));
593+
assert_eq!(headers.get("allow").unwrap().to_str().unwrap(), "GET"); //#[allow_ci]
594+
595+
let result: JsonWrapper<Value> = test::read_body_json(resp).await;
596+
597+
assert_eq!(result.results, json!({}));
598+
assert_eq!(result.code, 405);
599+
}
526600
}

0 commit comments

Comments
 (0)