Newsgroup: it.comp.software.newsreader
Titolo: Re: Message-ID di Eudora

 serie di dati *casuali* e *univoca* da mettere a sx di @fqdn.
C'era un articolo scritto da d'Itri e citato più volte su questo
problema (che ovviamente non ho archiviato); sicuramente Sleepers o
Gesù potranno essere più precisi.
-- 
daRkSidE, 25/11/2005 12.54.32

 o Gesù potranno essere più precisi.
Allora aspetto il Message-ID. :-)
-- 
Ciao, Lurkos
it-alt.media.internet.google
I servizi di Google: Gmail, Groups, News ed altro

daRkSidE wrote:

penso di averlo individuato, è del 2000 e rimanda a una rfc e un paio di
draft (uno dei quali è diventato rfc nel 2003). nessuna indicazione
pratica su come comportarsi.
greppando il codice del pg, ho visto che la parte a sx dell'@ viene
generata applicando
      function LikeRadix32( l : Longint ): String;
      const ALPHABET = '0123456789abcdefghijklmnopqrstuv';
      var  p : Longint;
      begin
           Result := '';
           repeat
              p := l and $1F;
              l := l shr 5;
              Result := copy(ALPHABET,p+1,1) + Result;
           until l=0;
      end;
 
prima alla data corrente espressa in secondi dal 1970 (il `date +%s' sotto
*nix) meno un offset di 673416000; la stringa ottenuta viene concatenata a
un . e poi alla stringa che si ottiene applicando la stessa function al
thread corrente.
pg ha la funzione `ApiGetCurrentThreadId' nel modulo `hw_common', l'and
logico è dato da &, lo shift destro (shr) da >>, il copy ha la stessa
sintassi del delphi.
hth
-- 
losing my taste for the human race

 e relativo thread su ICSN
| 
| 
| > Leggendo la RFC1036 si sa che Il message Id e' unico, non puo' essere
| > riutilizzato da nessuno per un tempo determinato(2 anni?) e che al
| > suo interno e' contenuto un codice identificativo che riguarda l'ora
| > e il giorno di creazione. Ma che algoritmo si segue? 
| 
| per l'algoritmo esatto forse dovresti guardare qualche sorgente di
| newsreader, ce ne sono diversi disponibili, almeno uno per i Mac e
| quasi tutti per unix. Immagino usino data, ora e/o username prima della
| chiocciola piu` un numero progressivo per evitare che due post che
| partano contemporaneamente abbiano lo stesso ID e alla destra della
| chiocciola il dominio.
| 
| > Viene deciso dal newsreader?
| 
| dovrebbe, ma se manca ce lo mette il server. Considera che la ragione
| dei messaggi multipli di outlook e` proprio questa, cioe` la mancanza
| di un ID quando un articolo viene spedito al server. Se per caso la
| connessione e lenta e outlook non riceve la conferma dal server questo
| rispedisce l'articolo, ancora senza ID al quale il server dara` un ID
| diverso dal primo (che ne sa lui poverino che i due sono uguali)
| originando cosi` la catena di messaggi identici.
| 
| 
| 
http://www.jwz.org/doc/mid.html
| 
http://groups.google.com/groups?ic=1&q=msgid:%3Cp4mdur0hqesigvi9niom2och7liu6fqqeg%404ax.com%3E
| 
| 
| [Md]
| Per facilitarti la cosa, pensa che devi generare un valore che sia unico
| per ogni dominio fisico o temporale. Quindi te la puoi cavare mettendo
| qualcosa che identifichi l'host (quindi l'IP, visto che si tratta di PC
| senza un vero dominio) o l'utente (quindi local part e domain della
| mailbox vanno piu` che bene). Una volta ristretta l'univocita` a una
| macchina/indirizzo aggiungi il nome del tuo programma per cautelarti da
| un eventuale programma che usa lo stesso schema.
| Fatto questo sai che nessun altro potra` generare lo stesso Message-ID,
| e devi solo preoccuparti di non essere *tu* a poterlo fare, quindi devi
| renderlo unico nel tempo: un timestamp UNIX ha granularita` di un
| secondo, quindi devi aggiungere un valore che sia unico per quel
| secondo: un PID e` l'ideale, ma in alternativa un numero casuale va bene
| lo stesso.
| 
| Aggiungo che se e` necessario mantenere la privacy di alcuni di questi
| dati si possono sostituire i dati fisicamente locali con un loro hash.
| 
| 
| [Carlo Fusco]
| Il problema e` che per prevenire le collisioni (il message-ID deve
| essere univoco per sempre) occorrono vari livelli di "unicita`", il
| primo e` proprio quello di un dominio valido, che quindi per
| definizione potra` essere usato solo dai server del suo titolare. Poi
| viene l'esatto momento del post e per scendere sotto la granularita`
| del secondo si utilizza PID o cose del genere (il tutto condensato in un
| hash). Esiste un post molto informativo di marco d'itri che spiega
| bene tutto l'algoritmo.
| 
| Il problema e`: che fare se non si dispone di un FQDN? L'idea della
| Forte` di offrire il loro dominio mi sembra una stronzata. Io uso un
| dominio di fantasia, con un TLD sicuramente non esistente e metterei
| il .invalid alla fine perche` i robot idioti degli spammer, ancora piu`
| idioti, raccolgono "indirizzi" email anche dai message-id.
| 
| Questo non previene teoricamente le collisioni, ma almeno le rende
| altamente improbabili.
 `----------
Ciao, Alessio.
-- 
Materiale in italiano per Agent: 
http://agentit.altervista.org/
FAQ di ICS.newsreader: 
http://faq.news.nic.it/wiki/IcsnFaq
Il mio sito: 
http://www.sleepers.it

 o Gesù potranno essere più precisi.
Allora aspetto il Message-ID. :-)


 copy/paste di materiale vario:
Ti ringrazio.
Mi metto a leggere tutto con calma.


 la stessa sintassi del delphi.
Ecco che qua mi perdo ...


 Sul Classic c'č l'opzione, non ricordo sul PG.
3 opzioni: system + user info, system info, liscio.


 3 opzioni: system + user info, system info, liscio.
Quella non sono le impostazioni di protezione delle password salvate?
Io intedevo l'opzione del Classic:
[IT] "Cifra il Message-ID, se generato"
[EN] "encrypt Message-ID, if generated"
-- 
Ciao, Lurkos

 Quella non sono le impostazioni di protezione delle password salvate?
esatto... 
no, non mi pare ci sia tale opzione. incollo la funzione che si occupa di
generare il mid:
   function MIDGenerator( FQDN: String; LocalSuffix: String = '' ): String;
   const OFFSET = 673416000;
   var   NewDateTime: LongInt;
         i: LongInt;
   begin
        NewDateTime := DateTimeToUnixTime( Now ) - OFFSET;
 
        if NewDateTime=MIDOldTime then begin
           inc( MIDCounter )
        end else begin
           MIDCounter := 1;
           MIDOldTime := NewDateTime;
        end;
 
        if FQDN='' then FQDN := 'FQDN-not-set';
        if Pos( '.', FQDN ) = 0 then begin
           i := NewDateTime XOR LongInt(GetCurrentThreadID) XOR MIDCounter;
           FQDN := FQDN
                 + '.h' + lowercase( inttohex( StrToCRC32(inttostr(i)), 8 ) )
                 + '.' + 'invalid';
        end;
 
        Result := '<'
                + LikeRadix32( NewDateTime ) + '.'
                + LikeRadix32( GetCurrentThreadID ) + '.'
                + inttostr( MIDCounter )
                + LocalSuffix + '@' + FQDN + '>';
   end;
LikeRadix32 viene sempre applicata alla parte sx del MID; se il FQDN non č
stato impostato viene aggiunta una stringa generata con gli XOR tra
`FQDN-not-set.h' e `.invalid'.


 incollo la funzione che si occupa di generare il mid:
Voglio provare a creare un programma a linea di comando per generare un 
Message-ID con Delphi5 "reimpastando" queste function.
Magari uno potrebbe richiamarlo con Hamster senza dover riscrivere da 
zero tutto il codice.
In quale file .pas si trovano?
La licenza di Hamster permette questo genere di cose?
Sembrerebbe di sě.
-- 
Ciao, Lurkos

 Sembrerebbe di sì.
già, è una licenza molto permissiva.


 lib/uTools.pas
Ok, trovato.
Ho trovato diversi richiami alla funzione "GetCurrentThreadID".
È inclusa direttamente in Delphi?
Ho provato a cercare fra i sorgenti, ma non ho trovato nessun codice 
relativo.
-- 
Ciao, Lurkos

 È inclusa direttamente in Delphi?
eggià


 eggià
Bene. Mi stavo già preoccupando :)
Ho trovato anche i sorgenti del Classic.
La function è quasi uguale, ma contiene in più la possibilità di creare 
un hash della parte a sinistra di @FQDN con MD5.
I sorgenti sono sempre su uTool.pas (+ uMD5.pas).
-- 
Ciao, Lurkos