cie-middleware-linux icon indicating copy to clipboard operation
cie-middleware-linux copied to clipboard

Flatpak support

Open DadiBit opened this issue 1 year ago • 6 comments

Vorrei proporre l'implementazione del codice sorgente in un "comodo" flatpak, tornerebbe molto utile per l'installazione da parte di utenti meno esperti.

In pratica si mette tutto (librerie e app) all'interno di una "scatola" che accede esclusivamente a certe parti del sistema (network e all-devices per il lettore).

DadiBit avatar Dec 07 '24 21:12 DadiBit

NB: non avendo al momento un lettore CIE disponibile mi trovo a non poter testare l'effettivo utilizzo del software.

Requisiti

Installare flatpak builder con uno dei seguenti metodi:

  1. Compilarlo e installarlo dalla sorgente
  2. Installare il pachetto flatpak-builder tramite il proprio package manager (dnf/apt/pacman)
  3. Installare il flatpak org.flatpak.Builder con flatpak install org.flatpak.Builder
    • Possiamo assegnare un alias alias flatpak-builder="flatpak run org.flatpak.Builder" per comodità
  4. In alternative è possibile lavorare con flatpak build, ma risulta più elaborato come processo.

Aggiungiamo la repo sorgente flathub a livello di utente con:

flatpak remote-add --if-not-exists --user flathub https://dl.flathub.org/repo/flathub.flatpakrepo

Build

Documentazione flatpak

Creiamo una cartella dove lavorare, e.g.: it.ipzs.cieid, ed entriamo al suo interno.

Creiamo il file manifest it.ipzs.cieid.yml:

id: it.ipzs.cieid
runtime: org.freedesktop.Platform
runtime-version: '24.08'
sdk: org.freedesktop.Sdk
sdk-extensions:
  - org.freedesktop.Sdk.Extension.openjdk
command: cieid-launcher # You cannot run `java` with arguments, we need a launcher script!
rename-icon: cieid
rename-desktop-file: cieid.desktop
modules:
  - name: openjdk
    buildsystem: simple
    build-commands:
      - /usr/lib/sdk/openjdk/install.sh
  - name: PCSC-lite-Middleware
    buildsystem: meson
    config-opts:
      - -Dpolkit=false
      - -Dlibsystemd=false
    sources:
      - type: archive
        url: https://pcsclite.apdu.fr/files/pcsc-lite-2.3.0.tar.xz
        sha256: 1acca22d2891d43ffe6d782740d32e78150d4fcc99e8a3cc763abaf546060d3d
  - name: CIE-Middleware
    buildsystem: simple
    build-commands:
      - mkdir -p /app/bin /app/lib /app/share/CIEID/lib /app/share/applications /app/share/CIEID /app/share/icons/hicolor/256x256/apps/ /app/usr/lib
      # Copy the library to standard paths
      - cp -r usr/local/lib/libcie-pkcs11.so /app/lib/
      # Copy the desktop file and fix paths
      - cp usr/share/applications/cieid.desktop /app/share/applications/
      - sed -i 's|^Exec=.*|Exec=cieid-launcher|' /app/share/applications/cieid.desktop
      - sed -i 's|^Icon=.*|Icon=cieid|' /app/share/applications/cieid.desktop
      # Copy the JAR file and the icon
      - cp -r usr/share/CIEID/cieid.jar /app/share/CIEID/cieid.jar
      - cp -r usr/share/CIEID/logo_circle.png /app/share/icons/hicolor/256x256/apps/cieid.png
      # Create the wrapper script
      - echo '#!/bin/sh' > /app/bin/cieid-launcher
      - echo 'exec java -Xms1G -Xmx1G -Djna.debug_load=true -Djna.debug_load.jna=true -classpath "/app/share/CIEID/cieid.jar" it.ipzs.cieid.MainApplication "$@"' >> /app/bin/cieid-launcher
      - chmod +x /app/bin/cieid-launcher
    sources:
      - type: archive
        url: https://github.com/italia/cie-middleware-linux/releases/download/1.4.3.10/CIE-Middleware-1.4.3-10.x86-64.tar.gz
        sha256: 4ecb3929a9b731b871406fcdbab3eb3cf32087daa50900be17b7e1a6fd2a2eac
finish-args:
  - "--env=PATH=/app/jre/bin:/app/bin:/usr/bin"
  - "--env=JAVA_HOME=/app/jre"
  - "--env=CLASSPATH=/app/share/CIEID/cieid.jar"
  - --device=dri
  - --device=all
  - --socket=x11
  - --socket=pcsc # If removed gets program stuck on waiting reader
  - --share=network # Required to access information, documentation etc.
  - --filesystem=home:rw # ~/.CIEID and ~/.CIEPKI access

Compiliamo il programma con:

flatpak run org.flatpak.Builder --force-clean --user --install-deps-from=flathub --repo=repo --install build it.ipzs.cieid.yml

NB: tutti i requisiti/sdk vengono scaricati/aggiornati in automatico durante la build.

Done! Puoi avviare l'app con:

flatpak run --user it.ipzs.cieid

Oppure semplicemente dal menu delle app del proprio sistema operativo

Per disinstallare l'app basta fare: flatpak remove --user it.ipzs.cieid

Bug riscontrati:

  1. Senza il socket pcsc il programma resta in attesa del lettore

PS: è la prima volta che compilo un flatpak: ci sono sicuramente dei punti su cui migliorare il file Manifest prima di una possibile pubblicazione (autore, versione ecc), tuttavia da quanto riesco a testare io l'app parte.

DadiBit avatar Dec 08 '24 13:12 DadiBit

Ciao, per caso sei riuscito a reperire un lettore? posseggo un Alcor Micro AU9540 (nel mio caso non è NFC) sarebbe molto interessante provarlo sulla mia distribuzione ClearLinux, in quanto un Flatpak sarebbe più comodo come dici tu, rispetto a doverlo compilare e eseguire.

MarcusPro7 avatar Mar 14 '25 10:03 MarcusPro7

Ciao, per caso sei riuscito a reperire un lettore? posseggo un Alcor Micro AU9540 (nel mio caso non è NFC) sarebbe molto interessante provarlo sulla mia distribuzione ClearLinux, in quanto un Flatpak sarebbe più comodo come dici tu, rispetto a doverlo compilare e eseguire.

Ciao! Fatalità mi è arrivato oggi un lettore nfc NP352 - clone cinese su aliexpress, proprio per poter sperimentare con TS e CIE.

Dentro un toolbox pulito con libnfc & Co. installati (sono su silverblue, quindi sono nelle condizioni più generiche possibili) leggo il device e la carta con i tool nfc:

Cofig

Ho aggiungunto a /etc/nfc/libnfc.conf:

device.name = "PN532 board via UART"
device.connstring = "pn532_uart:/dev/ttyUSB0"

Ovviamente dopo aver dato un bel chown davide:dialout /dev/ttyUSB0, che sennò non posso usare il device come utente

Test NFC

$ nfc-scan-device -v
nfc-scan-device uses libnfc 1.8.0
1 NFC device(s) found:
- PN532 board via UART:
    pn532_uart:/dev/ttyUSB0
chip: PN532 v1.6
initator mode modulations: ISO/IEC 14443A (424 kbps, 212 kbps, 106 kbps), FeliCa (424 kbps, 212 kbps), ISO/IEC 14443-4B (106 kbps), ISO/IEC 14443-4B' (106 kbps), ISO/IEC 14443-2B ST SRx (106 kbps), ISO/IEC 14443-2B ASK CTx (106 kbps), ISO/IEC 14443-2B-3B iClass (Picopass) (106 kbps), Innovision Jewel (106 kbps), Thinfilm NFC Barcode (106 kbps), D.E.P. (424 kbps, 212 kbps, 106 kbps)
target mode modulations: ISO/IEC 14443A (424 kbps, 212 kbps, 106 kbps), FeliCa (424 kbps, 212 kbps), D.E.P. (424 kbps, 212 kbps, 106 kbps)
$ nfc-poll
nfc-poll uses libnfc 1.8.0
NFC reader: PN532 board via UART opened
NFC device will poll during 36000 ms (20 pollings of 300 ms for 6 modulations)
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  08  
       UID (NFCID3): <4 byte>
      SAK (SEL_RES): 20  
                ATS: <19 byte>
Waiting for card removing...nfc_initiator_target_is_present: Target Released
done.

(Non ho idea se vengono mostrati dati sensibili, nel dubbio meglio non divulgare sti 23 byte mistici 😄 )

PCSC

Installiamo il pacchetto pcsc-tools e.... Niente, il reader non va. Sono stato 3 ore a cercare di far vedere a PCSC il lettore nfc, ma nada. Se trovo qualcosa vi aggiorno.

DadiBit avatar Mar 14 '25 22:03 DadiBit

Hai provato a lanciare pcsc_scan e vedere se rileva qualcosa?

MarcusPro7 avatar Mar 15 '25 12:03 MarcusPro7

Hai provato a lanciare pcsc_scan e vedere se rileva qualcosa?

Sì, in realtà è proprio quello che non va. Mi spiego meglio: il lettore PN/PCR532 è supportato da libnfc, ma il driver fidnfc è datato e credo sia da adattare per renderlo visibile a pcsc (in pratica sarebbe da installare all'interno di /var/lib/pcsc/drivers/ e poi creare un file reader.conf dedicato) Riesco a forzare il caricamento dellla library, ma è come se pcsc si rifiutasse di usare il lettore:

sudo pcscd -adf
00000000 [140513866404416] ../src/pcscdaemon.c:353:main() pcscd set to foreground with debug send to stdout
00000178 [140513866404416] ../src/configfile.l:293:DBGetReaderListDir() Parsing conf directory: /etc/reader.conf.d
00000017 [140513866404416] ../src/configfile.l:326:DBGetReaderListDir() Skipping non regular file: .
00000004 [140513866404416] ../src/configfile.l:326:DBGetReaderListDir() Skipping non regular file: ..
00000005 [140513866404416] ../src/configfile.l:365:DBGetReaderList() Parsing conf file: /etc/reader.conf.d/libccidtwin
00000035 [140513866404416] ../src/configfile.l:365:DBGetReaderList() Parsing conf file: /etc/reader.conf.d/libnfc
00000235 [140513866404416] ../src/configfile.l:210:evaluatetoken() Add reader: PN 532
00000014 [140513866404416] ../src/readerfactory.c:1103:RFInitializeReader() Attempting startup of PN 532 00 00 using /var/home/davide/.local/lib/libifdnfc.so
00000386 [140513866404416] ../src/readerfactory.c:977:RFBindFunctions() Loading IFD Handler 3.0
00000012 [140513866404416] ifd-nfc.c:377:IFDHCreateChannelByName() Driver initialization
00000048 [140513866404416] ifd-nfc.c:436:IFDHCreateChannelByName() "DEVICENAME    usb:1a86/7523:libudev:0:/dev/bus/usb/001/019" is not used.
00000005 [140513866404416] ifd-nfc.c:439:IFDHCreateChannelByName() IFD-handler for NFC devices is ready.
00000004 [140513866404416] ifd-nfc.c:480:IFDHGetCapabilities() IFDHGetCapabilities(DWORD Lun (00000000), DWORD Tag (00000fb3), PDWORD Length (8), PUCHAR Value)
00000005 [140513866404416] ifd-nfc.c:531:IFDHGetCapabilities() Tag 00000fb3 (4019) not supported
00000002 [140513866404416] ../src/readerfactory.c:386:RFAddReader() Using the pcscd polling thread
00000041 [140513866404416] ifd-nfc.c:480:IFDHGetCapabilities() IFDHGetCapabilities(DWORD Lun (00000000), DWORD Tag (00000fae), PDWORD Length (1), PUCHAR Value)
00000005 [140513866404416] ../src/pcscdaemon.c:669:main() pcsc-lite 2.3.0 daemon ready.
00000184 [140513866404416] ../src/pcscdaemon.c:752:main() Using drivers directory: /usr/lib64/pcsc/drivers

Comunque non c'entra niente con la CIE, quindi quando mi arrendo provo a scrivere sulla repo corretta 😄

DadiBit avatar Mar 15 '25 16:03 DadiBit

[!NOTE] Pubblico qui questo commento, con la speranza di aiutare tutti gli interessati a rendere il programma più accessibile: spendere 20 o più euro per un c...avolo di lettore nfc con un chip specifico non favorisce nè gli sviluppatori a lavorare su questa tecnologia, nè agli utenti finali a restare su Linux.

Ok, ho fatto passi da gigante ieri pomeriggio, ma non riesco ancora a sbloccare la carta nel programma: il programma si blocca dopo un po', però almeno ora mi riconosce la presenza o meno della carta via pcsc_scan. Su FireFox, dove normalmente il lettore bit4id funziona con tessera sanitaria TS2022 (dopo aver rimosso la libreria builtin e lasciato quella SafeDive 2022), non posso fare il login alla TS e nemmeno alla CIE (con rispettivi driver). Il mio problema è quasi sicuramente il lettore PCR 532 poco supportato su Linux.

Il mio riferimento principale è stata questa issue.

Driver PCR 532

Scarica la repo https://github.com/nfc-tools/ifdnfc via git o direttamente il file zip (fork con supporto per il chip che ho comprato su Aliexpress)

Compila con:

autoreconf -vis
./configure
make
sudo make install

Per installazione su Silverblue/Fedora immutable vedi qui il file spec con cui create un rpm da installare localmente come overlay.

Imposta dispositivo (hardcode - in alternativa abilita la scan intrusiva) per libnfc aggiungendo in fondo a /etc/nfc/libnfc.conf:

device.name = "PN532 board via UART"
device.connstring = "pn532_uart:/dev/ttyUSB0"

[!IMPORTANT] Non serve toccare il file /etc/reader.conf.d/ifdnfc se lavoriamo via USB (anche se la connesione è UART l'interfaccia resta pur sempre una USB)

PCSC

Possiamo stoppare il servizio con sudo systemctl stop pcscd e avviarlo in foreground con sudo pcscd -afd.

Attiviamiamo il dispositivo gestito da libnfc (quello configurato in fondo al predente capitolo - non quello gestito da pcsc) con ifdnfc-activate

Ora possiamo vedere che pcsc_scan notifica correttamente la connesione e disconnesione della carta. 🤟

DadiBit avatar Mar 16 '25 09:03 DadiBit