diff options
author | Erich Eckner <git@eckner.net> | 2015-12-04 13:16:24 +0100 |
---|---|---|
committer | Erich Eckner <git@eckner.net> | 2015-12-04 13:16:24 +0100 |
commit | 5c9d129d47071475e4a71362d1f0bbd5a8e463dd (patch) | |
tree | 865077a9400d22ff9769a58d5829dc4e1295b945 /popunit.pas | |
parent | 47e84f79abac5407328d9009b6f2b752238228e9 (diff) | |
download | units-5c9d129d47071475e4a71362d1f0bbd5a8e463dd.tar.xz |
popunit.pas: hashcash statt sha1sum, tNachricht statt tMyStringList
Diffstat (limited to 'popunit.pas')
-rw-r--r-- | popunit.pas | 226 |
1 files changed, 138 insertions, 88 deletions
diff --git a/popunit.pas b/popunit.pas index dc7a52c..337f915 100644 --- a/popunit.pas +++ b/popunit.pas @@ -13,14 +13,29 @@ type tPopClient = class; + tNachricht = class(tMyStringList) + private + _marke: tMarkenValiditaet; + public + id,groesze: longint; + gueltigerAdressat: string; + constructor create; + destructor destroy; override; + procedure kopiereVon(n: tNachricht); + function istGleich(n: tNachricht): boolean; + property marke: tMarkenValiditaet + read _Marke; + procedure pruefeMarke; + end; + tPopThread = class(tThread) private _beendet: boolean; _sshUser,_host,_user,_pass: string; _port: longint; _besitzer: tPopClient; - _nachrichten: array of tStringList; - _lIds: tStringList; + _nachrichten: array of tNachricht; + _lIds: array of longint; procedure datenRausGeben; procedure datenReinNehmen; procedure auszenWeltKontakt(var pr: tProcess); @@ -36,13 +51,13 @@ type tPopClient = class private _thread: tPopThread; - _nachrichten: array of tMyStringList; - _lIds: tMyStringList; + _nachrichten: array of tNachricht; + _lIds: array of longint; public - sshUser,host,user,pass: string; - port: longint; - timeout: extended; - neueNachrichten: tNotifyEvent; + sshUser,host,user,pass,gueltigerAdressat: string; + port: longint; + timeout: extended; + neueNachrichten: tNotifyEvent; constructor create; destructor destroy; override; function nAnz: longint; @@ -81,10 +96,80 @@ var i: longint; begin i:=1; - while i<=length(s) do + while p.running and (i<=length(s)) do i:=i+p.input.write(s[i],length(s)-i+1); end; +// tNachricht ****************************************************************** + +constructor tNachricht.create; +begin + inherited create; + id:=-1; + groesze:=-1; + _marke:=mvKeine; + fillchar(gueltigerAdressat,sizeof(gueltigerAdressat),#0); + gueltigerAdressat:=''; +end; + +destructor tNachricht.destroy; +begin + gueltigerAdressat:=''; + inherited destroy; +end; + +procedure tNachricht.kopiereVon(n: tNachricht); +begin + text:=n.text; + id:=n.id; + groesze:=n.groesze; + _marke:=n._marke; + gueltigerAdressat:=n.gueltigerAdressat; +end; + +function tNachricht.istGleich(n: tNachricht): boolean; +begin + result:=(text=n.text) and (id=n.id) and (groesze=n.groesze); +end; + +procedure tNachricht.pruefeMarke; +var + pr: tProcess; +begin + if grepFirst('^[Xx]-[Hh]ash[Cc]ash:\s')='' then begin + _marke:=mvKeine; + exit; + end; + + pr:=tProcess.create(nil); + pr.executable:='hashcash'; + pr.parameters.add('-c'); // Prüfen + pr.parameters.add('-X'); // Header-Format + pr.parameters.add('-b'); // Bits + pr.parameters.add('20'); + pr.parameters.add('-d'); // mit Datenbank + pr.parameters.add('-E'); // mit Regex + pr.parameters.add('-r'); // gültige Rezipienten + pr.parameters.add(gueltigerAdressat); + + pr.options:=[poUsePipes]; + pr.execute; + + writeString(pr,text); + pr.closeInput; + while pr.running or (pr.output.numBytesAvailable>0) do + readString(pr); + pr.closeOutput; + + case pr.ExitCode of + 0: _marke:=mvGueltig; + else + _marke:=mvUngueltig; + end; + + pr.free; +end; + // tPopThread ****************************************************************** constructor tPopThread.create(besitzer: tPopClient); @@ -99,7 +184,8 @@ begin _pass:=''; _host:=''; setlength(_nachrichten,0); - _lIds:=tStringList.create; + fillchar(_lIds,sizeof(_lIds),#0); + setlength(_lIds,0); suspended:=false; end; @@ -113,7 +199,7 @@ begin for i:=0 to length(_nachrichten)-1 do _nachrichten[i].free; setlength(_nachrichten,0); - _lIds.free; + setlength(_lIds,0); inherited destroy; end; @@ -127,14 +213,14 @@ begin neu:=length(_besitzer._nachrichten)<>length(_nachrichten); if not neu then for i:=0 to length(_nachrichten)-1 do - neu:=neu or (_nachrichten[i].text<>_besitzer._nachrichten[i].text); + neu:=neu or not _nachrichten[i].istGleich(_besitzer._nachrichten[i]); if neu then begin for i:=0 to length(_besitzer._nachrichten)-1 do _besitzer._nachrichten[i].free; setlength(_besitzer._nachrichten,length(_nachrichten)); for i:=0 to length(_besitzer._nachrichten)-1 do begin - _besitzer._nachrichten[i]:=tMyStringList.create; - _besitzer._nachrichten[i].text:=_nachrichten[i].text; + _besitzer._nachrichten[i]:=tNachricht.create; + _besitzer._nachrichten[i].kopiereVon(_nachrichten[i]); end; end; if assigned(_besitzer.neueNachrichten) then @@ -150,8 +236,10 @@ begin _pass:=_besitzer.pass; _host:=_besitzer.host; _port:=_besitzer.port; - _lIds.text:=_besitzer._lIds.text; - _besitzer._lIds.clear; + setlength(_lIds,length(_besitzer._lIds)); + if length(_lIds)>0 then + move(_besitzer._lIds[0],_lIds[0],sizeof(_lIds[0])*length(_lIds)); + setlength(_besitzer._lIds,0); end; procedure tPopThread.auszenWeltKontakt(var pr: tProcess); @@ -162,11 +250,9 @@ var begin synchronize(@datenReinNehmen); - _lIds.CustomSort(@numerischerVergleich); - if assigned(pr) then begin - for i:=_lIds.count-1 downto 0 do begin - writeString(pr,'DELE '+_lIds[i]+#10); + for i:=0 to length(_lIds)-1 do begin + writeString(pr,'DELE '+intToStr(_lIds[i])+#10); zeit:=now+_besitzer.timeout/24/60/60; buf:=''; @@ -176,7 +262,7 @@ begin if pos('+OK',buf)=0 then begin pr.free; pr:=nil; - writeln(stderr,'DELE '+_lIds[i]+' fehlgeschlagen!'); + writeln(stderr,'DELE '+intToStr(_lIds[i])+' fehlgeschlagen!'); exit; end; @@ -184,7 +270,7 @@ begin exit; for j:=length(_nachrichten)-1 downto 0 do - if _nachrichten[j][0]=_lIds[i] then begin + if _nachrichten[j].id=_lIds[i] then begin _nachrichten[j].free; for k:=j+1 to length(_nachrichten)-1 do _nachrichten[k-1]:=_nachrichten[k]; @@ -194,12 +280,12 @@ begin else if j=0 then begin pr.free; pr:=nil; - writeln(stderr,'DELE '+_lIds[i]+' fehlgeschlagen - ich habe die Nachricht nicht bei mir gefunden!'); + writeln(stderr,'DELE '+intToStr(_lIds[i])+' fehlgeschlagen - ich habe die Nachricht nicht bei mir gefunden!'); exit; end; end; - _lIds.clear; + setlength(_lIds,0); esGibtArbeit:=false; end; @@ -208,10 +294,10 @@ end; procedure tPopThread.execute; var - pr: tProcess; - buf,s,t: string; - zeit: extended; - i,j,len: longint; + pr: tProcess; + buf,s: string; + zeit: extended; + i,j,len,id,groesze: longint; begin pr:=nil; while not beenden do begin @@ -327,11 +413,12 @@ begin while (not beenden) and (buf<>'') do begin s:=erstesArgument(buf,#13#10); - t:=erstesArgument(s); + id:=strToInt(erstesArgument(s)); + groesze:=strToInt(s); if (len<length(_nachrichten)) and assigned(_nachrichten[len]) and - (_nachrichten[len][0]=t) and - (_nachrichten[len][1]=s) then begin // Nachricht bereits vorhanden + (_nachrichten[len].groesze=groesze) and + (_nachrichten[len].id=id) then begin // Nachricht bereits vorhanden inc(len); continue; end; @@ -340,9 +427,10 @@ begin for i:=len to length(_nachrichten)-1 do _nachrichten[i]:=nil; end; - _nachrichten[len]:=tStringList.create; - _nachrichten[len].Text:=t; - _nachrichten[len].add(s); + _nachrichten[len]:=tNachricht.create; + _nachrichten[len].id:=id; + _nachrichten[len].groesze:=groesze; + _nachrichten[len].gueltigerAdressat:=_besitzer.gueltigerAdressat; inc(len); end; for i:=len to length(_nachrichten)-1 do @@ -353,8 +441,8 @@ begin break; for i:=0 to length(_nachrichten)-1 do - if _nachrichten[i].count=2 then begin - writeString(pr,'TOP '+_nachrichten[i][0]+' 0'#10); + if _nachrichten[i].count=0 then begin + writeString(pr,'TOP '+intToStr(_nachrichten[i].id)+' 0'#10); zeit:=now+_besitzer.timeout/24/60/60; buf:=''; @@ -364,7 +452,7 @@ begin if pos(#13#10'.'#13#10,buf)=0 then begin pr.free; pr:=nil; - writeln(stderr,'TOP '+_nachrichten[i][0]+' fehlgeschlagen!'); + writeln(stderr,'TOP '+intToStr(_nachrichten[i].id)+' fehlgeschlagen!'); break; end; @@ -374,12 +462,13 @@ begin buf:=erstesArgument(buf,#13#10'.'#13#10); erstesArgument(buf,'.'); - _nachrichten[i].text:=_nachrichten[i].text + buf; - for j:=_nachrichten[i].count-1 downto 3 do + _nachrichten[i].text:=buf; + for j:=_nachrichten[i].count-1 downto 1 do if (length(_nachrichten[i][j])>0) and (_nachrichten[i][j][1] in [' ',#9]) then begin - _nachrichten[i][j-1]:=trimRight(_nachrichten[i][j-1])+trim(_nachrichten[i][j]); + _nachrichten[i][j-1]:=trimRight(_nachrichten[i][j-1])+trimLeft(_nachrichten[i][j]); _nachrichten[i].delete(j); end; + _nachrichten[i].pruefeMarke; end; if beenden or not assigned(pr) then @@ -439,11 +528,13 @@ begin user:=''; pass:=''; host:=''; + gueltigerAdressat:=''; port:=0; timeout:=10; setlength(_nachrichten,0); neueNachrichten:=nil; - _lids:=tMyStringList.create; + fillchar(_lIds,sizeof(_lIds),#0); + setlength(_lIds,0); _thread:=tPopThread.create(self); end; @@ -455,7 +546,7 @@ begin for i:=0 to length(_nachrichten)-1 do _nachrichten[i].free; setlength(_nachrichten,0); - _lids.free; + setlength(_lIds,0); inherited destroy; end; @@ -483,51 +574,8 @@ begin end; function tPopClient.marke(n: longint): tMarkenValiditaet; -var - s,erg: string; - bits: longint; - pr: tProcess; begin - s:=_nachrichten[n].grepFirst('^[Xx]-[Hh]ash[Cc]ash:\s'); - if s='' then begin - result:=mvKeine; - exit; - end; - erstesArgument(s,':'); - - pr:=tProcess.create(nil); - pr.executable:='sha1sum'; - pr.parameters.add('-'); - pr.options:=[poUsePipes]; - pr.execute; - - writeln(stderr,''''+s+''' ->'); - writeString(pr,s); - pr.closeInput; - erg:=''; - while pr.running or (pr.output.numBytesAvailable>0) do - erg:=erg+readString(pr); - pr.closeOutput; - - pr.free; - - erstesArgument(s,':'); - bits:=strtoint(erstesArgument(s,':')); - if bits<20 then begin - result:=mvKeine; - exit; - end; - writeln(stderr,''''+erg+''''); - erg:=leftStr(erg,(bits+3) div 4); - result:=mvUngueltig; - while length(erg)>1 do begin - if erg[1]<>'0' then - exit; - delete(erg,1,1); - end; - if (strtoint('$'+erg) shr ((4-bits) mod 4)) <> 0 then - exit; - result:=mvGueltig; + result:=_nachrichten[n].marke; end; procedure tPopClient.threadAnhalten; @@ -545,7 +593,8 @@ procedure tPopClient.loesche(n: longint); var i: longint; begin - _lIds.add(_nachrichten[n][0]); + setlength(_lIds,length(_lIds)+1); + _lIds[length(_lIds)-1]:=_nachrichten[n].id; _nachrichten[n].free; for i:=n+1 to length(_nachrichten)-1 do _nachrichten[i-1]:=_nachrichten[i]; @@ -559,8 +608,9 @@ procedure tPopClient.loeschen; var i: longint; begin + setlength(_lIds,length(_lIds)+length(_nachrichten)); for i:=0 to length(_nachrichten)-1 do begin - _lIds.add(_nachrichten[i][0]); + _lIds[length(_lIds)-1-i]:=_nachrichten[i].id; _nachrichten[i].free; end; setlength(_nachrichten,0); |