>

instant-thinking.de

just enough to get you started and leave you confused

Passwort für imapfilter aus der macOS Keychain holen

| Kommentare

Unter macOS gibt es einen eingebauten Passwortmanager, den Schlüsselbund bzw. die Keychain1. Und mit security kann man die auch von der Kommandozeile aus benutzen.

Passworte auf der Shell unter macOS

So kann man die Standard-Keychain aufschließen:

Keychain entsperren
1
2
3
$ security -v unlock-keychain
unlock-keychain
password to unlock default:

Und so ein Passwort hinzufügen, hier ist es ein IMAP-Passwort:

Passwort hinzufügen
1
$ security add-internet-password -a "someone@icloud.com" -s icloudimap -w "TOPSECRET" -r 'htps'

Sehr wichtig ist dabei, dass man mit -r ein Protokoll mitgibt2, sonst klappt das mit dem Hinzufügen gar nicht.

Den neuen Eintrag kann man sich dann auch in der GUI-Keychain angucken:

Das Passwort des Eintrags mit security auch auf der Shell wieder auszulesen ist dank dem Paramater -w3 für das find-internet-password Subkommando ganz einfach4:

Passwort auslesen
1
2
$ security find-internet-password -w -s "icloudimap"
TOPSECRET

Ganz dummerweise gibt es keinen entsprechenden Parameter für den Usernamen. Hier muss man sich mit etwas Schnipselei an die Gesamtausgabe begeben und nur dieacct-Zeile betrachten5:

Usernamen per grep und cut rausschnipseln
1
2
$ security find-internet-password -s "icloudimap" | grep "acct" | cut -d "=" -f 2
"someone@icloud.com"

Passwort in imapfilter verwenden

Super. Klasse. Was macht man nun damit? Zum Beispiel kann man auf einem eh da Mac mini einen eigenen imapfilter laufen lassen, um die eher schwachbrüstigen Filterfunktionen6 von iCloudmail deutlich zu verbessern. Und mit diesem Vorgehen muss man das Passwort dann nicht im Klartext in einer Textdatei rumliegen haben. Passworte im Klartext sind eine Doofe Idee™.

Der Loginteil für ein iCloud-Mail Konto schaut dann aus wie folgt:

iCloud Logindaten in der config.lua von imapfilter
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- Get the iCloud IMAP username from the keychain (removing surrounding quotes and the newline)
status, user = pipe_from('security find-internet-password -s "icloudimap" | grep "acct" | cut -d "=" -f 2')
user = string.gsub(user, '"', '')
user = string.gsub(user, "\n", "")

-- Get the iCloud IMAP password from the keychain (removing the newline)
status, passwd = pipe_from('security find-internet-password -w -s "icloudimap"')
passwd = string.gsub(passwd, "\n", "")

-- iCloud connection parameters
icloud = IMAP {
server = 'imap.mail.me.com',
username = user,
password = passwd,
ssl = 'tls1',
}

Wie das Suffix der Datei schon nahelegt ist das hier im Prinzip ein Lua-Programm. Die Bash-Einzeiler von oben werden per pipe_from Funktion eins zu eins übernommen um Username und Passwort zu bekommen. Beim Passwort wird in Zeile 8 noch der hier überflüssige7 Zeilenumbruch entfernt. Der ist nicht Teil des Passworts, das klappt sonst eher schlecht mit dem Login.

Beim Usernamen müssen vor dem Entfernen des Zeilenumbruchs in Zeile 4 außerdem in Zeile 3 die Anführungszeichen entfernt werden. Das ginge vielleicht auch irgendwie durch escapen der einfachen Anführungszeichen von tr in der zweiten Zeile aber ich habe mich hier für den Weg des geringsten Wiederstandes entschieden und entferne die Anführungszeichen ebenfalls per gsub in Lua. So läuft das jetzt super. Einige Beispielregeln finden sich auch hier, noch mehr und viel ausführlichere Beispiele hier sowie dort.

Einige andere8 Vorgehensweisen um an ein Passwort für imapfilter zu kommen finden sich auch in dieser Beispielconfig.

Das ganze läuft bei mir nun seit vielen Monden in einem tmux pane vor sich hin9:

imapfilter alle 5 Minuten ausführen
1
2
3
4
5
6
7
#!/bin/sh
while true
do
    date
    imapfilter
    sleep 300
done

Das ergibt dann solche Ausgaben:

imapfilter Ausgabe
1
2
3
4
5
Sa 25 Mar 2023 08:29:42 CET
6 messages, 0 recent, 1 unseen, in someone@icloud.com@imap.mail.me.com/INBOX.
1 messages moved from someone@icloud.com@imap.mail.me.com/INBOX to someone@icloud.com@imap.mail.me.com/Lists/Verbraucherinformationen.
Sa 25 Mar 2023 08:34:55 CET
5 messages, 0 recent, 0 unseen, in someone@icloud.com@imap.mail.me.com/INBOX.

Alles in allem ist imapfilter sehr zum feinstreifigen durchsieben und filtern von allen Postfächern geeignet, die selbst keine derartigen Funktionen mitbringen. Anstelle eines Mac minis kann natürlich so gut wie alles benutzt werden, was eh da ist. Nicht mal antike Raspberry Pis sollten hier irgendeine Art von Load verspüren.

(via: diesem imapfilter GitHub issue)

  1. Ich bleibe mal beim englischen Begriff…

  2. Auch wenn man es eigentlich gar nicht braucht, bzw. ein anderes…

  3. -w Display only the password on stdout

  4. Allerdings wird nach dem Passwort auch ein Zeilenumbruch ausgegeben, das wird später noch wichtig werden…

  5. Hier wird der Username allerdings in Anführungszeichen ausgegeben und ebenfalls mit einem Zeilenumbruch abgeschlossen. Die Anführungzeichen könnte man mit einer weiteren Pipe und tr -d '"' entsorgen. In der eigentlichen Verwendung mit ìmapfilterführte das aber zu Problemen und musste anders gelöst werden, immer ist was…

  6. Ernsthaft, das war in Googlemail viel besser…

  7. Auf der Shell hübsch, hier falsch…

  8. Eher für Linux gedachte…

  9. Ja, das gehört mal auf einen LaunchAgent umgestellt…

Comments