feat: Implémentation de la gestion des erreurs numériques de la librairie C pour la fonction InitLIB2

Co-authored-by: theo <t.lettermann@criteo.com>
This commit is contained in:
Florian Briand 2024-10-01 21:03:24 +02:00
parent a28ee34151
commit 3e1dc326f4
Signed by: florian_briand
GPG Key ID: CC981B9E6B98E70B
4 changed files with 119 additions and 16 deletions

View File

@ -1527,7 +1527,9 @@ dependencies = [
name = "fsv" name = "fsv"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow",
"fsv-sys", "fsv-sys",
"num_enum",
"thiserror", "thiserror",
"utils", "utils",
] ]

View File

@ -4,7 +4,9 @@ version = "0.1.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
anyhow = "1.0.89"
num_enum = "0.7.3"
thiserror = "1.0.64" thiserror = "1.0.64"
fsv-sys = { path = "../fsv-sys" } fsv-sys = { path = "../fsv-sys" }
utils = { path = "../utils" } utils = { path = "../utils" }

View File

@ -0,0 +1,82 @@
use num_enum::FromPrimitive;
use thiserror::Error;
#[derive(Error, Debug, Eq, PartialEq, FromPrimitive)]
#[repr(u16)]
pub enum SSVErrorCodes {
#[error("Le fichier `tablebin.smc` est inaccessible en lecture (inexistant ou pas de droits d'accès).")]
FileMissingTablebinMsc = 0xF610, // tablebin.smc
#[error("Le fichier `scripts.sms` est inaccessible en lecture (inexistant ou pas de droits d'accès).")]
FileMissingScriptsSms = 0xF611, // scripts.sms
#[error("Le fichier `tablebin.ssv` est inaccessible en lecture (inexistant ou pas de droits d'accès).")]
FileMissingTablebinSsv = 0xF612, // tablebin.ssv
#[error("Le fichier `script.ssv` est inaccessible en lecture (inexistant ou pas de droits d'accès).")]
FileMissingScriptSsv = 0xF613, // script.ssv
#[error("La version du fichier `tablebin.smc` est incompatible avec la bibliothèque des SSV.")]
FileVersionIncompatibleTablebinMsc = 0xF620, // tablebin.smc
#[error("La version du fichier `scripts.sms` est incompatible avec la bibliothèque des SSV.")]
FileVersionIncompatibleScriptsSms = 0xF621, // scripts.sms
#[error("La version du fichier `tablebin.ssv` est incompatible avec la bibliothèque des SSV.")]
FileVersionIncompatibleTablebinSsv = 0xF622, // tablebin.ssv
#[error("La version du fichier `script.ssv` est incompatible avec la bibliothèque des SSV.")]
FileVersionIncompatibleScriptSsv = 0xF623, // script.ssv
#[error("L'intégrité du fichier `tablebin.smc` est incorrecte.")]
FileIntegrityIncorrectTablebinMsc = 0xF630, // tablebin.smc
#[error("L'intégrité du fichier `scripts.sms` est incorrecte.")]
FileIntegrityIncorrectScriptsSms = 0xF631, // scripts.sms
#[error("L'intégrité du fichier `tablebin.ssv` est incorrecte.")]
FileIntegrityIncorrectTablebinSsv = 0xF632, // tablebin.ssv
#[error("L'intégrité du fichier `script.ssv` est incorrecte.")]
FileIntegrityIncorrectScriptSsv = 0xF633, // script.ssv
#[error("La structure interne du fichier `tablebin.smc` est invalide.")]
FileStructureInvalidTablebinMsc = 0xF640, // tablebin.smc
#[error("La structure interne du fichier `scripts.sms` est invalide.")]
FileStructureInvalidScriptsSms = 0xF641, // scripts.sms
#[error("La structure interne du fichier `tablebin.ssv` est invalide.")]
FileStructureInvalidTablebinSsv = 0xF642, // tablebin.ssv
#[error("La structure interne du fichier `script.ssv` est invalide.")]
FileStructureInvalidScriptSsv = 0xF643, // script.ssv
#[error("Le fichier `tablebin.smc` n'a pas pu être chargé en mémoire. Essayez de libérer de la mémoire.")]
FileLoadFailedTablebinMsc = 0xF650, // tablebin.smc
#[error("Le fichier `scripts.sms` n'a pas pu être chargé en mémoire. Essayez de libérer de la mémoire.")]
FileLoadFailedScriptsSms = 0xF651, // scripts.sms
#[error("Le fichier `tablebin.ssv` n'a pas pu être chargé en mémoire. Essayez de libérer de la mémoire.")]
FileLoadFailedTablebinSsv = 0xF652, // tablebin.ssv
#[error("Le fichier `script.ssv` n'a pas pu être chargé en mémoire. Essayez de libérer de la mémoire.")]
FileLoadFailedScriptSsv = 0xF653, // script.ssv
#[error("Le nom du fichier `tablebin.smc` est invalide.")]
FileNameInvalidTablebinMsc = 0xF660, // tablebin.smc
#[error("Le nom du fichier `scripts.sms` est invalide.")]
FileNameInvalidScriptsSms = 0xF661, // scripts.sms
#[error("Le nom du fichier `tablebin.ssv` est invalide.")]
FileNameInvalidTablebinSsv = 0xF662, // tablebin.ssv
#[error("Le nom du fichier `script.ssv` est invalide.")]
FileNameInvalidScriptSsv = 0xF663, // script.ssv
#[error("La fonction Initialiser Librairie est déjà appelée.")]
FunctionInitLib2AlreadyCalled = 0xF670, // Warning
#[error("Le fichier SESAM.INI est inaccessible en lecture (fichier ou droit daccès manquant) ou ne contient pas le chemin des tables binaires des SSV.")]
SesamIniMissingFileOrTablebinPath = 0xF680,
#[error("Le chemin du répertoire de travail est absent du fichier SESAM.INI.")]
SesamIniMissingWorkDir = 0xF6F1,
#[error("Les fichiers dextension adm ne sont pas accessibles en écriture.")]
AdmFilesNotWritable = 0xF6F2, // Warning
#[error("Aucune version de FSV du socle technique trouvé. Vérifier que la version du fichier script.sms est bonne.")]
NoFsvVersionFound = 0xF6F4,
#[error("Librairie SGD absente ou incomplète.")]
LibraryMissingOrIncompleteSGD = 0xF6F5,
#[error("Librairie SMC absente ou incomplète.")]
LibraryMissingOrIncompleteSMC = 0xF6F6,
#[error("Librairie SJS absente ou incomplète.")]
LibraryMissingOrIncompleteSJS = 0xF6F7,
#[error("Librairie SMS absente ou incomplète.")]
LibraryMissingOrIncompleteSMS = 0xF6F8,
#[error("Section MGC absente / clé RepertoireConfigTrace absente / fichier log4crc.xml non trouvé à lemplacement indiqué par la clé RepertoireConfigTrace du fichier SESAM.INI.")]
SesamIniTracingConfigMissing = 0xFF22, // Warning
#[error("Interface Full PC/SC : problème de chargement de la librairie cryptographique ou erreur retournée par la librairie cryptographique.")]
PCSCInterfaceCryptoLibraryError = 0xFF25,
#[error("Valorisation incorrecte des paramètres de gestion de l'accès aux ressources dans le SESAM.INI. Vérifier les valeurs des clés tempoexclusivite, repetitionexclusivite, tempoexclusivitePCSC, repetitionexclusivitePCSC")]
SesamIniResourceAccessParamsIncorrect = 0xFF2A,
#[num_enum(catch_all)]
#[error("Erreur inattendue de la librairie SSV (code d'erreur: {0}).")]
Unexpected(u16),
}

View File

@ -1,11 +1,24 @@
use thiserror::Error; use thiserror::Error;
use fsv_sys::{get_library_path, Error as FsvError, SSVLibrary, SSVLibrary_Common, SUPPORTED_FSV_VERSIONS, V1_40_13, V1_40_14}; use fsv_sys::{
get_library_path,
Error as FsvError,
SSVLibrary,
SSVLibraryCommon,
SupportedFsvVersion,
V1_40_13,
V1_40_14
};
mod errors_ssv;
use errors_ssv::SSVErrorCodes;
#[derive(Error, Debug)] #[derive(Error, Debug)]
pub enum Error { pub enum Error {
#[error(transparent)] #[error(transparent)]
SysLibrary(#[from] FsvError) FSVSysLibrary(#[from] FsvError),
#[error(transparent)]
SSVError(#[from] SSVErrorCodes),
} }
/// Enum to hold the different versions of the SSV library /// Enum to hold the different versions of the SSV library
@ -20,14 +33,14 @@ pub struct SSV {
} }
impl SSV { impl SSV {
fn new(version: SUPPORTED_FSV_VERSIONS) -> Result<Self, Error> { fn new(version: SupportedFsvVersion) -> Result<Self, Error> {
let library = match version { let library = match version {
SUPPORTED_FSV_VERSIONS::V1_40_13 => { SupportedFsvVersion::V1_40_13 => {
let lib_path = get_library_path(&version); let lib_path = get_library_path(&version);
let library = SSVLibrary::<V1_40_13>::new(&lib_path)?; let library = SSVLibrary::<V1_40_13>::new(&lib_path)?;
SsvLibraryVersion::V1_40_13(library) SsvLibraryVersion::V1_40_13(library)
}, },
SUPPORTED_FSV_VERSIONS::V1_40_14 => { SupportedFsvVersion::V1_40_14 => {
let lib_path = get_library_path(&version); let lib_path = get_library_path(&version);
let library = SSVLibrary::<V1_40_14>::new(&lib_path)?; let library = SSVLibrary::<V1_40_14>::new(&lib_path)?;
SsvLibraryVersion::V1_40_14(library) SsvLibraryVersion::V1_40_14(library)
@ -42,15 +55,17 @@ impl SSV {
/// Implement: SSV_InitLIB2 /// Implement: SSV_InitLIB2
pub fn init_library(&self, sesam_ini_path: &str) -> Result<(), Error> { pub fn init_library(&self, sesam_ini_path: &str) -> Result<(), Error> {
let sesam_ini_path = std::ffi::CString::new(sesam_ini_path).expect("CString::new failed"); let sesam_ini_path = std::ffi::CString::new(sesam_ini_path).expect("CString::new failed");
match &self.library { let result = match &self.library {
SsvLibraryVersion::V1_40_13(library) => { SsvLibraryVersion::V1_40_13(library) => {
let result = unsafe { library.ssv_init_lib2(sesam_ini_path.as_ptr()) }?; unsafe { library.ssv_init_lib2(sesam_ini_path.as_ptr()) }?
println!("SSV_InitLIB2 result: {}", result);
}, },
SsvLibraryVersion::V1_40_14(library) => { SsvLibraryVersion::V1_40_14(library) => {
let result = unsafe { library.ssv_init_lib2(sesam_ini_path.as_ptr()) }?; unsafe { library.ssv_init_lib2(sesam_ini_path.as_ptr()) }?
println!("SSV_InitLIB2 result: {}", result);
}, },
};
if result != 0 {
let error = SSVErrorCodes::from(result);
return Err(Error::SSVError(error));
} }
Ok(()) Ok(())
} }
@ -61,19 +76,21 @@ mod tests {
use std::env; use std::env;
use utils::config::load_config; use utils::config::load_config;
use anyhow::Result;
use super::*; use super::*;
fn init() -> SSV { fn init() -> Result<SSV> {
load_config().unwrap(); load_config().unwrap();
SSV::new(SUPPORTED_FSV_VERSIONS::V1_40_13).expect("SSV::new failed") Ok(SSV::new(SupportedFsvVersion::V1_40_13)?)
} }
#[test] #[test]
fn test_init_library() { fn test_init_library() -> Result<()> {
let lib = init(); let lib = init()?;
let sesam_ini_path = env::var("SESAM_INI_PATH").expect("SESAM_INI_PATH must be set"); let sesam_ini_path = env::var("SESAM_INI_PATH").expect("SESAM_INI_PATH must be set");
lib.init_library(&sesam_ini_path).expect("init_library failed"); lib.init_library(&sesam_ini_path)?;
Ok(())
} }
#[test] #[test]