diff --git a/.gitignore b/.gitignore index 4f581a9..957d6f2 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,9 @@ server_response.xml # ods .~lock.**.ods# +# Temp +tmp + # Output output diff --git a/CHANGELOG.md b/CHANGELOG.md index 77a90b2..f4bb3a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Add CI - changed - removed + - Remove Rust bindings and SDK for Eric ## v0.1.0 (2022-06-11) diff --git a/Cargo.lock b/Cargo.lock index d2868bb..826a56f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -103,17 +103,6 @@ dependencies = [ "syn 2.0.72", ] -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.3.0" @@ -126,29 +115,6 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "bindgen" -version = "0.60.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062dddbc1ba4aca46de6338e2bf87771414c335f7b2f2036e8f3e9befebf88e6" -dependencies = [ - "bitflags 1.3.2", - "cexpr", - "clang-sys", - "clap", - "env_logger 0.9.3", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "which", -] - [[package]] name = "bitflags" version = "1.3.2" @@ -243,15 +209,6 @@ version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2aba8f4e9906c7ce3c73463f62a7f0c65183ada1a2d47e397cc8810827f9694f" -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - [[package]] name = "cfg-if" version = "1.0.0" @@ -276,30 +233,16 @@ dependencies = [ "windows-targets", ] -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - [[package]] name = "clap" version = "3.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" dependencies = [ - "atty", "bitflags 1.3.2", "clap_lex", "indexmap 1.9.3", "once_cell", - "strsim", - "termcolor", "textwrap", ] @@ -415,25 +358,6 @@ dependencies = [ "syn 2.0.72", ] -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[package]] -name = "env_logger" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - [[package]] name = "env_logger" version = "0.10.2" @@ -454,13 +378,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "errno" -version = "0.3.9" +name = "eric-bindings" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "6c303f331d05a92c865d43ac285bbc29a01f55eb0eafc89676eea6e771f26e85" dependencies = [ - "libc", - "windows-sys", + "anyhow", +] + +[[package]] +name = "eric-sdk" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "867a7c21d159a0670ebf44e9569c712c62af982396c42984e3094983c58a527f" +dependencies = [ + "anyhow", + "eric-bindings", ] [[package]] @@ -507,12 +440,6 @@ dependencies = [ "wasi", ] -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - [[package]] name = "half" version = "1.8.3" @@ -534,30 +461,12 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys", -] - [[package]] name = "humantime" version = "2.1.0" @@ -631,7 +540,7 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi", "libc", "windows-sys", ] @@ -669,34 +578,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "libc" version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" -[[package]] -name = "libloading" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" -dependencies = [ - "cfg-if", - "windows-targets", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - [[package]] name = "litemap" version = "0.7.3" @@ -823,12 +710,6 @@ dependencies = [ "windows-targets", ] -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "phf_shared" version = "0.10.0" @@ -1091,15 +972,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "roxmltree" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" -dependencies = [ - "xmlparser", -] - [[package]] name = "rust_decimal" version = "1.35.0" @@ -1126,25 +998,6 @@ dependencies = [ "rust_decimal", ] -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys", -] - [[package]] name = "ryu" version = "1.0.18" @@ -1195,12 +1048,6 @@ dependencies = [ "serde", ] -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - [[package]] name = "simd-adler32" version = "0.3.7" @@ -1265,12 +1112,6 @@ dependencies = [ "serde", ] -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "syn" version = "1.0.109" @@ -1311,34 +1152,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" -[[package]] -name = "taxel" -version = "0.1.0" -dependencies = [ - "anyhow", - "roxmltree", - "taxel-bindings", - "taxel-util", -] - -[[package]] -name = "taxel-bindings" -version = "0.1.0" -dependencies = [ - "anyhow", - "bindgen", - "taxel-util", -] - [[package]] name = "taxel-cli" version = "0.2.0" dependencies = [ "anyhow", "clap", - "env_logger 0.10.2", + "env_logger", + "eric-sdk", "log", - "taxel", "taxel-xml", ] @@ -1355,7 +1177,7 @@ version = "0.1.0" dependencies = [ "anyhow", "csv", - "env_logger 0.10.2", + "env_logger", "log", "quick-xml 0.29.0", "serde", @@ -1535,34 +1357,6 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - [[package]] name = "winapi-util" version = "0.1.8" @@ -1572,12 +1366,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-core" version = "0.52.0" @@ -1684,12 +1472,6 @@ dependencies = [ "tap", ] -[[package]] -name = "xmlparser" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" - [[package]] name = "zip" version = "2.1.5" diff --git a/Cargo.toml b/Cargo.toml index 0a887ab..44ed421 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,5 @@ [workspace] members = [ - "taxel", - "taxel-bindings", "taxel-cli", "taxel-util", "taxel-xml", diff --git a/README.md b/README.md index dcfd8eb..142e435 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # Taxel [![build status](https://github.com/quambene/taxel/actions/workflows/ci.yml/badge.svg)](https://github.com/quambene/taxel/actions/workflows/ci.yml) -[![dependency status](https://deps.rs/repo/github/quambene/taxel/status.svg)](https://deps.rs/repo/github/quambene/taxel) Taxel provides a command line interface (CLI) to generate the electronic balance sheet (eBilanz) in the XBRL format. @@ -71,31 +70,18 @@ taxel send \ --tax-type "Bilanz" \ --tax-version 6.4 \ --xml-file "my_tax_data.xml" \ - --certificate-file "my_elster_certificate.pfx" \ - --password "my_password" # Send xml file to tax authorities and print confirmation as pdf file taxel send \ --tax-type "Bilanz" \ --tax-version 6.4 \ --xml-file "my_tax_data.xml" \ - --certificate-file "my_elster_certificate.pfx" \ - --password "my_password" \ --print "my_eBilanz.pdf" ``` ## Testing ``` bash -# Run unit tests for taxel -cargo test -p taxel -- --test-threads=1 - -# Run integration tests for taxel -cargo test -p taxel --test '*' --features integration-test -- --test-threads=1 - -# Run integration tests for taxel in release mode -cargo test -p taxel --release --test '*' --features integration-test -- --test-threads=1 - # Run unit tests for taxel-cli cargo test -p taxel-cli diff --git a/taxel-bindings/Cargo.toml b/taxel-bindings/Cargo.toml deleted file mode 100644 index 5ef09b8..0000000 --- a/taxel-bindings/Cargo.toml +++ /dev/null @@ -1,17 +0,0 @@ -[package] -name = "taxel-bindings" -version = "0.1.0" -authors.workspace = true -edition.workspace = true -build = "build.rs" - -[lib] -path = "src/lib.rs" -name = "taxel_bindings" - -[dependencies] -taxel-util = { version = "0.1.0", path = "../taxel-util" } -anyhow = { workspace = true } - -[build-dependencies] -bindgen = "0.60.1" diff --git a/taxel-bindings/build.rs b/taxel-bindings/build.rs deleted file mode 100644 index 2364dfb..0000000 --- a/taxel-bindings/build.rs +++ /dev/null @@ -1,37 +0,0 @@ -use std::{ - env, io, - path::{Path, PathBuf}, -}; - -fn main() -> io::Result<()> { - let library_path = - env::var("LIBRARY_PATH").expect("Missing environment variable 'LIBRARY_PATH'"); - let library_name = - env::var("LIBRARY_NAME").expect("Missing environment variable 'LIBRARY_NAME'"); - let header_file = env::var("HEADER_FILE").expect("Missing environment variable 'HEADER_FILE'"); - - let library_path = Path::new(&library_path); - let header_file = Path::new(&header_file); - - println!("cargo:rustc-link-search={}", library_path.display()); - println!("cargo:rustc-link-lib={}", library_name); - println!("cargo:rerun-if-changed={}", header_file.display()); - println!("cargo:rustc-env=LD_LIBRARY_PATH={}", library_path.display()); - - let header = header_file.to_str().expect("Can't convert path to string"); - - let bindings = bindgen::Builder::default() - .header(header) - .parse_callbacks(Box::new(bindgen::CargoCallbacks)) - .generate() - .expect("Can't generate bindings"); - - let out_dir = env::var("OUT_DIR").expect("Can't read environment variable 'OUT_DIR'"); - let output_path = PathBuf::from(out_dir); - - bindings - .write_to_file(output_path.join("bindings.rs")) - .expect("Can't write bindings"); - - Ok(()) -} diff --git a/taxel-bindings/src/ericapi.rs b/taxel-bindings/src/ericapi.rs deleted file mode 100644 index fdc5305..0000000 --- a/taxel-bindings/src/ericapi.rs +++ /dev/null @@ -1,42 +0,0 @@ -#![allow(non_upper_case_globals)] -#![allow(non_camel_case_types)] -#![allow(non_snake_case)] -#![allow(dead_code)] -// TODO: extern block uses type u128, which is not FFI-safe -#![allow(improper_ctypes)] - -include!(concat!(env!("OUT_DIR"), "/bindings.rs")); - -#[cfg(test)] -mod tests { - use super::*; - use std::env; - use taxel_util::ToCString; - - #[test] - fn test_ericapi() { - let plugin_path = env::var("PLUGIN_PATH") - .expect("Missing environment variable 'PLUGIN_PATH'") - .try_to_cstring() - .unwrap(); - - let log_path = env::current_dir() - .unwrap() - .to_str() - .unwrap() - .try_to_cstring() - .unwrap(); - - unsafe { - let error_code = EricInitialisiere(plugin_path.as_ptr(), log_path.as_ptr()); - assert_eq!(error_code, 0); - - let buffer = EricRueckgabepufferErzeugen(); - let error_code = EricVersion(buffer); - assert_eq!(error_code, 0); - - let error_code = EricBeende(); - assert_eq!(error_code, 0); - } - } -} diff --git a/taxel-bindings/src/lib.rs b/taxel-bindings/src/lib.rs deleted file mode 100644 index c73d3e0..0000000 --- a/taxel-bindings/src/lib.rs +++ /dev/null @@ -1,12 +0,0 @@ -//! Rust bindings for the ELSTER Rich Client (ERiC) - -// TODO: Fix https://github.com/rust-lang/cargo/issues/6313 - -mod ericapi; - -pub use ericapi::{ - eric_druck_parameter_t, eric_verschluesselungs_parameter_t, EricBearbeiteVorgang, EricBeende, - EricCloseHandleToCertificate, EricDekodiereDaten, EricGetHandleToCertificate, - EricInitialisiere, EricReturnBufferApi, EricRueckgabepufferErzeugen, - EricRueckgabepufferFreigeben, EricRueckgabepufferInhalt, EricZertifikatHandle, -}; diff --git a/taxel-cli/Cargo.toml b/taxel-cli/Cargo.toml index c0d90af..425d72c 100644 --- a/taxel-cli/Cargo.toml +++ b/taxel-cli/Cargo.toml @@ -12,7 +12,7 @@ name = "taxel" integration-test = [] [dependencies] -taxel = { version = "0.1.0", path = "../taxel" } +eric-sdk = "0.3.1" taxel-xml = { version = "0.1.0", path = "../taxel-xml" } anyhow = { workspace = true } log = { workspace = true } diff --git a/taxel-cli/src/arg.rs b/taxel-cli/src/arg.rs index 7573306..5d25327 100644 --- a/taxel-cli/src/arg.rs +++ b/taxel-cli/src/arg.rs @@ -13,8 +13,6 @@ pub const LOG_DIR: &str = "log-dir"; pub const TAX_TYPE: &str = "tax-type"; pub const TAX_VERSION: &str = "tax-version"; pub const PRINT: &str = "print"; -pub const CERTIFICATE_FILE: &str = "certificate-file"; -pub const PASSWORD: &str = "password"; pub fn get_one<'a>(matches: &'a ArgMatches, id: &str) -> Result<&'a str, anyhow::Error> { match matches.get_one::(id) { @@ -97,19 +95,3 @@ pub fn print() -> Arg<'static> { .takes_value(true) .help("Print the transmission confirmation as pdf file.") } - -pub fn certificate_file() -> Arg<'static> { - Arg::new(CERTIFICATE_FILE) - .long(CERTIFICATE_FILE) - .required(true) - .takes_value(true) - .help("The certificate (*.pfx) for encrypting and decrypting tax data.") -} - -pub fn password() -> Arg<'static> { - Arg::new(PASSWORD) - .long(PASSWORD) - .required(true) - .takes_value(true) - .help("The password for using the certificate (*.pfx).") -} diff --git a/taxel-cli/src/cmd/extract.rs b/taxel-cli/src/cmd/extract.rs index b848c76..96adda4 100644 --- a/taxel-cli/src/cmd/extract.rs +++ b/taxel-cli/src/cmd/extract.rs @@ -2,6 +2,7 @@ use crate::arg::{self, OUTPUT_FILE, XML_FILE}; use clap::{Arg, ArgMatches}; +use log::debug; use std::{env::current_dir, fs::File, io::BufReader, path::PathBuf}; use taxel_xml::{CsvWriterBuilder, Reader}; diff --git a/taxel-cli/src/cmd/generate.rs b/taxel-cli/src/cmd/generate.rs index b8187a5..ed7aeb5 100644 --- a/taxel-cli/src/cmd/generate.rs +++ b/taxel-cli/src/cmd/generate.rs @@ -2,6 +2,7 @@ use crate::arg; use clap::{Arg, ArgMatches}; +use log::debug; use std::{ env::current_dir, fs::File, diff --git a/taxel-cli/src/cmd/mod.rs b/taxel-cli/src/cmd/mod.rs index 19249f3..d2c4a0b 100644 --- a/taxel-cli/src/cmd/mod.rs +++ b/taxel-cli/src/cmd/mod.rs @@ -1,6 +1,7 @@ mod extract; mod generate; mod send; +mod utils; mod validate; pub use extract::{extract, extract_args}; diff --git a/taxel-cli/src/cmd/send.rs b/taxel-cli/src/cmd/send.rs index 25aac85..3cac758 100644 --- a/taxel-cli/src/cmd/send.rs +++ b/taxel-cli/src/cmd/send.rs @@ -1,18 +1,21 @@ //! Validate xml file according to the given taxonomy and send xml file to the //! tax authorities. +use super::utils; use crate::arg; use clap::{Arg, ArgMatches}; -use std::{env::current_dir, path::PathBuf}; -use taxel::{CertificateConfig, Eric, PrintConfig, ProcessingFlag}; - -pub fn send_args() -> [Arg<'static>; 7] { +use eric_sdk::Eric; +use std::{ + env::current_dir, + fs, + path::{Path, PathBuf}, +}; + +pub fn send_args() -> [Arg<'static>; 5] { [ arg::tax_type(), arg::tax_version(), arg::xml_file(), - arg::certificate_file(), - arg::password(), arg::print(), arg::log_dir(), ] @@ -22,40 +25,25 @@ pub fn send(matches: &ArgMatches) -> Result<(), anyhow::Error> { let xml_file = arg::get_one(matches, arg::XML_FILE)?; let tax_type = arg::get_one(matches, arg::TAX_TYPE)?; let tax_version = arg::get_one(matches, arg::TAX_VERSION)?; - let certificate_file = arg::get_one(matches, arg::CERTIFICATE_FILE)?; - let password = arg::get_one(matches, arg::PASSWORD)?; let log_dir = arg::get_maybe_one(matches, arg::LOG_DIR); - let type_version = format!("{}_{}", tax_type, tax_version); - let processing_flag: ProcessingFlag; let log_path = match log_dir { Some(log_dir) => PathBuf::from(log_dir), None => current_dir()?, }; - - let eric = Eric::new(&log_path)?; - - let certificate_config = CertificateConfig::new(certificate_file, password)?; - let print_config = if matches.contains_id(arg::PRINT) { - processing_flag = ProcessingFlag::SendAndPrint; let pdf_name = arg::get_one(matches, arg::PRINT)?; - Some(PrintConfig::new(pdf_name, &processing_flag)?) + Some(pdf_name) } else { - processing_flag = ProcessingFlag::Send; None }; + let xml_path = Path::new(xml_file); + let xml = fs::read_to_string(xml_path)?; - let xml = taxel::read(xml_file)?; + let eric = Eric::new(&log_path)?; - let response = eric.send( - xml, - type_version, - processing_flag, - certificate_config, - print_config, - )?; + let response = eric.send(xml, tax_type, tax_version, print_config)?; - eric.log(&log_path, &response)?; + utils::log_response(&log_path, &response)?; Ok(()) } diff --git a/taxel-cli/src/cmd/utils.rs b/taxel-cli/src/cmd/utils.rs new file mode 100644 index 0000000..2716b3d --- /dev/null +++ b/taxel-cli/src/cmd/utils.rs @@ -0,0 +1,31 @@ +use eric_sdk::EricResponse; +use std::{fs::File, io::Write, path::Path}; + +pub fn log_response(log_path: &Path, response: &EricResponse) -> Result<(), anyhow::Error> { + println!("Response code: {}", response.error_code); + + let validation_response_path = log_path.join("validation_response.xml"); + let server_response_path = log_path.join("server_response.xml"); + + if !response.validation_response.is_empty() { + println!( + "Logging validation result to '{}'", + validation_response_path.display() + ); + } + + if !response.server_response.is_empty() { + println!( + "Logging server reponse to '{}'", + server_response_path.display() + ); + } + + let mut validation_response_file = File::create(validation_response_path)?; + let mut server_response_file = File::create(server_response_path)?; + + validation_response_file.write_all(response.validation_response.as_bytes())?; + server_response_file.write_all(response.server_response.as_bytes())?; + + Ok(()) +} diff --git a/taxel-cli/src/cmd/validate.rs b/taxel-cli/src/cmd/validate.rs index b8c72be..7d4aadd 100644 --- a/taxel-cli/src/cmd/validate.rs +++ b/taxel-cli/src/cmd/validate.rs @@ -1,9 +1,14 @@ //! Validate xml file according to the given taxonomy. +use super::utils; use crate::arg; use clap::{Arg, ArgMatches}; -use std::{env::current_dir, path::PathBuf}; -use taxel::{Eric, PrintConfig, ProcessingFlag}; +use eric_sdk::Eric; +use std::{ + env::current_dir, + fs, + path::{Path, PathBuf}, +}; pub fn validate_args() -> [Arg<'static>; 5] { [ @@ -20,29 +25,24 @@ pub fn validate(matches: &ArgMatches) -> Result<(), anyhow::Error> { let tax_type = arg::get_one(matches, arg::TAX_TYPE)?; let tax_version = arg::get_one(matches, arg::TAX_VERSION)?; let log_dir = arg::get_maybe_one(matches, arg::LOG_DIR); - let type_version = format!("{}_{}", tax_type, tax_version); - let processing_flag: ProcessingFlag; let log_path = match log_dir { Some(log_dir) => PathBuf::from(log_dir), None => current_dir()?, }; - let print_config = if matches.contains_id(arg::PRINT) { - processing_flag = ProcessingFlag::Print; let pdf_name = arg::get_one(matches, arg::PRINT)?; - Some(PrintConfig::new(pdf_name, &processing_flag)?) + Some(pdf_name) } else { - processing_flag = ProcessingFlag::Validate; None }; - - let xml = taxel::read(xml_file)?; + let xml_path = Path::new(xml_file); + let xml = fs::read_to_string(xml_path)?; let eric = Eric::new(&log_path)?; - let response = eric.validate(xml, type_version, processing_flag, print_config)?; + let response = eric.validate(xml, tax_type, tax_version, print_config)?; - eric.log(&log_path, &response)?; + utils::log_response(&log_path, &response)?; Ok(()) } diff --git a/taxel-cli/src/lib.rs b/taxel-cli/src/lib.rs new file mode 100644 index 0000000..f1c8317 --- /dev/null +++ b/taxel-cli/src/lib.rs @@ -0,0 +1,35 @@ +pub mod arg; +pub mod cmd; + +use clap::{crate_version, App, SubCommand}; + +pub fn app() -> App<'static> { + App::new(cmd::BIN) + .version(crate_version!()) + .arg( + clap::Arg::with_name(arg::VERBOSE) + .long(arg::VERBOSE) + .takes_value(false) + .help("Shows what is going on"), + ) + .subcommand( + SubCommand::with_name(cmd::EXTRACT) + .args(cmd::extract_args()) + .about("Extract tag values from xml file"), + ) + .subcommand( + SubCommand::with_name(cmd::GENERATE) + .args(cmd::generate_args()) + .about("Generate xml file"), + ) + .subcommand( + SubCommand::with_name(cmd::VALIDATE) + .args(cmd::validate_args()) + .about("Validate xml file"), + ) + .subcommand( + SubCommand::with_name(cmd::SEND) + .args(cmd::send_args()) + .about("Validate and send xml file"), + ) +} diff --git a/taxel-cli/src/main.rs b/taxel-cli/src/main.rs index 9883537..c482ac2 100644 --- a/taxel-cli/src/main.rs +++ b/taxel-cli/src/main.rs @@ -1,8 +1,5 @@ -mod arg; -mod cmd; - use anyhow::anyhow; -use clap::{crate_version, App, SubCommand}; +use taxel_cli::{app, arg, cmd}; #[macro_use] extern crate log; @@ -24,34 +21,3 @@ fn main() -> Result<(), anyhow::Error> { _ => Err(anyhow!("Subcommand not found")), } } - -pub fn app() -> App<'static> { - App::new(cmd::BIN) - .version(crate_version!()) - .arg( - clap::Arg::with_name(arg::VERBOSE) - .long(arg::VERBOSE) - .takes_value(false) - .help("Shows what is going on"), - ) - .subcommand( - SubCommand::with_name(cmd::EXTRACT) - .args(cmd::extract_args()) - .about("Extract tag values from xml file"), - ) - .subcommand( - SubCommand::with_name(cmd::GENERATE) - .args(cmd::generate_args()) - .about("Generate xml file"), - ) - .subcommand( - SubCommand::with_name(cmd::VALIDATE) - .args(cmd::validate_args()) - .about("Validate xml file"), - ) - .subcommand( - SubCommand::with_name(cmd::SEND) - .args(cmd::send_args()) - .about("Validate and send xml file"), - ) -} diff --git a/taxel/Cargo.toml b/taxel/Cargo.toml deleted file mode 100644 index b9bfe20..0000000 --- a/taxel/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "taxel" -version = "0.1.0" -authors.workspace = true -edition.workspace = true - -[lib] -path = "src/lib.rs" -name = "taxel" - -[features] -integration-test = [] - -[dependencies] -taxel-bindings = { version = "0.1.0", path = "../taxel-bindings" } -taxel-util = { version = "0.1.0", path = "../taxel-util" } -anyhow = { workspace = true } - -[dev-dependencies] -roxmltree = { workspace = true } diff --git a/taxel/src/certificate.rs b/taxel/src/certificate.rs deleted file mode 100644 index 9d10a30..0000000 --- a/taxel/src/certificate.rs +++ /dev/null @@ -1,42 +0,0 @@ -use crate::ErrorCode; -use anyhow::anyhow; -use std::{ffi::CStr, ptr}; -use taxel_bindings::{EricCloseHandleToCertificate, EricGetHandleToCertificate}; - -pub struct Certificate { - pub handle: u32, -} - -impl Certificate { - pub fn new(path: &CStr) -> Result { - println!("Preparing certificate '{}'", path.to_str()?); - - let mut handle = 0; - let pin_support = ptr::null::() as *mut u32; - - // SAFETY: path.as_ptr() is not dangling as path is allocated in struct CertificateConfig and path is not moved as a reference to the CString is given - let error_code = - unsafe { EricGetHandleToCertificate(&mut handle, pin_support, path.as_ptr()) }; - - match error_code { - x if x == ErrorCode::ERIC_OK as i32 => Ok(Certificate { handle }), - error_code => Err(anyhow!("Can't create certificate: {}", error_code)), - } - } - - // TODO: check validity of certificate - // unsafe { EricHoleZertifikatseigenschaften() } -} - -impl Drop for Certificate { - fn drop(&mut self) { - println!("Cleaning up certificate"); - - let error_code = unsafe { EricCloseHandleToCertificate(self.handle) }; - - match error_code { - x if x == ErrorCode::ERIC_OK as i32 => (), - error_code => panic!("Can't drop certificate handle: {}", error_code), - } - } -} diff --git a/taxel/src/config.rs b/taxel/src/config.rs deleted file mode 100644 index 700c720..0000000 --- a/taxel/src/config.rs +++ /dev/null @@ -1,112 +0,0 @@ -use crate::{certificate::Certificate, Preview, ProcessingFlag}; -use std::{ - ffi::{CStr, CString}, - path::Path, - ptr, -}; -use taxel_bindings::{eric_druck_parameter_t, eric_verschluesselungs_parameter_t}; -use taxel_util::ToCString; - -pub struct CertificateConfig { - // allocate path as CString - pub path: CString, - // allocate password as CString - pub password: CString, - pub certificate: Certificate, - pub certificate_parameter: CertificateParameter, -} - -impl CertificateConfig { - pub fn new(path: &str, password: &str) -> Result { - let path = Path::new(path).try_to_cstring()?; - let password = password.try_to_cstring()?; - let certificate = Certificate::new(&path)?; - let certificate_parameter = CertificateParameter::new(&certificate, &password); - - Ok(Self { - path, - password, - certificate, - certificate_parameter, - }) - } -} - -// CertificateParameter is a wrapper type to keep C memory alignment for eric_verschluesselungs_parameter_t -#[derive(Debug)] -#[repr(C)] -pub struct CertificateParameter { - inner: eric_verschluesselungs_parameter_t, -} - -impl CertificateParameter { - pub fn new(certificate: &Certificate, password: &CStr) -> Self { - let certificate_parameter = eric_verschluesselungs_parameter_t { - abrufCode: ptr::null(), - // SAFETY: password.as_ptr() is not dangling as password is allocated in struct CertificateConfig and password is not moved as a reference to the CString is given - pin: password.as_ptr(), - version: 2, - zertifikatHandle: certificate.handle, - }; - - Self { - inner: certificate_parameter, - } - } - - pub fn as_ptr(&self) -> *const eric_verschluesselungs_parameter_t { - &self.inner - } -} - -#[derive(Debug)] -pub struct PrintConfig { - // allocate pdf_name as CString - pub pdf_name: CString, - pub print_parameter: PrintParameter, -} - -impl PrintConfig { - pub fn new(pdf_name: &str, processing_flag: &ProcessingFlag) -> Result { - let pdf_path = Path::new(pdf_name).try_to_cstring()?; - let print_parameter = PrintParameter::new(&pdf_path, processing_flag); - - Ok(Self { - pdf_name: pdf_path, - print_parameter, - }) - } -} - -// PrintParameter is a wrapper type to keep C memory alignment for eric_druck_parameter_t -#[derive(Debug)] -#[repr(C)] -pub struct PrintParameter { - inner: eric_druck_parameter_t, -} - -impl PrintParameter { - pub fn new(pdf_name: &CStr, processing_flag: &ProcessingFlag) -> Self { - let print_parameter = eric_druck_parameter_t { - version: 2, - vorschau: match processing_flag { - ProcessingFlag::Validate => Preview::Yes as u32, - ProcessingFlag::Print => Preview::Yes as u32, - _ => Preview::No as u32, - }, - ersteSeite: 0, - duplexDruck: 0, - // SAFETY: pdf_name.as_ptr() is not dangling as pdf_name is allocated in struct PrintConfig and pdf_name is not moved as a reference to the CString is given - pdfName: pdf_name.as_ptr(), - fussText: ptr::null(), - }; - - Self { - inner: print_parameter, - } - } - - pub fn as_ptr(&self) -> *const eric_druck_parameter_t { - &self.inner - } -} diff --git a/taxel/src/eric.rs b/taxel/src/eric.rs deleted file mode 100644 index 343763c..0000000 --- a/taxel/src/eric.rs +++ /dev/null @@ -1,300 +0,0 @@ -use crate::{ - config::{CertificateConfig, PrintConfig}, - processing::process, - response_buffer::ResponseBuffer, - EricResponse, ErrorCode, ProcessingFlag, -}; -use anyhow::{anyhow, Context}; -use std::{ - env::{self}, - fs::File, - io::Write, - path::Path, -}; -use taxel_bindings::{EricBeende, EricDekodiereDaten, EricInitialisiere}; -use taxel_util::ToCString; - -#[derive(Debug)] -pub struct Eric; - -impl Eric { - pub fn new(log_path: &Path) -> Result { - println!("Initializing eric"); - - let plugin_path = - env::var("PLUGIN_PATH").context("Missing environment variable 'PLUGIN_PATH'")?; - let plugin_path = Path::new(&plugin_path); - - println!("Setting plugin path '{}'", plugin_path.display()); - println!("Setting log path '{}'", log_path.display()); - println!("Logging to '{}'", log_path.join("eric.log").display()); - - let plugin_path = plugin_path.try_to_cstring()?; - let log_path = log_path.try_to_cstring()?; - - let error_code = unsafe { EricInitialisiere(plugin_path.as_ptr(), log_path.as_ptr()) }; - - match error_code { - x if x == ErrorCode::ERIC_OK as i32 => Ok(Eric), - error_code => Err(anyhow!("Can't init eric: {}", error_code)), - } - } - - pub fn validate( - &self, - xml: String, - type_version: String, - processing_flag: ProcessingFlag, - print_config: Option, - ) -> Result { - process(xml, type_version, processing_flag, print_config, None, None) - } - - pub fn send( - &self, - xml: String, - type_version: String, - processing_flag: ProcessingFlag, - certificate_config: CertificateConfig, - print_config: Option, - ) -> Result { - process( - xml, - type_version, - processing_flag, - print_config, - Some(certificate_config), - None, - ) - } - - pub fn log(&self, log_path: &Path, response: &EricResponse) -> Result<(), anyhow::Error> { - println!("Response code: {}", response.error_code); - - let validation_response_path = log_path.join("validation_response.xml"); - let server_response_path = log_path.join("server_response.xml"); - - if !response.validation_response.is_empty() { - println!( - "Logging validation result to '{}'", - validation_response_path.display() - ); - } - - if !response.server_response.is_empty() { - println!( - "Logging server reponse to '{}'", - server_response_path.display() - ); - } - - let mut validation_response_file = File::create(validation_response_path)?; - let mut server_response_file = File::create(server_response_path)?; - - validation_response_file.write_all(response.validation_response.as_bytes())?; - server_response_file.write_all(response.server_response.as_bytes())?; - - Ok(()) - } - - pub fn decrypt( - &self, - encrypted_file: &str, - certificate_config: CertificateConfig, - ) -> Result { - let encrypted_data = encrypted_file.try_to_cstring()?; - let response_buffer = ResponseBuffer::new()?; - - let error_code = unsafe { - EricDekodiereDaten( - certificate_config.certificate.handle, - certificate_config.password.as_ptr(), - encrypted_data.as_ptr(), - response_buffer.as_ptr(), - ) - }; - - Ok(error_code) - } -} - -impl Drop for Eric { - fn drop(&mut self) { - println!("Closing eric"); - - // TODO: implement EricEntladePlugins - - let error_code = unsafe { EricBeende() }; - - match error_code { - x if x == ErrorCode::ERIC_OK as i32 => (), - error_code => panic!("Can't close eric: {}", error_code), - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - use roxmltree::Document; - use std::{ - env::current_dir, - fs::{self}, - }; - - #[test] - fn test_new() { - let log_path = current_dir().unwrap(); - let res = Eric::new(&log_path); - - println!("{:#?}", res); - assert!(res.is_ok()); - - // eric goes out of scope here and is closed automatically (via implementation of Drop) - } - - #[test] - fn test_validate() { - let xml_path = "../test_data/taxonomy/v6.5/SteuerbilanzAutoverkaeufer_PersG.xml"; - let xml = fs::read_to_string(xml_path).unwrap(); - let type_version = "Bilanz_6.5".to_string(); - let processing_flag = ProcessingFlag::Validate; - let print_config = None; - let log_path = current_dir().unwrap(); - - let eric = Eric::new(&log_path).unwrap(); - - let res = eric.validate(xml, type_version, processing_flag, print_config); - - println!("{:#?}", res); - assert!(res.is_ok()); - - let response = res.unwrap(); - - eric.log(&log_path, &response).unwrap(); - - assert_eq!(response.error_code, ErrorCode::ERIC_OK as i32); - - let doc = Document::parse(&response.validation_response).unwrap(); - println!("Doc: {:#?}", doc); - let node = doc.descendants().find(|node| node.has_tag_name("Erfolg")); - assert!(node.is_some()); - let node = node.unwrap(); - assert_eq!(node.tag_name().name(), "Erfolg"); - - assert!(response.server_response.is_empty()); - } - - #[test] - #[cfg_attr(not(feature = "integration-test"), ignore)] - fn test_validate_and_print() { - let xml_path = "../test_data/taxonomy/v6.5/SteuerbilanzAutoverkaeufer_PersG.xml"; - let xml = fs::read_to_string(xml_path).unwrap(); - let type_version = "Bilanz_6.5".to_string(); - let processing_flag = ProcessingFlag::Print; - let print_config = PrintConfig::new("ebilanz.pdf", &processing_flag).unwrap(); - let log_path = current_dir().unwrap(); - - let eric = Eric::new(&log_path).unwrap(); - - let res = eric.validate(xml, type_version, processing_flag, Some(print_config)); - - println!("{:#?}", res); - assert!(res.is_ok()); - - let response = res.unwrap(); - - eric.log(&log_path, &response).unwrap(); - - assert_eq!(response.error_code, ErrorCode::ERIC_OK as i32); - - let doc = Document::parse(&response.validation_response).unwrap(); - println!("Doc: {:#?}", doc); - let node = doc.descendants().find(|node| node.has_tag_name("Erfolg")); - assert!(node.is_some()); - let node = node.unwrap(); - assert_eq!(node.tag_name().name(), "Erfolg"); - - assert!(response.server_response.is_empty()); - } - - #[test] - #[cfg_attr(not(feature = "integration-test"), ignore)] - fn test_send() { - let log_path = current_dir().unwrap(); - let eric = Eric::new(&log_path).unwrap(); - let xml_path = "../test_data/taxonomy/v6.5/SteuerbilanzAutoverkaeufer_PersG.xml"; - let xml = fs::read_to_string(xml_path).unwrap(); - let type_version = "Bilanz_6.5".to_string(); - let certificate_path = "../test_data/test-certificate.pfx"; - let certificate_password = "123456"; - let certificate_config = - CertificateConfig::new(certificate_path, certificate_password).unwrap(); - let processing_flag = ProcessingFlag::Send; - let print_config = None; - - let res = eric.send( - xml, - type_version, - processing_flag, - certificate_config, - print_config, - ); - - println!("{:#?}", res); - assert!(res.is_ok()); - - let response = res.unwrap(); - - eric.log(&log_path, &response).unwrap(); - - assert_eq!(response.error_code, ErrorCode::ERIC_OK as i32); - - let doc = Document::parse(&response.validation_response).unwrap(); - println!("Doc: {:#?}", doc); - let node = doc.descendants().find(|node| node.has_tag_name("Erfolg")); - assert!(node.is_some()); - let node = node.unwrap(); - assert_eq!(node.tag_name().name(), "Erfolg"); - } - - #[test] - #[cfg_attr(not(feature = "integration-test"), ignore)] - fn test_send_and_print() { - let log_path = current_dir().unwrap(); - let eric = Eric::new(&log_path).unwrap(); - let xml_path = "../test_data/taxonomy/v6.5/SteuerbilanzAutoverkaeufer_PersG.xml"; - let xml = fs::read_to_string(xml_path).unwrap(); - let type_version = "Bilanz_6.5".to_string(); - let certificate_path = "../test_data/test-certificate.pfx"; - let certificate_password = "123456"; - let certificate_config = - CertificateConfig::new(certificate_path, certificate_password).unwrap(); - let processing_flag = ProcessingFlag::Print; - let print_config = PrintConfig::new("ebilanz.pdf", &processing_flag).unwrap(); - - let res = eric.send( - xml, - type_version, - processing_flag, - certificate_config, - Some(print_config), - ); - - println!("{:#?}", res); - assert!(res.is_ok()); - - let response = res.unwrap(); - - eric.log(&log_path, &response).unwrap(); - - assert_eq!(response.error_code, ErrorCode::ERIC_OK as i32); - - let doc = Document::parse(&response.validation_response).unwrap(); - println!("Doc: {:#?}", doc); - let node = doc.descendants().find(|node| node.has_tag_name("Erfolg")); - assert!(node.is_some()); - let node = node.unwrap(); - assert_eq!(node.tag_name().name(), "Erfolg"); - } -} diff --git a/taxel/src/error_code.rs b/taxel/src/error_code.rs deleted file mode 100644 index 923c63e..0000000 --- a/taxel/src/error_code.rs +++ /dev/null @@ -1,1083 +0,0 @@ -#![allow(non_camel_case_types)] - -pub enum ErrorCode { - /** - * [0] Verarbeitung fehlerfrei. - */ - ERIC_OK = 0, - - /** - * [610001001] Verarbeitung fehlerhaft, keine genaueren Informationen vorhanden. Details stehen ggf. im Logfile (eric.log). - */ - ERIC_GLOBAL_UNKNOWN = 610001001, - - /** - * [610001002] Fehler während der Plausibilitätsprüfung, Datensatz nicht plausibel. Zur Ermittlung der fehlgeschlagenen Plausibiltätsprüfungen muss der Rückgabepuffer (Parameter "rueckgabeXmlPuffer") ausgewertet werden. - */ - ERIC_GLOBAL_PRUEF_FEHLER = 610001002, - - /** - * [610001003] Hinweise während der Plausibilitätsprüfung, Datensatz ist aber plausibel. Zur Ermittlung der anzuzeigenden Hinweise muss der Rückgabepuffer (Parameter "rueckgabeXmlPuffer") ausgewertet werden. - */ - ERIC_GLOBAL_HINWEISE = 610001003, - - /** - * [610001007] Keine Klartextfehlermeldung vorhanden. - */ - ERIC_GLOBAL_FEHLERMELDUNG_NICHT_VORHANDEN = 610001007, - - /* - * [610001008] Für den übergebenen Wert sind keine Daten vorhanden. - */ - ERIC_GLOBAL_KEINE_DATEN_VORHANDEN = 610001008, - - /** - * [610001013] Es ist nicht genügend Arbeitsspeicher vorhanden. - */ - ERIC_GLOBAL_NICHT_GENUEGEND_ARBEITSSPEICHER = 610001013, - - /** - * [610001014] Datei nicht gefunden. - */ - ERIC_GLOBAL_DATEI_NICHT_GEFUNDEN = 610001014, - - /** - * [610001016] Für dieses Verfahren/diese Datenart ist eine Bearbeitung mit der angegebenen HerstellerID nicht erlaubt. - */ - ERIC_GLOBAL_HERSTELLER_ID_NICHT_ERLAUBT = 610001016, - - /** - * [610001017] Ungültiger Zustand. - */ - ERIC_GLOBAL_ILLEGAL_STATE = 610001017, - - /** - * [610001018] Die aufgerufene Funktion ist nicht erlaubt. - */ - ERIC_GLOBAL_FUNKTION_NICHT_ERLAUBT = 610001018, - - /** - * [610001019] Für dieses Verfahren/diese Datenart/diese Test-HerstellerID/diese ERiC-Einstellungen sind Echtfälle nicht erlaubt. - */ - ERIC_GLOBAL_ECHTFALL_NICHT_ERLAUBT = 610001019, - - /** - * [610001020] Der Versand von Echtfällen (= Fällen ohne gesetzten Testmerker) ist mit einer BETA-Version nicht möglich. - */ - ERIC_GLOBAL_NO_VERSAND_IN_BETA_VERSION = 610001020, - - /** - * [610001025] Der übergebene Testmerker ist für das angegebene Verfahren nicht zulässig. - */ - ERIC_GLOBAL_TESTMERKER_UNGUELTIG = 610001025, - - /** - * [610001026] Der zu versendende Datensatz ist zu groß. - */ - ERIC_GLOBAL_DATENSATZ_ZU_GROSS = 610001026, - - /** - * [610001027] Der Verschlüsselungsparameter darf nur bei authentifiziertem Versand angegeben werden. - */ - ERIC_GLOBAL_VERSCHLUESSELUNGS_PARAMETER_NICHT_ERLAUBT = 610001027, - - /** - * [610001028] Bei der angegebenen Versandart sind nur Portal-Zertifikate erlaubt. - */ - ERIC_GLOBAL_NUR_PORTALZERTIFIKAT_ERLAUBT = 610001028, - - /** - * [610001029] Für die übermittelte Datenart ist die Angabe eines Abrufcodes nicht zulässig, daher muss für den Abrufcode der Wert NULL übergeben werden. - */ - ERIC_GLOBAL_ABRUFCODE_NICHT_ERLAUBT = 610001029, - - /** - * [610001030] Es ist ein Fehler bei der Umwandlung nach XML aufgetreten. - */ - ERIC_GLOBAL_ERROR_XML_CREATE = 610001030, - - /** - * [610001031] Die Größe des Textpuffers kann nicht verändert werden. - */ - ERIC_GLOBAL_TEXTPUFFERGROESSE_FIX = 610001031, - - /** - * [610001032] Interner Fehler aufgetreten. Details stehen ggf. im Logfile (eric.log). - */ - ERIC_GLOBAL_INTERNER_FEHLER = 610001032, - - /** - * [610001033] Bei einer arithmetischen Operation ist ein Fehler aufgetreten. Details stehen im Logile (eric.log) - */ - ERIC_GLOBAL_ARITHMETIKFEHLER = 610001033, - - /** - * [610001034] Ungültige Steuernummer. - */ - ERIC_GLOBAL_STEUERNUMMER_UNGUELTIG = 610001034, - - /** - * [610001035] Ungültige Steuernummer: Es werden 13 Stellen erwartet. - */ - ERIC_GLOBAL_STEUERNUMMER_FALSCHE_LAENGE = 610001035, - - /** - * [610001036] Ungültige Steuernummer: Es werden nur Ziffern erwartet. - */ - ERIC_GLOBAL_STEUERNUMMER_NICHT_NUMERISCH = 610001036, - - /** - * [610001037] Ungültige Landesnummer. - */ - ERIC_GLOBAL_LANDESNUMMER_UNBEKANNT = 610001037, - - /** - * [610001038] Ungültige Bundesfinanzamtsnummer. - */ - ERIC_GLOBAL_BUFANR_UNBEKANNT = 610001038, - - /** - * [610001039] Ungültige Bundesfinanzamtsnummer. - */ - ERIC_GLOBAL_LANDESNUMMER_BUFANR = 610001039, - - /** - * [610001040] Ein Puffer-Handle wurde mehrfach übergeben. - */ - ERIC_GLOBAL_PUFFER_ZUGRIFFSKONFLIKT = 610001040, - - /** - * [610001041] Es wurde versucht, einen Puffer über die maximal mögliche Länge hinaus zu beschreiben. - */ - ERIC_GLOBAL_PUFFER_UEBERLAUF = 610001041, - - /** - * [610001042] Die übergebene Datenartversion ist unbekannt. Beachten Sie bitte, dass die Datenartversion case-sensitive ist. - */ - ERIC_GLOBAL_DATENARTVERSION_UNBEKANNT = 610001042, - - /** - * [610001044] Die übergebene Datenartversion passt nicht zum Eingangs-XML. Details stehen ggf. im Logfile (eric.log). - */ - ERIC_GLOBAL_DATENARTVERSION_XML_INKONSISTENT = 610001044, - - /** - * [610001045] Das Plugin 'commonData' konnte nicht geladen werden oder bietet einen benötigten Service nicht an. Details stehen im Logfile (eric.log). - */ - ERIC_GLOBAL_COMMONDATA_NICHT_VERFUEGBAR = 610001045, - - /** - * [610001046] Beim Schreiben in die Protokolldatei ist eine Ausnahme aufgetreten. - */ - ERIC_GLOBAL_LOG_EXCEPTION = 610001046, - - /** - * [610001047] Für diese Datenart darf im TransferHeader kein TransportSchluessel angegeben werden. - */ - ERIC_GLOBAL_TRANSPORTSCHLUESSEL_NICHT_ERLAUBT = 610001047, - - /** - * [610001048] Der übergebene öffentliche Schlüssel kann nicht eingelesen werden. - */ - ERIC_GLOBAL_OEFFENTLICHER_SCHLUESSEL_UNGUELTIG = 610001048, - - /** - * [610001049] Der Typ des im TransferHeader angegebenen Transportschlüssels ist für diese Datenart nicht erlaubt. - */ - ERIC_GLOBAL_TRANSPORTSCHLUESSEL_TYP_FALSCH = 610001049, - - /** - * [610001050] Das übergebene Puffer-Handle wurde nicht mit der vorliegenden Instanz erzeugt. - */ - ERIC_GLOBAL_PUFFER_UNGLEICHER_INSTANZ = 610001050, - - /** - * [610001051] Das Element "Vorsatz" enthält ungültige Werte, Details stehen im Logfile (eric.log). - */ - ERIC_GLOBAL_VORSATZ_UNGUELTIG = 610001051, - - /** - * [610001053] Auf eine Datei konnte nicht in gewünschter Weise zugegriffen werden. Details stehen im Logile (eric.log) - */ - ERIC_GLOBAL_DATEIZUGRIFF_VERWEIGERT = 610001053, - - /** - * [610001080] Die übergebene Instanz ist gleich NULL oder bereits freigegeben worden. - */ - ERIC_GLOBAL_UNGUELTIGE_INSTANZ = 610001080, - - /** - * [610001081] Der Singlethread-ERiC wurde nicht mit EricInitialisiere initialisiert. - */ - ERIC_GLOBAL_NICHT_INITIALISIERT = 610001081, - - /** - * [610001082] Der Singlethread-ERiC wurde bereits mit EricInitialisiere initialisiert. - */ - ERIC_GLOBAL_MEHRFACHE_INITIALISIERUNG = 610001082, - - /** - * [610001083] Der angeforderte ERiC-Instanz konnte nicht erstellt werden. Details stehen ggf. im Logfile (eric.log). - */ - ERIC_GLOBAL_FEHLER_INITIALISIERUNG = 610001083, - - /** - * [610001102] Unbekannter Parameterfehler. - */ - ERIC_GLOBAL_UNKNOWN_PARAMETER_ERROR = 610001102, - - /** - * [610001108] Defekter Nutzdatensatz. - */ - ERIC_GLOBAL_CHECK_CORRUPTED_NDS = 610001108, - - /** - * [610001206] Verschlüsselter/authentifizierter Versand gewünscht, aber keine notwendigen Verschlüsselungsparameter angegeben. - */ - ERIC_GLOBAL_VERSCHLUESSELUNGS_PARAMETER_NICHT_ANGEGEBEN = 610001206, - - /** - * [610001209] Es ist mehr als ein Versandflag angegeben. - */ - ERIC_GLOBAL_SEND_FLAG_MEHR_ALS_EINES = 610001209, - - /** - * [610001218] Die übergebene Kombination von Bearbeitungsflags ist nicht erlaubt. - */ - ERIC_GLOBAL_UNGUELTIGE_FLAG_KOMBINATION = 610001218, - - /** - * [610001220] Der Erste-Seite-Druck ist nur für Steuerberater bei nicht-authentifizierten Einkommenssteuerfällen ab Veranlagungszeitraum 2010 ohne Versandanforderung erlaubt. - */ - ERIC_GLOBAL_ERSTE_SEITE_DRUCK_NICHT_UNTERSTUETZT = 610001220, - - /** - * [610001222] Die angegebenen Parameter sind ungültig oder unvollständig. - */ - ERIC_GLOBAL_UNGUELTIGER_PARAMETER = 610001222, - - /** - * [610001224] Für das angegebene Verfahren wird der Druck nicht unterstützt. - */ - ERIC_GLOBAL_DRUCK_FUER_VERFAHREN_NICHT_ERLAUBT = 610001224, - - /** - * [610001225] Die Versandart ist für die angegebene Datenartversion nicht erlaubt. - */ - ERIC_GLOBAL_VERSAND_ART_NICHT_UNTERSTUETZT = 610001225, - - /** - * [610001226] Die Version eines der angegebenen Parameter ist ungültig. - */ - ERIC_GLOBAL_UNGUELTIGE_PARAMETER_VERSION = 610001226, - - /** - * [610001227] Für das Verfahren Datenabholung wurde ein illegales Transferhandle angegeben. - */ - ERIC_GLOBAL_TRANSFERHANDLE = 610001227, - - /** - * [610001228] Die Initialisierung eines Plugins ist fehlgeschlagen. - */ - ERIC_GLOBAL_PLUGININITIALISIERUNG = 610001228, - - /** - * [610001229] Die Versionen der im Logfile genannten ERiC-Dateien sind nicht kompatibel. (Siehe eric.log.) - */ - ERIC_GLOBAL_INKOMPATIBLE_VERSIONEN = 610001229, - - /** - * [610001230] Das im XML-Element "" angegebene Verschlüsselungsverfahren wird vom ERiC nicht unterstützt. - */ - ERIC_GLOBAL_VERSCHLUESSELUNGSVERFAHREN_NICHT_UNTERSTUETZT = 610001230, - - /** - * [610001231] Der Aufruf eine API-Funktion des ERiCs darf erst dann erfolgen, wenn ein vorheriger Aufruf zurückgekehrt ist. - */ - ERIC_GLOBAL_MEHRFACHAUFRUFE_NICHT_UNTERSTUETZT = 610001231, - - /** - * [610001404] Das Bundesland/Finanzamt mit der angegebenen Nummer nimmt bei der angegebenen Steuerart am ELSTER-Verfahren nicht teil. - */ - ERIC_GLOBAL_UTI_COUNTRY_NOT_SUPPORTED = 610001404, - - /** - * [610001501] Ungültige IBAN: IBAN muss aus zweistelligem Ländercode gefolgt von zweistelliger Prüfziffer gefolgt von der Basic Bank Account Number bestehen. - */ - ERIC_GLOBAL_IBAN_FORMALER_FEHLER = 610001501, - - /** - * [610001502] Ungültige IBAN: Der angegebene Ländercode ist ungültig oder wird aktuell im ELSTER-Verfahren nicht unterstützt. - */ - ERIC_GLOBAL_IBAN_LAENDERCODE_FEHLER = 610001502, - - /** - * [610001503] Ungültige IBAN: Die angegebene IBAN entspricht nicht dem für das angegebene Land definierten formalen Aufbau der IBAN oder die IBAN ist unzulässig. - */ - ERIC_GLOBAL_IBAN_LANDESFORMAT_FEHLER = 610001503, - - /** - * [610001504] Ungültige IBAN: Die Prüfziffernberechnung zur angegebenen IBAN führt zu einer abweichenden Prüfziffer. - */ - ERIC_GLOBAL_IBAN_PRUEFZIFFER_FEHLER = 610001504, - - /** - * [610001510] Ungültiger BIC: Der formale Aufbau des angegeben BIC ist ungültig. - */ - ERIC_GLOBAL_BIC_FORMALER_FEHLER = 610001510, - - /** - * [610001511] Ungültiger BIC: Der angegebene Ländercode ist ungültig oder wird aktuell im ELSTER-Verfahren nicht unterstützt. - */ - ERIC_GLOBAL_BIC_LAENDERCODE_FEHLER = 610001511, - - /** - * [610001519] Die angegebene Zulassungsnummer entspricht nicht den Längenvorgaben. Es sind maximal 6 Stellen erlaubt. - */ - ERIC_GLOBAL_ZULASSUNGSNUMMER_ZU_LANG = 610001519, - - /** - * [610001525] Die übergebene IDNummer ist ungültig. - */ - ERIC_GLOBAL_IDNUMMER_UNGUELTIG = 610001525, - - /** - * [610001526] Es wurde der Parameter NULL übergeben. - */ - ERIC_GLOBAL_NULL_PARAMETER = 610001526, - - /** - * [610001527] Das übergebene Einheitswert-Aktenzeichen ist ungültig. - */ - ERIC_GLOBAL_EWAZ_UNGUELTIG = 610001527, - - /** - * [610001528] Das übergebene Landeskürzel ist unbekannt oder leer. - */ - ERIC_GLOBAL_EWAZ_LANDESKUERZEL_UNBEKANNT = 610001528, - - /** - * [610001851] Update des ERiC erforderlich. Starten Sie nun das Update. - */ - ERIC_GLOBAL_UPDATE_NECESSARY = 610001851, - - /** - * [610001860] Ungültiger Name für Einstellung. - */ - ERIC_GLOBAL_EINSTELLUNG_NAME_UNGUELTIG = 610001860, - - /** - * [610001861] Ungültiger Wert für Einstellung. - */ - ERIC_GLOBAL_EINSTELLUNG_WERT_UNGUELTIG = 610001861, - - /** - * [610001862] Fehler beim Dekodieren. - */ - ERIC_GLOBAL_ERR_DEKODIEREN = 610001862, - - /** - * [610001863] Die aufgerufene Funktion wird nicht unterstützt. - */ - ERIC_GLOBAL_FUNKTION_NICHT_UNTERSTUETZT = 610001863, - - /** - * [610001865] Fehler im übergebenen EDS-XML: In den Sammeldaten wurde ein Nutzdatenticket für mehrere Steuerfälle verwendet. Für jeden Steuerfall muss jedoch ein eigenes Nutzdatenticket angegeben werden. - */ - ERIC_GLOBAL_NUTZDATENTICKETS_NICHT_EINDEUTIG = 610001865, - - /** - * [610001866] Fehler im übergebenen EDS-XML: Bei den Sammeldaten wurden unterschiedliche Versionen des Nutzdaten-Headers verwendet. Innerhalb einer Datenlieferung ist jedoch nur eine Nutzdaten-Header-Version zulässig. - */ - ERIC_GLOBAL_NUTZDATENHEADERVERSIONEN_UNEINHEITLICH = 610001866, - - /** - * [610001867] Fehler im übergebenen EDS-XML: Es wurden Fälle für mehrere Bundesländer angegeben. Innerhalb einer Datenlieferung dürfen jedoch nur Fälle für ein Bundesland angegeben werden. - */ - ERIC_GLOBAL_BUNDESLAENDER_UNEINHEITLICH = 610001867, - - /** - * [610001868] Fehler im übergebenen EDS-XML: Es wurden Fälle für unterschiedliche Jahre angegeben. Innerhalb einer Datenlieferung dürfen jedoch nur Fälle für ein und dasselbe Jahr angegeben werden. - */ - ERIC_GLOBAL_ZEITRAEUME_UNEINHEITLICH = 610001868, - - /** - * [610001869] Fehler im übergebenen EDS-XML: Der Inhalt des Nutzdaten-Elements "" ist für diese Datenart nicht korrekt. - */ - ERIC_GLOBAL_NUTZDATENHEADER_EMPFAENGER_NICHT_KORREKT = 610001869, - - /** - * [610101200] Allgemeiner Kommunikationsfehler. - */ - ERIC_TRANSFER_COM_ERROR = 610101200, - - /** - * [610101201] Dieser Vorgang wird von der aufgerufenen Funktion nicht unterstützt. - */ - ERIC_TRANSFER_VORGANG_NICHT_UNTERSTUETZT = 610101201, - - /** - * [610101210] Fehler im Transferheader. Der ELSTER-Annahmeserver hat einen Fehler zurückgemeldet. Bitte werten Sie die Serverantwort aus. - */ - ERIC_TRANSFER_ERR_XML_THEADER = 610101210, - - /** - * [610101251] Es wurden ungültige Parameter übergeben. - */ - ERIC_TRANSFER_ERR_PARAM = 610101251, - - /** - * [610101253] Im XML-String konnte der Text "" nicht gefunden werden. - */ - ERIC_TRANSFER_ERR_DATENTEILENDNOTFOUND = 610101253, - - /** - * [610101255] Im XML-String konnte der Text "" nicht gefunden werden. - */ - ERIC_TRANSFER_ERR_BEGINDATENLIEFERANT = 610101255, - - /** - * [610101256] Im XML-String konnte der Text "" nicht gefunden werden. - */ - ERIC_TRANSFER_ERR_ENDDATENLIEFERANT = 610101256, - - /** - * [610101257] Im XML-String konnte der Text "" nicht gefunden werden. - */ - ERIC_TRANSFER_ERR_BEGINTRANSPORTSCHLUESSEL = 610101257, - - /** - * [610101258] Im XML-String konnte der Text "" nicht gefunden werden. - */ - ERIC_TRANSFER_ERR_ENDTRANSPORTSCHLUESSEL = 610101258, - - /** - * [610101259] Im XML-String konnte der Text "" nicht gefunden werden. - */ - ERIC_TRANSFER_ERR_BEGINDATENGROESSE = 610101259, - - /** - * [610101260] Im XML-String konnte der Text "" nicht gefunden werden. - */ - ERIC_TRANSFER_ERR_ENDDATENGROESSE = 610101260, - - /** - * [610101271] Beim Datenaustausch ist ein Fehler aufgetreten. - */ - ERIC_TRANSFER_ERR_SEND = 610101271, - - /** - * [610101274] Die Antwortdaten waren nicht PKCS#7-verschlüsselt. - */ - ERIC_TRANSFER_ERR_NOTENCRYPTED = 610101274, - - /** - * [610101276] Verbindung zum ProxyServer konnte nicht aufgebaut werden. - */ - ERIC_TRANSFER_ERR_PROXYCONNECT = 610101276, - - /** - * [610101278] Zu den Servern konnte keine Verbindung aufgebaut werden. - */ - ERIC_TRANSFER_ERR_CONNECTSERVER = 610101278, - - /** - * [610101279] Von der Clearingstelle konnte keine Antwort empfangen werden. - */ - ERIC_TRANSFER_ERR_NORESPONSE = 610101279, - - /** - * [610101280] Der Proxyserver erwartet Anmeldedaten. - */ - ERIC_TRANSFER_ERR_PROXYAUTH = 610101280, - - /** - * [610101282] Fehler bei der Initialisierung des Versands, Details stehen ggf. im Logfile (eric.log). - */ - ERIC_TRANSFER_ERR_SEND_INIT = 610101282, - - /** - * [610101283] Bei der Kommunikation mit dem Server kam es zu einer Zeitüberschreitung. - */ - ERIC_TRANSFER_ERR_TIMEOUT = 610101283, - - /** - * [610101284] Es wurde kein gültiger Port für den Proxy angegeben. - */ - ERIC_TRANSFER_ERR_PROXYPORT_INVALID = 610101284, - - /** - * [610101291] Sonstiger, nicht definierter Fehler aufgetreten. - */ - ERIC_TRANSFER_ERR_OTHER = 610101291, - - /** - * [610101292] Fehler im NutzdatenHeader. Der ELSTER-Annahmeserver hat einen Fehler zurückgemeldet. Bitte werten Sie die Serverantwort aus. Bei Sammeldaten sind alle Nutzdatenblöcke zu prüfen, um den fehlerhaften Datensatz identifizieren zu können. - */ - ERIC_TRANSFER_ERR_XML_NHEADER = 610101292, - - /** - * [610101293] Das XML liegt im falschen Encoding vor. - */ - ERIC_TRANSFER_ERR_XML_ENCODING = 610101293, - - /** - * [610101294] Im XML-String konnte der Text "" nicht gefunden werden. - */ - ERIC_TRANSFER_ERR_ENDSIGUSER = 610101294, - - /** - * [610101295] Im XML-String konnte ein Tag nicht gefunden werden. - */ - ERIC_TRANSFER_ERR_XMLTAG_NICHT_GEFUNDEN = 610101295, - - /** - * [610101297] Das XML-Element "" konnte nicht gelesen werden. - */ - ERIC_TRANSFER_ERR_DATENTEILFEHLER = 610101297, - - /** - * [610101500] Es konnte kein Ad Hoc-Zertifikat fuer den Personalausweis oder den Aufenthaltstitel erzeugt bzw. gefunden werden, Details stehen ggf. im Logfile (eric.log). - */ - ERIC_TRANSFER_EID_ZERTIFIKATFEHLER = 610101500, - - /** - * [610101510] Für die Identifikationsnummer des Benutzers existiert kein Konto bei ELSTER. - */ - ERIC_TRANSFER_EID_KEINKONTO = 610101510, - - /** - * [610101511] Dem Benutzer konnte keine eindeutige Identifikationsnummer zugeordnet werden. - */ - ERIC_TRANSFER_EID_IDNRNICHTEINDEUTIG = 610101511, - - /** - * [610101512] Das nPA-Servlet konnte keine Verbindung zum eID-Server aufbauen. - */ - ERIC_TRANSFER_EID_SERVERFEHLER = 610101512, - - /** - * [610101520] Der eID-Client ist nicht erreichbar. Wahrscheinlich wurde er nicht gestartet oder die übergebene lokale URL ist nicht korrekt - */ - ERIC_TRANSFER_EID_KEINCLIENT = 610101520, - - /** - * [610101521] Der eID-Client hat einen Fehler gemeldet. Details zu dem Fehler finden Sie im Log des eID-Clients oder ggf. im ERiC Logfile (eric.log). - */ - ERIC_TRANSFER_EID_CLIENTFEHLER = 610101521, - - /** - * [610101522] Es konnten nicht alle benötigten Datenfelder des Personalausweises ausgelesen werden. Bitte prüfen Sie über die Funktion "Selbstauskunft" des eID-Clients, ob folgende Daten von Ihrem Personalausweis korrekt bereitgestellt werden: Familienname, Vorname(n), Geburtsdatum, Anschrift (mit Postleitzahl) und Dokumentenart. - */ - ERIC_TRANSFER_EID_FEHLENDEFELDER = 610101522, - - /** - * [610101523] Das Auslesen der Daten aus dem Personalausweis wurde vom Anwender abgebrochen. - */ - ERIC_TRANSFER_EID_IDENTIFIKATIONABGEBROCHEN = 610101523, - - /** - * [610101524] Der Personalausweis wird von einem anderen Vorgang blockiert. Beenden Sie den anderen Vorgang und versuchen Sie es dann erneut. - */ - ERIC_TRANSFER_EID_NPABLOCKIERT = 610101524, - - /** - * [610201016] Fehler bei der Schlüsselerzeugung. - */ - ERIC_CRYPT_ERROR_CREATE_KEY = 610201016, - - /** - * [610201101] eSigner: Ungültiges Token Handle. - */ - ERIC_CRYPT_E_INVALID_HANDLE = 610201101, - - /** - * [610201102] eSigner: Zu viele Sessions geöffnet. - */ - ERIC_CRYPT_E_MAX_SESSION = 610201102, - - /** - * [610201103] eSigner: Überlastung. - */ - ERIC_CRYPT_E_BUSY = 610201103, - - /** - * [610201104] eSigner: Speicherzuordnungsfehler. - */ - ERIC_CRYPT_E_OUT_OF_MEM = 610201104, - - /** - * [610201105] eSigner: Ungültiger PSE Pfad. - */ - ERIC_CRYPT_E_PSE_PATH = 610201105, - - /** - * [610201106] eSigner: Es wurde ein falsches Passwort bzw. eine falsche PIN angegeben. - */ - ERIC_CRYPT_E_PIN_WRONG = 610201106, - - /** - * [610201107] eSigner: Das Passwort bzw. die PIN ist gesperrt. - */ - ERIC_CRYPT_E_PIN_LOCKED = 610201107, - - /** - * [610201108] eSigner: Fehler beim Lesen des PKCS#7-Objekts. - */ - ERIC_CRYPT_E_P7_READ = 610201108, - - /** - * [610201109] eSigner: Fehler beim PKCS#7 Dekodieren. - */ - ERIC_CRYPT_E_P7_DECODE = 610201109, - - /** - * [610201110] eSigner: Entschlüsselungszertifikat nicht in Empfängerliste enthalten. - */ - ERIC_CRYPT_E_P7_RECIPIENT = 610201110, - - /** - * [610201111] eSigner: Fehler beim Lesen des PKCS#12-Objekts. - */ - ERIC_CRYPT_E_P12_READ = 610201111, - - /** - * [610201112] eSigner: Fehler beim Dekodieren des PKCS#12-Objekts. - */ - ERIC_CRYPT_E_P12_DECODE = 610201112, - - /** - * [610201113] eSigner: Fehler beim Zugriff auf Soft-PSE-Signaturschlüssel. - */ - ERIC_CRYPT_E_P12_SIG_KEY = 610201113, - - /** - * [610201114] eSigner: Fehler beim Zugriff auf Soft-PSE Entschlüsselungsschlüssel. - */ - ERIC_CRYPT_E_P12_ENC_KEY = 610201114, - - /** - * [610201115] eSigner: Fehler beim Zugriff auf Hard-Token Signaturschlüssel. - */ - ERIC_CRYPT_E_P11_SIG_KEY = 610201115, - - /** - * [610201116] eSigner: Fehler beim Zugriff auf Hard-Token Entschlüsselungsschlüssel. - */ - ERIC_CRYPT_E_P11_ENC_KEY = 610201116, - - /** - * [610201117] eSigner: Fehler beim Parsen der XML-Eingabedatei. - */ - ERIC_CRYPT_E_XML_PARSE = 610201117, - - /** - * [610201118] eSigner: Fehler beim Erzeugen des XML-Signaturasts. - */ - ERIC_CRYPT_E_XML_SIG_ADD = 610201118, - - /** - * [610201119] eSigner: XML-Signaturtag nicht vorhanden. - */ - ERIC_CRYPT_E_XML_SIG_TAG = 610201119, - - /** - * [610201120] eSigner: Fehler bei XML-Signaturerzeugung. - */ - ERIC_CRYPT_E_XML_SIG_SIGN = 610201120, - - /** - * [610201121] eSigner: Parameter-Fehler, unbekanntes Encoding. - */ - ERIC_CRYPT_E_ENCODE_UNKNOWN = 610201121, - - /** - * [610201122] eSigner: Encoding-Fehler. - */ - ERIC_CRYPT_E_ENCODE_ERROR = 610201122, - - /** - * [610201123] eSigner: XML Initialisierungsfehler. - */ - ERIC_CRYPT_E_XML_INIT = 610201123, - - /** - * [610201124] eSigner: Fehler beim Verschlüsseln. - */ - ERIC_CRYPT_E_ENCRYPT = 610201124, - - /** - * [610201125] eSigner: Fehler beim Entschlüsseln. - */ - ERIC_CRYPT_E_DECRYPT = 610201125, - - /** - * [610201126] eSigner: Keine Signaturkarte eingesteckt (PKCS#11). - */ - ERIC_CRYPT_E_P11_SLOT_EMPTY = 610201126, - - /** - * [610201127] eSigner: Keine Signatur-/Verschlüsselungs-Zertifikate/-Schlüssel gefunden (PKCS#11). - */ - ERIC_CRYPT_E_NO_SIG_ENC_KEY = 610201127, - - /** - * [610201128] eSigner: PKCS11 bzw. PC/SC Library fehlt oder ist nicht ausführbar. - */ - ERIC_CRYPT_E_LOAD_DLL = 610201128, - - /** - * [610201129] eSigner: Der PC/SC Dienst ist nicht gestartet. - */ - ERIC_CRYPT_E_NO_SERVICE = 610201129, - - /** - * [610201130] eSigner: Unbekannte Ausnahme aufgetreten. - */ - ERIC_CRYPT_E_ESICL_EXCEPTION = 610201130, - - /** - * [610201144] eSigner: CA Tokentyp und interner Tokentyp stimmen nicht überein. - */ - ERIC_CRYPT_E_TOKEN_TYPE_MISMATCH = 610201144, - - /** - * [610201146] eSigner: Temporäres PKCS#12-Token kann nicht erzeugt werden. - */ - ERIC_CRYPT_E_P12_CREATE = 610201146, - - /** - * [610201147] eSigner: Zertifikatskette konnte nicht verifiziert werden. - */ - ERIC_CRYPT_E_VERIFY_CERT_CHAIN = 610201147, - - /** - * [610201148] eSigner: PKCS#11 Engine mit anderer Bibliothek belegt. - */ - ERIC_CRYPT_E_P11_ENGINE_LOADED = 610201148, - - /** - * [610201149] eSigner: Aktion vom Benutzer abgebrochen. - */ - ERIC_CRYPT_E_USER_CANCEL = 610201149, - - /** - * [610201200] Fehler beim Zugriff auf Zertifikat. - */ - ERIC_CRYPT_ZERTIFIKAT = 610201200, - - /** - * [610201201] Fehler bei Signaturerzeugung. - */ - ERIC_CRYPT_SIGNATUR = 610201201, - - /** - * [610201203] Das Format der PSE wird nicht unterstützt. - */ - ERIC_CRYPT_NICHT_UNTERSTUETZTES_PSE_FORMAT = 610201203, - - /** - * [610201205] Für die ausgewählte Operation muss ein Passwort bzw. eine PIN angegeben werden. - */ - ERIC_CRYPT_PIN_BENOETIGT = 610201205, - - /** - * [610201206] Das gewünschte Passwort ist nicht sicher genug (z.B. zu kurz). - */ - ERIC_CRYPT_PIN_STAERKE_NICHT_AUSREICHEND = 610201206, - - /** - * [610201208] Interner Fehler aufgetreten. Details stehen ggf. im Logfile (eric.log). - */ - ERIC_CRYPT_E_INTERN = 610201208, - - /** - * [610201209] Der angegebene Zertifikatspfad ist kein Verzeichnis. - */ - ERIC_CRYPT_ZERTIFIKATSPFAD_KEIN_VERZEICHNIS = 610201209, - - /** - * [610201210] Im angegebenen Verzeichnis existiert bereits ein Bestandteil eines ERiC-Zertifikats. - */ - ERIC_CRYPT_ZERTIFIKATSDATEI_EXISTIERT_BEREITS = 610201210, - - /** - * [610201211] Das gewünschte Passwort enthält ungültige Zeichen (z.B. Umlaute). - */ - ERIC_CRYPT_PIN_ENTHAELT_UNGUELTIGE_ZEICHEN = 610201211, - - /** - * [610201212] eSigner: Der Abrufcode besitzt eine falsche Struktur oder enthält ungültige Zeichen. - */ - ERIC_CRYPT_E_INVALID_PARAM_ABC = 610201212, - - /** - * [610201213] Das übergebene Zertifikat weist Inkonsistenzen auf und kann deswegen nicht verwendet werden. Bitte verwenden Sie ein anderes oder erzeugen und verwenden Sie ein neues Zertifikat. - */ - ERIC_CRYPT_CORRUPTED = 610201213, - - /** - * [610201214] Die aufgerufene Funktion unterstützt den neuen Personalausweis (nPA) und den elektronischen Aufenthaltstitel (eAT) nicht. - */ - ERIC_CRYPT_EIDKARTE_NICHT_UNTERSTUETZT = 610201214, - - /** - * [610201215] Es ist keine Karte/kein Stick eingesteckt - */ - ERIC_CRYPT_E_SC_SLOT_EMPTY = 610201215, - - /** - * [610201216] Kein unterstütztes Applet gefunden - */ - ERIC_CRYPT_E_SC_NO_APPLET = 610201216, - - /** - * [610201217] Fehler in der Kartensession - */ - ERIC_CRYPT_E_SC_SESSION = 610201217, - - /** - * [610201218] P11 Signaturzertifikat fehlt - */ - ERIC_CRYPT_E_P11_NO_SIG_CERT = 610201218, - - /** - * [610201219] P11 Der initiale Tokenzugriff ist fehlgeschlagen - */ - ERIC_CRYPT_E_P11_INIT_FAILED = 610201219, - - /** - * [610201220] P11 Verschlüsselungszertifikat fehlt - */ - ERIC_CRYPT_E_P11_NO_ENC_CERT = 610201220, - - /** - * [610201221] P12 Signaturzertifikat fehlt - */ - ERIC_CRYPT_E_P12_NO_SIG_CERT = 610201221, - - /** - * [610201222] P12 Verschlüsselungszertifikat fehlt - */ - ERIC_CRYPT_E_P12_NO_ENC_CERT = 610201222, - - /** - * [610201223] PC/SC Der Zugriff auf den Entschlüsselungsschlüssel ist fehlgeschlagen - */ - ERIC_CRYPT_E_SC_ENC_KEY = 610201223, - - /** - * [610201224] PC/SC Signaturzertifikat fehlt - */ - ERIC_CRYPT_E_SC_NO_SIG_CERT = 610201224, - - /** - * [610201225] PC/SC Verschlüsselungszertifikat fehlt - */ - ERIC_CRYPT_E_SC_NO_ENC_CERT = 610201225, - - /** - * [610201226] PC/SC Der initiale Tokenzugriff ist fehlgeschlagen - */ - ERIC_CRYPT_E_SC_INIT_FAILED = 610201226, - - /** - * [610201227] PC/SC Der Zugriff auf den Signaturschlüssel ist fehlgeschlagen - */ - ERIC_CRYPT_E_SC_SIG_KEY = 610201227, - - /** - * [610301001] Verarbeitung fehlerhaft, keine genaueren Informationen vorhanden. - */ - ERIC_IO_FEHLER = 610301001, - - /** - * [610301005] Der Dateiaufbau ist nicht korrekt. - */ - ERIC_IO_DATEI_INKORREKT = 610301005, - - /** - * [610301006] Fehler beim Parsen der Eingabedaten. Details stehen im Logfile (eric.log). - */ - ERIC_IO_PARSE_FEHLER = 610301006, - - /** - * [610301007] Die Generierung des Nutzdatensatzes ist fehlgeschlagen. - */ - ERIC_IO_NDS_GENERIERUNG_FEHLGESCHLAGEN = 610301007, - - /** - * [610301010] Interner Fehler, der Masterdatenservice ist nicht verfügbar. - */ - ERIC_IO_MASTERDATENSERVICE_NICHT_VERFUEGBAR = 610301010, - - /** - * [610301014] Es wurden ungültige Steuerzeichen im Nutzdatensatz gefunden. - */ - ERIC_IO_STEUERZEICHEN_IM_NDS = 610301014, - - /** - * [610301031] Die Versionsinformationen der ERiC-Bibliotheken konnten nicht ausgelesen werden. - */ - ERIC_IO_VERSIONSINFORMATIONEN_NICHT_GEFUNDEN = 610301031, - - /** - * [610301104] Der Wert im Transferheader-Element "Verfahren" wird vom verwendeten Reader nicht unterstützt. - */ - ERIC_IO_FALSCHES_VERFAHREN = 610301104, - - /** - * [610301105] Es wurde mehr als ein Steuerfall in der Eingabedatei gefunden. - */ - ERIC_IO_READER_MEHRFACHE_STEUERFAELLE = 610301105, - - /** - * [610301106] Es wurden unerwartete Elemente in der Eingabedatei gefunden, Details stehen ggf. im Logfile (eric.log). - */ - ERIC_IO_READER_UNERWARTETE_ELEMENTE = 610301106, - - /** - * [610301107] Es wurden formale Fehler in der Eingabedatei gefunden, Details stehen ggf. im Logfile (eric.log). - */ - ERIC_IO_READER_FORMALE_FEHLER = 610301107, - - /** - * [610301108] Die Eingabedaten lagen nicht im Encoding UTF-8 vor, oder es war kein Encoding spezifiziert. - */ - ERIC_IO_READER_FALSCHES_ENCODING = 610301108, - - /** - * [610301109] Es wurde mehr als ein "Nutzdaten"-Element in der Eingabedatei gefunden. - */ - ERIC_IO_READER_MEHRFACHE_NUTZDATEN_ELEMENTE = 610301109, - - /** - * [610301110] Es wurde mehr als ein Nutzdatenblock in der Eingabedatei gefunden. - */ - ERIC_IO_READER_MEHRFACHE_NUTZDATENBLOCK_ELEMENTE = 610301110, - - /** - * [610301111] Der im Transferheader-Element "Datenart" angegebene Wert ist unbekannt. - */ - ERIC_IO_UNBEKANNTE_DATENART = 610301111, - - /** - * [610301114] Ungültiger oder fehlender Wert für den Untersachbereich. - */ - ERIC_IO_READER_UNTERSACHBEREICH_UNGUELTIG = 610301114, - - /** - * [610301115] Es wurden zu viele Nutzdatenblöcke in der Eingabedatei gefunden. - */ - ERIC_IO_READER_ZU_VIELE_NUTZDATENBLOCK_ELEMENTE = 610301115, - - /** - * [610301150] Es wurden ungültige Steuerzeichen im TransferHeader-Element gefunden. - */ - ERIC_IO_READER_STEUERZEICHEN_IM_TRANSFERHEADER = 610301150, - - /** - * [610301151] Es wurden ungültige Steuerzeichen im NutzdatenHeader-Element gefunden. - */ - ERIC_IO_READER_STEUERZEICHEN_IM_NUTZDATENHEADER = 610301151, - - /** - * [610301152] Es wurden ungültige Steuerzeichen im Nutzdaten-Element gefunden. - */ - ERIC_IO_READER_STEUERZEICHEN_IN_DEN_NUTZDATEN = 610301152, - - /** - * [610301190] Ein Nutzdatenblock enthält zu viele Anhänge. Details stehen im Logfile (eric.log). - */ - ERIC_IO_READER_ZU_VIELE_ANHAENGE = 610301190, - - /** - * [610301191] Ein Anhang ist zu groß. Details stehen im Logfile (eric.log). - */ - ERIC_IO_READER_ANHANG_ZU_GROSS = 610301191, - - /** - * [610301192] Die Gesamtgröße aller Anhange in einem Nutzdatenblock ist zu groß. Details stehen im Logfile (eric.log). - */ - ERIC_IO_READER_ANHAENGE_ZU_GROSS = 610301192, - - /** - * [610301200] Es traten Fehler beim Validieren des XML auf. Details stehen im Logfile (eric.log). - */ - ERIC_IO_READER_SCHEMA_VALIDIERUNGSFEHLER = 610301200, - - /** - * [610301201] Eine XML-Entity konnte nicht aufgelöst werden. - */ - ERIC_IO_READER_UNBEKANNTE_XML_ENTITY = 610301201, - - /** - * [610301252] Im XML-String konnte der Text "" nicht gefunden werden. - */ - ERIC_IO_DATENTEILNOTFOUND = 610301252, - - /** - * [610301253] Im XML-String konnte der Text "" nicht gefunden werden. - */ - ERIC_IO_DATENTEILENDNOTFOUND = 610301253, - - /** - * [610301300] Falsche Übergabeparameter für die Funktion. - */ - ERIC_IO_UEBERGABEPARAMETER_FEHLERHAFT = 610301300, - - /** - * [610301400] Der Parameter enthält ungültige UTF-8 Multibytesequenzen. - */ - ERIC_IO_UNGUELTIGE_UTF8_SEQUENZ = 610301400, - - /** - * [610301401] Der Parameter enthält mindestens ein unzulässiges Zeichen. - */ - ERIC_IO_UNGUELTIGE_ZEICHEN_IN_PARAMETER = 610301401, - - /** - * [610501001] Verarbeitung fehlerhaft, keine genaueren Informationen vorhanden. - */ - ERIC_PRINT_INTERNER_FEHLER = 610501001, - - /** - * [610501002] Keine Druckvorlage für die angegebene Kombination aus Unterfallart und Veranlagungszeitraum gefunden. Bitte prüfen Sie die installierten Druckvorlagen. - */ - ERIC_PRINT_DRUCKVORLAGE_NICHT_GEFUNDEN = 610501002, - - /** - * [610501004] Es wurde ein falscher Dateipfad angegeben, es fehlen Zugriffsrechte oder die Datei wird aktuell von einer anderen Anwendung verwendet. - */ - ERIC_PRINT_UNGUELTIGER_DATEI_PFAD = 610501004, - - /** - * [610501007] ERiCPrint wurde nicht richtig initialisiert. Eventuell wurde ERiC nicht richtig initialisiert? - */ - ERIC_PRINT_INITIALISIERUNG_FEHLERHAFT = 610501007, - - /** - * [610501008] Das zu verwendende Format bzw. der Zielklient sind nicht bekannt. - */ - ERIC_PRINT_AUSGABEZIEL_UNBEKANNT = 610501008, - - /** - * [610501009] Der Beginn des Ausdruckprozesses schlug fehl. Eventuell konnten notwendige Ressourcen nicht allokiert werden. - */ - ERIC_PRINT_ABBRUCH_DRUCKVORBEREITUNG = 610501009, - - /** - * [610501010] Während der Ausgabe der Inhalte ist ein Fehler aufgetreten. - */ - ERIC_PRINT_ABBRUCH_GENERIERUNG = 610501010, - - /** - * [610501011] Die Kombination aus Unterfallart und Veranlagungszeitraum wird nicht unterstützt. - */ - ERIC_PRINT_STEUERFALL_NICHT_UNTERSTUETZT = 610501011, - - /** - * [610501012] Der übergebene Fußtext ist zu lang. - */ - ERIC_PRINT_FUSSTEXT_ZU_LANG = 610501012, -} diff --git a/taxel/src/lib.rs b/taxel/src/lib.rs deleted file mode 100644 index 101baf1..0000000 --- a/taxel/src/lib.rs +++ /dev/null @@ -1,74 +0,0 @@ -mod certificate; -mod config; -mod eric; -mod error_code; -mod processing; -mod response_buffer; -mod xml; - -pub use config::{CertificateConfig, PrintConfig}; -pub use eric::Eric; -pub use error_code::ErrorCode; -pub use xml::read; - -/* - ProcessingFlag - Validate = 2 - Send = 4 - Print = 32 - CheckHints = 128 - - binary operation: 2 | 4 = 6 - ValidateAndSend = 6 - - binary operation: 2 | 32 = 34 - ValidateAndPrint = 34 - - binary operation: 4 | 32 = 36 - SendAndPrint = 36 - - binary operation: 2 | 4 | 32 = 38 - ValidateAndSendAndPrint = 38 - - Send and Print are always validated, i.e. - Send = ValidateAndSend - Print = ValidateAndPrint - SendAndPrint = ValidateAndSendAndPrint -*/ - -#[derive(Debug, Clone, Copy)] -pub enum ProcessingFlag { - Validate = 2, - Send = 4, - Print = 32, - SendAndPrint = 36, - CheckHints = 128, -} - -impl ProcessingFlag { - pub fn into_u32(&self) -> u32 { - *self as u32 - } -} - -pub enum Preview { - Yes = 1, - No = 0, -} - -#[derive(Debug)] -pub struct EricResponse { - pub error_code: i32, - pub validation_response: String, - pub server_response: String, -} - -impl EricResponse { - pub fn new(error_code: i32, validation_response: String, server_response: String) -> Self { - Self { - error_code, - validation_response, - server_response, - } - } -} diff --git a/taxel/src/processing.rs b/taxel/src/processing.rs deleted file mode 100644 index 2a2e36c..0000000 --- a/taxel/src/processing.rs +++ /dev/null @@ -1,87 +0,0 @@ -use crate::{ - config::{CertificateConfig, PrintConfig}, - response_buffer::ResponseBuffer, - EricResponse, ProcessingFlag, -}; -use std::ptr; -use taxel_bindings::EricBearbeiteVorgang; -use taxel_util::ToCString; - -pub fn process( - xml: String, - type_version: String, - processing_flag: ProcessingFlag, - print_config: Option, - certificate_config: Option, - transfer_code: Option, -) -> Result { - println!("Processing xml file"); - - match processing_flag { - ProcessingFlag::Validate => println!("Validating xml file"), - ProcessingFlag::Print => println!("Validating xml file"), - ProcessingFlag::Send => println!("Sending xml file"), - ProcessingFlag::SendAndPrint => println!("Send and print"), - ProcessingFlag::CheckHints => println!("Check hints"), - } - - let xml = xml.try_to_cstring()?; - let type_version = type_version.try_to_cstring()?; - - // Transfer_code should be NULL except for data retrieval; if transfer_code is not NULL in the other cases, it will be ignored - let transfer_code = match transfer_code { - Some(mut code) => &mut code, - None => ptr::null::() as *mut u32, - }; - - match &print_config { - Some(print_config) => println!( - "Printing confirmation to file '{}'", - print_config.pdf_name.to_str()? - ), - None => (), - } - - let validation_response_buffer = ResponseBuffer::new()?; - let server_response_buffer = ResponseBuffer::new()?; - - let error_code = unsafe { - EricBearbeiteVorgang( - xml.as_ptr(), - type_version.as_ptr(), - processing_flag.into_u32(), - // SAFETY: match a reference of print_config; otherwise print_config is moved, and print_parameter.as_ptr() would be dangling - match &print_config { - Some(el) => el.print_parameter.as_ptr(), - None => ptr::null(), - }, - // SAFETY: match a reference of certificate_config; otherwise certificate_config is moved, and certificate_parameter.as_ptr() would be dangling - match &certificate_config { - Some(el) => el.certificate_parameter.as_ptr(), - None => ptr::null(), - }, - transfer_code, - validation_response_buffer.as_ptr(), - server_response_buffer.as_ptr(), - ) - }; - - // TODO: EricHoleFehlerText() for error code - - let transfer_code = unsafe { transfer_code.as_ref() }; - - if let Some(code) = transfer_code { - println!("Transfer code: {}", code) - } - - let validation_response = validation_response_buffer.read()?; - // TODO: parse server response via EricGetErrormessagesFromXMLAnswer() - let server_response = server_response_buffer.read()?; - let response = EricResponse::new( - error_code, - validation_response.to_string(), - server_response.to_string(), - ); - - Ok(response) -} diff --git a/taxel/src/response_buffer.rs b/taxel/src/response_buffer.rs deleted file mode 100644 index 8b1a5e3..0000000 --- a/taxel/src/response_buffer.rs +++ /dev/null @@ -1,46 +0,0 @@ -use crate::ErrorCode; -use std::ffi::CStr; -use taxel_bindings::{ - EricReturnBufferApi, EricRueckgabepufferErzeugen, EricRueckgabepufferFreigeben, - EricRueckgabepufferInhalt, -}; - -pub struct ResponseBuffer { - ctx: *mut EricReturnBufferApi, -} - -impl ResponseBuffer { - pub fn new() -> Result { - let response_buffer = unsafe { EricRueckgabepufferErzeugen() }; - - Ok(ResponseBuffer { - ctx: response_buffer, - }) - } - - pub fn as_ptr(&self) -> *mut EricReturnBufferApi { - self.ctx - } - - pub fn read(&self) -> Result<&str, anyhow::Error> { - let buffer = unsafe { - let ptr = EricRueckgabepufferInhalt(self.ctx); - CStr::from_ptr(ptr) - }; - - Ok(buffer.to_str()?) - } -} - -impl Drop for ResponseBuffer { - fn drop(&mut self) { - println!("Cleaning up response buffer"); - - let error_code = unsafe { EricRueckgabepufferFreigeben(self.ctx) }; - - match error_code { - x if x == ErrorCode::ERIC_OK as i32 => (), - error_code => panic!("Can't drop reponse buffer: {}", error_code), - } - } -} diff --git a/taxel/src/xml.rs b/taxel/src/xml.rs deleted file mode 100644 index c388aa8..0000000 --- a/taxel/src/xml.rs +++ /dev/null @@ -1,8 +0,0 @@ -use std::{fs, path::Path}; - -pub fn read(xml_file: &str) -> Result { - let xml_path = Path::new(xml_file); - println!("Reading xml file '{}'", xml_path.display()); - let xml = fs::read_to_string(xml_path)?; - Ok(xml) -}