]> git.donarmstrong.com Git - debbugs.git/blob - scripts/process.in
355db908d4988e425378ccb57821884a09d30c35
[debbugs.git] / scripts / process.in
1 #!/usr/bin/perl
2 # $Id: process.in,v 1.23 2001/03/18 04:11:07 doogie Exp $
3 #
4 # Usage: process nn
5 # Temps:  incoming/Pnn
6
7 use Mail::Address;
8 require( '/etc/debbugs/config' );
9 require( '/usr/lib/debbugs/errorlib' );
10 chdir( "$gSpoolDir" ) || die 'chdir spool: $!\n';
11
12 #open(DEBUG,"> /tmp/debbugs.debug");
13 open DEBUG, ">/dev/null";
14
15 defined( $intdate= time ) || &quit( "failed to get time: $!" );
16
17 $_=shift;
18 m/^([BMQFDU])(\d*)\.\d+$/ || &quit("bad argument");
19 $codeletter= $1;
20 $tryref= length($2) ? $2+0 : -1;
21 $nn= $_;
22
23 if (!rename("incoming/G$nn","incoming/P$nn")) 
24 {       $_=$!.'';  m/no such file or directory/i && exit 0;
25     &quit("renaming to lock: $!");
26 }    
27
28 $baddress= 'bugs' if $codeletter eq 'B';
29 $baddress= 'maintonly' if $codeletter eq 'M';
30 $baddress= 'quiet' if $codeletter eq 'Q';
31 $baddress= 'forwarded' if $codeletter eq 'F';
32 $baddress= 'done' if $codeletter eq 'D';
33 $baddress= 'submitter' if $codeletter eq 'U';
34 $baddress || &quit("bad codeletter $codeletter");
35 $baddressroot= $baddress;
36 $baddress= "$tryref-$baddress" if $tryref>=0;
37
38 open(M,"incoming/P$nn");
39 @log=<M>;
40 close(M);
41
42 @msg=@log;
43 grep(s/\n+$//,@msg);
44
45 print DEBUG "###\n",join("##\n",@msg),"\n###\n";
46
47 chop($tdate= `date -u '+%a, %d %h %Y %T GMT'`);
48 $fwd= <<END;
49 X-Loop: $gMaintainerEmail
50 Received: via spool by $baddress\@$gEmailDomain id=$nn
51           (code $codeletter ref $tryref); $tdate
52 END
53
54 # Process the message's mail headers
55 for ($i=0; $i<=$#msg; $i++) {
56     $_ = $msg[$i];
57     last unless length($_);
58     &quit("looping detected") if m/^x-loop: (\S+)$/i && $1 eq "$gMaintainerEmail";
59     $ins= !m/^subject:/i && !m/^reply-to:/i && !m/^return-path:/i
60        && !m/^From / && !m/^X-Debbugs-CC:/i && !m/^received:/i;
61     $fwd .= $_."\n" if $ins;
62     while ($msg[$i+1] =~ m/^\s/) {
63         $i++;
64         $fwd .= $msg[$i]."\n" if $ins;
65         $_ .= ' '.$msg[$i];
66     }
67 # print DEBUG ">$_<\n";
68     if (s/^(\S+):\s*//) {
69         $v= $1; $v =~ y/A-Z/a-z/;
70                 print DEBUG ">$v=$_<\n";
71         $header{$v}= $_;
72     } else {
73         print DEBUG "!>$_<\n";
74     }
75 }
76
77 #remove blank lines
78 while ($i <= $#msg && !length($msg[$i])) { $fwd .= "\n"; $i++; }
79
80 #skips the "this is mime" message and any blank space after it
81 if ( $msg[$i] =~ /^This is a multi-part message in MIME format./ )
82 {
83         while ( $i <= $#msg && length( $msg[$i] ) ) { $fwd .= $msg[$i] . "\n"; $i++; }
84         while ( $i <= $#msg && !length( $msg[$i] ) ) { $fwd .= "\n"; $i++; }
85 }
86 #if the lines starts with -- or is nothing but blank space...
87 #skip to the next blank line(s) then skip past the blank line(s)
88 if ( $msg[$i] =~ /^--/ || $msg[$i] =~ /^\s*$/ )
89 {
90         while ( $i <= $#msg && length( $msg[$i] ) ) { $fwd .= $msg[$i] . "\n"; $i++; }
91         while ( $i <= $#msg && !length( $msg[$i] ) ) { $fwd .= "\n"; $i++; }
92 }               
93
94 while (defined ($msg[$i] ) )
95 {
96         last if ( $msg[$i] !~ m/^([\w]+):\s*(\S+)(.*)/ );
97         $i++;
98         $fn = $1; $fv = $2;
99         print DEBUG ">$fn|$'|\n";
100     $fwd .= $fn.': '.$fv."\n";
101     $fn =~ y/A-Z/a-z/;
102     $fv =~ y/A-Z/a-z/;
103     $pheader{$fn}= $fv;
104     $pfullheader{$fn}= $2.$3;
105         print DEBUG ">$fn~$fv<\n";
106 }
107
108
109 $fwd .= join("\n",@msg[$i..$#msg]);
110
111 print DEBUG "***\n$fwd\n***\n";
112
113 defined($header{'from'}) || &quit("no From header");
114 $replyto= defined($header{'reply-to'}) ? $header{'reply-to'} : $header{'from'};
115
116 $_= $replyto;
117 $_= "$2 <$1>" if m/^([^\<\> \t\n\(\)]+) \(([^\(\)\<\>]+)\)$/;
118 $replytocompare= $_;
119 print DEBUG "replytocompare >$replytocompare<\n";
120     
121 if (!defined($header{'subject'})) 
122 {       $brokenness.= <<END;
123
124 Your message did not contain a Subject field.  This is broken, I am
125 afraid - the Subject: line is a Required Header according to RFC822.
126 Please remember to include a Subject field in your messages in future.
127 If you did so the fact that it got lost probably indicates a poorly
128 configured mail system at your site or an intervening one.
129 END
130     $subject= '(no subject)';
131 } else { $subject= $header{'subject'}; }
132
133 $ref=-1;
134 $subject =~ s/^Re:\s*//i; $_= $subject."\n";
135 if ($tryref < 0 && m/^Bug ?\#(\d+)\D/i) { $tryref= $1+0; }
136
137 if ($tryref >= 0) 
138 {       $bfound= &lockreadbugmerge($tryref);
139     if ($bfound) { $ref= $tryref; } 
140         else 
141         {       &htmllog("Reply","sent", $replyto,"Unknown problem report number <code>$tryref</code>.");
142         &sendmessage(<<END, '');
143 From: $gMaintainerEmail ($gProject $gBug Tracking System)
144 To: $replyto
145 Subject: Unknown problem report $gBug#$tryref ($subject)
146 Message-ID: <handler.x.$nn.unknown\@$gEmailDomain>
147 In-Reply-To: $header{'message-id'}
148 References: $header{'message-id'} $s_msgid
149 X-$gProject-PR-Message: error
150
151 You sent a message to the $gBug tracking system which gave (in the
152 Subject line or encoded into the recipient at $gEmailDomain),
153 the number of a nonexistent $gBug report (#$tryref).
154
155 This may be because that $gBug report has been resolved for more than $gRemoveAge
156 days, and the record of it has been expunged, or because you mistyped
157 the $gBug report number.
158
159 Your message was dated $header{'date'} and was sent to
160 $baddress\@$gEmailDomain.  It had
161 Message-ID $header{'message-id'}
162 and Subject $subject.
163
164 It has been filed (under junk) but otherwise ignored.
165
166 Please consult your records to find the correct $gBug report number, or
167 contact me, the system administrator, for assistance.
168
169 $gMaintainer
170 (administrator, $gProject $gBugs database)
171
172 (NB: If you are a system administrator and have no idea what I am
173 talking about this indicates a serious mail system misconfiguration
174 somewhere.  Please contact me immediately.)
175
176 END
177                 &appendlog;
178         &finish;
179     }
180 } else { &filelock('lock/-1'); }
181
182 if ($codeletter eq 'D' || $codeletter eq 'F') 
183 {       if ($replyto =~ m/$gBounceFroms/o ||
184                 $header{'from'} =~ m/$gBounceFroms/o) 
185                 { &quit("bounce detected !  Mwaap! Mwaap!"); }
186     $markedby= $header{'from'} eq $replyto ? $replyto :
187                "$header{'from'} (reply to $replyto)";
188     if ($codeletter eq 'F') 
189         {       (&appendlog,&finish) if length($s_forwarded);
190         $receivedat= "forwarded\@$gEmailDomain";
191         $markaswhat= 'forwarded';
192         $set_forwarded= $header{'to'};
193                 if ( length( $gListDomain ) > 0 && length( $gFowardList ) > 0 ) 
194                         { $generalcc= "$gFowardList\@$gListDomain"; } 
195                 else { $generalcc=''; }
196     } else 
197         {       (&appendlog,&finish) if length($s_done);
198         $receivedat= "done\@$gEmailDomain";
199         $markaswhat= 'done';
200         $set_done= $header{'from'};
201                 if ( length( $gListDomain ) > 0 && length( $gDoneList ) > 0 ) 
202                         { $generalcc= "$gDoneList\@$gListDomain"; } 
203                 else { $generalcc=''; }
204     }
205     if ($ref<0) 
206         {       &htmllog("Warning","sent",$replyto,"Message ignored.");
207         &sendmessage(<<END, '');
208 From: $gMaintainerEmail ($gProject $gBug Tracking System)
209 To: $replyto
210 Subject: Message with no $gBug number ignored by $receivedat
211          ($subject)
212 Message-ID: <header.x.$nn.warnignore\@$gEmailDomain>
213 In-Reply-To: $header{'message-id'}
214 References: $header{'message-id'} $s_msgid
215 X-$gProject-PR-Message: error
216
217 You sent a message to the $gProject $gBug tracking system old-style
218 unified mark as $markaswhat address ($receivedat),
219 without a recognisable $gBug number in the Subject.
220 Your message has been filed under junk but otherwise ignored.
221
222 If you don't know what I'm talking about then probably either:
223
224 (a) you unwittingly sent a message to done\@$gEmailDomain
225 because you replied to all recipients of the message a developer used
226 to mark a $gBug as done and you modified the Subject.  In this case,
227 please do not be alarmed.  To avoid confusion do not do it again, but
228 there is no need to apologise or mail anyone asking for an explanation.
229
230 (b) you are a system administrator, reading this because the $gBug 
231 tracking system is responding to a misdirected bounce message.  In this
232 case there is a serious mail system misconfiguration somewhere - please
233 contact me immediately.
234
235 Your message was dated $header{'date'} and had
236 message-id $header{'message-id'}
237 and subject $subject.
238
239 If you need any assistance or explanation please contact me.
240
241 $gMaintainer
242 (administrator, $gProject $gBugs database)
243
244 END
245                 &appendlog;
246                 &finish;
247     }
248     &checkmaintainers;
249     $noticeccval.= join(', ', grep($_ ne $replyto,@maintaddrs));
250     $noticeccval =~ s/\s+\n\s+/ /g; $noticeccval =~ s/^\s+/ /; $noticeccval =~ s/\s+$//;
251     if (length($noticeccval)) { $noticecc= "Cc: $noticeccval\n"; }
252         if (length($generalcc)) { $noticecc.= "Bcc: $generalcc\n"; }
253     @process= ($ref,split(/ /,$s_mergedwith));
254     $orgref= $ref;
255     for $ref (@process) 
256         {       if ($ref != $orgref) 
257                 {       &unfilelock;
258                 &lockreadbug($ref) || die "huh ? $ref from $orgref out of @process";
259                 }
260         $s_done= $set_done if defined($set_done);
261         $s_forwarded= $set_forwarded if defined($set_forwarded);
262                 &overwrite("db/$ref.status",
263                    "$s_originator\n$s_date\n$s_subject\n$s_msgid\n".
264                    "$s_package\n$s_keywords\n$s_done\n$s_forwarded\n$s_mergedwith\n$s_severity\n");
265         open(O,"db/$ref.report") || &quit("read original report: $!");
266         $x= join('',<O>); close(O);
267         if ($codeletter eq 'F') 
268                 {       &htmllog("Reply","sent",$replyto,"You have marked $gBug as forwarded.");
269             &sendmessage(<<END, '');
270 From: $gMaintainerEmail ($gProject $gBug Tracking System)
271 To: $replyto
272 ${noticecc}Subject: $gBug#$ref: marked as forwarded ($s_subject)
273 Message-ID: <header.$ref.$nn.ackfwdd\@$gEmailDomain>
274 In-Reply-To: $header{'message-id'}
275 References: $header{'message-id'} $s_msgid
276 X-$gProject-PR-Message: forwarded $ref
277
278 Your message dated $header{'date'}
279 with message-id $header{'message-id'}
280 has caused the $gProject $gBug report #$ref,
281 regarding $s_subject
282 to be marked as having been forwarded to the upstream software
283 author(s) $s_forwarded.
284
285 (NB: If you are a system administrator and have no idea what I am
286 talking about this indicates a serious mail system misconfiguration
287 somewhere.  Please contact me immediately.)
288
289 $gMaintainer
290 (administrator, $gProject $gBugs database)
291
292 END
293         } else 
294                 {   &htmllog("Reply","sent",$replyto,"You have taken responsibility.");
295             &sendmessage(<<END."--------------------------------------\n".$x."---------------------------------------\n".join( "\n", @msg ), '');
296 From: $gMaintainerEmail ($gProject $gBug Tracking System)
297 To: $replyto
298 ${noticecc}Subject: $gBug#$ref: marked as done ($s_subject)
299 Message-ID: <handler.$ref.$nn.ackdone\@$gEmailDomain>
300 In-Reply-To: $header{'message-id'}
301 References: $header{'message-id'} $s_msgid
302 X-$gProject-PR-Message: closed $ref
303
304 Your message dated $header{'date'}
305 with message-id $header{'message-id'}
306 and subject line $subject
307 has caused the attached $gBug report to be marked as done.
308
309 This means that you claim that the problem has been dealt with.
310 If this is not the case it is now your responsibility to reopen the
311 $gBug report if necessary, and/or fix the problem forthwith.
312
313 (NB: If you are a system administrator and have no idea what I am
314 talking about this indicates a serious mail system misconfiguration
315 somewhere.  Please contact me immediately.)
316
317 $gMaintainer
318 (administrator, $gProject $gBugs database)
319
320 END
321             &htmllog("Notification","sent",$s_originator, 
322                                 "$gBug acknowledged by developer.");
323             &sendmessage(<<END.join("\n",@msg),'');
324 From: $gMaintainerEmail ($gProject $gBug Tracking System)
325 To: $s_originator
326 Subject: $gBug#$ref acknowledged by developer
327          ($header{'subject'})
328 Message-ID: <handler.$ref.$nn.notifdone\@$gEmailDomain>
329 In-Reply-To: $s_msgid
330 References: $header{'message-id'} $s_msgid
331 X-$gProject-PR-Message: they-closed $ref
332
333 This is an automatic notification regarding your $gBug report
334 #$ref: $s_subject,
335 which was filed against the $s_package package.
336
337 It has been closed by one of the developers, namely
338 $markedby.
339
340 Their explanation is attached below.  If this explanation is
341 unsatisfactory and you have not received a better one in a separate
342 message then please contact the developer directly, or email
343 $ref\@$gEmailDomain or me.
344
345 $gMaintainer
346 (administrator, $gProject $gBugs database)
347
348 END
349         }
350                 &appendlog;
351     }
352     &finish;
353 }
354
355 if ($ref<0) 
356 {       if ($codeletter eq 'U') 
357         {       &htmllog("Warning","sent",$replyto,"Message not forwarded.");
358         &sendmessage(<<END, '');
359 From: $gMaintainerEmail ($gProject $gBug Tracking System)
360 To: $replyto
361 Subject: Message with no $gBug number cannot be sent to submitter !
362          ($subject)
363 Message-ID: <handler.x.$nn.nonumnosub\@$gEmailDomain>
364 In-Reply-To: $header{'message-id'}
365 References: $header{'message-id'} $s_msgid
366 X-$gProject-PR-Message: error
367
368 You sent a message to the $gProject $gBug tracking system send to $gBug 
369 report submitter address $baddress\@$gEmailDomain, without a
370 recognisable $gBug number in the Subject.  Your message has been filed
371 under junk but otherwise ignored.
372
373 If you don't know what I'm talking about then probably either:
374
375 (a) you unwittingly sent a message to $baddress\@$gEmailDomain
376 because you replied to all recipients of the message a developer sent
377 to a $gBug's submitter and you modified the Subject.  In this case,
378 please do not be alarmed.  To avoid confusion do not do it again, but
379 there is no need to apologise or mail anyone asking for an
380 explanation.
381
382 (b) you are a system administrator, reading this because the $gBug 
383 tracking system is responding to a misdirected bounce message.  In this
384 case there is a serious mail system misconfiguration somewhere - please
385 contact me immediately.
386
387 Your message was dated $header{'date'} and had
388 message-id $header{'message-id'}
389 and subject $subject.
390
391 If you need any assistance or explanation please contact me.
392
393 $gMaintainer
394 (administrator, $gProject $gBugs database)
395
396 END
397         &appendlog;
398         &finish;
399     }
400     if (!defined($pheader{'package'}))
401         {       &htmllog("Warning","sent",$replyto,"Message not forwarded.");
402         &sendmessage(<<END."---------------------------------------------------------------------------\n".join("\n", @msg), '');
403 From: $gMaintainerEmail ($gProject $gBug Tracking System)
404 To: $replyto
405 Subject: Message with no Package: tag cannot be processed!
406          ($subject)
407 Message-ID: <handler.x.$nn.nonumnosub\@$gEmailDomain>
408 In-Reply-To: $header{'message-id'}
409 References: $header{'message-id'} $s_msgid
410 X-$gProject-PR-Message: error
411
412 Your message didn't have a Package: line at the start (in the
413 pseudo-header following the real mail header), or didn't have a
414 pseudo-header at all.
415
416 This makes it much harder for us to categorise and deal with your
417 problem report. Please _resubmit_ your report and tell us which package
418 the report is on. For help, check out http://$gWebDomain/Reporting.html.
419
420 Your message was dated $header{'date'} and had
421 message-id $header{'message-id'}
422 and subject $subject.
423 The complete text of it is attached to this message.
424
425 If you need any assistance or explanation please contact me.
426
427 $gMaintainer
428 (administrator, $gProject $gBugs database)
429
430 END
431         &appendlog;
432         &finish;
433     } else { $s_package= $pheader{'package'}; }
434     $s_keywords= '';
435     if (defined($pheader{'keywords'})) {
436         $s_keywords= $pfullheader{'keywords'};
437     } elsif (defined($pheader{'tags'})) {
438         $s_keywords= $pfullheader{'tags'};
439     }
440     if (length($s_keywords)) {
441         my @kws;
442         my %gkws = map { (%_, 1) } @gTags;
443         foreach my $kw (sort split(/[,\s]+/, lc($s_keywords))) {
444             push @kws, $kw if (defined $gkws{$kw});
445         }
446         $s_keywords = join(" ", @kws);
447     }
448     $s_severity= '';
449         if (defined($pheader{'severity'}) || defined($pheader{'priority'})) 
450         {       $s_severity= $pheader{'severity'};
451             $s_severity= $pheader{'priority'} unless ($s_severity);
452
453                 if (!grep($_ eq $s_severity, @severities, "$gDefaultSeverity")) {
454             $brokenness.= <<END;
455
456 Your message specified a Severity: in the pseudo-header, but
457 the severity value $s_severity was not recognised.
458 The default severity $gDefaultSeverity is being used instead.
459 The recognised values are: $gShowSeverities.
460 END
461 # if we use @gSeverityList array in the above line, perl -c gives:
462 # In string, @gSeverityList now must be written as \@gSeverityList at
463 #          process line 452, near "$gDefaultSeverity is being used instead.
464             $s_severity= '';
465         }
466     }
467     &filelock("nextnumber.lock");
468     open(N,"nextnumber") || &quit("nextnumber: read: $!");
469     $v=<N>; $v =~ s/\n$// || &quit("nextnumber bad format");
470     $ref= $v+0;  $v += 1;  $newref=1;
471     &overwrite('nextnumber', "$v\n");
472     &unfilelock;
473     &overwrite("db/$ref.log",'');
474     &overwrite("db/$ref.status",
475                "$replyto\n$intdate\n$subject\n$header{'message-id'}\n".
476                "$s_package\n$s_keywords\n\n\n\n$s_severity\n");
477     &overwrite("db/$ref.report",
478                join("\n",@msg)."\n");
479 }
480
481 &checkmaintainers;
482
483 print DEBUG "maintainers >@maintaddrs<\n";
484
485 $orgsender= defined($header{'sender'}) ? "Orignal-Sender: $header{'sender'}\n" : '';
486 $newsubject= $subject;  $newsubject =~ s/^$gBug#$ref\W*\s*//;
487
488 $xcchdr= $header{ 'x-debbugs-cc' };
489 if ($xcchdr =~ m/\S/) {
490     push(@resentccs,$xcchdr);
491     $resentccexplain.= <<END;
492
493 As you requested using X-Debbugs-CC, your message was also forwarded to
494    $xcchdr
495 (after having been given a $gBug report number, if it did not have one).
496 END
497 }
498
499 if (@maintaddrs && ($codeletter eq 'B' || $codeletter eq 'M')) {
500     push(@resentccs,@maintaddrs);
501     $resentccexplain.= <<END." ".join("\n ",@maintaddrs)."\n";
502
503 Your message has been sent to the package maintainer(s):
504 END
505 }
506
507 $veryquiet= $codeletter eq 'Q';
508 if ($codeletter eq 'M' && !@maintaddrs) {
509     $veryquiet= 1;
510     $brokenness.= <<END;
511
512 You requested that the message be sent to the package maintainer(s)
513 but either the $gBug report is not associated with any package (probably
514 because of a missing Package pseudo-header field in the original $gBug
515 report), or the package(s) specified do not have any maintainer(s).
516
517 Your message has *not* been sent to any package maintainers; it has
518 merely been filed in the $gBug tracking system.  If you require assistance
519 please contact $gMaintainerEmail quoting the $gBug number $ref.
520 END
521 }
522
523 $resentccval.= join(', ',@resentccs);
524 $resentccval =~ s/\s+\n\s+/ /g; $resentccval =~ s/^\s+/ /; $resentccval =~ s/\s+$//;
525 if (length($resentccval)) { $resentcc= "Resent-CC: $resentccval\n"; }
526
527 if ($codeletter eq 'U') {
528     &htmllog("Message", "sent on", $s_originator, "$gBug#$ref.");
529     &sendmessage(<<END,$s_originator,@resentccs);
530 Subject: $gBug#$ref: $newsubject
531 Reply-To: $replyto, $ref-quiet\@$gEmailDomain
532 ${orgsender}Resent-To: $s_originator
533 ${resentcc}Resent-Date: $tdate
534 Resent-Message-ID: <handler.$ref.$nn\@$gEmailDomain>
535 Resent-Sender: $gMaintainerEmail
536 X-$gProject-PR-Message: report $ref
537 X-$gProject-PR-Package: $s_package
538 X-$gProject-PR-Keywords: $s_keywords
539 $fwd
540 END
541 } elsif ($codeletter eq 'B') {
542     &htmllog($newref ? "Report" : "Information", "forwarded",
543              join(', ',"$gSubmitList\@$gListDomain",@resentccs),
544              "<code>$gBug#$ref</code>".
545              (length($s_package)? "; Package <code>".&sani($s_package)."</code>" : '').
546              ".");
547     &sendmessage(<<END,"$gSubmitList\@$gListDomain",@resentccs);
548 Subject: $gBug#$ref: $newsubject
549 Reply-To: $replyto, $ref\@$gEmailDomain
550 Resent-From: $header{'from'}
551 ${orgsender}Resent-To: $gSubmitList\@$gListDomain
552 ${resentcc}Resent-Date: $tdate
553 Resent-Message-ID: <handler.$ref.$nn\@$gEmailDomain>
554 Resent-Sender: $gMaintainerEmail
555 X-$gProject-PR-Message: report $ref
556 X-$gProject-PR-Package: $s_package
557 X-$gProject-PR-Keywords: $s_keywords
558 $fwd
559 END
560 } elsif (@resentccs) {
561     # D and F done far earlier; B just done - so this must be M or Q
562     # We preserve whichever it was in the Reply-To (possibly adding
563     # the $gBug#).
564     &htmllog($newref ? "Report" : "Information", "forwarded",
565              $resentccval,
566              "<code>$gBug#$ref</code>".
567              (length($s_package)? "; Package <code>".&sani($s_package)."</code>" : '').
568              ".");
569     &sendmessage(<<END,@resentccs);
570 Subject: $gBug#$ref: $newsubject
571 Reply-To: $replyto, $ref-$baddressroot\@$gEmailDomain
572 Resent-From: $header{'from'}
573 ${orgsender}Resent-To: $resentccval
574 Resent-Date: $tdate
575 Resent-Message-ID: <handler.$ref.$nn\@$gEmailDomain>
576 Resent-Sender: $gMaintainerEmail
577 X-$gProject-PR-Message: report $ref
578 X-$gProject-PR-Package: $s_package
579 X-$gProject-PR-Keywords: $s_keywords
580 $fwd
581 END
582 }
583
584 $htmlbreak= length($brokenness) ? "<p>\n".&sani($brokenness)."\n<p>\n" : '';
585 $htmlbreak =~ s/\n\n/\n<P>\n\n/g;
586 if (length($resentccval)) {
587     $htmlbreak =
588         "  Copy sent to <code>".&sani($resentccval)."</code>.".
589         $htmlbreak;
590 }
591 if ($newref) {
592     &htmllog("Acknowledgement","sent",$replyto,
593              ($veryquiet ?
594               "New $gBug report received and filed, but not forwarded." :
595               "New $gBug report received and forwarded."). $htmlbreak);
596     &sendmessage($veryquiet ? <<END : $codeletter eq 'M' ? <<END : <<END,'');
597 From: $gMaintainerEmail ($gProject $gBug Tracking System)
598 To: $replyto
599 Subject: $gBug#$ref: Acknowledgement of QUIET report
600          ($subject)
601 Message-ID: <handler.$ref.$nn.ackquiet\@$gEmailDomain>
602 In-Reply-To: $header{'message-id'}
603 References: $header{'message-id'}
604 X-$gProject-PR-Message: ack-quiet $ref
605
606 Thank you for the problem report you have sent regarding $gProject.
607 This is an automatically generated reply, to let you know your message
608 has been received.  It has not been forwarded to the developers or
609 their mailing list; you should ensure that the developers are aware of
610 the problem you have entered into the system - preferably quoting the
611 $gBug reference number, #$ref.
612 $resentccexplain
613 If you wish to submit further information on your problem, please send it
614 to $ref-$baddressroot\@$gEmailDomain (and *not*
615 to $baddress\@$gEmailDomain).
616
617 Please do not reply to the address at the top of this message,
618 unless you wish to report a problem with the $gBug-tracking system.
619 $brokenness
620 $gMaintainer
621 (administrator, $gProject $gBugs database)
622 END
623 From: $gMaintainerEmail ($gProject $gBug Tracking System)
624 To: $replyto
625 Subject: $gBug#$ref: Acknowledgement of maintainer-only report
626          ($subject)
627 Message-ID: <handler.$ref.$nn.ackmaint\@$gEmailDomain>
628 In-Reply-To: $header{'message-id'}
629 References: $header{'message-id'}
630 X-$gProject-PR-Message: ack-maintonly $ref
631
632 Thank you for the problem report you have sent regarding $gProject.
633 This is an automatically generated reply, to let you know your message has
634 been received.  It is being forwarded to the developers (but not the mailing
635 list, as you requested) for their attention; they will reply in due course.
636 $resentccexplain
637 If you wish to submit further information on your problem, please send
638 it to $ref-$baddressroot\@$gEmailDomain (and *not*
639 to $baddress\@$gEmailDomain).
640
641 Please do not reply to the address at the top of this message,
642 unless you wish to report a problem with the $gBug-tracking system.
643 $brokenness
644 $gMaintainer
645 (administrator, $gProject $gBugs database)
646 END
647 From: $gMaintainerEmail ($gProject $gBug Tracking System)
648 To: $replyto
649 Subject: $gBug#$ref: Acknowledgement ($subject)
650 Message-ID: <handler.$ref.$nn.ack\@$gEmailDomain>
651 In-Reply-To: $header{'message-id'}
652 References: $header{'message-id'}
653 X-$gProject-PR-Message: ack $ref
654
655 Thank you for the problem report you have sent regarding $gProject.
656 This is an automatically generated reply, to let you know your message has
657 been received.  It is being forwarded to the developers mailing list for
658 their attention; they will reply in due course.
659 $resentccexplain
660 If you wish to submit further information on your problem, please send
661 it to $ref\@$gEmailDomain (and *not* to
662 $baddress\@$gEmailDomain).
663
664 Please do not reply to the address at the top of this message,
665 unless you wish to report a problem with the $gBug-tracking system.
666 $brokenness
667 $gMaintainer
668 (administrator, $gProject $gBugs database)
669 END
670 } elsif ($codeletter ne 'U') {
671     &htmllog("Acknowledgement","sent",$replyto,
672              ($veryquiet ? "Extra info received and filed, but not forwarded." :
673               $codeletter eq 'M' ? "Extra info received and forwarded to maintainer." :
674               "Extra info received and forwarded to list."). $htmlbreak);
675     &sendmessage($veryquiet ? <<END : $codeletter eq 'M' ? <<END : <<END,'');
676 From: $gMaintainerEmail ($gProject $gBug Tracking System)
677 To: $replyto
678 Subject: $gBug#$ref: Info received and FILED only
679          (was $subject)
680 Message-ID: <handler.$ref.$nn.ackinfoquiet\@$gEmailDomain>
681 In-Reply-To: $header{'message-id'}
682 References: $header{'message-id'}
683 X-$gProject-PR-Message: ack-info-quiet $ref
684
685 Thank you for the additional information you have supplied regarding
686 this problem report.  It has NOT been forwarded to the developers, but
687 will accompany the original report in the $gBug tracking system.  Please
688 ensure that you yourself have sent a copy of the additional
689 information to any relevant developers or mailing lists.
690 $resentccexplain
691 If you wish to continue to submit further information on your problem,
692 please send it to $ref-$baddressroot\@$gEmailDomain, as before.
693
694 Please do not reply to the address at the top of this message,
695 unless you wish to report a problem with the $gBug-tracking system.
696 $brokenness
697 $gMaintainer
698 (administrator, $gProject $gBugs database)
699 END
700 From: $gMaintainerEmail ($gProject $gBug Tracking System)
701 To: $replyto
702 Subject: $gBug#$ref: Info received for maintainer only
703          (was $subject)
704 Message-ID: <handler.$ref.$nn.ackinfomaint\@$gEmailDomain>
705 In-Reply-To: $header{'message-id'}
706 References: $header{'message-id'}
707 X-$gProject-PR-Message: ack-info $ref
708
709 Thank you for the additional information you have supplied regarding
710 this problem report.  It has been forwarded to the developer(s) (but
711 not to the mailing list) to accompany the original report.
712 $resentccexplain
713 If you wish to continue to submit further information on your problem,
714 please send it to $ref-$baddressroot\@$gEmailDomain, as before.
715
716 Please do not reply to the address at the top of this message,
717 unless you wish to report a problem with the $gBug-tracking system.
718 $brokenness
719 $gMaintainer
720 (administrator, $gProject $gBugs database)
721 END
722 From: $gMaintainerEmail ($gProject $gBug Tracking System)
723 To: $replyto
724 Subject: $gBug#$ref: Info received (was $subject)
725 Message-ID: <handler.$ref.$nn.ackinfo\@$gEmailDomain>
726 In-Reply-To: $header{'message-id'}
727 References: $header{'message-id'}
728 X-$gProject-PR-Message: ack-info-maintonly $ref
729
730 Thank you for the additional information you have supplied regarding
731 this problem report.  It has been forwarded to the developer(s) and
732 to the developers mailing list to accompany the original report.
733 $resentccexplain
734 If you wish to continue to submit further information on your problem,
735 please send it to $ref\@$gEmailDomain, as before.
736
737 Please do not reply to the address at the top of this message,
738 unless you wish to report a problem with the $gBug-tracking system.
739 $brokenness
740 $gMaintainer
741 (administrator, $gProject $gBugs database)
742 END
743 }
744
745 &appendlog;
746 &finish;
747
748 sub overwrite {
749     local ($f,$v) = @_;
750     open(NEW,">$f.new") || &quit("$f.new: create: $!");
751     print(NEW "$v") || &quit("$f.new: write: $!");
752     close(NEW) || &quit("$f.new: close: $!");
753     rename("$f.new","$f") || &quit("rename $f.new to $f: $!");
754 }
755
756 sub appendlog {
757     if (!open(AP,">>db/$ref.log")) {
758         print DEBUG "failed open log<\n";
759         print DEBUG "failed open log err $!<\n";
760         &quit("opening db/$ref.log (li): $!");
761     }
762     print(AP "\7\n",@log,"\n\3\n") || &quit("writing db/$ref.log (li): $!");
763     close(AP) || &quit("closing db/$ref.log (li): $!");
764 }
765
766 sub finish {
767     utime(time,time,"db");
768     local ($u);
769     while ($u= $cleanups[$#cleanups]) { &$u; }
770     unlink("incoming/P$nn") || &quit("unlinking incoming/P$nn: $!");
771     exit $_[0];
772 }
773
774 &quit("wot no exit");
775
776 sub chldhandle { $chldexit = 'yes'; }
777
778 sub htmllog {
779     local ($whatobj,$whatverb,$where,$desc) = @_;
780     open(AP,">>db/$ref.log") || &quit("opening db/$ref.log (lh): $!");
781     print(AP
782           "\6\n".
783           "<strong>$whatobj $whatverb</strong> to <code>".&sani($where).
784           "</code>:<br>\n". $desc.
785           "\n\3\n") || &quit("writing db/$ref.log (lh): $!");
786     close(AP) || &quit("closing db/$ref.log (lh): $!");
787 }    
788
789 sub get_addresses {
790         return
791                 map { $_->address() }
792                 map { Mail::Address->parse($_) } @_;
793 }
794
795
796 sub sendmessage {
797     local ($msg,@recips) = @_;
798     if ($recips[0] eq '' && $#recips == 0) { @recips= ('-t'); }
799
800         #save email to the log
801     open(AP,">>db/$ref.log") || &quit("opening db/$ref.log (lo): $!");
802     print(AP "\2\n",join("\4",@recips),"\n\5\n$msg\n\3\n") ||
803         &quit("writing db/$ref.log (lo): $!");
804     close(AP) || &quit("closing db/$ref.log (lo): $!");
805     
806         #if debbuging.. save email to a log
807 #       open AP, ">>debug";
808 #       print AP join( '|', @recips )."\n>>";
809 #       print AP get_addresses( @recips );
810 #       print AP "<<\n".$msg;
811 #       print AP "\n--------------------------------------------------------\n";
812 #       close AP;
813
814         #start mailing
815         $_ = '';
816     $SIG{'CHLD'}='chldhandle';
817         #print DEBUG "mailing sigchild set up<\n";
818         $chldexit = 'no';
819     $c= open(U,"-|");
820         #print DEBUG "mailing opened pipe fork<\n";
821     defined($c) || die $!;
822         #print DEBUG "mailing opened pipe fork ok $c<\n";
823     if (!$c) { # ie, we are in the child process
824                 #print DEBUG "mailing child<\n";
825         unless (open(STDERR,">&STDOUT")) {
826                         #print DEBUG "mailing child opened stderr<\n";
827             print STDOUT "redirect stderr: $!\n";
828                         #print DEBUG "mailing child opened stderr fail<\n";
829             exit 1;
830                         #print DEBUG "mailing child opened stderr fail exit !?<\n";
831         }
832                 #print DEBUG "mailing child opened stderr ok<\n";
833         $c= open(D,"|-");
834                 #print DEBUG "mailing child forked again<\n";
835         defined($c) || die $!;
836                 #print DEBUG "mailing child forked again ok $c<\n";
837         if (!$c) { # ie, we are the child process
838                         #print DEBUG "mailing grandchild<\n";
839             exec '/usr/lib/sendmail','-f'."$gMaintainerEmail",'-odi','-oem','-oi',get_addresses(@recips);
840                         #print DEBUG "mailing grandchild exec failed<\n";
841             die $!;
842                         #print DEBUG "mailing grandchild died !?<\n";
843         }
844                 #print DEBUG "mailing child not grandchild<\n";
845         print(D $msg) || die $!;
846                 #print DEBUG "mailing child printed msg<\n";
847         close(D);
848                 #print DEBUG "mailing child closed pipe<\n";
849         die "\n*** command returned exit status $?\n" if $?;
850                 #print DEBUG "mailing child exit status ok<\n";
851         exit 0;
852                 #print DEBUG "mailing child exited ?!<\n";
853     }
854         #print DEBUG "mailing parent<\n";
855     $results='';
856         #print DEBUG "mailing parent results emptied<\n";
857     while( $chldexit eq 'no' ) { $results.= $_; }
858         #print DEBUG "mailing parent results read >$results<\n";
859     close(U);
860         #print DEBUG "mailing parent results closed<\n";
861     $results.= "\n*** child returned exit status $?\n" if $?;
862         #print DEBUG "mailing parent exit status ok<\n";
863     $SIG{'CHLD'}='DEFAULT';
864         #print DEBUG "mailing parent sigchild default<\n";
865     if (length($results)) { &quit("running sendmail: $results"); }
866         #print DEBUG "mailing parent results ok<\n";
867 }
868
869 sub checkmaintainers {
870     return if $maintainerschecked++;
871     return if !length($s_package);
872     open(MAINT,"$gMaintainerFile") || die &quit("maintainers open: $!");
873     while (<MAINT>) {
874         m/^\n$/ && next;
875         m/^\s*$/ && next;
876         m/^(\S+)\s+(\S.*\S)\n$/ || &quit("maintainers bogus \`$_'");
877         $a= $1; $b= $2; $a =~ y/A-Z/a-z/;
878         $maintainerof{$1}= $2;
879     }
880     close(MAINT);
881     $anymaintfound=0; $anymaintnotfound=0;
882     for $p (split(m/[ \t?,()]+/,$s_package)) {
883         $p =~ y/A-Z/a-z/;
884         if (defined($maintainerof{$p})) {
885 print DEBUG "maintainer add >$p|$maintainerof{$p}<\n";
886             $addmaint= $maintainerof{$p};
887             push(@maintaddrs,$addmaint) unless
888                 $addmaint eq $replyto || grep($_ eq $addmaint, @maintaddrs);
889             $anymaintfound++;
890         } else {
891 print DEBUG "maintainer none >$p<\n";
892             $anymaintnotfound++;
893             last;
894         }
895     }
896 }