Guest User

Untitled

a guest
Jan 5th, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 7.66 KB | None | 0 0
  1. program OnBeforeSendingMessage;
  2.  
  3. (*
  4. Format for Remove_Headers: {} = required, [] = optional
  5.   {HeaderName: }[,HeaderName: ][,HeaderName: ][...]
  6. Examples:
  7. - Single header: 'User-Agent: '
  8. - Multiple headers: 'User-Agent: ,X-Face: '
  9. *)
  10. procedure RemoveHeaders(Message : TStringlist;
  11.                         const Remove_Headers: String
  12. );
  13. var i                : integer;
  14.     k                : integer;
  15.     s                : string;
  16.     CommaPos         : integer;
  17.     DelHeader        : TStringlist;
  18.     RemoveH          : String;
  19. begin
  20.    RemoveH := Remove_Headers;
  21.    i := 0;
  22.    If ( RemoveH <> '' ) then begin
  23.       try
  24.          DelHeader := TStringlist.Create;
  25.          if ansipos ( ',', RemoveH) = 0 then begin
  26.             DelHeader.Add ( LowerCase ( TrimLeft( RemoveH )));
  27.          end // if
  28.          else begin
  29.             CommaPos := 0;  
  30.             for k := 1 to length ( RemoveH ) do begin
  31.                If RemoveH[k] = ',' then begin
  32.                   DelHeader.Add ( LowerCase ( TrimLeft (copy ( RemoveH, CommaPos + 1, k - ( CommaPos + 1 )))));
  33.                   CommaPos := k;
  34.                end; // if
  35.                if k = length ( RemoveH ) then
  36.                   DelHeader.Add ( LowerCase ( TrimLeft (copy ( RemoveH, CommaPos + 1, k - CommaPos ))));                  
  37.                end; // for  
  38.             end; // else  
  39.             s:= Message.text;
  40.             while (Message.Strings[i]<>'') do begin
  41.                k := 0;
  42.                while k <= ( DelHeader.Count - 1 ) do begin
  43.                   if pos( DelHeader[k], LowerCase ( Message.Strings[i] )) = 1 then
  44.                   begin
  45.                      delete ( s, pos(DelHeader[k], LowerCase (s) ), length (Message.Strings[i] ) + 2 );
  46.                      i := i - 1;
  47.                      k := DelHeader.Count - 1;
  48.                      message.text := s;
  49.                   end; // if
  50.                   k := k + 1;
  51.                end; // while  
  52.                i := i + 1;
  53.             end; //while
  54.             message.text:=s;
  55.          finally
  56.             DelHeader.Free;
  57.          end; // try - finally
  58.       end; // if  
  59. end; // RemoveHeaders    
  60.  
  61. (*
  62. Format for Add_Headers: {} = required, [] = optional
  63.   {HeaderName: HeaderValue{#13#10}}[HeaderName: HeaderValue{#13#10}][...]
  64. Examples: (each header must end with CR+LF)
  65. - Single header: 'User-Agent: '#13#10
  66. - Multiple headers: 'User-Agent: MyNewsClient'#13#10'X-Comment: To be, or not to be'#13#10
  67. *)
  68. procedure AddHeaders(var Message : TStringlist;
  69.                      const Add_Headers: String
  70. );
  71. var
  72.   SeparatorIndex: integer;
  73.   s: string;
  74. begin      
  75.   s:= Message.Text;
  76. //  writetolog('***before***'#13#10+s, 7);
  77.   SeparatorIndex:= pos(#13#10#13#10, s);
  78.   Insert(Add_Headers, s, SeparatorIndex+2);
  79.   Message.Text:= s;
  80. //  writetolog('***after***'#13#10+s, 7);
  81. end;
  82.  
  83. function StrMatch(str: String; pattern: String):Boolean;
  84. var
  85.   patternSize : Integer;
  86.   subStr : String;
  87.   compareRes : Integer;
  88. begin
  89.   patternSize := Length(pattern);
  90.   subStr := Copy(str, 1, patternSize);
  91.   compareRes := CompareStr(pattern, subStr);
  92.   if (compareRes = 0) then
  93.     result := true
  94.   else
  95.     result := false;
  96. end;
  97.  
  98. //the xxx2Identity() functions must return an empty string if specified string is not identified
  99.  
  100. function From2Identity(from: String): String;
  101. begin  
  102.   if (StrMatch(from, 'First1 Last1 <[email protected]>')) then
  103.     result := 'id1'
  104.   else if (StrMatch(from, 'First2 Last2 <[email protected]>')) then
  105.     result := 'id2'
  106.   else if (StrMatch(from, 'john doe <[email protected]>')) then
  107.     result := 'id3'
  108.   else
  109.     result := '';
  110. end;
  111.  
  112. function NewsGroup2Identity(newsgroup: String): String;
  113. begin
  114.   if StrMatch(newsgroup, 'news.software.readers') then
  115.     result := 'id1'
  116.   else if StrMatch(newsgroup, 'alt.free.newsservers') then
  117.     result := 'id2'
  118.   else if StrMatch(newsgroup, 'alt.test') then
  119.     result := 'id3'
  120.   else
  121.     result := '';
  122. end;    
  123.  
  124. function Server2Identity(server: String): String;
  125. begin
  126.   if (CompareStr(server, 'aioe') = 0) then
  127.     result := 'id1'
  128.   else if (CompareStr(server, 'albasani') = 0) then
  129.     result := 'id2'
  130.   else
  131.     result := '';
  132. end;
  133.  
  134. procedure GetIdentities(var message: TStringlist; servername: string;
  135.   isEmail: boolean; var FromIdentity: String; var NewsgroupIdentity: String;
  136.   var ServerIdentity: String);
  137. var i : Integer;
  138. begin
  139.   FromIdentity := '';
  140.   NewsgroupIdentity := '';
  141.   ServerIdentity := '';
  142.   if (not IsEmail) then
  143.   begin
  144.     for i := 0 to Message.Count - 1 do
  145.     begin
  146.       if (strMatch(Message[i], 'From:')) then
  147.         fromIdentity := Copy(Message[i], 7, Length(Message[i]) - 6);
  148.       if (strMatch(Message[i], 'Newsgroups:')) then
  149.         newsgroupIdentity := Copy(Message[i], 13, Length(Message[i]) - 12);
  150.     end;
  151.     fromIdentity := From2Identity(fromIdentity);
  152.     newsgroupIdentity := NewsGroup2Identity(newsgroupIdentity);
  153.     serverIdentity := Server2Identity(servername);
  154.     // The lines below write to the log file ./40tude/logs/20161231.log
  155.     WriteToLog('  fromIdentity = ' + fromIdentity, 7);
  156.     WriteToLog('  newsgroupIdentity = ' + newsgroupIdentity, 7);
  157.     WriteToLog('  serverIdentity = ' + serverIdentity, 7);
  158.   end;
  159. end;  
  160.  
  161. procedure LogHeaders(var Message: TStringlist);
  162. var
  163.   i: integer;
  164.   s: string;
  165. begin
  166.   s:= '';
  167.   for i:= 0 to message.count-1 do
  168.   begin
  169.     if message[i] <> '' then s:= s+message[i]+#13#10
  170.     else break;
  171.   end;
  172.   writetolog(s, 7);
  173. end;
  174.  
  175. function OnBeforeSendingMessage(var Message     : TStringlist;
  176.                                     Servername  : string;
  177.                                     IsEmail     : boolean
  178. ):boolean;
  179. var
  180.   ForEmail: boolean;
  181.   ForNewsgroup : boolean;
  182.   FromIdentity: String;
  183.   NewsgroupIdentity: String;
  184.   ServerIdentity: String;
  185.   Remove_Headers: String;
  186.   Add_Headers: String;
  187. begin
  188.   //get the identities of the message
  189.   GetIdentities(message, servername, isEmail, FromIdentity, NewsgroupIdentity, ServerIdentity);
  190.  
  191.   ForEmail := false;     //don't do email message by default
  192.   ForNewsgroup := false; //don't do newsgroup message by default
  193.   Remove_Headers := '';  //don't remove any header by default
  194.   Add_Headers := '';     //don't add any header by default
  195.  
  196.   {The main decision.
  197.  
  198.    For FromIdentity, comparison must match against string returned by From2Identity() function.
  199.    Same applies to NewsgroupIdentity and ServerIdentity.
  200.    Note that identities may be an empty string.
  201.  
  202.    Set Remove_Header to remove header(s).
  203.    Set Add_Header to add header(s).
  204.    Set ForEmail and/or ForNewsgroup to `true` to add/remove header for email/newsgroup messages.
  205.   }
  206.   if FromIdentity = 'id1' then
  207.   begin
  208.     ForNewsgroup := true;
  209.     Remove_Headers := 'User-Agent: ,Message-ID: ';
  210.   end
  211.   else if (FromIdentity = 'id2') and (NewsgroupIdentity = 'id1') then
  212.   begin
  213.     ForNewsgroup := true;
  214.     Remove_Headers := 'User-Agent: ,Content-Transfer-Encoding: '
  215.     Add_Headers := 'X-Comment: John Doe was here';
  216.   end
  217.   else if (FromIdentity = 'id3') and (ServerIdentity = 'id2') then
  218.   begin
  219.     ForEmail := true;
  220.     ForNewsgroup := true;
  221.     Remove_Headers := 'User-Agent: ,Mime-Version: ';
  222.     Add_Headers := 'X-Comment: Jane Doe was here'#13#10 +
  223.       'X-Greeting: Hello there!'#13#10;
  224.   end;
  225.  
  226.   if (IsEmail and ForEmail) or ((not IsEmail) and ForNewsgroup) then
  227.   begin
  228.     if Remove_Headers <> '' then RemoveHeaders(Message, Remove_Headers);
  229.     if Add_Headers <> '' then AddHeaders(Message, Add_Headers);
  230.   end;
  231.  
  232.   result := true;
  233. //  result := false; //uncomment this line for testing purposes (doesn't send the message)
  234. end;
  235. // ----------------------------------------------------------------------
  236. begin
  237. end.
Advertisement
Add Comment
Please, Sign In to add comment