From 4afb0ae995af991736d68dd66ba2a88561fefcd2 Mon Sep 17 00:00:00 2001 From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com> Date: Sun, 12 Jan 2025 20:02:50 +0100 Subject: [PATCH 1/7] add fedora signing and replace xmlsec --- .devcontainer/devcontainer.json | 31 --- .devcontainer/{ => docker}/Dockerfile | 0 .devcontainer/docker/devcontainer.json | 34 +++ .../{ => docker}/postCreateCommand.sh | 0 .devcontainer/podman/.env | 2 + .devcontainer/podman/Dockerfile | 37 +++ .devcontainer/podman/devcontainer.json | 24 ++ .devcontainer/podman/docker-compose.yml | 18 ++ .devcontainer/podman/entrypoint.sh | 20 ++ .devcontainer/podman/onCreateCommand.sh | 8 + .devcontainer/podman/postCreateCommand.sh | 2 + .../actions/install-dependencies/action.yml | 2 +- Cargo.lock | 193 +++------------- Cargo.toml | 11 +- rust-toolchain.toml | 3 + xbuilder/Cargo.toml | 7 +- xsender/Cargo.toml | 7 +- xsigner/Cargo.toml | 4 +- .../resources/test/invoice_with_template.xml | 181 --------------- xsigner/src/lib.rs | 210 +++++++++--------- 20 files changed, 298 insertions(+), 496 deletions(-) delete mode 100644 .devcontainer/devcontainer.json rename .devcontainer/{ => docker}/Dockerfile (100%) create mode 100644 .devcontainer/docker/devcontainer.json rename .devcontainer/{ => docker}/postCreateCommand.sh (100%) create mode 100644 .devcontainer/podman/.env create mode 100644 .devcontainer/podman/Dockerfile create mode 100644 .devcontainer/podman/devcontainer.json create mode 100644 .devcontainer/podman/docker-compose.yml create mode 100755 .devcontainer/podman/entrypoint.sh create mode 100755 .devcontainer/podman/onCreateCommand.sh create mode 100755 .devcontainer/podman/postCreateCommand.sh create mode 100644 rust-toolchain.toml delete mode 100644 xsigner/resources/test/invoice_with_template.xml diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json deleted file mode 100644 index af0522bc..00000000 --- a/.devcontainer/devcontainer.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "xhandler-rust", - "build": { - "dockerfile": "Dockerfile" - }, - "features": { - "ghcr.io/devcontainers/features/rust:1": {}, - "ghcr.io/devcontainers/features/node:1": { - "version": "20" - }, - "ghcr.io/devcontainers/features/docker-in-docker:2": {} - }, - "postCreateCommand": "bash .devcontainer/postCreateCommand.sh", - "customizations": { - "vscode": { - "settings": {}, - "extensions": [ - "vadimcn.vscode-lldb", - "rust-lang.rust-analyzer", - "tamasfe.even-better-toml", - "github.vscode-github-actions", - "github.vscode-pull-request-github" - ] - }, - "codespaces": { - "openFiles": [ - "README.md" - ] - } - } -} \ No newline at end of file diff --git a/.devcontainer/Dockerfile b/.devcontainer/docker/Dockerfile similarity index 100% rename from .devcontainer/Dockerfile rename to .devcontainer/docker/Dockerfile diff --git a/.devcontainer/docker/devcontainer.json b/.devcontainer/docker/devcontainer.json new file mode 100644 index 00000000..f7606920 --- /dev/null +++ b/.devcontainer/docker/devcontainer.json @@ -0,0 +1,34 @@ +{ + "name": "xhandler-rust", + "build": { + "dockerfile": "Dockerfile" + }, + "features": { + "ghcr.io/devcontainers/features/rust:1": {}, + "ghcr.io/devcontainers/features/node:1": { + "version": "20" + }, + "ghcr.io/devcontainers/features/docker-in-docker:2": {} + }, + "postCreateCommand": "bash .devcontainer/docker/postCreateCommand.sh", + "customizations": { + "jetbrains": { + "backend": "RustRover" + }, + "vscode": { + "settings": {}, + "extensions": [ + "vadimcn.vscode-lldb", + "rust-lang.rust-analyzer", + "tamasfe.even-better-toml", + "github.vscode-github-actions", + "github.vscode-pull-request-github" + ] + }, + "codespaces": { + "openFiles": [ + "README.md" + ] + } + } +} \ No newline at end of file diff --git a/.devcontainer/postCreateCommand.sh b/.devcontainer/docker/postCreateCommand.sh similarity index 100% rename from .devcontainer/postCreateCommand.sh rename to .devcontainer/docker/postCreateCommand.sh diff --git a/.devcontainer/podman/.env b/.devcontainer/podman/.env new file mode 100644 index 00000000..e2dbf394 --- /dev/null +++ b/.devcontainer/podman/.env @@ -0,0 +1,2 @@ +REPO_PATH=/home/cferiavi/git/openubl/xhandler-rust +USER_UID=115091 diff --git a/.devcontainer/podman/Dockerfile b/.devcontainer/podman/Dockerfile new file mode 100644 index 00000000..4894e6a5 --- /dev/null +++ b/.devcontainer/podman/Dockerfile @@ -0,0 +1,37 @@ +FROM quay.io/fedora/fedora:41 + +ARG USERNAME=vscode +ARG USER_UID=1000 +ARG USER_GID=$USER_UID + +COPY entrypoint.sh /entrypoint.sh + +RUN dnf -y update && \ + dnf install -y @development-tools && \ + dnf install -y curl wget podman + +RUN groupadd --gid $USER_GID $USERNAME && \ + useradd --uid $USER_UID --gid $USER_GID -m $USERNAME && \ + echo $USERNAME:10000:5000 > /etc/subuid && echo $USERNAME:10000:5000 > /etc/subgid && \ + # Allow user to execute 'sudo' without password + usermod -aG wheel $USERNAME && \ + echo "%wheel ALL=(ALL) NOPASSWD:ALL" | tee -a /etc/sudoers > /dev/null + +# Podman +# https://github.com/containers/podman/issues/2788#issuecomment-479923274 +RUN chmod 4755 /usr/bin/newgidmap && chmod 4755 /usr/bin/newuidmap + +# set permissions +RUN chown $USERNAME:$USERNAME -R /home/$USERNAME + +RUN usermod -aG wheel $USERNAME && \ + # Allow user to execute 'sudo' without password + echo "%wheel ALL=(ALL) NOPASSWD:ALL" | tee -a /etc/sudoers > /dev/null && \ + # https://github.com/containers/podman/issues/2788#issuecomment-479923274 + chmod 4755 /usr/bin/newgidmap && chmod 4755 /usr/bin/newuidmap + +ENV _CONTAINERS_USERNS_CONFIGURED="" + +ENTRYPOINT [ "/entrypoint.sh" ] +USER $USERNAME +CMD ["tail", "-f", "/dev/null"] diff --git a/.devcontainer/podman/devcontainer.json b/.devcontainer/podman/devcontainer.json new file mode 100644 index 00000000..5f0cdae1 --- /dev/null +++ b/.devcontainer/podman/devcontainer.json @@ -0,0 +1,24 @@ +{ + "name": "xhandler-rust", + "dockerComposeFile": "docker-compose.yml", + "overrideCommand": true, + "shutdownAction": "stopCompose", + "service": "xhandler-rust", + "remoteUser": "vscode", + "onCreateCommand": "bash .devcontainer/podman/onCreateCommand.sh", + "postCreateCommand": "bash .devcontainer/podman/postCreateCommand.sh", + "customizations": { + "jetbrains": { + "backend": "RustRover" + }, + "vscode": { + "extensions": [ + "vadimcn.vscode-lldb", + "rust-lang.rust-analyzer", + "tamasfe.even-better-toml", + "github.vscode-github-actions", + "github.vscode-pull-request-github" + ] + } + } +} \ No newline at end of file diff --git a/.devcontainer/podman/docker-compose.yml b/.devcontainer/podman/docker-compose.yml new file mode 100644 index 00000000..3757873a --- /dev/null +++ b/.devcontainer/podman/docker-compose.yml @@ -0,0 +1,18 @@ +volumes: + cargo-cache: + +services: + xhandler-rust: + # https://github.com/microsoft/vscode-remote-release/issues/10215 + image: localhost/xhandler-rust_devcontainer-xhandler-rust:latest + build: + context: . + dockerfile: ./Dockerfile + args: + USER_UID: ${USER_UID} + privileged: true + userns_mode: "keep-id" +# command: tail -f /dev/null + volumes: + - ${REPO_PATH}:/workspace:cached + - cargo-cache:/home/vscode/.cargo diff --git a/.devcontainer/podman/entrypoint.sh b/.devcontainer/podman/entrypoint.sh new file mode 100755 index 00000000..434c8781 --- /dev/null +++ b/.devcontainer/podman/entrypoint.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +# Ensure $HOME exists when starting +if [ ! -d "${HOME}" ]; then + mkdir -p "${HOME}" +fi + +# Setup $PS1 for a consistent and reasonable prompt +if [ -w "${HOME}" ] && [ ! -f "${HOME}"/.bashrc ]; then + echo "PS1='\s-\v \w \$ '" > "${HOME}"/.bashrc +fi + +# Add current (arbitrary) user to /etc/passwd and /etc/group +if ! whoami > /dev/null 2>&1; then + if [ -w /etc/passwd ]; then + echo "update passwd file" + echo "${USER_NAME:-user}:x:$(id -u):0:${USER_NAME:-user} user:${HOME}:/bin/bash" >> /etc/passwd + echo "${USER_NAME:-user}:x:$(id -u):" >> /etc/group + fi +fi diff --git a/.devcontainer/podman/onCreateCommand.sh b/.devcontainer/podman/onCreateCommand.sh new file mode 100755 index 00000000..c00d5e02 --- /dev/null +++ b/.devcontainer/podman/onCreateCommand.sh @@ -0,0 +1,8 @@ +sudo dnf install -y @development-tools +sudo dnf install -y @c-development +sudo dnf install -y libxml2-devel openssl-devel gcc gcc-c++ cmake perl + +sudo dnf install -y rustup +rustup-init -y +. "$HOME/.cargo/env" +rustup update diff --git a/.devcontainer/podman/postCreateCommand.sh b/.devcontainer/podman/postCreateCommand.sh new file mode 100755 index 00000000..62357f99 --- /dev/null +++ b/.devcontainer/podman/postCreateCommand.sh @@ -0,0 +1,2 @@ +# Git autocomplete +echo "source /usr/share/bash-completion/completions/git" >> ~/.bashrc diff --git a/.github/actions/install-dependencies/action.yml b/.github/actions/install-dependencies/action.yml index 7210d089..0a263d66 100644 --- a/.github/actions/install-dependencies/action.yml +++ b/.github/actions/install-dependencies/action.yml @@ -6,4 +6,4 @@ runs: - name: Install dependencies shell: bash run: | - sudo apt-get -y install pkg-config xmlsec1 libxml2-dev libxmlsec1-dev libxmlsec1-openssl libclang-dev + sudo apt-get -y install pkg-config libssl-dev libxml2-dev libclang-dev diff --git a/Cargo.lock b/Cargo.lock index eedc406b..40039da8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -123,29 +123,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "bindgen" -version = "0.65.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5" -dependencies = [ - "bitflags 1.3.2", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.71", - "which", -] - [[package]] name = "bitflags" version = "1.3.2" @@ -199,7 +176,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", "syn_derive", ] @@ -284,15 +261,6 @@ dependencies = [ "libc", ] -[[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" @@ -362,17 +330,6 @@ dependencies = [ "inout", ] -[[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 = "const-oid" version = "0.9.6" @@ -496,7 +453,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", ] [[package]] @@ -516,7 +473,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", ] [[package]] @@ -545,15 +502,9 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", ] -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - [[package]] name = "encoding_rs" version = "0.8.34" @@ -820,15 +771,6 @@ dependencies = [ "digest", ] -[[package]] -name = "home" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" -dependencies = [ - "windows-sys 0.52.0", -] - [[package]] name = "http" version = "1.1.0" @@ -1058,28 +1000,12 @@ dependencies = [ "spin", ] -[[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 0.52.6", -] - [[package]] name = "libm" version = "0.2.8" @@ -1157,12 +1083,6 @@ dependencies = [ "unicase", ] -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - [[package]] name = "miniz_oxide" version = "0.7.4" @@ -1201,16 +1121,6 @@ dependencies = [ "tempfile", ] -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - [[package]] name = "num-bigint-dig" version = "0.8.4" @@ -1302,7 +1212,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", ] [[package]] @@ -1380,12 +1290,6 @@ dependencies = [ "hmac", ] -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "pem-rfc7468" version = "0.7.0" @@ -1432,7 +1336,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", ] [[package]] @@ -1501,7 +1405,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", ] [[package]] @@ -1555,16 +1459,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" -[[package]] -name = "prettyplease" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" -dependencies = [ - "proc-macro2", - "syn 2.0.71", -] - [[package]] name = "proc-macro-crate" version = "3.1.0" @@ -1807,9 +1701,9 @@ dependencies = [ [[package]] name = "rsa" -version = "0.9.6" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +checksum = "47c75d7c5c6b673e58bf54d8544a9f432e3a925b0e80f7cd3602ab5c50c55519" dependencies = [ "const-oid", "digest", @@ -1858,12 +1752,6 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" -[[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" @@ -2008,7 +1896,7 @@ checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", ] [[package]] @@ -2056,7 +1944,7 @@ checksum = "82fe9db325bcef1fbcde82e078a5cc4efdf787e96b3b9cf45b50b529f2083d67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", ] [[package]] @@ -2081,12 +1969,6 @@ dependencies = [ "digest", ] -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - [[package]] name = "signature" version = "2.2.0" @@ -2196,9 +2078,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.71" +version = "2.0.87" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" dependencies = [ "proc-macro2", "quote", @@ -2214,7 +2096,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", ] [[package]] @@ -2301,7 +2183,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", ] [[package]] @@ -2356,7 +2238,7 @@ checksum = "8d9ef545650e79f30233c0003bcc2504d7efac6dad25fca40744de773fe2049c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", ] [[package]] @@ -2383,7 +2265,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", ] [[package]] @@ -2662,7 +2544,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", "wasm-bindgen-shared", ] @@ -2696,7 +2578,7 @@ checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2717,18 +2599,6 @@ dependencies = [ "wasm-bindgen", ] -[[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-util" version = "0.1.8" @@ -2930,7 +2800,7 @@ dependencies = [ [[package]] name = "xbuilder" -version = "0.1.0" +version = "0.1.1" dependencies = [ "anyhow", "chrono", @@ -2944,7 +2814,6 @@ dependencies = [ "serial_test", "static-files", "tera", - "thiserror", "tokio", "xsender", "xsigner", @@ -2966,26 +2835,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" [[package]] -name = "xmlsec" -version = "0.2.3" +name = "xml_c14n" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85162cd6fa3c1e8ebc239bd11c7c001042ba6fb7bb861d63b5d7b3c99951f1df" +checksum = "10920b2d5910f5e249f6476ae61952fe3f0b9d1fdf379a994a4325984e63665c" dependencies = [ - "bindgen", - "lazy_static", - "libc", "libxml", - "pkg-config", + "thiserror", ] [[package]] name = "xsender" -version = "0.1.0" +version = "0.1.1" dependencies = [ "anyhow", "base64", "lazy_static", - "log", "regex", "reqwest", "serde", @@ -3004,12 +2869,14 @@ name = "xsigner" version = "0.1.0" dependencies = [ "anyhow", + "base64", "der", "libxml", + "openssl", "rsa", "thiserror", "x509-cert", - "xmlsec", + "xml_c14n", ] [[package]] @@ -3029,7 +2896,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.71", + "syn 2.0.87", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index de921410..3ce44dc7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,6 +2,12 @@ resolver = "2" members = ["xbuilder", "xsender", "xsigner"] +[workspace.package] +version = "0.1.1" +edition = "2021" +publish = false +license = "Apache-2.0" + [workspace.dependencies] chrono = { version = "0.4.31", features = ["serde"] } regex = "1.10.6" @@ -23,13 +29,12 @@ thiserror = "1.0.53" anyhow = "1.0.78" sha2 = "0.10.8" rsa = "0.9.6" -rand = "0.8.5" serial_test = "3.1.1" tokio = "1.39.2" -xmlsec = "0.2.3" libxml = "0.3.3" x509-cert = "0.2.5" der = { version = "0.7.6" } -spki = { version = "0.7.3" } +openssl = "0.10" +xml_c14n = "0.3.0" [patch.crates-io] diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 00000000..c6d8cdf2 --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "1.83.0" +components = [ "rustfmt", "clippy" ] diff --git a/xbuilder/Cargo.toml b/xbuilder/Cargo.toml index 5173ecc7..5b159a6e 100644 --- a/xbuilder/Cargo.toml +++ b/xbuilder/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "xbuilder" -version = "0.1.0" -edition = "2021" -license = "Apache-2.0" description = "Creates XML files based on UBL under the standards of Peru." +version.workspace = true +edition.workspace = true +license.workspace = true [dependencies] chrono = { workspace = true, features = ["serde"] } @@ -15,7 +15,6 @@ lazy_static = { workspace = true } serde = { workspace = true, features = ["derive"] } rust_decimal = { workspace = true, features = ["serde-str", "serde-with-str"] } rust_decimal_macros = { workspace = true } -thiserror = { workspace = true } anyhow = { workspace = true } [dev-dependencies] diff --git a/xsender/Cargo.toml b/xsender/Cargo.toml index 83554bda..669a7626 100644 --- a/xsender/Cargo.toml +++ b/xsender/Cargo.toml @@ -1,13 +1,12 @@ [package] name = "xsender" -version = "0.1.0" -edition = "2021" -license = "Apache-2.0" description = "Sends XML files through SOAP - SUNAT" +version.workspace = true +edition.workspace = true +license.workspace = true [dependencies] xml = { workspace = true } -log = { workspace = true } zip = { workspace = true } tera = { workspace = true } static-files = { workspace = true } diff --git a/xsigner/Cargo.toml b/xsigner/Cargo.toml index 9a94223a..a1ffc18e 100644 --- a/xsigner/Cargo.toml +++ b/xsigner/Cargo.toml @@ -8,10 +8,12 @@ description = "Sign your XML files" [dependencies] thiserror = { workspace = true } anyhow = { workspace = true } -xmlsec = { workspace = true } libxml = { workspace = true } rsa = { workspace = true, features = ["sha2"] } x509-cert = { workspace = true, features = ["builder"] } der = { workspace = true, features = ["alloc", "derive", "flagset", "oid"] } +base64 = { workspace = true } +openssl = { workspace = true } +xml_c14n = { workspace = true } [dev-dependencies] diff --git a/xsigner/resources/test/invoice_with_template.xml b/xsigner/resources/test/invoice_with_template.xml deleted file mode 100644 index eea6e3f0..00000000 --- a/xsigner/resources/test/invoice_with_template.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.1 - 2.0 - F001-1 - 2019-12-24 - 01 - PEN - - 12345678912 - - - 12345678912 - - - - - - - - #PROJECT-OPENUBL-SIGN - - - - - - - 12345678912 - - - - - 0000 - - - - - - - - - - - 12121212121 - - - - - - - - FormaPago - Contado - - - 424.80 - - 2360.00 - 424.80 - - S - - 1000 - IGV - VAT - - - - - - 2360.00 - 2784.80 - 0 - 0 - 2784.80 - - - 1 - 10 - 1180.00 - - - 139.24 - 01 - - - - 212.40 - - 1180.00 - 212.40 - - S - 18.00 - 10 - - 1000 - IGV - VAT - - - - - - - - - 118.00 - - - - 2 - 10 - 1180.00 - - - 139.24 - 01 - - - - 212.40 - - 1180.00 - 212.40 - - S - 18.00 - 10 - - 1000 - IGV - VAT - - - - - - - - - 118.00 - - - diff --git a/xsigner/src/lib.rs b/xsigner/src/lib.rs index 8cc77656..050836e9 100644 --- a/xsigner/src/lib.rs +++ b/xsigner/src/lib.rs @@ -1,13 +1,18 @@ use anyhow::anyhow; +use base64::engine::general_purpose; +use base64::Engine; use der::{DecodePem, EncodePem}; -use libxml::parser::XmlParseError; -use libxml::tree::{Document, Namespace, Node}; -use libxml::xpath::Context; +use libxml::parser::{Parser, XmlParseError}; +use libxml::tree::{Document, Node}; +use openssl::hash::{hash, MessageDigest}; +use openssl::pkey::PKey; +use openssl::rsa::Rsa; +use openssl::sign::Signer; use rsa::pkcs1::{DecodeRsaPrivateKey, EncodeRsaPrivateKey}; use rsa::pkcs8::LineEnding; use rsa::RsaPrivateKey; use x509_cert::Certificate; -use xmlsec::{XmlSecError, XmlSecKey, XmlSecKeyFormat, XmlSecSignatureContext}; +use xml_c14n::{canonicalize_xml, CanonicalizationMode, CanonicalizationOptions}; #[derive(Debug, thiserror::Error)] pub enum EncryptionError { @@ -61,8 +66,6 @@ pub enum SignErr { #[error(transparent)] Pkcs1(#[from] rsa::pkcs1::Error), #[error(transparent)] - XmlSec(#[from] XmlSecError), - #[error(transparent)] Any(#[from] anyhow::Error), } @@ -103,116 +106,113 @@ impl XSigner { pub fn sign(&self, key_pair: &RsaKeyPair) -> Result<(), SignErr> { let xml = &self.xml_document; + let xml_string = xml.to_string(); + + let canonicalize_options = CanonicalizationOptions { + mode: CanonicalizationMode::Canonical1_1, + keep_comments: false, + inclusive_ns_prefixes: vec![], + }; + let xml_canonicalize = canonicalize_xml(&xml_string, canonicalize_options.clone()) + .expect("Could not canonicalize xml"); + + // Generate digest + let digest = hash(MessageDigest::sha256(), xml_canonicalize.as_bytes()) + .expect("Digest generation error"); + let digest_base64 = general_purpose::STANDARD.encode(digest); + + // Sign + let signed_info_string = format!( + " + + + + + + + + {digest_base64} + + " + ); + let signed_info_canonicalize = + canonicalize_xml(&signed_info_string, canonicalize_options.clone()) + .expect("Could not canonicalize xml"); + + // Sign + let pk_pem = key_pair.private_key_to_pem()?; + let rsa = Rsa::private_key_from_pem(pk_pem.as_bytes()).expect("Failed to parse PK"); + let pkey = PKey::from_rsa(rsa).expect("Failed to convert RSA to PKey"); + + let certificate_pem = key_pair.certificate_to_pem()?; + let pem_contents = certificate_pem + .lines() + .filter(|line| !line.starts_with("-----")) + .collect::>() + .join("\n"); + + let mut signer = + Signer::new(MessageDigest::sha256(), &pkey).expect("Signer creation error"); + signer + .update(signed_info_canonicalize.as_bytes()) + .expect("Failed to update signer"); + let signature = signer.sign_to_vec().expect("Error while signing"); + let signature_base64 = general_purpose::STANDARD.encode(&signature); // Search Signature element - let context = Context::new(xml)?; - let signature_node = context.evaluate("//ds:Signature"); - - // Add the Signature xml tag - if signature_node.is_err() { - fn find_extension_content_node(node: Node) -> Option { - if let Some(ns) = node.get_namespace() { - if ns.get_prefix() == "ext" && node.get_name() == "ExtensionContent" { - return Some(node); - } + fn find_extension_content_node(node: Node) -> Option { + if let Some(ns) = node.get_namespace() { + if ns.get_prefix() == "ext" && node.get_name() == "ExtensionContent" { + return Some(node); } + } - for child in node.get_child_nodes().into_iter() { - let result = find_extension_content_node(child); - if result.is_some() { - return result; - } + for child in node.get_child_nodes().into_iter() { + let result = find_extension_content_node(child); + if result.is_some() { + return result; } - - None } - let root = xml - .get_root_element() - .ok_or(SignErr::Any(anyhow!("Could not get the xml root element")))?; - let mut root_note = find_extension_content_node(root).ok_or(SignErr::Any(anyhow!( - "Could not find the ext:ExtensionContent tag" - )))?; - - // Signature - let mut signature = Node::new("Signature", None, xml)?; - signature.set_attribute("Id", "PROJECT-OPENUBL")?; - let ns = Namespace::new("ds", "http://www.w3.org/2000/09/xmldsig#", &mut signature)?; - signature.set_namespace(&ns)?; - - // - let mut signed_info = Node::new("SignedInfo", Some(ns.clone()), xml)?; - signature.add_child(&mut signed_info)?; - - let mut canonicalization_method = - Node::new("CanonicalizationMethod", Some(ns.clone()), xml)?; - canonicalization_method.set_attribute( - "Algorithm", - "http://www.w3.org/TR/2001/REC-xml-c14n-20010315", - )?; - signed_info.add_child(&mut canonicalization_method)?; - - let mut signature_method = Node::new("SignatureMethod", Some(ns.clone()), xml)?; - signature_method - .set_attribute("Algorithm", "http://www.w3.org/2000/09/xmldsig#rsa-sha1")?; - signed_info.add_child(&mut signature_method)?; - - let mut reference = Node::new("Reference", Some(ns.clone()), xml)?; - reference.set_attribute("URI", "")?; - signed_info.add_child(&mut reference)?; - - let mut transforms = Node::new("Transforms", Some(ns.clone()), xml)?; - reference.add_child(&mut transforms)?; - - let mut transform = Node::new("Transform", Some(ns.clone()), xml)?; - transform.set_attribute( - "Algorithm", - "http://www.w3.org/2000/09/xmldsig#enveloped-signature", - )?; - transforms.add_child(&mut transform)?; - - let mut digest_method = Node::new("DigestMethod", Some(ns.clone()), xml)?; - digest_method.set_attribute("Algorithm", "http://www.w3.org/2000/09/xmldsig#sha1")?; - reference.add_child(&mut digest_method)?; - - let mut digest_value = Node::new("DigestValue", Some(ns.clone()), xml)?; - reference.add_child(&mut digest_value)?; - - let mut signature_value = Node::new("SignatureValue", Some(ns.clone()), xml)?; - signature.add_child(&mut signature_value)?; - - let mut key_info = Node::new("KeyInfo", Some(ns.clone()), xml)?; - signature.add_child(&mut key_info)?; - - let mut x509_data = Node::new("X509Data", Some(ns.clone()), xml)?; - key_info.add_child(&mut x509_data)?; - - let mut x509_certificate = Node::new("X509Certificate", Some(ns.clone()), xml)?; - x509_data.add_child(&mut x509_certificate)?; - - // - root_note.add_child(&mut signature)?; + None } - let private_key_pem = key_pair.private_key_to_pem()?; - let private_key = - XmlSecKey::from_memory(private_key_pem.as_bytes(), XmlSecKeyFormat::Pem, None)?; - - let certificate_pem = key_pair.certificate_to_pem()?; - private_key.load_cert_from_memory(certificate_pem.as_bytes(), XmlSecKeyFormat::CertPem)?; - - let mut sigctx = XmlSecSignatureContext::new(); - sigctx.insert_key(private_key); - - sigctx.sign_document(xml)?; - + let xml_root_node = xml + .get_root_element() + .ok_or(SignErr::Any(anyhow!("Could not get the xml root element")))?; + let mut extension_content_node = find_extension_content_node(xml_root_node).ok_or( + SignErr::Any(anyhow!("Could not find the ext:ExtensionContent tag")), + )?; + + // Signature + let signature_string = format!( + " + {signed_info_string} + {signature_base64} + + + {pem_contents} + + + " + ); + + let parser = Parser::default(); + let signature_string_node = parser + .parse_string(&signature_string) + .expect("Could not parse Signature"); + let mut signed_info_node_root = signature_string_node + .get_root_element() + .expect("Could not get root element of Signature"); + signed_info_node_root.unlink(); + + extension_content_node.add_child(&mut signed_info_node_root)?; Ok(()) } } #[cfg(test)] mod tests { - use std::fs; use crate::RsaKeyPair; @@ -247,7 +247,6 @@ mod tests { fs::read_to_string(format!("{RESOURCES}/public.cer")).expect("Could not read file"); let xml_no_template = format!("{RESOURCES}/invoice_no_template.xml"); - let xml_with_template = format!("{RESOURCES}/invoice_with_template.xml"); let rsa_key_pair = RsaKeyPair::from_pkcs1_pem_and_certificate( &private_key_from_file, @@ -257,14 +256,9 @@ mod tests { let document1 = XSigner::from_file(&xml_no_template).expect("Could read xml with no template"); - let document2 = - XSigner::from_file(&xml_with_template).expect("Could read xml with template"); document1 .sign(&rsa_key_pair) - .expect("Could not sign document with no tempate"); - document2 - .sign(&rsa_key_pair) - .expect("Could not sign document with template"); + .expect("Could not sign document with no template"); } } From 9c9d089861f02367a94228708f762c87ee62647a Mon Sep 17 00:00:00 2001 From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com> Date: Sun, 12 Jan 2025 20:07:20 +0100 Subject: [PATCH 2/7] fix lock --- Cargo.lock | 228 ++++++++++++++++++++--------------------------------- 1 file changed, 84 insertions(+), 144 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 40039da8..f46a3949 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -123,12 +123,6 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - [[package]] name = "bitflags" version = "2.6.0" @@ -226,9 +220,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.6.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12916984aab3fa6e39d655a33e09c0071eb36d6ab3aea5c2d78551f1df6d952" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" [[package]] name = "bzip2" @@ -295,7 +289,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -527,7 +521,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -717,7 +711,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 2.6.0", + "bitflags", "ignore", "walkdir", ] @@ -875,9 +869,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.6" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ab92f4f49ee4fb4f997c784b7a2e0fa70050211e0b6a287f898c3c9785ca956" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-channel", @@ -888,7 +882,6 @@ dependencies = [ "pin-project-lite", "socket2", "tokio", - "tower", "tower-service", "tracing", ] @@ -1101,7 +1094,7 @@ dependencies = [ "hermit-abi", "libc", "wasi", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -1195,7 +1188,7 @@ version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ - "bitflags 2.6.0", + "bitflags", "cfg-if", "foreign-types", "libc", @@ -1253,7 +1246,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -1388,26 +1381,6 @@ dependencies = [ "siphasher", ] -[[package]] -name = "pin-project" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.87", -] - [[package]] name = "pin-project-lite" version = "0.2.14" @@ -1571,7 +1544,7 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" dependencies = [ - "bitflags 2.6.0", + "bitflags", ] [[package]] @@ -1614,9 +1587,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.5" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7d6d2a27d57148378eb5e111173f4276ad26340ecc5c49a4a2152167a2d6a37" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64", "bytes", @@ -1647,12 +1620,13 @@ dependencies = [ "system-configuration", "tokio", "tokio-native-tls", + "tower", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg", + "windows-registry", ] [[package]] @@ -1667,7 +1641,7 @@ dependencies = [ "libc", "spin", "untrusted", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -1758,11 +1732,11 @@ version = "0.38.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" dependencies = [ - "bitflags 2.6.0", + "bitflags", "errno", "libc", "linux-raw-sys", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -1835,7 +1809,7 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -1862,7 +1836,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.6.0", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -1881,18 +1855,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.205" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33aedb1a7135da52b7c21791455563facbbcc43d0f0f66165b42c21b3dfb150" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.205" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692d6f5ac90220161d6774db30c662202721e64aed9058d2c394f451261420c1" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", @@ -2029,7 +2003,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -2104,23 +2078,26 @@ name = "sync_wrapper" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] [[package]] name = "system-configuration" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 1.3.2", + "bitflags", "core-foundation", "system-configuration-sys", ] [[package]] name = "system-configuration-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" dependencies = [ "core-foundation-sys", "libc", @@ -2141,7 +2118,7 @@ dependencies = [ "cfg-if", "fastrand", "rustix", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -2254,7 +2231,7 @@ dependencies = [ "pin-project-lite", "socket2", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -2321,14 +2298,14 @@ dependencies = [ [[package]] name = "tower" -version = "0.4.13" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" dependencies = [ "futures-core", "futures-util", - "pin-project", "pin-project-lite", + "sync_wrapper", "tokio", "tower-layer", "tower-service", @@ -2336,15 +2313,15 @@ dependencies = [ [[package]] name = "tower-layer" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-service" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" @@ -2605,7 +2582,7 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" dependencies = [ - "windows-sys 0.52.0", + "windows-sys", ] [[package]] @@ -2614,40 +2591,46 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] -name = "windows-sys" -version = "0.48.0" +name = "windows-registry" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" dependencies = [ - "windows-targets 0.48.5", + "windows-result", + "windows-strings", + "windows-targets", ] [[package]] -name = "windows-sys" -version = "0.52.0" +name = "windows-result" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] -name = "windows-targets" -version = "0.48.5" +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows-targets", ] [[package]] @@ -2656,46 +2639,28 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", "windows_i686_gnullvm", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -2708,48 +2673,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -2765,16 +2706,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "wyz" version = "0.5.1" @@ -2819,6 +2750,15 @@ dependencies = [ "xsigner", ] +[[package]] +name = "xhandler" +version = "0.1.0" +dependencies = [ + "xbuilder", + "xsender", + "xsigner", +] + [[package]] name = "xml" version = "0.8.20" From ab2aef5b275908172246551b817411df8909dd23 Mon Sep 17 00:00:00 2001 From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com> Date: Sun, 19 Jan 2025 08:47:20 +0100 Subject: [PATCH 3/7] use quick-xml --- Cargo.lock | 10 +++ Cargo.toml | 1 + xbuilder/tests/common/mod.rs | 24 ++++--- xsigner/Cargo.toml | 1 + xsigner/src/lib.rs | 125 +++++++++++++++++++---------------- 5 files changed, 94 insertions(+), 67 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f46a3949..e01ae956 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1493,6 +1493,15 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "quick-xml" +version = "0.37.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "165859e9e55f79d67b96c5d96f4e88b6f2695a1972849c15a6a3f5c59fc2c003" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.36" @@ -2813,6 +2822,7 @@ dependencies = [ "der", "libxml", "openssl", + "quick-xml", "rsa", "thiserror", "x509-cert", diff --git a/Cargo.toml b/Cargo.toml index db8e6637..c1627d47 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,6 +29,7 @@ rsa = "0.9.6" serial_test = "3.1.1" tokio = "1.39.2" libxml = "0.3.3" +quick-xml = "0.37.2" x509-cert = "0.2.5" der = { version = "0.7.6" } openssl = "0.10" diff --git a/xbuilder/tests/common/mod.rs b/xbuilder/tests/common/mod.rs index ad735c62..30422cab 100644 --- a/xbuilder/tests/common/mod.rs +++ b/xbuilder/tests/common/mod.rs @@ -1,7 +1,7 @@ use std::fs; use chrono::NaiveDate; -use libxml::tree::Document; +use libxml::parser::Parser; use rust_decimal_macros::dec; use xbuilder::prelude::*; @@ -101,7 +101,7 @@ pub fn cliente_base() -> Cliente { } } -fn sign_xml(xml: &str) -> Document { +fn sign_xml(xml: &str) -> Vec { let private_key_from_file = fs::read_to_string("tests/resources/certificates/private.key") .expect("Could not read private.key"); let certificate_from_file = fs::read_to_string("tests/resources/certificates/public.cer") @@ -111,10 +111,10 @@ fn sign_xml(xml: &str) -> Document { RsaKeyPair::from_pkcs1_pem_and_certificate(&private_key_from_file, &certificate_from_file) .expect("Could not initialize RsaKeyPair"); - let signer = XSigner::from_string(xml).expect("Could parse xml"); - signer.sign(&rsa_key_pair).expect("Could not sign document"); - - signer.xml_document + let signer = XSigner { + xml_document: xml.to_string(), + }; + signer.sign(&rsa_key_pair).expect("Could not sign document") } #[allow(dead_code)] @@ -171,7 +171,7 @@ fn assert_snapshot(expected: &str, snapshot_filename: &str) { ); } -fn assert_xsd(xml: &Document, schema: &str) { +fn assert_xsd(xml: &Vec, schema: &str) { let mut xsdparser = SchemaParserContext::from_file(schema); let xsd = SchemaValidationContext::from_parser(&mut xsdparser); @@ -185,18 +185,20 @@ fn assert_xsd(xml: &Document, schema: &str) { let mut xsd = xsd.unwrap(); - if let Err(errors) = xsd.validate_document(xml) { + let xml_document = Parser::default().parse_string(xml).unwrap(); + if let Err(errors) = xsd.validate_document(&xml_document) { for err in &errors { println!("{}", err.message.as_ref().unwrap()); } - panic!("Invalid XML accoding to XSD schema"); + panic!("Invalid XML according to XSD schema"); } } -async fn assert_sunat(xml: &Document) { +async fn assert_sunat(xml: &Vec) { + let file_content = String::from_utf8_lossy(xml).to_string(); let xml_file = UblFile { - file_content: xml.to_string(), + file_content, }; let result = CLIENT diff --git a/xsigner/Cargo.toml b/xsigner/Cargo.toml index a1ffc18e..44858d23 100644 --- a/xsigner/Cargo.toml +++ b/xsigner/Cargo.toml @@ -9,6 +9,7 @@ description = "Sign your XML files" thiserror = { workspace = true } anyhow = { workspace = true } libxml = { workspace = true } +quick-xml = { workspace = true } rsa = { workspace = true, features = ["sha2"] } x509-cert = { workspace = true, features = ["builder"] } der = { workspace = true, features = ["alloc", "derive", "flagset", "oid"] } diff --git a/xsigner/src/lib.rs b/xsigner/src/lib.rs index 050836e9..fc45d7f0 100644 --- a/xsigner/src/lib.rs +++ b/xsigner/src/lib.rs @@ -1,16 +1,16 @@ -use anyhow::anyhow; use base64::engine::general_purpose; use base64::Engine; use der::{DecodePem, EncodePem}; -use libxml::parser::{Parser, XmlParseError}; -use libxml::tree::{Document, Node}; use openssl::hash::{hash, MessageDigest}; use openssl::pkey::PKey; use openssl::rsa::Rsa; use openssl::sign::Signer; +use quick_xml::events::{BytesEnd, BytesStart, Event}; use rsa::pkcs1::{DecodeRsaPrivateKey, EncodeRsaPrivateKey}; use rsa::pkcs8::LineEnding; use rsa::RsaPrivateKey; +use std::io::Cursor; +use std::{fs, io}; use x509_cert::Certificate; use xml_c14n::{canonicalize_xml, CanonicalizationMode, CanonicalizationOptions}; @@ -88,36 +88,26 @@ impl From> for SignErr { } pub struct XSigner { - pub xml_document: Document, + pub xml_document: String, } impl XSigner { - pub fn from_file(filename: &str) -> Result { - let xml_parser = libxml::parser::Parser::default(); - let xml_document = xml_parser.parse_file(filename)?; + pub fn from_file(filename: &str) -> Result { + let xml_document = fs::read_to_string(filename)?; Ok(Self { xml_document }) } - pub fn from_string(xml: &str) -> Result { - let xml_parser = libxml::parser::Parser::default(); - let xml_document = xml_parser.parse_string(xml)?; - Ok(Self { xml_document }) - } - - pub fn sign(&self, key_pair: &RsaKeyPair) -> Result<(), SignErr> { - let xml = &self.xml_document; - let xml_string = xml.to_string(); - + pub fn sign(&self, key_pair: &RsaKeyPair) -> Result, SignErr> { let canonicalize_options = CanonicalizationOptions { mode: CanonicalizationMode::Canonical1_1, - keep_comments: false, + keep_comments: true, inclusive_ns_prefixes: vec![], }; - let xml_canonicalize = canonicalize_xml(&xml_string, canonicalize_options.clone()) + let xml_canonicalized = canonicalize_xml(&self.xml_document, canonicalize_options.clone()) .expect("Could not canonicalize xml"); // Generate digest - let digest = hash(MessageDigest::sha256(), xml_canonicalize.as_bytes()) + let digest = hash(MessageDigest::sha256(), xml_canonicalized.as_bytes()) .expect("Digest generation error"); let digest_base64 = general_purpose::STANDARD.encode(digest); @@ -159,31 +149,6 @@ impl XSigner { let signature = signer.sign_to_vec().expect("Error while signing"); let signature_base64 = general_purpose::STANDARD.encode(&signature); - // Search Signature element - fn find_extension_content_node(node: Node) -> Option { - if let Some(ns) = node.get_namespace() { - if ns.get_prefix() == "ext" && node.get_name() == "ExtensionContent" { - return Some(node); - } - } - - for child in node.get_child_nodes().into_iter() { - let result = find_extension_content_node(child); - if result.is_some() { - return result; - } - } - - None - } - - let xml_root_node = xml - .get_root_element() - .ok_or(SignErr::Any(anyhow!("Could not get the xml root element")))?; - let mut extension_content_node = find_extension_content_node(xml_root_node).ok_or( - SignErr::Any(anyhow!("Could not find the ext:ExtensionContent tag")), - )?; - // Signature let signature_string = format!( " @@ -197,17 +162,65 @@ impl XSigner { " ); - let parser = Parser::default(); - let signature_string_node = parser - .parse_string(&signature_string) - .expect("Could not parse Signature"); - let mut signed_info_node_root = signature_string_node - .get_root_element() - .expect("Could not get root element of Signature"); - signed_info_node_root.unlink(); - - extension_content_node.add_child(&mut signed_info_node_root)?; - Ok(()) + let mut xml_reader = quick_xml::Reader::from_str(&xml_canonicalized); + let mut xml_writer = quick_xml::Writer::new(Cursor::new(Vec::new())); + + let mut inside_target_element = false; + let mut requires_closing_extension_content_tag = false; + + loop { + match xml_reader.read_event() { + Ok(Event::Empty(e)) => { + if e.name().as_ref() == b"ext:ExtensionContent" { + inside_target_element = true; + requires_closing_extension_content_tag = true; + + xml_writer + .write_event(Event::Start(BytesStart::new("ext:ExtensionContent"))) + .unwrap(); + } else { + assert!(xml_writer.write_event(Event::Start(e.clone())).is_ok()); + } + } + Ok(Event::Start(e)) => { + assert!(xml_writer.write_event(Event::Start(e.clone())).is_ok()); + if e.name().as_ref() == b"ext:ExtensionContent" { + inside_target_element = true; + } + } + Ok(Event::End(e)) => { + if inside_target_element { + inside_target_element = false; + + let mut xml_content_reader = quick_xml::Reader::from_str(&signature_string); + loop { + match xml_content_reader.read_event() { + Ok(Event::Eof) => break, + Ok(e) => assert!(xml_writer.write_event(e).is_ok()), + Err(e) => panic!( + "Error at position {}: {:?}", + xml_reader.error_position(), + e + ), + } + } + + if requires_closing_extension_content_tag { + xml_writer + .write_event(Event::End(BytesEnd::new("ext:ExtensionContent"))) + .unwrap(); + } + } + assert!(xml_writer.write_event(Event::End(e.clone())).is_ok()); + } + Ok(Event::Eof) => break, + Ok(e) => assert!(xml_writer.write_event(e).is_ok()), + Err(e) => panic!("Error at position {}: {:?}", xml_reader.error_position(), e), + } + } + + let result = xml_writer.into_inner().into_inner(); + Ok(result) } } From 400868e0b1c05fda081aefe2e651e9afede2de5e Mon Sep 17 00:00:00 2001 From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com> Date: Sun, 19 Jan 2025 08:58:24 +0100 Subject: [PATCH 4/7] fix lint --- xsigner/src/lib.rs | 65 ++++++++++++++-------------------------------- 1 file changed, 20 insertions(+), 45 deletions(-) diff --git a/xsigner/src/lib.rs b/xsigner/src/lib.rs index fc45d7f0..519dbb3c 100644 --- a/xsigner/src/lib.rs +++ b/xsigner/src/lib.rs @@ -1,6 +1,7 @@ use base64::engine::general_purpose; use base64::Engine; use der::{DecodePem, EncodePem}; +use openssl::error::ErrorStack; use openssl::hash::{hash, MessageDigest}; use openssl::pkey::PKey; use openssl::rsa::Rsa; @@ -12,7 +13,9 @@ use rsa::RsaPrivateKey; use std::io::Cursor; use std::{fs, io}; use x509_cert::Certificate; -use xml_c14n::{canonicalize_xml, CanonicalizationMode, CanonicalizationOptions}; +use xml_c14n::{ + canonicalize_xml, CanonicalizationErrorCode, CanonicalizationMode, CanonicalizationOptions, +}; #[derive(Debug, thiserror::Error)] pub enum EncryptionError { @@ -57,34 +60,14 @@ impl RsaKeyPair { #[derive(Debug, thiserror::Error)] pub enum SignErr { - #[error("Error while signing")] - Generic, - #[error("Error `{0}`")] - GenericWithMessage(String), - #[error("Error")] - Std(Box), #[error(transparent)] Pkcs1(#[from] rsa::pkcs1::Error), #[error(transparent)] - Any(#[from] anyhow::Error), -} - -impl From<()> for SignErr { - fn from(_error: ()) -> Self { - Self::Generic - } -} - -impl From for SignErr { - fn from(error: String) -> Self { - Self::GenericWithMessage(error) - } -} - -impl From> for SignErr { - fn from(error: Box) -> Self { - Self::Std(error) - } + Key(#[from] ErrorStack), + #[error(transparent)] + IO(#[from] io::Error), + #[error(transparent)] + Canonicalization(#[from] CanonicalizationErrorCode), } pub struct XSigner { @@ -103,12 +86,10 @@ impl XSigner { keep_comments: true, inclusive_ns_prefixes: vec![], }; - let xml_canonicalized = canonicalize_xml(&self.xml_document, canonicalize_options.clone()) - .expect("Could not canonicalize xml"); + let xml_canonicalize = canonicalize_xml(&self.xml_document, canonicalize_options.clone())?; // Generate digest - let digest = hash(MessageDigest::sha256(), xml_canonicalized.as_bytes()) - .expect("Digest generation error"); + let digest = hash(MessageDigest::sha256(), xml_canonicalize.as_bytes())?; let digest_base64 = general_purpose::STANDARD.encode(digest); // Sign @@ -126,13 +107,12 @@ impl XSigner { " ); let signed_info_canonicalize = - canonicalize_xml(&signed_info_string, canonicalize_options.clone()) - .expect("Could not canonicalize xml"); + canonicalize_xml(&signed_info_string, canonicalize_options.clone())?; // Sign let pk_pem = key_pair.private_key_to_pem()?; - let rsa = Rsa::private_key_from_pem(pk_pem.as_bytes()).expect("Failed to parse PK"); - let pkey = PKey::from_rsa(rsa).expect("Failed to convert RSA to PKey"); + let rsa = Rsa::private_key_from_pem(pk_pem.as_bytes())?; + let pkey = PKey::from_rsa(rsa)?; let certificate_pem = key_pair.certificate_to_pem()?; let pem_contents = certificate_pem @@ -141,12 +121,9 @@ impl XSigner { .collect::>() .join("\n"); - let mut signer = - Signer::new(MessageDigest::sha256(), &pkey).expect("Signer creation error"); - signer - .update(signed_info_canonicalize.as_bytes()) - .expect("Failed to update signer"); - let signature = signer.sign_to_vec().expect("Error while signing"); + let mut signer = Signer::new(MessageDigest::sha256(), &pkey)?; + signer.update(signed_info_canonicalize.as_bytes())?; + let signature = signer.sign_to_vec()?; let signature_base64 = general_purpose::STANDARD.encode(&signature); // Signature @@ -162,7 +139,7 @@ impl XSigner { " ); - let mut xml_reader = quick_xml::Reader::from_str(&xml_canonicalized); + let mut xml_reader = quick_xml::Reader::from_str(&xml_canonicalize); let mut xml_writer = quick_xml::Writer::new(Cursor::new(Vec::new())); let mut inside_target_element = false; @@ -176,8 +153,7 @@ impl XSigner { requires_closing_extension_content_tag = true; xml_writer - .write_event(Event::Start(BytesStart::new("ext:ExtensionContent"))) - .unwrap(); + .write_event(Event::Start(BytesStart::new("ext:ExtensionContent")))?; } else { assert!(xml_writer.write_event(Event::Start(e.clone())).is_ok()); } @@ -207,8 +183,7 @@ impl XSigner { if requires_closing_extension_content_tag { xml_writer - .write_event(Event::End(BytesEnd::new("ext:ExtensionContent"))) - .unwrap(); + .write_event(Event::End(BytesEnd::new("ext:ExtensionContent")))?; } } assert!(xml_writer.write_event(Event::End(e.clone())).is_ok()); From 02e92e48feedc568177111915e603c24b5a43b5b Mon Sep 17 00:00:00 2001 From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com> Date: Sun, 19 Jan 2025 09:06:18 +0100 Subject: [PATCH 5/7] fix lint --- xbuilder/tests/common/mod.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/xbuilder/tests/common/mod.rs b/xbuilder/tests/common/mod.rs index 30422cab..f7a4a558 100644 --- a/xbuilder/tests/common/mod.rs +++ b/xbuilder/tests/common/mod.rs @@ -197,9 +197,7 @@ fn assert_xsd(xml: &Vec, schema: &str) { async fn assert_sunat(xml: &Vec) { let file_content = String::from_utf8_lossy(xml).to_string(); - let xml_file = UblFile { - file_content, - }; + let xml_file = UblFile { file_content }; let result = CLIENT .send_file(&xml_file) From 54865ecb5a6560afc8f6d5acf83f2c9fb2bd4846 Mon Sep 17 00:00:00 2001 From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com> Date: Sun, 19 Jan 2025 09:11:12 +0100 Subject: [PATCH 6/7] fix lint --- xbuilder/tests/common/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xbuilder/tests/common/mod.rs b/xbuilder/tests/common/mod.rs index f7a4a558..e297df71 100644 --- a/xbuilder/tests/common/mod.rs +++ b/xbuilder/tests/common/mod.rs @@ -195,7 +195,7 @@ fn assert_xsd(xml: &Vec, schema: &str) { } } -async fn assert_sunat(xml: &Vec) { +async fn assert_sunat(xml: &[u8]) { let file_content = String::from_utf8_lossy(xml).to_string(); let xml_file = UblFile { file_content }; From 9c806b289ca9137865b9f38a854c84ba0cde9efa Mon Sep 17 00:00:00 2001 From: Carlos Feria <2582866+carlosthe19916@users.noreply.github.com> Date: Sun, 19 Jan 2025 09:13:22 +0100 Subject: [PATCH 7/7] fix lint --- .devcontainer/docker/Dockerfile | 9 ++++++++- .devcontainer/docker/devcontainer.json | 5 +++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.devcontainer/docker/Dockerfile b/.devcontainer/docker/Dockerfile index 2a5b7f93..f7d1a80b 100644 --- a/.devcontainer/docker/Dockerfile +++ b/.devcontainer/docker/Dockerfile @@ -1,2 +1,9 @@ FROM mcr.microsoft.com/devcontainers/rust:bullseye -RUN apt-get update && apt-get -y install pkg-config xmlsec1 libxml2-dev libxmlsec1-dev libxmlsec1-openssl libclang-dev +RUN apt-get update && apt-get -y install pkg-config libssl-dev libxml2-dev libclang-dev +RUN apt update && \ + apt install sudo && \ + usermod -aG sudo vscode && \ + echo "%sudo ALL=(ALL) NOPASSWD:ALL" | tee -a /etc/sudoers > /dev/null + +RUN chown vscode:vscode -R /home/vscode +USER vscode \ No newline at end of file diff --git a/.devcontainer/docker/devcontainer.json b/.devcontainer/docker/devcontainer.json index f7606920..e776a030 100644 --- a/.devcontainer/docker/devcontainer.json +++ b/.devcontainer/docker/devcontainer.json @@ -3,6 +3,11 @@ "build": { "dockerfile": "Dockerfile" }, + "runArgs": [ + "--privileged", + "--userns=keep-id" + ], + "remoteUser": "vscode", "features": { "ghcr.io/devcontainers/features/rust:1": {}, "ghcr.io/devcontainers/features/node:1": {