From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-3.9 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00, RP_MATCHES_RCVD,URIBL_BLOCKED shortcircuit=no autolearn=unavailable version=3.3.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 7674420D59 for ; Sat, 14 May 2016 02:24:39 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] import ssoma-replay example script I've been using Date: Sat, 14 May 2016 02:24:39 +0000 Message-Id: <20160514022439.24882-1-e@80x24.org> List-Id: Unfortunately, most users still prefer their mail delivered over SMTP; so we'll at least document mlmmj integration for now until we can popularize pull-based reading over POP3/NNTP/ssoma. --- Makefile.PL | 3 +- TODO | 3 -- scripts/ssoma-replay | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 4 deletions(-) create mode 100755 scripts/ssoma-replay diff --git a/Makefile.PL b/Makefile.PL index 1948848..de0ac4a 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -37,7 +37,8 @@ WriteMakefile( sub MY::postamble { </dev/null || echo 2) + 1))) diff --git a/TODO b/TODO index b6a3af3..1a40311 100644 --- a/TODO +++ b/TODO @@ -44,6 +44,3 @@ TODO items for public-inbox * more test cases (use git fast-import to speed up creation) * large mbox/Maildir/MH/NNTP spool import (use git fast-import) - -* improve + document mlmmj integration, currently only at: - http://bogomips.org/unicorn-public/20140508084301.GA2033%40dcvr.yhbt.net/ diff --git a/scripts/ssoma-replay b/scripts/ssoma-replay new file mode 100755 index 0000000..bfcea0a --- /dev/null +++ b/scripts/ssoma-replay @@ -0,0 +1,95 @@ +#!/usr/bin/perl -w +# Copyright (C) 2015-2016 all contributors +# License: AGPL-3.0+ +# +# A work-in-progress, but one day I hope this script is no longer +# necessary and users will all pull from public-inboxes instead +# of having mail pushed to them via mlmmj. +# +# This is for use with ssoma, using "command:" delivery mechanism +# (as opposed to normal Maildir or mbox). +# It assumes mlmmj-process is in /usr/bin (mlmmj requires absolute paths) +# and assumes FOO@domain.example.com has web archives available at: +# https://domain.example.com/FOO/ +# +# The goal here is _anybody_ can setup a mirror of any public-inbox +# repository and run their own mlmmj instance to replay traffic. +=begin usage with ssoma: + +NAME=meta +URL=https://public-inbox.org/meta/ +ssoma add $NAME $URL "command:/path/to/ssoma-replay -L /path/to/spool/$NAME" + +; $GIT_DIR/ssoma.state should have something like the following target: +; (where GIT_DIR is ~/.ssoma/meta.git/ in the above example) +[target "local"] + command = /path/to/ssoma-replay -L /path/to/spool/meta +=cut +use strict; +use Email::Simple; +use URI::Escape qw/uri_escape_utf8/; +use File::Temp qw/tempfile/; +my ($fh, $filename) = tempfile('pi-replay-XXXXXXXX'); +my $msg = eval { + local $/; + Email::Simple->new(); +}; +select $fh; + +# Note: the archive URL makes assumptions about where the +# archive is hosted. It is currently true of all the domains +# hosted by me. + +my $header_obj = $msg->header_obj; +my $body = $msg->body; +my $list_id = $header_obj->header('List-Id'); +my ($archive_url, $user, $domain); +if (defined $list_id) { + ($user, $domain) = ($list_id =~ /<(.+)\@(.+)>/g); + + if (defined $domain) { + $archive_url = "https://$domain/$user/"; + my $mid = $header_obj->header('Message-Id'); + if ($mid =~ /\A<(.+)>\z/) { + $mid = $1; + } + $mid = uri_escape_utf8($mid); + $header_obj->header_set('List-Archive', "<$archive_url>"); + + foreach my $h (qw(Help Unsubscribe Subscribe Owner)) { + my $lch = lc $h; + my $v = ""; + $header_obj->header_set("List-$h", $v); + } + $header_obj->header_set('List-Post', ""); + + # RFC 5064 + $header_obj->header_set('Archived-At', "<$archive_url$mid/>"); + $header_obj->header_set('X-Archived-At'); + } +} + +print $header_obj->as_string, $msg->crlf, $body; + +# don't break inline signatures +goto out if ($body =~ /^-----BEGIN PGP SIG.+-----/sm); + +# try not to break dkim/dmarc/spf crap, either +foreach (qw(domainkey-signature dkim-signature authentication-results)) { + goto out if defined $header_obj->header($_); +} + +my $ct = $header_obj->header('Content-Type'); + +if (!defined($ct) || $ct =~ m{\A\s*text/plain\b}i) { + print "\n" unless $body =~ /\n\z/s; + defined $archive_url or goto out; + # Do not add a space after '--' as is standard for user-generated + # signatures, we want to preserve the "-- \n" in original user sigs + # for mail software which splits on that. + print "--\n", "unsubscribe: $user+unsubscribe\@$domain\n", + "archive: $archive_url\n"; +} +out: +$| = 1; +exec '/usr/bin/mlmmj-process', @ARGV, '-m', $filename;