libeufin

Integration and sandbox testing for FinTech APIs and data formats
Log | Files | Refs | Submodules | README | LICENSE

ebics_code.rs (6210B)


      1 /*
      2 * This file is part of LibEuFin.
      3 * Copyright (C) 2026 Taler Systems S.A.
      4 
      5 * LibEuFin is free software; you can redistribute it and/or modify
      6 * it under the terms of the GNU Affero General Public License as
      7 * published by the Free Software Foundation; either version 3, or
      8 * (at your option) any later version.
      9 
     10 * LibEuFin is distributed in the hope that it will be useful, but
     11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     12 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General
     13 * Public License for more details.
     14 
     15 * You should have received a copy of the GNU Affero General Public
     16 * License along with LibEuFin; see the file COPYING.  If not, see
     17 * <http://www.gnu.org/licenses/>
     18 */
     19 
     20 use taler_macros::EnumMeta;
     21 
     22 /// EBICS Error Class (First two digits of the return code)
     23 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
     24 pub enum EbicsKind {
     25     /// 00 - Success / General Information
     26     Information,
     27     /// 01 - Positive notification, but action might be required
     28     Note,
     29     /// 03 - Warning
     30     Warning,
     31     /// 06 - Recoverable Error
     32     RecoverableError,
     33     /// 09 - Non-recoverable Error
     34     NonRecoverableError,
     35 }
     36 #[derive(Debug, Clone, Copy, PartialEq, Eq, EnumMeta)]
     37 #[enum_meta(DomainCode, Str)]
     38 #[allow(non_camel_case_types)]
     39 pub enum EbicsReturnCode {
     40     // --- 00: Information ---
     41     #[code = "000000"]
     42     EBICS_OK,
     43 
     44     // --- 01: Notes ---
     45     #[code = "011000"]
     46     EBICS_DOWNLOAD_POSTPROCESS_DONE,
     47     #[code = "011001"]
     48     EBICS_DOWNLOAD_POSTPROCESS_SKIPPED,
     49     #[code = "011101"]
     50     EBICS_TX_SEGMENT_NUMBER_UNDERRUN,
     51     #[code = "011301"]
     52     EBICS_NO_ONLINE_CHECKS,
     53 
     54     // --- 03: Warnings ---
     55     #[code = "031001"]
     56     EBICS_ORDER_PARAMS_IGNORED,
     57 
     58     // --- 06: Technical Errors (Recoverable) ---
     59     #[code = "061001"]
     60     EBICS_AUTHENTICATION_FAILED,
     61     #[code = "061002"]
     62     EBICS_INVALID_REQUEST,
     63     #[code = "061099"]
     64     EBICS_INTERNAL_ERROR,
     65     #[code = "061101"]
     66     EBICS_TX_RECOVERY_SYNC,
     67 
     68     // --- 09: Business Errors (Non-Recoverable) ---
     69     #[code = "090003"]
     70     EBICS_AUTHORISATION_ORDER_IDENTIFIER_FAILED,
     71     #[code = "090004"]
     72     EBICS_INVALID_ORDER_DATA_FORMAT,
     73     #[code = "090005"]
     74     EBICS_NO_DOWNLOAD_DATA_AVAILABLE,
     75     #[code = "090006"]
     76     EBICS_UNSUPPORTED_REQUEST_FOR_ORDER_INSTANCE,
     77 
     78     // --- 09: Transaction Administration ---
     79     #[code = "091002"]
     80     EBICS_INVALID_USER_OR_USER_STATE,
     81     #[code = "091003"]
     82     EBICS_USER_UNKNOWN,
     83     #[code = "091004"]
     84     EBICS_INVALID_USER_STATE,
     85     #[code = "091005"]
     86     EBICS_INVALID_ORDER_TYPE,
     87     #[code = "091006"]
     88     EBICS_UNSUPPORTED_ORDER_TYPE,
     89     #[code = "091007"]
     90     EBICS_DISTRIBUTED_SIGNATURE_AUTHORISATION_FAILED,
     91     #[code = "091008"]
     92     EBICS_BANK_PUBKEY_UPDATE_REQUIRED,
     93     #[code = "091009"]
     94     EBICS_SEGMENT_SIZE_EXCEEDED,
     95     #[code = "091010"]
     96     EBICS_INVALID_XML,
     97     #[code = "091011"]
     98     EBICS_INVALID_HOST_ID,
     99 
    100     // --- 09: Transaction Processing ---
    101     #[code = "091101"]
    102     EBICS_TX_UNKNOWN_TXID,
    103     #[code = "091102"]
    104     EBICS_TX_ABORT,
    105     #[code = "091103"]
    106     EBICS_TX_MESSAGE_REPLAY,
    107     #[code = "091104"]
    108     EBICS_TX_SEGMENT_NUMBER_EXCEEDED,
    109     #[code = "091105"]
    110     EBICS_RECOVERY_NOT_SUPPORTED,
    111     #[code = "091111"]
    112     EBICS_INVALID_SIGNATURE_FILE_FORMAT,
    113     #[code = "091112"]
    114     EBICS_INVALID_ORDER_PARAMS,
    115     #[code = "091113"]
    116     EBICS_INVALID_REQUEST_CONTENT,
    117     #[code = "091114"]
    118     EBICS_ORDERID_UNKNOWN,
    119     #[code = "091115"]
    120     EBICS_ORDERID_ALREADY_FINAL,
    121     #[code = "091116"]
    122     EBICS_PROCESSING_ERROR,
    123     #[code = "091117"]
    124     EBICS_MAX_ORDER_DATA_SIZE_EXCEEDED,
    125     #[code = "091118"]
    126     EBICS_MAX_SEGMENTS_EXCEEDED,
    127     #[code = "091119"]
    128     EBICS_MAX_TRANSACTIONS_EXCEEDED,
    129     #[code = "091120"]
    130     EBICS_PARTNER_ID_MISMATCH,
    131     #[code = "091121"]
    132     EBICS_INCOMPATIBLE_ORDER_ATTRIBUTE,
    133     #[code = "091122"]
    134     EBICS_ORDER_ALREADY_EXISTS,
    135 
    136     // --- 09: Key Management (X.509 & Keys) ---
    137     #[code = "091201"]
    138     EBICS_KEYMGMT_UNSUPPORTED_VERSION_SIGNATURE,
    139     #[code = "091202"]
    140     EBICS_KEYMGMT_UNSUPPORTED_VERSION_AUTHENTICATION,
    141     #[code = "091203"]
    142     EBICS_KEYMGMT_UNSUPPORTED_VERSION_ENCRYPTION,
    143     #[code = "091204"]
    144     EBICS_KEYMGMT_KEYLENGTH_ERROR_SIGNATURE,
    145     #[code = "091205"]
    146     EBICS_KEYMGMT_KEYLENGTH_ERROR_AUTHENTICATION,
    147     #[code = "091206"]
    148     EBICS_KEYMGMT_KEYLENGTH_ERROR_ENCRYPTION,
    149     #[code = "091207"]
    150     EBICS_KEYMGMT_NO_X509_SUPPORT,
    151     #[code = "091208"]
    152     EBICS_X509_CERTIFICATE_EXPIRED,
    153     #[code = "091209"]
    154     EBICS_X509_CERTIFICATE_NOT_VALID_YET,
    155     #[code = "091210"]
    156     EBICS_X509_WRONG_KEY_USAGE,
    157     #[code = "091211"]
    158     EBICS_X509_WRONG_ALGORITHM,
    159     #[code = "091212"]
    160     EBICS_X509_INVALID_THUMBPRINT,
    161     #[code = "091213"]
    162     EBICS_X509_CTL_INVALID,
    163     #[code = "091214"]
    164     EBICS_X509_UNKNOWN_CERTIFICATE_AUTHORITY,
    165     #[code = "091215"]
    166     EBICS_X509_INVALID_POLICY,
    167     #[code = "091216"]
    168     EBICS_X509_INVALID_BASIC_CONSTRAINTS,
    169     #[code = "091217"]
    170     EBICS_ONLY_X509_SUPPORT,
    171     #[code = "091218"]
    172     EBICS_KEYMGMT_DUPLICATE_KEY,
    173     #[code = "091219"]
    174     EBICS_CERTIFICATES_VALIDATION_ERROR,
    175 
    176     // --- 09: Pre-verification / Signature Logic ---
    177     #[code = "091301"]
    178     EBICS_SIGNATURE_VERIFICATION_FAILED,
    179     #[code = "091302"]
    180     EBICS_ACCOUNT_AUTHORISATION_FAILED,
    181     #[code = "091303"]
    182     EBICS_AMOUNT_CHECK_FAILED,
    183     #[code = "091304"]
    184     EBICS_SIGNER_UNKNOWN,
    185     #[code = "091305"]
    186     EBICS_INVALID_SIGNER_STATE,
    187     #[code = "091306"]
    188     EBICS_DUPLICATE_SIGNATURE,
    189 }
    190 
    191 impl EbicsReturnCode {
    192     /// Automatically classifies the severity/kind based on standard EBICS prefixes.
    193     pub fn kind(&self) -> EbicsKind {
    194         match &self.code()[..2] {
    195             "00" => EbicsKind::Information,
    196             "01" => EbicsKind::Note,
    197             "03" => EbicsKind::Warning,
    198             "06" => EbicsKind::RecoverableError,
    199             "09" => EbicsKind::NonRecoverableError,
    200             prefix => unreachable!("Internal parser mapping error {prefix}"),
    201         }
    202     }
    203 
    204     pub fn is_error(&self) -> bool {
    205         matches!(
    206             self.kind(),
    207             EbicsKind::RecoverableError | EbicsKind::NonRecoverableError
    208         )
    209     }
    210 }