@@ -20,11 +20,14 @@ use hyper_util::rt::TokioIo;
2020use crate :: vss_service:: VssService ;
2121use api:: auth:: { Authorizer , NoopAuthorizer } ;
2222use api:: kv_store:: KvStore ;
23+ use auth_impls:: { DecodingKey , JWTAuthorizer } ;
2324use impls:: postgres_store:: { Certificate , PostgresPlaintextBackend , PostgresTlsBackend } ;
2425use std:: sync:: Arc ;
2526
26- pub ( crate ) mod util;
27- pub ( crate ) mod vss_service;
27+ mod util;
28+ mod vss_service;
29+
30+ use util:: config:: { Config , ServerConfig } ;
2831
2932fn main ( ) {
3033 let args: Vec < String > = std:: env:: args ( ) . collect ( ) ;
@@ -33,22 +36,21 @@ fn main() {
3336 std:: process:: exit ( 1 ) ;
3437 }
3538
36- let config = match util:: config:: load_config ( & args[ 1 ] ) {
37- Ok ( cfg) => cfg,
38- Err ( e) => {
39- eprintln ! ( "Failed to load configuration: {}" , e) ;
40- std:: process:: exit ( 1 ) ;
41- } ,
42- } ;
43-
44- let addr: SocketAddr =
45- match format ! ( "{}:{}" , config. server_config. host, config. server_config. port) . parse ( ) {
46- Ok ( addr) => addr,
39+ let Config { server_config : ServerConfig { host, port, rsa_pem_file } , postgresql_config } =
40+ match util:: config:: load_config ( & args[ 1 ] ) {
41+ Ok ( cfg) => cfg,
4742 Err ( e) => {
48- eprintln ! ( "Invalid host/port configuration: {}" , e) ;
43+ eprintln ! ( "Failed to load configuration: {}" , e) ;
4944 std:: process:: exit ( 1 ) ;
5045 } ,
5146 } ;
47+ let addr: SocketAddr = match format ! ( "{}:{}" , host, port) . parse ( ) {
48+ Ok ( addr) => addr,
49+ Err ( e) => {
50+ eprintln ! ( "Invalid host/port configuration: {}" , e) ;
51+ std:: process:: exit ( 1 ) ;
52+ } ,
53+ } ;
5254
5355 let runtime = match tokio:: runtime:: Builder :: new_multi_thread ( ) . enable_all ( ) . build ( ) {
5456 Ok ( runtime) => Arc :: new ( runtime) ,
@@ -66,9 +68,27 @@ fn main() {
6668 std:: process:: exit ( -1 ) ;
6769 } ,
6870 } ;
69- let authorizer: Arc < dyn Authorizer > = Arc :: new ( NoopAuthorizer { } ) ;
70- let postgresql_config =
71- config. postgresql_config . expect ( "PostgreSQLConfig must be defined in config file." ) ;
71+
72+ let authorizer: Arc < dyn Authorizer > = if let Some ( rsa_pem_file) = rsa_pem_file {
73+ let rsa_pem = match std:: fs:: read ( rsa_pem_file) {
74+ Ok ( pem) => pem,
75+ Err ( e) => {
76+ println ! ( "Failed to read RSA public key file: {}" , e) ;
77+ std:: process:: exit ( -1 ) ;
78+ } ,
79+ } ;
80+ let rsa_public_key = match DecodingKey :: from_rsa_pem ( & rsa_pem) {
81+ Ok ( pem) => pem,
82+ Err ( e) => {
83+ println ! ( "Failed to parse RSA public key file: {}" , e) ;
84+ std:: process:: exit ( -1 ) ;
85+ } ,
86+ } ;
87+ Arc :: new ( JWTAuthorizer :: new ( rsa_public_key) . await )
88+ } else {
89+ Arc :: new ( NoopAuthorizer { } )
90+ } ;
91+
7292 let endpoint = postgresql_config. to_postgresql_endpoint ( ) ;
7393 let db_name = postgresql_config. database ;
7494 let store: Arc < dyn KvStore > = if let Some ( tls_config) = postgresql_config. tls {
@@ -109,6 +129,7 @@ fn main() {
109129 Arc :: new ( postgres_plaintext_backend)
110130 } ;
111131 println ! ( "Connected to PostgreSQL backend with DSN: {}/{}" , endpoint, db_name) ;
132+
112133 let rest_svc_listener =
113134 TcpListener :: bind ( & addr) . await . expect ( "Failed to bind listening port" ) ;
114135 println ! ( "Listening for incoming connections on {}" , addr) ;
0 commit comments