<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>martin-grandrath.de &#187; Mutt</title>
	<atom:link href="http://martin-grandrath.de/tags/mutt/feed/" rel="self" type="application/rss+xml" />
	<link>http://martin-grandrath.de</link>
	<description>Ein neues WordPress-Weblog</description>
	<lastBuildDate>Fri, 23 Oct 2009 22:35:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>&#187;pgp_autoencrypt&#171; für mutt automatisieren</title>
		<link>http://martin-grandrath.de/2008/04/pgp_autoencrypt-fuer-mutt-automatisieren/</link>
		<comments>http://martin-grandrath.de/2008/04/pgp_autoencrypt-fuer-mutt-automatisieren/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 07:41:18 +0000</pubDate>
		<dc:creator>Martin Grandrath</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[GPG]]></category>
		<category><![CDATA[Mutt]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://www.martin-grandrath.de/?p=15</guid>
		<description><![CDATA[Mutt bietet von sich aus keine Möglichkeit Nachrichten an Empfänger, für die ein öffentlicher GPG-Schlüssel vorhanden ist, automatisch zu verschlüsseln. Man kann zwar die Option pgp_autoencrypt aktivieren, dies führt aber dazu, dass mutt versucht jede E-Mail zu verschlüsseln, was man dann regelmäßig vor dem Absenden deaktivieren muss, wenn der Empfänger keinen public key hat. Die [...]]]></description>
			<content:encoded><![CDATA[<p>Mutt bietet von sich aus keine Möglichkeit Nachrichten an Empfänger, für die ein öffentlicher GPG-Schlüssel vorhanden ist, automatisch zu verschlüsseln. Man kann zwar die Option <code>pgp_autoencrypt</code> aktivieren, dies führt aber dazu, dass mutt versucht <em>jede</em> E-Mail zu verschlüsseln, was man dann regelmäßig vor dem Absenden deaktivieren muss, wenn der Empfänger keinen public key hat. Die Alternative (<code>pgp_autoencrypt</code> deaktivieren) ist auch nicht sehr benutzerfreundlich, weil man hier viel zu leicht vergessen kann, die Verschlüsselung im Einzelfall zu aktivieren.<br />
<span id="more-15"></span></p>
<h3>Abhilfe</h3>
<p>Abhilfe schafft die Möglichkeit die automatische Verschlüsselung zunächst global zu deaktivieren und mit so genannten <code>send-hook</code>s für einzelne Empfängeradressen (eben diejenigen, für die ein Schlüssel vorhanden ist) wieder zu aktivieren. In der <code>~/.muttrc</code> sieht das Ganze dann so aus:</p>
<pre class="code">send-hook . 'unset pgp_autoencrypt'
send-hook '~t my-friend@example.com' 'set pgp_autoencrypt'</pre>
<p>Die erste Zeile deaktiviert (unset) automatische Verschlüsselung für alle Empfänger (der &#8216;.&#8217; trifft immer zu). In der zweiten Zeile wird nun die Verschlüsselung wieder aktiviert und zwar immer dann, wenn eine Mail an <code>my-friend@example.com</code> adressiert wird (der Schalter &#8216;<code>~t</code>&#8216; bezieht das Suchmuster auf das Empfänger-Feld (To:). Den passenden Schlüssel kann mutt dann selbst ermitteln, sofern <code>pgp_list_pubring_command</code> korrekt gesetzt ist.</p>
<p>Nun ist es alles andere als praktikabel für jeden einzelnen Empfänger, der einen GPG-Schlüssel besitzt, eine separate Zeile in der Konfigurationsdatei hinzuzufügen, zumal diese Information ja bereits existiert: im public keyring. Netterweise bietet GPG eine komfortable Möglichkeit, die Liste der vorhandenen Schlüssel automatisiert zu verarbeiten und zwar mit Hilfe der Schalter &raquo;<code>--list-keys --with-colons</code>&raquo;. Das Ergebnis ist eine Liste mit 15 durch Doppelpunkte getrennten Feldern. Für unsere Zwecke benötigen wir nur drei davon:</p>
<ul>
<li>Feld 1 enthält den Typ der Zeile. Uns interessieren nur diejenigen vom Typ <code>pub</code> und <code>uid</code>.</li>
<li>Feld 2 enthält den berechneten trust level. Ich habe mich dafür entschieden, alle Schlüssel zu berücksichtigen, denen ich mindestens &raquo;marginally&laquo; (&#8217;m') vertraue. Des Weiteren steht &#8216;f&#8217; für &raquo;fully&laquo; und &#8216;u&#8217; für &raquo;ultimately&laquo; trusted.</li>
<li>Feld 10 enthält die eigentliche UID, also den Namen und die E-Mail-Adresse.</li>
</ul>
<p>Als regulärer Ausdruck ergibt sich damit</p>
<pre class="code">/^(uid|pub):[mfu]:(.*:){7}.* &lt;(.+@.+)&gt;:/</pre>
<p>Die vollständige Dokumentation dieses Formats findet sich übrigens in der Datei <code>DETAILS.gz</code> im Dokumentationsverzeichnis von GnuPG (z.B. bei Debian <code>/usr/share/doc/gnupg/</code>).</p>
<h3>Alles zusammen</h3>
<p>Das folgende Script prüft zunächst, ob eine Cache-Datei existiert und diese neuer als der public keyring ist. Wenn das der Fall ist, wird einfach diese Datei ausgegeben. Andernfalls die oben beschriebene Liste aller Schlüssel mit <code>gpg --list-keys --with-colons</code> und daraus entsprechende Konfigurationszeilen für mutt erzeugt. Eingebunden wird das Script mit der Zeile</p>
<pre class="code">source ~/.muttrc.gpg.pl|</pre>
<p>in der <code>~/.muttrc</code> (das Pipe-Symbol (|) am Ende nicht vergessen!).</p>
<p>Falls die Cache-Datei nicht existiert und der Keyring einigermaßen groß ist (bei mir sind es derzeit etwas über 1800 Zeilen), verzögert sich der Start von mutt um wenige Sekunden, was durchaus im Rahmen des Erträglichen liegt.</p>
<pre class="code perl">#!/usr/bin/perl

# file:    ~/.muttrc.gpg.pl
# author:  Martin Grandrath &lt;mail@martin-grandrath.de&gt;
# date:    2008-04-19
#
# description:
#   Creates .muttrc lines in the form
#   ,----
#   | send-hook '~t trusted@example.com' 'set pgp_autoencrypt'
#   `----
#   for each trusted uid in your gpg public keyring.  The output is
#   stored in a cache file that will be refreshed whenever the keyring
#   is newer than the cache file (mtime).
#
#   This script can be included in ~/.muttrc with the following line
#   (don't forget the trailing pipe (|))
#   ,----
#   | source ~/.muttrc.gpg.pl|
#   `----

use strict;
use warnings;
use File::stat;

my $cachefile="$ENV{HOME}/.cache/muttrc.gpg";
my $keyring="$ENV{HOME}/.gnupg/pubring.gpg";

if (-s $cachefile &amp;&amp; -s $keyring &amp;&amp;
    stat($cachefile)-&gt;mtime &gt; stat($keyring)-&gt;mtime)
{
    # Just dump cachefile to stdout if it exists and is not older than
    # keyring
    open FILE, $cachefile or die "ERROR: $!\n";
    print while (&lt;FILE&gt;);
    close FILE;
}
else
{
    my %count;   # count adresses (we want no duplicates)
    my $address; # email addresses from keyring

    # Create new muttrc config and "tee" it to stdout and the
    # cachefile
    open STDOUT, "| tee $cachefile" or die "ERROR: $!\n";
    open GPG, '/usr/bin/gpg --list-keys --with-colons |' or die "Error: $!\n";

    # let mutt reset all autoencrypt settings
    print "send-hook . 'unset pgp_autoencrypt'\n";

    while (&lt;GPG&gt;)
    {
        # Get all keys which we at least "marginally" trust
        if (/^(uid|pub):[mfu]:(.*:){7}.* &lt;(.+@.+)&gt;:/)
        {
            $address = lc($3);
            $count{$address} += 1;

            # Output new send-hook line if address is no duplicate
            print "send-hook '~t $address' 'set pgp_autoencrypt'\n"
                if ($count{$address} &lt; 2);
        }
    }
    close GPG;
    close STDOUT;
}</pre>
<p>Ich setze hier voraus, dass alle E-Mails verschlüsselt werden sollen, sobald die Möglichkeit dazu besteht. Möchte man einzelne Empfänger von dieser Regel ausnehmen, kann man für diese natürlich nach der Einbindung des Scriptes weitere <code>send-hook</code>s anlegen, die die automatische Verschlüsselung wieder deaktivieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://martin-grandrath.de/2008/04/pgp_autoencrypt-fuer-mutt-automatisieren/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

