3
3
4
4
use crate :: common:: JsonWrapper ;
5
5
use crate :: { tpm, Error as KeylimeError , QuoteData } ;
6
- use actix_web:: { web, HttpRequest , HttpResponse , Responder } ;
6
+ use actix_web:: { http , web, HttpRequest , HttpResponse , Responder } ;
7
7
use base64:: { engine:: general_purpose, Engine as _} ;
8
8
use log:: * ;
9
9
use serde:: { Deserialize , Serialize } ;
@@ -19,7 +19,7 @@ pub(crate) struct AgentInfo {
19
19
20
20
// This is an Info request which gets some information about this keylime agent
21
21
// It should return a AgentInfo object as JSON
22
- pub async fn info (
22
+ async fn info (
23
23
req : HttpRequest ,
24
24
data : web:: Data < QuoteData > ,
25
25
) -> impl Responder {
@@ -38,12 +38,52 @@ pub async fn info(
38
38
HttpResponse :: Ok ( ) . json ( response)
39
39
}
40
40
41
+ /// Configure the endpoints for the /agent scope
42
+ async fn agent_default ( req : HttpRequest ) -> impl Responder {
43
+ let error;
44
+ let response;
45
+ let message;
46
+
47
+ match req. head ( ) . method {
48
+ http:: Method :: GET => {
49
+ error = 400 ;
50
+ message = "URI not supported, only /info is supported for GET in /agent interface" ;
51
+ response = HttpResponse :: BadRequest ( )
52
+ . json ( JsonWrapper :: error ( error, message) ) ;
53
+ }
54
+ _ => {
55
+ error = 405 ;
56
+ message = "Method is not supported in /agent interface" ;
57
+ response = HttpResponse :: MethodNotAllowed ( )
58
+ . insert_header ( http:: header:: Allow ( vec ! [ http:: Method :: GET ] ) )
59
+ . json ( JsonWrapper :: error ( error, message) ) ;
60
+ }
61
+ } ;
62
+
63
+ warn ! (
64
+ "{} returning {} response. {}" ,
65
+ req. head( ) . method,
66
+ error,
67
+ message
68
+ ) ;
69
+
70
+ response
71
+ }
72
+
73
+ /// Configure the endpoints for the /agents scope
74
+ pub ( crate ) fn configure_agent_endpoints ( cfg : & mut web:: ServiceConfig ) {
75
+ _ = cfg
76
+ . service ( web:: resource ( "/info" ) . route ( web:: get ( ) . to ( info) ) )
77
+ . default_service ( web:: to ( agent_default) ) ;
78
+ }
79
+
41
80
#[ cfg( test) ]
42
81
#[ cfg( feature = "testing" ) ]
43
82
mod tests {
44
83
use super :: * ;
45
84
use crate :: common:: API_VERSION ;
46
85
use actix_web:: { test, web, App } ;
86
+ use serde_json:: { json, Value } ;
47
87
48
88
#[ actix_rt:: test]
49
89
async fn test_agent_info ( ) {
@@ -73,4 +113,37 @@ mod tests {
73
113
assert_eq ! ( result. results. tpm_enc_alg. as_str( ) , "rsa" ) ;
74
114
assert_eq ! ( result. results. tpm_sign_alg. as_str( ) , "rsassa" ) ;
75
115
}
116
+
117
+ #[ actix_rt:: test]
118
+ async fn test_agents_default ( ) {
119
+ let mut app = test:: init_service (
120
+ App :: new ( ) . service ( web:: resource ( "/" ) . to ( agent_default) ) ,
121
+ )
122
+ . await ;
123
+
124
+ let req = test:: TestRequest :: get ( ) . uri ( "/" ) . to_request ( ) ;
125
+
126
+ let resp = test:: call_service ( & app, req) . await ;
127
+ assert ! ( resp. status( ) . is_client_error( ) ) ;
128
+
129
+ let result: JsonWrapper < Value > = test:: read_body_json ( resp) . await ;
130
+
131
+ assert_eq ! ( result. results, json!( { } ) ) ;
132
+ assert_eq ! ( result. code, 400 ) ;
133
+
134
+ let req = test:: TestRequest :: delete ( ) . uri ( "/" ) . to_request ( ) ;
135
+
136
+ let resp = test:: call_service ( & app, req) . await ;
137
+ assert ! ( resp. status( ) . is_client_error( ) ) ;
138
+
139
+ let headers = resp. headers ( ) ;
140
+
141
+ assert ! ( headers. contains_key( "allow" ) ) ;
142
+ assert_eq ! ( headers. get( "allow" ) . unwrap( ) . to_str( ) . unwrap( ) , "GET" ) ; //#[allow_ci]
143
+
144
+ let result: JsonWrapper < Value > = test:: read_body_json ( resp) . await ;
145
+
146
+ assert_eq ! ( result. results, json!( { } ) ) ;
147
+ assert_eq ! ( result. code, 405 ) ;
148
+ }
76
149
}
0 commit comments