@@ -12,7 +12,7 @@ use crate::certs::ssh_cert::{get_ssh_pem, SSHCertificateBuilder};
1212use crate :: certs:: tls_cert:: { get_timestamp, get_tls_pem, TLSCertificateBuilder } ;
1313use crate :: constants:: VAULTLS_VERSION ;
1414use crate :: data:: api:: { CallbackQuery , ChangePasswordRequest , CreateCARequest , CreateUserCertificateRequest , CreateUserRequest , DownloadResponse , IsSetupResponse , LoginRequest , SetupRequest } ;
15- use crate :: data:: enums:: { CAType , CertificateType , PasswordRule , UserRole } ;
15+ use crate :: data:: enums:: { CAType , CertificateType , PasswordRule , TimespanUnit , UserRole } ;
1616use crate :: data:: error:: ApiError ;
1717use crate :: data:: objects:: { AppState , User } ;
1818use crate :: notification:: mail:: { MailMessage , Mailer } ;
@@ -81,9 +81,11 @@ pub(crate) async fn setup(
8181
8282 state. db . insert_user ( user) . await ?;
8383
84+ let cert_validity = setup_req. validity_duration . unwrap_or ( 5 ) ;
85+ let cert_validity_unit = setup_req. validity_unit . unwrap_or ( TimespanUnit :: Year ) ;
8486 let mut ca = TLSCertificateBuilder :: new ( ) ?
8587 . set_name ( & setup_req. ca_name ) ?
86- . set_valid_until ( setup_req . ca_validity_in_years ) ?
88+ . set_valid_until ( cert_validity , cert_validity_unit ) ?
8789 . build_ca ( ) ?;
8890 ca = state. db . insert_ca ( ca) . await ?;
8991 save_ca ( & ca) ?;
@@ -287,10 +289,11 @@ pub(crate) async fn create_ca(
287289) -> Result < Json < i64 > , ApiError > {
288290 let mut ca = match payload. ca_type {
289291 CAType :: TLS => {
290- let validity = payload. validity_in_years . unwrap_or ( 5 ) ;
292+ let cert_validity = payload. validity_duration . unwrap_or ( 5 ) ;
293+ let cert_validity_unit = payload. validity_unit . unwrap_or ( TimespanUnit :: Year ) ;
291294 TLSCertificateBuilder :: new ( ) ?
292295 . set_name ( & payload. ca_name ) ?
293- . set_valid_until ( validity ) ?
296+ . set_valid_until ( cert_validity , cert_validity_unit ) ?
294297 . build_ca ( ) ?
295298 } ,
296299 CAType :: SSH => {
@@ -320,9 +323,10 @@ pub(crate) async fn create_user_certificate(
320323
321324 let mut ca = get_appropriate_ca ( state, & payload) . await ?;
322325 ca = ensure_ca_validity ( & mut ca, state, & payload) . await ?;
323-
324- let cert_validity_in_years = payload. validity_in_years . unwrap_or ( 1 ) ;
325- let mut cert = build_certificate ( & payload, & ca, & cert_password, cert_validity_in_years, state) . await ?;
326+
327+ let cert_validity = payload. validity_duration . unwrap_or ( 1 ) ;
328+ let cert_validity_unit = payload. validity_unit . unwrap_or ( TimespanUnit :: Year ) ;
329+ let mut cert = build_certificate ( & payload, & ca, & cert_password, cert_validity, cert_validity_unit, state) . await ?;
326330
327331 cert = state. db . insert_user_cert ( cert) . await ?;
328332
@@ -374,8 +378,9 @@ async fn get_appropriate_ca(state: &State<AppState>, payload: &CreateUserCertifi
374378}
375379
376380async fn ensure_ca_validity ( ca : & mut CA , state : & State < AppState > , payload : & CreateUserCertificateRequest ) -> Result < CA , ApiError > {
377- let cert_validity_in_years = payload. validity_in_years . unwrap_or ( 1 ) ;
378- let cert_validity_timestamp = get_timestamp ( cert_validity_in_years) ?;
381+ let cert_validity = payload. validity_duration . unwrap_or ( 1 ) ;
382+ let cert_validity_unit = payload. validity_unit . unwrap_or ( TimespanUnit :: Year ) ;
383+ let cert_validity_timestamp = get_timestamp ( cert_validity, cert_validity_unit) ?;
379384
380385 if ca. valid_until == -1 || cert_validity_timestamp. 0 <= ca. valid_until {
381386 return Ok ( ca. clone ( ) ) ;
@@ -400,31 +405,33 @@ async fn build_certificate(
400405 payload : & CreateUserCertificateRequest ,
401406 ca : & CA ,
402407 cert_password : & str ,
403- cert_validity_in_years : u64 ,
408+ validity_duration : u64 ,
409+ validity_unit : TimespanUnit ,
404410 state : & State < AppState >
405411) -> Result < Certificate , ApiError > {
406412 let cert_type = payload. cert_type . ok_or_else ( || {
407413 ApiError :: BadRequest ( "Certificate type is required" . to_string ( ) )
408414 } ) ?;
409415
410416 match cert_type {
411- CertificateType :: SSHClient => build_ssh_cert ( payload, ca, cert_password, cert_validity_in_years , true ) ,
412- CertificateType :: SSHServer => build_ssh_cert ( payload, ca, cert_password, cert_validity_in_years , false ) ,
413- CertificateType :: TLSClient => build_tls_cert ( payload, ca, cert_password, cert_validity_in_years , state, true ) . await ,
414- CertificateType :: TLSServer => build_tls_cert ( payload, ca, cert_password, cert_validity_in_years , state, false ) . await ,
417+ CertificateType :: SSHClient => build_ssh_cert ( payload, ca, cert_password, validity_duration , validity_unit , true ) ,
418+ CertificateType :: SSHServer => build_ssh_cert ( payload, ca, cert_password, validity_duration , validity_unit , false ) ,
419+ CertificateType :: TLSClient => build_tls_cert ( payload, ca, cert_password, validity_duration , validity_unit , state, true ) . await ,
420+ CertificateType :: TLSServer => build_tls_cert ( payload, ca, cert_password, validity_duration , validity_unit , state, false ) . await ,
415421 }
416422}
417423
418424fn build_ssh_cert (
419425 payload : & CreateUserCertificateRequest ,
420426 ca : & CA ,
421427 cert_password : & str ,
422- cert_validity_in_years : u64 ,
428+ validity_duration : u64 ,
429+ validity_unit : TimespanUnit ,
423430 is_client : bool ,
424431) -> Result < Certificate , ApiError > {
425432 let mut cert_builder = SSHCertificateBuilder :: new ( ) ?
426433 . set_name ( & payload. cert_name ) ?
427- . set_valid_until ( cert_validity_in_years ) ?
434+ . set_valid_until ( validity_duration , validity_unit ) ?
428435 . set_renew_method ( payload. renew_method . unwrap_or_default ( ) ) ?
429436 . set_ca ( ca) ?
430437 . set_user_id ( payload. user_id ) ?;
@@ -448,13 +455,14 @@ async fn build_tls_cert(
448455 payload : & CreateUserCertificateRequest ,
449456 ca : & CA ,
450457 pkcs12_password : & str ,
451- cert_validity_in_years : u64 ,
458+ validity_duration : u64 ,
459+ validity_unit : TimespanUnit ,
452460 state : & State < AppState > ,
453461 is_client : bool ,
454462) -> Result < Certificate , ApiError > {
455463 let mut cert_builder = TLSCertificateBuilder :: new ( ) ?
456464 . set_name ( & payload. cert_name ) ?
457- . set_valid_until ( cert_validity_in_years ) ?
465+ . set_valid_until ( validity_duration , validity_unit ) ?
458466 . set_renew_method ( payload. renew_method . unwrap_or_default ( ) ) ?
459467 . set_password ( pkcs12_password) ?
460468 . set_ca ( ca) ?
0 commit comments