+sub xref_by_tc ($$$) {
+ my ($xref, $pi_cfg, $smsg) = @_;
+ my $by_addr = $pi_cfg->{-by_addr};
+ my $mid = $smsg->{mid};
+ for my $f (qw(to cc)) {
+ my @ibxs = map {
+ $by_addr->{lc($_)} // ()
+ } (PublicInbox::Address::emails($smsg->{$f} // ''));
+ for my $ibx (@ibxs) {
+ $xref->{$ibx->{newsgroup}} //=
+ $ibx->mm(1)->num_for($mid);
+ }
+ }
+}
+
+sub xref ($$$) {
+ my ($self, $cur_ibx, $smsg) = @_;
+ my $nntpd = $self->{nntpd};
+ my $cur_ng = $cur_ibx->{newsgroup};
+ my $xref;
+ if (my $ALL = $nntpd->{pi_cfg}->ALL) {
+ $xref = $ALL->nntp_xref_for($cur_ibx, $smsg);
+ xref_by_tc($xref, $nntpd->{pi_cfg}, $smsg);
+ } else { # slow path
+ $xref = { $cur_ng => $smsg->{num} };
+ my $mid = $smsg->{mid};
+ for my $ibx (values %{$nntpd->{pi_cfg}->{-by_newsgroup}}) {
+ $xref->{$ibx->{newsgroup}} //=
+ $ibx->mm(1)->num_for($mid);
+ }
+ }
+ my $ret = "$nntpd->{servername} $cur_ng:".delete($xref->{$cur_ng});
+ for my $ng (sort keys %$xref) {
+ my $num = $xref->{$ng} // next;
+ $ret .= " $ng:$num";
+ }
+ $ret;
+}
+
+sub set_nntp_headers ($$) {
+ my ($hdr, $smsg) = @_;
+ my ($mid) = $smsg->{mid};
+
+ # leafnode (and maybe other NNTP clients) have trouble dealing
+ # with v2 messages which have multiple Message-IDs (either due
+ # to our own content-based dedupe or buggy git-send-email versions).
+ my @mids = $hdr->header_raw('Message-ID');
+ if (scalar(@mids) > 1) {
+ my $mid0 = "<$mid>";
+ $hdr->header_set('Message-ID', $mid0);
+ my @alt = $hdr->header_raw('X-Alt-Message-ID');
+ my %seen = map { $_ => 1 } (@alt, $mid0);
+ push(@alt, grep { !$seen{$_}++ } @mids);
+ $hdr->header_set('X-Alt-Message-ID', @alt);
+ }
+
+ # clobber some existing headers
+ my $ibx = $smsg->{-ibx};
+ my $xref = xref($smsg->{nntp}, $ibx, $smsg);
+ $hdr->header_set('Xref', $xref);
+
+ # RFC 5536 3.1.4
+ my ($server_name, $newsgroups) = split(/ /, $xref, 2);
+ $newsgroups =~ s/:[0-9]+\b//g; # drop NNTP article numbers
+ $newsgroups =~ tr/ /,/;
+ $hdr->header_set('Newsgroups', $newsgroups);
+
+ # *something* here is required for leafnode, try to follow
+ # RFC 5536 3.1.5...
+ $hdr->header_set('Path', $server_name . '!not-for-mail');
+}
+