summaryrefslogtreecommitdiff
path: root/popunit.pas
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2015-12-04 13:16:24 +0100
committerErich Eckner <git@eckner.net>2015-12-04 13:16:24 +0100
commit5c9d129d47071475e4a71362d1f0bbd5a8e463dd (patch)
tree865077a9400d22ff9769a58d5829dc4e1295b945 /popunit.pas
parent47e84f79abac5407328d9009b6f2b752238228e9 (diff)
downloadunits-5c9d129d47071475e4a71362d1f0bbd5a8e463dd.tar.xz
popunit.pas: hashcash statt sha1sum, tNachricht statt tMyStringList
Diffstat (limited to 'popunit.pas')
-rw-r--r--popunit.pas226
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);