summaryrefslogtreecommitdiff
path: root/popimapunit.pas
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2019-04-06 22:29:43 +0200
committerErich Eckner <git@eckner.net>2019-04-06 22:29:43 +0200
commitbbcb57bb5fa397ec88734c0c421b10f56d870947 (patch)
tree4cf34565d5e21131a8a0bf1c76fa73ccd689ac3e /popimapunit.pas
parenta5253b3bc9bc2a0f75db8601346bb9ccdcc26ce2 (diff)
downloadunits-bbcb57bb5fa397ec88734c0c421b10f56d870947.tar.xz
popimapunit.pas: bugfixes
Diffstat (limited to 'popimapunit.pas')
-rw-r--r--popimapunit.pas90
1 files changed, 64 insertions, 26 deletions
diff --git a/popimapunit.pas b/popimapunit.pas
index 5461792..df95c3e 100644
--- a/popimapunit.pas
+++ b/popimapunit.pas
@@ -139,6 +139,9 @@ var
zeit: extended;
begin
writeString(pr,bef+#10);
+ {$IFDEF DEBUG}
+ writeln(stderr, '>> ' + bef);
+ {$ENDIF}
zeit:=now+timeOut/24/60/60;
ausg:='';
@@ -147,6 +150,9 @@ begin
if pos(ende,ausg)>0 then begin
result:=baeOk;
+ {$IFDEF DEBUG}
+ writeln(stderr, '<< ' + copy(ausg, 1, 80));
+ {$ENDIF}
exit;
end;
@@ -177,6 +183,9 @@ var
const
chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
begin
+ {$IFDEF DEBUG}
+ writeln(stderr, '>> ' + bef);
+ {$ENDIF}
id:='';
for i:=0 to 15 do
id:=id + chars[random(length(chars))];
@@ -190,6 +199,9 @@ begin
if pos(id+' OK',ausg)>0 then begin
result:=baeOk;
delete(ausg, pos(id+' OK',ausg), length(ausg));
+ {$IFDEF DEBUG}
+ writeln(stderr, '<< ' + copy(ausg, 1, 80));
+ {$ENDIF}
exit;
end;
@@ -390,7 +402,7 @@ begin
if assigned(pr) then begin
case _mailProtocol of
- mpPop: begin
+ mpPop:
for i:=0 to length(_lIds)-1 do begin
case popBefehlAusfuehren(pr,'DELE '+intToStr(_lIds[i]),_besitzer.timeOut) of
baeTimeOut: exit;
@@ -401,22 +413,7 @@ begin
end{of case};
if beenden then
exit;
- for j:=length(_nachrichten)-1 downto 0 do
- 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];
- setLength(_nachrichten,length(_nachrichten)-1);
- break;
- end
- else if j=0 then begin
- pr.free;
- pr:=nil;
- writeln(stderr,'DELE '+intToStr(_lIds[i])+' fehlgeschlagen - ich habe die Nachricht nicht bei mir gefunden!');
- exit;
- end;
end;
- end;
mpImap: begin
s:='';
for i:=0 to length(_lIds)-1 do
@@ -433,11 +430,28 @@ begin
end;
end{of case};
+ for i:=0 to length(_lIds)-1 do begin
+ for j:=length(_nachrichten)-1 downto 0 do
+ 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];
+ setLength(_nachrichten,length(_nachrichten)-1);
+ break;
+ end
+ else if j=0 then begin
+ pr.free;
+ pr:=nil;
+ writeln(stderr,'DELE '+intToStr(_lIds[i])+' fehlgeschlagen - ich habe die Nachricht nicht bei mir gefunden!');
+ exit;
+ end;
+ end;
+
setLength(_lIds,0);
esGibtArbeit:=false;
end;
- synchronize(@datenRausGeben)
+ synchronize(@datenRausGeben);
end;
function tPopImapThread.doLogin(pr: tProcess): tBefehlAusfuehrenErgebnis;
@@ -632,25 +646,49 @@ begin
break;
if beenden then
break;
- if not startetMit('* '+intToStr(_nachrichten[i].id)+' FETCH (BODY[HEADER] {',buf,false) then
+ if not startetMit('* '+intToStr(_nachrichten[i].id)+' FETCH (BODY[HEADER] {',buf,false) then begin
+ writeln(stderr, 'syntax-Fehler: Antwort begann nicht mit "* '+intToStr(_nachrichten[i].id)+' FETCH (BODY[HEADER] {"');
break;
- _nachrichten[i].groesze:=strToInt(erstesArgument(buf,'}',false));
- if not startetMit(#13#10,buf,false) then
+ end;
+ s:=erstesArgument(buf,'}',false);
+ try
+ _nachrichten[i].groesze:=strToInt(s);
+ except
+ writeln(stderr, 'syntax-Fehler: "'+s+'" (1. Größe) ist kein Integer');
break;
+ end;
+ if not startetMit(#13#10,buf,false) then begin
+ writeln(stderr, 'syntax-Fehler: Zwischen-"#13#10" fehlt');
+ break;
+ end;
_nachrichten[i].text:=copy(buf,1,_nachrichten[i].groesze);
delete(buf,1,_nachrichten[i].groesze);
- if not startetMit(' BODY[TEXT] {',buf,false) then
+ if not startetMit(' BODY[TEXT] {',buf,false) then begin
+ writeln(stderr, 'syntax-Fehler: Zwischen-" BODY[TEXT] {" fehlt');
+ break;
+ end;
+ s:=erstesArgument(buf,'}',false);
+ try
+ j:=strToInt(s);
+ except
+ writeln(stderr, 'syntax-Fehler: "'+s+'" (2. Größe) ist kein Integer');
break;
- j:=strToInt(erstesArgument(buf,'}',false));
- if not startetMit(#13#10,buf,false) then
+ end;
+ if not startetMit(#13#10,buf,false) then begin
+ writeln(stderr, 'syntax-Fehler: 2. Zwischen-"#13#10" fehlt');
break;
+ end;
_nachrichten[i].text:=_nachrichten[i].text + #10 + copy(buf,1,j);
delete(buf,1,j);
_nachrichten[i].groesze:=_nachrichten[i].groesze + j;
- if not startetMit(')',buf) then
+ if not startetMit(')',buf) then begin
+ writeln(stderr, 'syntax-Fehler: End-")" fehlt');
break;
- if buf<>'' then
+ end;
+ if (buf<>'') and not startetMit('* '+intToStr(_nachrichten[i].id)+' FETCH ',buf) then begin
+ writeln(stderr, 'syntax Fehler: zu lange Antwort: "'+buf+'" übrig');
break;
+ end;
end;
end{of case};
for j:=_nachrichten[i].count-1 downto 1 do
@@ -671,7 +709,7 @@ begin
continue;
zeit:=now;
- for i:=0 to 5 do begin
+ for i:=0 to 5*byte(_mailProtocol = mpPop) do begin
zeit:=now+1/24/60/6;
if doNOOP(pr)<>baeOk then
break;