2 # $Id: process.in,v 1.82 2003/08/30 00:15:15 cjwatson Exp $
7 use POSIX qw(strftime tzset);
13 $config_path = '/etc/debbugs';
14 $lib_path = '/usr/lib/debbugs';
16 require "$config_path/config";
17 require "$lib_path/errorlib";
18 $ENV{'PATH'} = $lib_path.':'.$ENV{'PATH'};
20 chdir( "$gSpoolDir" ) || die "chdir spool: $!\n";
22 #open(DEBUG,"> /tmp/debbugs.debug");
24 open DEBUG, ">/dev/null";
26 defined( $intdate= time ) || &quit( "failed to get time: $!" );
29 m/^([BMQFDU])(\d*)\.\d+$/ || &quit("bad argument");
31 $tryref= length($2) ? $2+0 : -1;
34 if (!rename("incoming/G$nn","incoming/P$nn"))
36 $_=$!.''; m/no such file or directory/i && exit 0;
37 &quit("renaming to lock: $!");
40 $baddress= 'submit' if $codeletter eq 'B';
41 $baddress= 'maintonly' if $codeletter eq 'M';
42 $baddress= 'quiet' if $codeletter eq 'Q';
43 $baddress= 'forwarded' if $codeletter eq 'F';
44 $baddress= 'done' if $codeletter eq 'D';
45 $baddress= 'submitter' if $codeletter eq 'U';
46 $baddress || &quit("bad codeletter $codeletter");
47 $baddressroot= $baddress;
48 $baddress= "$tryref-$baddress" if $tryref>=0;
50 open(M,"incoming/P$nn");
57 print DEBUG "###\n",join("##\n",@msg),"\n###\n";
59 $tdate = strftime "%a, %d %h %Y %T UTC", localtime;
61 Received: via spool by $baddress\@$gEmailDomain id=$nn
62 (code $codeletter ref $tryref); $tdate
65 # header and decoded body respectively
66 my (@headerlines, @bodylines);
68 my $parser = new MIME::Parser;
69 mkdir "$gSpoolDir/mime.tmp", 0777;
70 $parser->output_under("$gSpoolDir/mime.tmp");
71 my $entity = eval { $parser->parse_data(join('',@log)) };
73 if ($entity and $entity->head->tags) {
74 @headerlines = @{$entity->head->header};
77 my $entity_body = getmailbody($entity);
78 @bodylines = $entity_body ? $entity_body->as_lines() : ();
81 # set $i to beginning of encoded body data, so we can dump it out
84 ++$i while $msg[$i] =~ /./;
86 # Legacy pre-MIME code, kept around in case MIME::Parser fails.
87 for ($i = 0; $i <= $#msg; $i++) {
89 last unless length($_);
90 while ($msg[$i+1] =~ m/^\s/) {
94 push @headerlines, $_;
97 @bodylines = @msg[$i..$#msg];
100 for my $hdr (@headerlines) {
103 &finish if m/^x-loop: (\S+)$/i && $1 eq "$gMaintainerEmail";
104 my $ins = !m/^subject:/i && !m/^reply-to:/i && !m/^return-path:/i
105 && !m/^From / && !m/^X-Debbugs-/i;
106 $fwd .= $hdr."\n" if $ins;
107 # print DEBUG ">$_<\n";
108 if (s/^(\S+):\s*//) {
110 print DEBUG ">$v=$_<\n";
113 print DEBUG "!>$_<\n";
118 shift @bodylines while @bodylines and $bodylines[0] !~ /\S/;
120 # Strip off RFC2440-style PGP clearsigning.
121 if (@bodylines and $bodylines[0] =~ /^-----BEGIN PGP SIGNED/) {
122 shift @bodylines while @bodylines and length $bodylines[0];
123 shift @bodylines while @bodylines and $bodylines[0] !~ /\S/;
124 for my $findsig (0 .. $#bodylines) {
125 if ($bodylines[$findsig] =~ /^-----BEGIN PGP SIGNATURE/) {
126 $#bodylines = $findsig - 1;
130 map { s/^- // } @bodylines;
133 # extract pseudo-headers
134 for my $phline (@bodylines)
136 last if $phline !~ m/^([\w-]+):\s*(\S.*)/;
137 my ($fn, $fv) = ($1, $2);
139 print DEBUG ">$fn|$fv|\n";
143 print DEBUG ">$fn~$fv<\n";
147 $fwd .= join("\n",@msg[$i..$#msg]);
149 print DEBUG "***\n$fwd\n***\n";
151 if (defined $header{'resent-from'} && !defined $header{'from'}) {
152 $header{'from'} = $header{'resent-from'};
154 defined($header{'from'}) || &quit("no From header");
155 $replyto= defined($header{'reply-to'}) ? $header{'reply-to'} : $header{'from'};
158 $_= "$2 <$1>" if m/^([^\<\> \t\n\(\)]+) \(([^\(\)\<\>]+)\)$/;
160 print DEBUG "replytocompare >$replytocompare<\n";
162 if (!defined($header{'subject'}))
166 Your message did not contain a Subject field. They are recommended and
167 useful because the title of a $gBug is determined using this field.
168 Please remember to include a Subject field in your messages in future.
171 # RFC822 actually lists it as an `optional-field'.
173 $subject= '(no subject)';
175 $subject= $header{'subject'};
179 $subject =~ s/^Re:\s*//i; $_= $subject."\n";
180 if ($tryref < 0 && m/^Bug ?\#(\d+)\D/i) {
186 ($bfound, $data)= &lockreadbugmerge($tryref);
190 &htmllog("Reply","sent", $replyto,"Unknown problem report number <code>$tryref</code>.");
191 my $archivenote = '';
193 $archivenote = <<END;
194 This may be because that $gBug report has been resolved for more than $gRemoveAge
195 days, and the record of it has been expunged, or because you mistyped
196 the $gBug report number.
200 &sendmessage(<<END, '');
201 From: $gMaintainerEmail ($gProject $gBug Tracking System)
203 Subject: Unknown problem report $gBug#$tryref ($subject)
204 Message-ID: <handler.x.$nn.unknown\@$gEmailDomain>
205 In-Reply-To: $header{'message-id'}
206 References: $header{'message-id'} $data->{msgid}
208 X-$gProject-PR-Message: error
210 You sent a message to the $gBug tracking system which gave (in the
211 Subject line or encoded into the recipient at $gEmailDomain),
212 the number of a nonexistent $gBug report (#$tryref).
214 ${archivenote}Your message was dated $header{'date'} and was sent to
215 $baddress\@$gEmailDomain. It had
216 Message-ID $header{'message-id'}
217 and Subject $subject.
219 It has been filed (under junk) but otherwise ignored.
221 Please consult your records to find the correct $gBug report number, or
222 contact me, the system administrator, for assistance.
225 (administrator, $gProject $gBugs database)
227 (NB: If you are a system administrator and have no idea what I am
228 talking about this indicates a serious mail system misconfiguration
229 somewhere. Please contact me immediately.)
236 &filelock('lock/-1');
239 if ($codeletter eq 'D' || $codeletter eq 'F')
241 if ($replyto =~ m/$gBounceFroms/o ||
242 $header{'from'} =~ m/$gBounceFroms/o)
244 &quit("bounce detected ! Mwaap! Mwaap!");
246 $markedby= $header{'from'} eq $replyto ? $replyto :
247 "$header{'from'} (reply to $replyto)";
248 if ($codeletter eq 'F') {
249 (&appendlog,&finish) if length($data->{forwarded});
250 $receivedat= "forwarded\@$gEmailDomain";
251 $markaswhat= 'forwarded';
252 $set_forwarded= $header{'to'};
253 if ( length( $gListDomain ) > 0 && length( $gForwardList ) > 0 ) {
254 $generalcc= "$gForwardList\@$gListDomain";
259 (&appendlog,&finish) if length($data->{done});
260 $receivedat= "done\@$gEmailDomain";
262 $set_done= $header{'from'};
263 if ( length( $gListDomain ) > 0 && length( $gDoneList ) > 0 ) {
264 $generalcc= "$gDoneList\@$gListDomain";
269 if (defined $gStrongList and isstrongseverity($data->{severity})) {
270 $generalcc = join ', ', $generalcc, "$gStrongList\@$gListDomain";
273 &htmllog("Warning","sent",$replyto,"Message ignored.");
274 &sendmessage(<<END, '');
275 From: $gMaintainerEmail ($gProject $gBug Tracking System)
277 Subject: Message with no $gBug number ignored by $receivedat
279 Message-ID: <header.x.$nn.warnignore\@$gEmailDomain>
280 In-Reply-To: $header{'message-id'}
281 References: $header{'message-id'} $data->{msgid}
283 X-$gProject-PR-Message: error
285 You sent a message to the $gProject $gBug tracking system old-style
286 unified mark as $markaswhat address ($receivedat),
287 without a recognisable $gBug number in the Subject.
288 Your message has been filed under junk but otherwise ignored.
290 If you don't know what I'm talking about then probably either:
292 (a) you unwittingly sent a message to done\@$gEmailDomain
293 because you replied to all recipients of the message a developer used
294 to mark a $gBug as done and you modified the Subject. In this case,
295 please do not be alarmed. To avoid confusion do not do it again, but
296 there is no need to apologise or mail anyone asking for an explanation.
298 (b) you are a system administrator, reading this because the $gBug
299 tracking system is responding to a misdirected bounce message. In this
300 case there is a serious mail system misconfiguration somewhere - please
301 contact me immediately.
303 Your message was dated $header{'date'} and had
304 message-id $header{'message-id'}
305 and subject $subject.
307 If you need any assistance or explanation please contact me.
310 (administrator, $gProject $gBugs database)
319 $noticeccval.= join(', ', grep($_ ne $replyto,@maintaddrs));
320 $noticeccval =~ s/\s+\n\s+/ /g;
321 $noticeccval =~ s/^\s+/ /; $noticeccval =~ s/\s+$//;
323 $generalcc = join(', ', $generalcc, @addsrcaddrs);
324 $generalcc =~ s/\s+\n\s+/ /g;
325 $generalcc =~ s/^\s+/ /; $generalcc =~ s/\s+$//;
327 if (length($noticeccval)) { $noticecc= "Cc: $noticeccval\n"; }
328 if (length($generalcc)) { $noticecc.= "Bcc: $generalcc\n"; }
330 @process= ($ref,split(/ /,$data->{mergedwith}));
333 for $ref (@process) {
334 if ($ref != $orgref) {
336 $data = &lockreadbug($ref)
337 || die "huh ? $ref from $orgref out of @process";
339 $data->{done}= $set_done if defined($set_done);
340 $data->{forwarded}= $set_forwarded if defined($set_forwarded);
341 if ($codeletter eq 'D') {
342 $data->{keywords} = join ' ', grep $_ ne 'pending',
343 split ' ', $data->{keywords};
346 writebug($ref, $data);
348 my $hash = get_hashname($ref);
349 open(O,"db-h/$hash/$ref.report") || &quit("read original report: $!");
350 $x= join('',<O>); close(O);
351 if ($codeletter eq 'F') {
352 &htmllog("Reply","sent",$replyto,"You have marked $gBug as forwarded.");
353 &sendmessage(<<END."---------------------------------------\n".join( "\n", @msg ), '');
354 From: $gMaintainerEmail ($gProject $gBug Tracking System)
356 ${noticecc}Subject: $gBug#$ref: marked as forwarded ($data->{subject})
357 Message-ID: <header.$ref.$nn.ackfwdd\@$gEmailDomain>
358 In-Reply-To: $header{'message-id'}
359 References: $header{'message-id'} $data->{msgid}
361 X-$gProject-PR-Message: forwarded $ref
362 X-$gProject-PR-Package: $data->{package}
363 X-$gProject-PR-Keywords: $data->{keywords}
365 Your message dated $header{'date'}
366 with message-id $header{'message-id'}
367 has caused the $gProject $gBug report #$ref,
368 regarding $data->{subject}
369 to be marked as having been forwarded to the upstream software
370 author(s) $data->{forwarded}.
372 (NB: If you are a system administrator and have no idea what I am
373 talking about this indicates a serious mail system misconfiguration
374 somewhere. Please contact me immediately.)
377 (administrator, $gProject $gBugs database)
382 &htmllog("Reply","sent",$replyto,"You have taken responsibility.");
383 &sendmessage(<<END."--------------------------------------\n".$x."---------------------------------------\n".join( "\n", @msg ), '');
384 From: $gMaintainerEmail ($gProject $gBug Tracking System)
386 ${noticecc}Subject: $gBug#$ref: marked as done ($data->{subject})
387 Message-ID: <handler.$ref.$nn.ackdone\@$gEmailDomain>
388 In-Reply-To: $header{'message-id'}
389 References: $header{'message-id'} $data->{msgid}
391 X-$gProject-PR-Message: closed $ref
392 X-$gProject-PR-Package: $data->{package}
393 X-$gProject-PR-Keywords: $data->{keywords}
395 Your message dated $header{'date'}
396 with message-id $header{'message-id'}
397 and subject line $subject
398 has caused the attached $gBug report to be marked as done.
400 This means that you claim that the problem has been dealt with.
401 If this is not the case it is now your responsibility to reopen the
402 $gBug report if necessary, and/or fix the problem forthwith.
404 (NB: If you are a system administrator and have no idea what I am
405 talking about this indicates a serious mail system misconfiguration
406 somewhere. Please contact me immediately.)
409 (administrator, $gProject $gBugs database)
412 &htmllog("Notification","sent",$data->{originator},
413 "$gBug acknowledged by developer.");
414 &sendmessage(<<END.join("\n",@msg),'');
415 From: $gMaintainerEmail ($gProject $gBug Tracking System)
416 To: $data->{originator}
417 Subject: $gBug#$ref acknowledged by developer
419 Message-ID: <handler.$ref.$nn.notifdone\@$gEmailDomain>
420 In-Reply-To: $data->{msgid}
421 References: $header{'message-id'} $data->{msgid}
422 X-$gProject-PR-Message: they-closed $ref
423 X-$gProject-PR-Package: $data->{package}
424 X-$gProject-PR-Keywords: $data->{keywords}
425 Reply-To: $ref\@$gEmailDomain
427 This is an automatic notification regarding your $gBug report
428 #$ref: $data->{subject},
429 which was filed against the $data->{package} package.
431 It has been closed by one of the developers, namely
434 Their explanation is attached below. If this explanation is
435 unsatisfactory and you have not received a better one in a separate
436 message then please contact the developer, by replying to this email.
439 (administrator, $gProject $gBugs database)
449 if ($codeletter eq 'U') {
450 &htmllog("Warning","sent",$replyto,"Message not forwarded.");
451 &sendmessage(<<END, '');
452 From: $gMaintainerEmail ($gProject $gBug Tracking System)
454 Subject: Message with no $gBug number cannot be sent to submitter !
456 Message-ID: <handler.x.$nn.nonumnosub\@$gEmailDomain>
457 In-Reply-To: $header{'message-id'}
458 References: $header{'message-id'} $data->{msgid}
460 X-$gProject-PR-Message: error
462 You sent a message to the $gProject $gBug tracking system send to $gBug
463 report submitter address $baddress\@$gEmailDomain, without a
464 recognisable $gBug number in the Subject. Your message has been filed
465 under junk but otherwise ignored.
467 If you don't know what I'm talking about then probably either:
469 (a) you unwittingly sent a message to $baddress\@$gEmailDomain
470 because you replied to all recipients of the message a developer sent
471 to a $gBug's submitter and you modified the Subject. In this case,
472 please do not be alarmed. To avoid confusion do not do it again, but
473 there is no need to apologise or mail anyone asking for an
476 (b) you are a system administrator, reading this because the $gBug
477 tracking system is responding to a misdirected bounce message. In this
478 case there is a serious mail system misconfiguration somewhere - please
479 contact me immediately.
481 Your message was dated $header{'date'} and had
482 message-id $header{'message-id'}
483 and subject $subject.
485 If you need any assistance or explanation please contact me.
488 (administrator, $gProject $gBugs database)
494 if (!defined($pheader{'package'})) {
495 &htmllog("Warning","sent",$replyto,"Message not forwarded.");
496 &sendmessage(<<END."---------------------------------------------------------------------------\n".join("\n", @msg), '');
497 From: $gMaintainerEmail ($gProject $gBug Tracking System)
499 Subject: Message with no Package: tag cannot be processed!
501 Message-ID: <handler.x.$nn.nonumnosub\@$gEmailDomain>
502 In-Reply-To: $header{'message-id'}
503 References: $header{'message-id'} $data->{msgid}
505 X-$gProject-PR-Message: error
507 Your message didn't have a Package: line at the start (in the
508 pseudo-header following the real mail header), or didn't have a
509 pseudo-header at all.
511 This makes it much harder for us to categorise and deal with your
512 problem report. Please _resubmit_ your report to $baddress\@$gEmailDomain
513 and tell us which package the report is on. For help, check out
514 http://$gWebDomain/Reporting$gHTMLSuffix.
516 Your message was dated $header{'date'} and had
517 message-id $header{'message-id'}
518 and subject $subject.
519 The complete text of it is attached to this message.
521 If you need any assistance or explanation please contact me.
524 (administrator, $gProject $gBugs database)
530 $data->{package}= $pheader{'package'};
533 $data->{versions}= '';
534 if (defined($pheader{'version'})) {
535 $data->{versions} = $pheader{'version'};
536 $data->{versions} =~ s/\s+/ /;
537 # BUG: need to bounce unknown versions back to submitter here
540 $data->{fixed_versions}= '';
541 if (defined($pheader{'fixed-in-version'})) {
542 $data->{fixed_versions} = $pheader{'fixed-in-version'};
543 $data->{fixed_versions} =~ s/\s+/ /;
546 $data->{keywords}= '';
547 if (defined($pheader{'keywords'})) {
548 $data->{keywords}= $pheader{'keywords'};
549 } elsif (defined($pheader{'tags'})) {
550 $data->{keywords}= $pheader{'tags'};
552 if (length($data->{keywords})) {
554 my %gkws = map { ($_, 1) } @gTags;
555 foreach my $kw (sort split(/[,\s]+/, lc($data->{keywords}))) {
556 push @kws, $kw if (defined $gkws{$kw});
558 $data->{keywords} = join(" ", @kws);
560 $data->{severity}= '';
561 if (defined($pheader{'severity'}) || defined($pheader{'priority'})) {
562 $data->{severity}= $pheader{'severity'};
563 $data->{severity}= $pheader{'priority'} unless ($data->{severity});
564 $data->{severity} =~ s/^\s*(.+)\s*$/$1/;
566 if (!grep($_ eq $data->{severity}, @severities, "$gDefaultSeverity")) {
569 Your message specified a Severity: in the pseudo-header, but
570 the severity value $data->{severity} was not recognised.
571 The default severity $gDefaultSeverity is being used instead.
572 The recognised values are: $gShowSeverities.
574 # if we use @gSeverityList array in the above line, perl -c gives:
575 # In string, @gSeverityList now must be written as \@gSeverityList at
576 # process line 452, near "$gDefaultSeverity is being used instead.
577 $data->{severity}= '';
580 &filelock("nextnumber.lock");
581 open(N,"nextnumber") || &quit("nextnumber: read: $!");
582 $v=<N>; $v =~ s/\n$// || &quit("nextnumber bad format");
583 $ref= $v+0; $v += 1; $newref=1;
584 &overwrite('nextnumber', "$v\n");
586 my $hash = get_hashname($ref);
587 &overwrite("db-h/$hash/$ref.log",'');
588 $data->{originator} = $replyto;
589 $data->{date} = $intdate;
590 $data->{subject} = $subject;
591 $data->{msgid} = $header{'message-id'};
592 writebug($ref, $data);
593 &overwrite("db-h/$hash/$ref.report",
594 join("\n",@msg)."\n");
599 print DEBUG "maintainers >@maintaddrs<\n";
601 $orgsender= defined($header{'sender'}) ? "Original-Sender: $header{'sender'}\n" : '';
602 $newsubject= $subject; $newsubject =~ s/^$gBug#$ref:*\s*//;
604 $xcchdr= $header{ 'x-debbugs-cc' };
605 if ($xcchdr =~ m/\S/) {
606 push(@resentccs,$xcchdr);
607 $resentccexplain.= <<END;
609 As you requested using X-Debbugs-CC, your message was also forwarded to
611 (after having been given a $gBug report number, if it did not have one).
615 if (@maintaddrs && ($codeletter eq 'B' || $codeletter eq 'M')) {
616 push(@resentccs,@maintaddrs);
617 $resentccexplain.= <<END." ".join("\n ",@maintaddrs)."\n";
619 Your message has been sent to the package maintainer(s):
623 @bccs = @addsrcaddrs;
624 if (defined $gStrongList and isstrongseverity($data->{severity})) {
625 push @bccs, "$gStrongList\@$gListDomain";
628 $veryquiet= $codeletter eq 'Q';
629 if ($codeletter eq 'M' && !@maintaddrs) {
633 You requested that the message be sent to the package maintainer(s)
634 but either the $gBug report is not associated with any package (probably
635 because of a missing Package pseudo-header field in the original $gBug
636 report), or the package(s) specified do not have any maintainer(s).
638 Your message has *not* been sent to any package maintainers; it has
639 merely been filed in the $gBug tracking system. If you require assistance
640 please contact $gMaintainerEmail quoting the $gBug number $ref.
644 $resentccval.= join(', ',@resentccs);
645 $resentccval =~ s/\s+\n\s+/ /g; $resentccval =~ s/^\s+/ /; $resentccval =~ s/\s+$//;
646 if (length($resentccval)) {
647 $resentcc= "Resent-CC: $resentccval\n";
650 if ($codeletter eq 'U') {
651 &htmllog("Message", "sent on", $data->{originator}, "$gBug#$ref.");
652 &sendmessage(<<END,[$data->{originator},@resentccs],[@bccs]);
653 Subject: $gBug#$ref: $newsubject
654 Reply-To: $replyto, $ref-quiet\@$gEmailDomain
655 ${orgsender}Resent-To: $data->{originator}
656 ${resentcc}Resent-Date: $tdate
657 Resent-Message-ID: <handler.$ref.$nn\@$gEmailDomain>
658 Resent-Sender: $gMaintainerEmail
659 X-$gProject-PR-Message: report $ref
660 X-$gProject-PR-Package: $data->{package}
661 X-$gProject-PR-Keywords: $data->{keywords}
664 } elsif ($codeletter eq 'B') {
665 &htmllog($newref ? "Report" : "Information", "forwarded",
666 join(', ',"$gSubmitList\@$gListDomain",@resentccs),
667 "<code>$gBug#$ref</code>".
668 (length($data->{package})? "; Package <code>".&sani($data->{package})."</code>" : '').
670 &sendmessage(<<END,["$gSubmitList\@$gListDomain",@resentccs],[@bccs]);
671 Subject: $gBug#$ref: $newsubject
672 Reply-To: $replyto, $ref\@$gEmailDomain
673 Resent-From: $header{'from'}
674 ${orgsender}Resent-To: $gSubmitList\@$gListDomain
675 ${resentcc}Resent-Date: $tdate
676 Resent-Message-ID: <handler.$ref.$nn\@$gEmailDomain>
677 Resent-Sender: $gMaintainerEmail
678 X-$gProject-PR-Message: report $ref
679 X-$gProject-PR-Package: $data->{package}
680 X-$gProject-PR-Keywords: $data->{keywords}
683 } elsif (@resentccs or @bccs) {
684 # D and F done far earlier; B just done - so this must be M or Q
685 # We preserve whichever it was in the Reply-To (possibly adding
688 &htmllog($newref ? "Report" : "Information", "forwarded",
690 "<code>$gBug#$ref</code>".
691 (length($data->{package}) ? "; Package <code>".&sani($data->{package})."</code>" : '').
694 &htmllog($newref ? "Report" : "Information", "stored",
696 "<code>$gBug#$ref</code>".
697 (length($data->{package}) ? "; Package <code>".&sani($data->{package})."</code>" : '').
700 &sendmessage(<<END,[@resentccs],[@bccs]);
701 Subject: $gBug#$ref: $newsubject
702 Reply-To: $replyto, $ref-$baddressroot\@$gEmailDomain
703 Resent-From: $header{'from'}
704 ${orgsender}Resent-To: $resentccval
706 Resent-Message-ID: <handler.$ref.$nn\@$gEmailDomain>
707 Resent-Sender: $gMaintainerEmail
708 X-$gProject-PR-Message: report $ref
709 X-$gProject-PR-Package: $data->{package}
710 X-$gProject-PR-Keywords: $data->{keywords}
715 $htmlbreak= length($brokenness) ? "<p>\n".&sani($brokenness)."\n<p>\n" : '';
716 $htmlbreak =~ s/\n\n/\n<P>\n\n/g;
717 if (length($resentccval)) {
718 $htmlbreak = " Copy sent to <code>".&sani($resentccval)."</code>.".
721 unless (exists $header{'x-debbugs-no-ack'}) {
723 &htmllog("Acknowledgement","sent",$replyto,
725 "New $gBug report received and filed, but not forwarded." :
726 "New $gBug report received and forwarded."). $htmlbreak);
727 &sendmessage($veryquiet ? <<END : $codeletter eq 'M' ? <<END : <<END,'');
728 From: $gMaintainerEmail ($gProject $gBug Tracking System)
730 Subject: $gBug#$ref: Acknowledgement of QUIET report
732 Message-ID: <handler.$ref.$nn.ackquiet\@$gEmailDomain>
733 In-Reply-To: $header{'message-id'}
734 References: $header{'message-id'}
736 X-$gProject-PR-Message: ack-quiet $ref
737 X-$gProject-PR-Package: $data->{package}
738 X-$gProject-PR-Keywords: $data->{keywords}
739 Reply-To: $ref-quiet\@$gEmailDomain
741 Thank you for the problem report you have sent regarding $gProject.
742 This is an automatically generated reply, to let you know your message
743 has been received. It has not been forwarded to the package maintainers
744 or other interested parties; you should ensure that the developers are
745 aware of the problem you have entered into the system - preferably
746 quoting the $gBug reference number, #$ref.
748 If you wish to submit further information on your problem, please send it
749 to $ref-$baddressroot\@$gEmailDomain (and *not*
750 to $baddress\@$gEmailDomain).
752 Please do not reply to the address at the top of this message,
753 unless you wish to report a problem with the $gBug-tracking system.
756 (administrator, $gProject $gBugs database)
758 From: $gMaintainerEmail ($gProject $gBug Tracking System)
760 Subject: $gBug#$ref: Acknowledgement of maintainer-only report
762 Message-ID: <handler.$ref.$nn.ackmaint\@$gEmailDomain>
763 In-Reply-To: $header{'message-id'}
764 References: $header{'message-id'}
766 X-$gProject-PR-Message: ack-maintonly $ref
767 X-$gProject-PR-Package: $data->{package}
768 X-$gProject-PR-Keywords: $data->{keywords}
769 Reply-To: $ref-maintonly\@$gEmailDomain
771 Thank you for the problem report you have sent regarding $gProject.
772 This is an automatically generated reply, to let you know your message has
773 been received. It is being forwarded to the package maintainers (but not
774 other interested parties, as you requested) for their attention; they will
777 If you wish to submit further information on your problem, please send
778 it to $ref-$baddressroot\@$gEmailDomain (and *not*
779 to $baddress\@$gEmailDomain).
781 Please do not reply to the address at the top of this message,
782 unless you wish to report a problem with the $gBug-tracking system.
785 (administrator, $gProject $gBugs database)
787 From: $gMaintainerEmail ($gProject $gBug Tracking System)
789 Subject: $gBug#$ref: Acknowledgement ($subject)
790 Message-ID: <handler.$ref.$nn.ack\@$gEmailDomain>
791 In-Reply-To: $header{'message-id'}
792 References: $header{'message-id'}
794 X-$gProject-PR-Message: ack $ref
795 X-$gProject-PR-Package: $data->{package}
796 X-$gProject-PR-Keywords: $data->{keywords}
797 Reply-To: $ref\@$gEmailDomain
799 Thank you for the problem report you have sent regarding $gProject.
800 This is an automatically generated reply, to let you know your message has
801 been received. It is being forwarded to the package maintainers and other
802 interested parties for their attention; they will reply in due course.
804 If you wish to submit further information on your problem, please send
805 it to $ref\@$gEmailDomain (and *not* to
806 $baddress\@$gEmailDomain).
808 Please do not reply to the address at the top of this message,
809 unless you wish to report a problem with the $gBug-tracking system.
812 (administrator, $gProject $gBugs database)
814 } elsif ($codeletter ne 'U' and
815 $header{'precedence'} !~ /\b(?:bulk|junk|list)\b/) {
816 &htmllog("Acknowledgement","sent",$replyto,
817 ($veryquiet ? "Extra info received and filed, but not forwarded." :
818 $codeletter eq 'M' ? "Extra info received and forwarded to maintainer." :
819 "Extra info received and forwarded to list."). $htmlbreak);
820 &sendmessage($veryquiet ? <<END : $codeletter eq 'M' ? <<END : <<END,'');
821 From: $gMaintainerEmail ($gProject $gBug Tracking System)
823 Subject: $gBug#$ref: Info received and FILED only
825 Message-ID: <handler.$ref.$nn.ackinfoquiet\@$gEmailDomain>
826 In-Reply-To: $header{'message-id'}
827 References: $header{'message-id'}
829 X-$gProject-PR-Message: ack-info-quiet $ref
830 X-$gProject-PR-Package: $data->{package}
831 X-$gProject-PR-Keywords: $data->{keywords}
832 Reply-To: $ref-quiet\@$gEmailDomain
834 Thank you for the additional information you have supplied regarding
835 this problem report. It has NOT been forwarded to the package
836 maintainers, but will accompany the original report in the $gBug
837 tracking system. Please ensure that you yourself have sent a copy of
838 the additional information to any relevant developers or mailing lists.
840 If you wish to continue to submit further information on your problem,
841 please send it to $ref-$baddressroot\@$gEmailDomain, as before.
843 Please do not reply to the address at the top of this message,
844 unless you wish to report a problem with the $gBug-tracking system.
847 (administrator, $gProject $gBugs database)
849 From: $gMaintainerEmail ($gProject $gBug Tracking System)
851 Subject: $gBug#$ref: Info received for maintainer only
853 Message-ID: <handler.$ref.$nn.ackinfomaint\@$gEmailDomain>
854 In-Reply-To: $header{'message-id'}
855 References: $header{'message-id'}
857 X-$gProject-PR-Message: ack-info-maintonly $ref
858 X-$gProject-PR-Package: $data->{package}
859 X-$gProject-PR-Keywords: $data->{keywords}
860 Reply-To: $ref-maintonly\@$gEmailDomain
862 Thank you for the additional information you have supplied regarding
863 this problem report. It has been forwarded to the package maintainer(s)
864 (but not to other interested parties) to accompany the original report.
866 If you wish to continue to submit further information on your problem,
867 please send it to $ref-$baddressroot\@$gEmailDomain, as before.
869 Please do not reply to the address at the top of this message,
870 unless you wish to report a problem with the $gBug-tracking system.
873 (administrator, $gProject $gBugs database)
875 From: $gMaintainerEmail ($gProject $gBug Tracking System)
877 Subject: $gBug#$ref: Info received (was $subject)
878 Message-ID: <handler.$ref.$nn.ackinfo\@$gEmailDomain>
879 In-Reply-To: $header{'message-id'}
880 References: $header{'message-id'}
882 X-$gProject-PR-Message: ack-info $ref
883 X-$gProject-PR-Package: $data->{package}
884 X-$gProject-PR-Keywords: $data->{keywords}
886 Thank you for the additional information you have supplied regarding
887 this problem report. It has been forwarded to the package maintainer(s)
888 and to other interested parties to accompany the original report.
890 If you wish to continue to submit further information on your problem,
891 please send it to $ref\@$gEmailDomain, as before.
893 Please do not reply to the address at the top of this message,
894 unless you wish to report a problem with the $gBug-tracking system.
897 (administrator, $gProject $gBugs database)
899 # Reply-To: in previous ack disabled by doogie due to mail loops.
900 # Are these still a concern?
901 # Reply-To: $ref\@$gEmailDomain
910 open(NEW,">$f.new") || &quit("$f.new: create: $!");
911 print(NEW "$v") || &quit("$f.new: write: $!");
912 close(NEW) || &quit("$f.new: close: $!");
913 rename("$f.new","$f") || &quit("rename $f.new to $f: $!");
917 my $hash = get_hashname($ref);
918 if (!open(AP,">>db-h/$hash/$ref.log")) {
919 print DEBUG "failed open log<\n";
920 print DEBUG "failed open log err $!<\n";
921 &quit("opening db-h/$hash/$ref.log (li): $!");
923 print(AP "\7\n",@{escapelog(@log)},"\n\3\n") || &quit("writing db-h/$hash/$ref.log (li): $!");
924 close(AP) || &quit("closing db-h/$hash/$ref.log (li): $!");
928 utime(time,time,"db");
930 while ($u= $cleanups[$#cleanups]) { &$u; }
931 unlink("incoming/P$nn") || &quit("unlinking incoming/P$nn: $!");
935 &quit("wot no exit");
937 sub chldhandle { $chldexit = 'yes'; }
940 local ($whatobj,$whatverb,$where,$desc) = @_;
941 my $hash = get_hashname($ref);
942 open(AP,">>db-h/$hash/$ref.log") || &quit("opening db-h/$hash/$ref.log (lh): $!");
945 "<strong>$whatobj $whatverb</strong>".
946 ($where eq '' ? "" : " to <code>".&sani($where)."</code>").
948 "\n\3\n") || &quit("writing db-h/$hash/$ref.log (lh): $!");
949 close(AP) || &quit("closing db-h/$hash/$ref.log (lh): $!");
956 while ($msg =~ s/(.*\n)//) {
963 # strip continuation lines too
977 local ($msg,$recips,$bcc) = @_;
978 if ((!ref($recips) && $recips eq '') || @$recips == 0) {
981 $msg = "X-Loop: $gMaintainerEmail\n" . $msg;
983 my $hash = get_hashname($ref);
984 #save email to the log
985 open(AP,">>db-h/$hash/$ref.log") || &quit("opening db-h/$hash/$ref.log (lo): $!");
986 print(AP "\2\n",join("\4",@$recips),"\n\5\n",
987 @{escapelog(stripbccs($msg))},"\n\3\n") ||
988 &quit("writing db-h/$hash/$ref.log (lo): $!");
989 close(AP) || &quit("closing db-h/$hash/$ref.log (lo): $!");
992 shift @$recips if $recips->[0] eq '-t';
993 push @$recips, @$bcc;
996 #if debugging.. save email to a log
997 # open AP, ">>debug";
998 # print AP join( '|', @$recips )."\n>>";
999 # print AP get_addresses( @$recips );
1000 # print AP "<<\n".$msg;
1001 # print AP "\n--------------------------------------------------------\n";
1006 $SIG{'CHLD'}='chldhandle';
1007 #print DEBUG "mailing sigchild set up<\n";
1010 #print DEBUG "mailing opened pipe fork<\n";
1011 defined($c) || die $!;
1012 #print DEBUG "mailing opened pipe fork ok $c<\n";
1013 if (!$c) { # ie, we are in the child process
1014 #print DEBUG "mailing child<\n";
1015 unless (open(STDERR,">&STDOUT")) {
1016 #print DEBUG "mailing child opened stderr<\n";
1017 print STDOUT "redirect stderr: $!\n";
1018 #print DEBUG "mailing child opened stderr fail<\n";
1020 #print DEBUG "mailing child opened stderr fail exit !?<\n";
1022 #print DEBUG "mailing child opened stderr ok<\n";
1024 #print DEBUG "mailing child forked again<\n";
1025 defined($c) || die $!;
1026 #print DEBUG "mailing child forked again ok $c<\n";
1027 if (!$c) { # ie, we are the child process
1028 #print DEBUG "mailing grandchild<\n";
1029 exec '/usr/lib/sendmail','-f'."$gMaintainerEmail",'-odq','-oem','-oi',get_addresses(@$recips);
1030 #print DEBUG "mailing grandchild exec failed<\n";
1032 #print DEBUG "mailing grandchild died !?<\n";
1034 #print DEBUG "mailing child not grandchild<\n";
1035 print(D $msg) || die $!;
1036 #print DEBUG "mailing child printed msg<\n";
1038 #print DEBUG "mailing child closed pipe<\n";
1039 die "\n*** command returned exit status $?\n" if $?;
1040 #print DEBUG "mailing child exit status ok<\n";
1042 #print DEBUG "mailing child exited ?!<\n";
1044 #print DEBUG "mailing parent<\n";
1046 #print DEBUG "mailing parent results emptied<\n";
1047 while( $chldexit eq 'no' ) { $results.= $_; }
1048 #print DEBUG "mailing parent results read >$results<\n";
1050 #print DEBUG "mailing parent results closed<\n";
1051 $results.= "\n*** child returned exit status $?\n" if $?;
1052 #print DEBUG "mailing parent exit status ok<\n";
1053 $SIG{'CHLD'}='DEFAULT';
1054 #print DEBUG "mailing parent sigchild default<\n";
1055 if (length($results)) { &quit("running sendmail: $results"); }
1056 #print DEBUG "mailing parent results ok<\n";
1059 sub checkmaintainers {
1060 return if $maintainerschecked++;
1061 return if !length($data->{package});
1062 open(MAINT,"$gMaintainerFile") || die &quit("maintainers open: $!");
1066 m/^(\S+)\s+(\S.*\S)\s*\n$/ || &quit("maintainers bogus \`$_'");
1067 $a= $1; $b= $2; $a =~ y/A-Z/a-z/;
1068 $maintainerof{$1}= $2;
1071 open(MAINT,"$gMaintainerFileOverride") || die &quit("maintainers.override open: $!");
1075 m/^(\S+)\s+(\S.*\S)\s*\n$/ || &quit("maintainers.override bogus \`$_'");
1076 $a= $1; $b= $2; $a =~ y/A-Z/a-z/;
1077 $maintainerof{$1}= $2;
1080 open(SOURCES,"$gPackageSource") || &quit("pkgsrc open: $!");
1082 next unless m/^(\S+)\s+\S+\s+(\S.*\S)\s*$/;
1088 $anymaintfound=0; $anymaintnotfound=0;
1089 for $p (split(m/[ \t?,()]+/,$data->{package})) {
1091 if (defined $gSubscriptionDomain) {
1092 if (defined($pkgsrc{$p})) {
1093 push @addsrcaddrs, "$pkgsrc{$p}\@$gSubscriptionDomain";
1095 push @addsrcaddrs, "$p\@$gSubscriptionDomain";
1098 if (defined($maintainerof{$p})) {
1099 print DEBUG "maintainer add >$p|$maintainerof{$p}<\n";
1100 $addmaint= $maintainerof{$p};
1101 push(@maintaddrs,$addmaint) unless
1102 $addmaint eq $replyto || grep($_ eq $addmaint, @maintaddrs);
1105 print DEBUG "maintainer none >$p<\n";
1106 push(@maintaddrs,$gUnknownMaintainerEmail) unless $anymaintnotfound;
1107 $anymaintnotfound++;
1112 if (length $data->{owner}) {
1113 print DEBUG "owner add >$data->{package}|$data->{owner}<\n";
1114 $addmaint = $data->{owner};
1115 push(@maintaddrs, $addmaint) unless
1116 $addmaint eq $replyto or grep($_ eq $addmaint, @maintaddrs);