Vai al contenuto
SIMONE PIZZI
Progetti ↗
Runtime FeedDownloader Pro

La cassaforte adesso è aperta: anche FeedDownloader Pro diventa Open Source

A maggio avevo costruito una cassaforte e provato a scassinarla. Adesso l'ho aperta: FeedDownloader Pro esce dal mercato e passa sotto licenza MIT, codice pubblico.

Data
Lettura
10 minuti
Sezioni
16
Copertina: La cassaforte adesso è aperta: anche FeedDownloader Pro diventa Open Source

Cinque giorni dopo Titan Edition, il secondo programma esce dal mercato e passa sotto licenza MIT. Codice pubblico, release su GitHub, zero euro. E in mezzo tre mesi di lavoro che non avevo ancora raccontato.


Tre mesi fa chiudevo un articolo su questo software con una frase precisa: «La prossima versione stabile parte da qui. E stavolta, prima di scriverlo, ci ho provato sul serio.»

Quella versione è la v1.5.1, ed è la prima release nella storia del progetto a non essere più in vendita.

Runtime FeedDownloader Pro è da oggi software libero con licenza MIT:

👉 github.com/Pitz72/FeedDownloader

Il prodotto è stato rimosso da Gumroad, il repository Git è pubblico con la cronologia completa dei commit, gli installer sono scaricabili dalla sezione release e non è richiesto alcun pagamento.


Due in una settimana

Il 13 agosto è toccato a Runtime TelegramBot Desktop Titan Edition. Cinque giorni dopo segue questo programma.

I motivi alla base della decisione sono gli stessi già esposti per il primo rilascio: software altamente verticali, pensati per esigenze di nicchia, uniti alla mia totale assenza di attività di marketing. Ho allestito la pagina di vendita, fissato il prezzo e atteso eventuali acquirenti.

Le vendite complessive di FeedDownloader Pro, come per Titan, sono state pari a zero.

La scelta concreta era tra lasciare il codice inutilizzato in locale o renderlo accessibile a chiunque voglia esaminarlo, compilarlo, modificarlo o integrarlo nei propri flussi. Ho escluso la prima opzione la settimana scorsa per Titan e ho applicato lo stesso criterio qui.

Meglio un programma vivo e gratuito che un prodotto ben confezionato che non ha mai aperto nessuno.

Il passaggio all'open source ha però presentato una differenza operativa significativa rispetto a Titan, legata alla gestione pregressa del repository.


Questa volta non c’era niente da nascondere

Rendere pubblico un repository richiede un audit preventivo su tutta la cronologia dei commit, poiché file o segreti rimossi nei rami recenti rimangono comunque accessibili nei metadati storici di Git.

Nel caso di Titan questa verifica aveva richiesto la bonifica di 28 oggetti per 532 MB complessivi, tra manuali PDF con licenze EULA incorporate e asset di vecchie build scartate, comportando un pomeriggio di riscrittura della storia Git.

Per FeedDownloader la scansione non ha rilevato criticità: sono stati analizzati 162 commit su tutti i branch e 1.971 oggetti distinti, con l'estrazione integrale dei 1.872 file di testo per un totale di 22,5 MB di codice e documentazione esaminati in modo sistematico.

L'esito ha consentito la pubblicazione immediata senza modifiche alla cronologia: nessun token, chiave privata o credenziale reale era presente nei log. Le uniche stringhe sensibili individuate sono percorsi di esempio nei manuali (\\MYNAS\NomeCondivisione) e indirizzi fittizi usati nei test di regressione anti-SSRF. Il file locale contenente il token di rilascio non è mai stato tracciato grazie alle regole del file .gitignore impostate all'avvio del progetto. La cronologia non contiene file binari, registra un unico autore e non include nomi utente di sistema nei percorsi.


Aprire una cassaforte

Il post di maggio («Ho costruito una cassaforte. Poi ho provato a scassinarla») documentava la revisione di sicurezza condotta sul programma: undici release consecutive in poche ore per implementare controlli anti-SSRF a livello di socket, mitigazioni contro il DNS rebinding e la validazione ricorsiva dei reindirizzamenti HTTP.

Rendere pubblico il codice sorgente non indebolisce queste difese, ma permette di verificarle direttamente senza doversi fidare delle sole dichiarazioni dell'autore.

Il documento sul modello di sicurezza illustra nel dettaglio i cinque livelli di protezione adottati per bloccare richieste verso la rete locale, la gestione dei file scaricati e i meccanismi di persistenza su disco. Il testo dichiara inoltre due specifici limiti architetturali:

  1. Le credenziali dei feed protetti da autenticazione HTTP sono memorizzate in chiaro all'interno della stringa URL salvata nel database SQLite, scelta adottata per limitare la complessità del layer di archiviazione.

  2. I file eseguibili non sono firmati tramite certificato di firma commerciale: all'avvio su sistemi Windows viene mostrato l'avviso standard di SmartScreen relativo all'editore non verificato. La disponibilità del codice sorgente permette di verificare e compilare autonomamente i binari.


Tre mesi che non avevo raccontato

Dalla revisione di sicurezza di maggio al rilascio pubblico, l'applicazione è passata dalla v1.3.11 alla v1.5.1. Questo intervallo ha introdotto diverse modifiche strutturali al core del software.

Metà del catalogo era invisibile

Il parser dei feed RSS leggeva originariamente soltanto la prima pagina restituita dal server. Con piattaforme di hosting che implementano la paginazione dei feed (come Apple Podcasts, Libsyn o Blubrry), il programma recuperava solo gli ultimi 20 o 100 episodi, ignorando l'archivio pregresso.

Il modulo di recupero gestisce ora i collegamenti di paginazione, ricostruendo l'indice completo fino a un limite di sicurezza di 20 pagine consecutive per prevenire loop infiniti. Ciascuna pagina supplementare è sottoposta alle medesime verifiche di sicurezza applicate al feed iniziale.

Le notifiche che «sembravano non funzionare»

Il polling periodico controllava in precedenza la variazione del conteggio totale degli episodi. Per i podcast distribuiti con un catalogo a finestra fissa (dove l'aggiunta di una puntata coincide con la contestuale rimozione di quella più vecchia), il numero complessivo rimaneva costante, impedendo al sistema di rilevare l'aggiornamento e inviare la notifica.

L'algoritmo attuale memorizza gli episodi già elaborati in una tabella dedicata ed esegue il confronto sui singoli identificativi (GUID). Al primo avvio post-aggiornamento, per i feed privi di storico pregresso, il popolamento della tabella avviene in modo silenzioso per evitare l'invio massivo di notifiche relative a puntate già pubblicate in passato.

Il file corrotto marcato come buono

Durante la revisione del 12 luglio sono state individuate 14 anomalie, tra cui un bug critico nella logica di ripristino dei download interrotti.

In caso di trasferimento incompleto, il client inviava una richiesta con header Range richiedendo i byte a partire dall'offset locale. Se il file sul server remoto veniva sostituito o aggiornato nel frattempo, i nuovi byte venivano concatenati in coda al vecchio troncone, generando un file audio corrotto ma contrassegnato come integro a causa dell'omissione del controllo di validità sul ramo di ripresa.

La procedura attuale calcola e conserva l'hash parziale del file iniziale: se il server remoto segnala una modifica della risorsa o se l'hash non coincide, il file temporaneo viene scartato e il download riparte dall'inizio.

Gli identificativi che si chiamavano tutti «1»

I tag <guid> o <id> all'interno dei feed RSS sono univoci solo all'interno del singolo canale. Molti editori impiegano numerazioni progressive standard (1, 2, 3) o URL generici. Il database trattava originariamente questi valori come chiavi primarie globali, generando collisioni tra podcast diversi con conseguente sovrascrittura di record nell'archivio.

La chiave di unicità nel database è stata convertita nella coppia composita formata da identificativo dell'episodio e ID del feed, applicando una migrazione che preserva l'integrità dei database preesistenti.

Il programma che moriva prima di aprirsi

Un'eventuale corruzione del file di database all'avvio (causata da interruzioni di corrente in fase di I/O o errori di disco) determinava il crash immediato del processo prima del rendering dell'interfaccia grafica, senza generare log a schermo.

L'eccezione viene ora gestita isolando il database corrotto in un file di backup e inizializzando una nuova istanza, informando l'utente tramite apposita finestra di dialogo. Dalla versione 1.5.0, in presenza di un archivio danneggiato isolato e di un database attivo vuoto, l'applicazione offre una procedura guidata di ripristino che tenta il recupero riga per riga di feed, storico e impostazioni.

E poi

  • Aggiornamento di Electron: il framework è stato aggiornato da Electron 30 a Electron 43, allineando i moduli di runtime e Chromium alle ultime patch di sicurezza.

  • Ricalcolo del checksum SHA-256: la verifica dell'integrità non si limita a confermare la presenza del file su disco, ma ricalcola l'impronta hash per rilevare alterazioni. La funzione «Ripara archivio» consente di riassociare automaticamente file rinominati all'interno della directory.

  • Processi separati per il parsing: l'elaborazione dei feed è stata disaccoppiata dal processo principale di Electron, con un meccanismo di fallback nel caso in cui il processo secondario non risponda.

  • Gestione dei redirect permanenti: se un feed restituisce uno stato HTTP 301, il database aggiorna automaticamente l'URL di origine mantenendo associati storico e download.

  • Minimizzazione su tray: la chiusura della finestra tramite il pulsante X minimizza l'applicazione nell'area di notifica per mantenere attivi i controlli in background.

  • Miglioramenti alla v1.5.0: introdotta la sospensione e ripresa dei singoli download e della coda globale, il riaccodamento selettivo dei download falliti, l'impostazione di un limite massimo di dimensione per i file scaricabili e il blocco delle risposte server che restituiscono pagine HTML anziché stream multimediali.

  • Gestione aggiornamenti: rimossa l'installazione automatica dei pacchetti, sostituita da una notifica che richiede la conferma esplicita dell'utente, uniformando il comportamento a quello di Titan Edition.

Riduzione dei linguaggi supportati

Seguendo quanto fatto per Titan, sono state rimosse le localizzazioni in francese, tedesco, spagnolo, portoghese, russo e cinese dall'applicazione e dalla documentazione, lasciando attivi solo italiano e inglese. L'eliminazione delle lingue che non potevo verificare direttamente evita la presenza di testi errati o non revisionati. I client configurati su una delle lingue dismesse vengono reimpostati automaticamente su inglese al primo avvio.

Test e documentazione tecnica

La suite di test automatici è stata estesa da 199 a 394 casi di test, configurati come gate bloccante nelle pipeline di rilascio. Per gestire la compilazione dei moduli nativi del database tra l'ambiente Node (utilizzato dai test) ed Electron, la suite esegue automaticamente la ricompilazione mirata dei binari durante il ciclo di verifica.

Il repository include inoltre un paper tecnico (disponibile in italiano e inglese) che documenta l'architettura interna, la pipeline di download e le specifiche del modello di sicurezza, con riferimenti diretti ai singoli file e metodi del codice sorgente.


Il bundle da un pezzo

Nel catalogo prodotti del sito era presente un'opzione bundle per l'acquisto combinato dei tre software disponibili a prezzo ridotto. Con il passaggio all'open source di Titan (13 agosto) e FeedDownloader (18 agosto), l'offerta a pagamento include attualmente un unico applicativo.

Il blocco promozionale del bundle è stato modificato in modo dinamico: il componente viene renderizzato solo se il numero di prodotti a pagamento disponibili è pari o superiore a due, disattivandosi automaticamente in caso contrario.

Contestualmente sono state corrette alcune specifiche rimaste disallineate sulla vecchia scheda prodotto: il supporto a macOS (non supportato ufficialmente), la disponibilità di otto lingue (ridotte a due ad agosto), la versione di Electron indicata (aggiornata alla 43) e la grafica del logo, aggiornata a luglio.


Distribuzione e requisiti

I pacchetti compilati sono disponibili nella sezione release del repository:

  • Installer NSIS per Windows 10 e 11

  • Pacchetti AppImage e .deb per distribuzioni Linux

Per l'ambiente macOS non sono distribuiti binari precompilati: il software può essere compilato localmente dal codice sorgente, ma l'assenza di un certificato Apple Developer a pagamento esclude la fornitura di eseguibili firmati.

Le installazioni esistenti con versione 1.4.2 ricevono l'aggiornamento automatico e vengono agganciate al repository pubblico GitHub. Il meccanismo di transizione è stato validato con il rilascio della v1.5.1 eseguendo l'aggiornamento da una build v1.5.0.

Le istruzioni di compilazione e le linee guida per i contributi sono documentate nel file CONTRIBUTING.md. Il tracciamento dei bug avviene tramite issue di GitHub, mentre per le segnalazioni di sicurezza è indicata una procedura di contatto riservata.

Il programma rimane gratuito. Le modalità di contatto sono indicate sulla pagina contatti, mentre per il supporto economico al progetto è disponibile il canale paypal.me/runtimeradio.


A maggio scrivevo che una cassaforte non si valuta dalla verniciatura ma dalla tenuta della serratura, e che l'unico modo per provarla è tentare di scassinarla da soli.

L'apertura del codice sorgente rende ora visibile l'intera struttura del programma, consentendo a chiunque di ispezionarne l'implementazione e verificarne il comportamento direttamente dai file sorgente.


Runtime FeedDownloader Pro è software libero sotto licenza MIT. Codice, release e documentazione su GitHub. Sviluppato da Simone Pizzi per Runtime Radio.


Ogni tanto scrivo una lettera

Nessuna cadenza fissa, nessun riassunto automatico: parte solo quando ho qualcosa da raccontare. In fondo a ognuna c'è il link per uscire.

↑ Su

Cerca nel sito

Condividi

L'indirizzo di questa pagina:

Scrivi a Simone

Segnalazioni, correzioni, o solo per dire che una cosa non funziona: quest'ultima è la più utile di tutte.