cie-middleware-linux
cie-middleware-linux copied to clipboard
Flatpak support
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).
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:
- Compilarlo e installarlo dalla sorgente
- Installare il pachetto
flatpak-buildertramite il proprio package manager (dnf/apt/pacman) - Installare il flatpak
org.flatpak.Builderconflatpak install org.flatpak.Builder- Possiamo assegnare un alias
alias flatpak-builder="flatpak run org.flatpak.Builder"per comodità
- Possiamo assegnare un alias
- 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
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:
- 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.
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, 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.
Hai provato a lanciare pcsc_scan e vedere se rileva qualcosa?
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 😄
[!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/ifdnfcse 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. 🤟