8
8
use super :: { KeyInfoStore , Provide } ;
9
9
use derivative:: Derivative ;
10
10
use log:: trace;
11
- use parsec_interface:: operations:: { list_authenticators, list_opcodes, list_providers, ping} ;
12
11
use parsec_interface:: operations:: {
13
- list_authenticators:: AuthenticatorInfo , list_providers:: ProviderInfo ,
12
+ list_authenticators, list_keys, list_opcodes, list_providers, ping,
13
+ } ;
14
+ use parsec_interface:: operations:: {
15
+ list_authenticators:: AuthenticatorInfo , list_keys:: KeyInfo , list_providers:: ProviderInfo ,
14
16
} ;
15
17
use parsec_interface:: requests:: { Opcode , ProviderID , ResponseStatus , Result } ;
16
18
use std:: collections:: { HashMap , HashSet } ;
@@ -20,11 +22,12 @@ use std::sync::Arc;
20
22
use uuid:: Uuid ;
21
23
use version:: { version, Version } ;
22
24
23
- const SUPPORTED_OPCODES : [ Opcode ; 4 ] = [
25
+ const SUPPORTED_OPCODES : [ Opcode ; 5 ] = [
24
26
Opcode :: ListProviders ,
25
27
Opcode :: ListOpcodes ,
26
28
Opcode :: Ping ,
27
29
Opcode :: ListAuthenticators ,
30
+ Opcode :: ListKeys ,
28
31
] ;
29
32
30
33
/// Service information provider
@@ -82,6 +85,45 @@ impl Provide for CoreProvider {
82
85
} )
83
86
}
84
87
88
+ fn list_keys ( & self , _op : list_keys:: Operation ) -> Result < list_keys:: Result > {
89
+ trace ! ( "list_keys ingress" ) ;
90
+
91
+ let mut keys: Vec < KeyInfo > = Vec :: new ( ) ;
92
+ for provider in & self . prov_list {
93
+ let provider_id = provider. provider_id ( ) ;
94
+
95
+ let key_info_store = match provider. get_key_info_store ( ) {
96
+ Some ( key_info_store) => key_info_store,
97
+ _ => continue ,
98
+ } ;
99
+
100
+ let key_info_store = key_info_store. read ( ) . expect ( "Key store lock poisoned" ) ;
101
+ let key_triples = key_info_store. get_all ( provider_id) . map_err ( |e| {
102
+ format_error ! ( "Error occurred when fetching key triples" , e) ;
103
+ ResponseStatus :: KeyInfoManagerError
104
+ } ) ?;
105
+
106
+ for key_triple in key_triples {
107
+ let key_info = key_info_store. get ( key_triple) . map_err ( |e| {
108
+ format_error ! ( "Error occurred when fetching key info" , e) ;
109
+ ResponseStatus :: KeyInfoManagerError
110
+ } ) ?;
111
+
112
+ let key_info = match key_info {
113
+ Some ( key_info) => key_info,
114
+ _ => continue ,
115
+ } ;
116
+
117
+ keys. push ( KeyInfo {
118
+ provider_id,
119
+ name : key_triple. key_name ( ) . to_string ( ) ,
120
+ attributes : key_info. attributes ,
121
+ } ) ;
122
+ }
123
+ }
124
+ Ok ( list_keys:: Result { keys } )
125
+ }
126
+
85
127
fn ping ( & self , _op : ping:: Operation ) -> Result < ping:: Result > {
86
128
trace ! ( "ping ingress" ) ;
87
129
let result = ping:: Result {
0 commit comments