;; -*- emacs-lisp -*-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; $Id: gnus_gpg.el,v 1.5 2006-11-06 21:02:42 rscholz Exp $
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; Interne GPG/PGP/SMIME-Unterstützung von Gnus
;;
;; Die offizielle Quelle dieser Datei ist
;;   <http://www.zonix.de/projects/emacs/config>
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; PGP(/MIME)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; PGG benutzen (ab Gnus 5.10)
(setq mml2015-use 'pgg)
(setq mml1991-use 'pgg)

;; gpg.el benutzen (aufgrund von Copyright-Problemen nicht bei Gnus
;; 5.10 dabei)
;(setq mml2015-use 'gpg)
;(setq mml1991-use 'gpg)

;; MailCrypt benutzen
;(setq mml2015-use 'mailcrypt)
;(setq mml1991-use 'mailcrypt)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; PGG (neues Crypto-Interface ab Gnus 5.10)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; PGG soll GnuPG verwenden
(setq pgg-default-scheme 'gpg)
(setq pgg-scheme 'gpg)

;; immer auch mit meinem Public-Key verschlüsseln
(setq pgg-encrypt-for-me t)

;; meine Key-ID
(if (string-match "\\.zonix\\.de" system-name)
    (setq pgg-default-user-id "F0311FD8"))

(if (string-match "\\.verified\\.de" system-name)
    (setq pgg-default-user-id "5159191E"))

;; Keyserver abfragen
;(setq pgg-query-keyserver t)
;(setq pgg-default-keyserver-address "wwwkeys.de.pgp.net")

;; Passphrase 5 min merken 
(setq pgg-passphrase-cache-expiry 300)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Anzeige von Nachrichten             (Info-goto-node "(Gnus)Security")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; nur auf Anfrage verifizieren / entschluesseln
(setq mm-verify-option 'never)
(setq mm-decrypt-option 'never)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Erstellen von Nachrichten        (Info-goto-node "(Message)Security")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Bei PGP(/MIME) soll "in einem Rutsch" signiert und verschlüsselt
;; werden.
(setq mml-signencrypt-style-alist
 '(("smime" separate)
   ("pgp" combined)
   ("pgpmime" combined)))

;; Default beim Verschlüsseln und Signieren ist PGP/MIME
(setq mml-default-encrypt-method "pgpmime")
(setq mml-default-sign-method "pgpmime")

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Anzeige-Optionen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Security-Buttons anzeigen
(setq gnus-buttonized-mime-types '("multipart/encrypted" "multipart/signed"))

;;Inline-Anzeige von application/pgp
(add-to-list 'mm-inlined-types "application/pgp$")
(add-to-list 'mm-automatic-display "application/pgp$")
(add-to-list 'mm-inline-media-tests '("application/pgp$" mm-inline-text identity))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Nützliche Funktionen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; <#part encrypt=pgpmime sender="you@home" recipients="someone@somewhere">

;; automatisch signieren
(defun zsh/mml-pgp-sign-automatically ()
  (interactive)
  (message-goto-body)
  (if (save-excursion
        (re-search-forward 
         "<#\\(/\\)?\\(multipart\\|part\\|external\\|mml\\)." nil t))
      (insert "<#multipart sign=pgpmime>\n")
    (insert "<#part sign=pgpmime>\n")))

;(add-hook 'message-send-hook 'zsh/mml-pgp-sign-automatically)

;; andere Möglichkeit, automatisch zu signieren
;;(add-hook 'gnus-message-setup-hook 'mml-secure-sign-pgpmime)

;; und noch eine Möglichkeit
;; (add-hook 'message-setup-hook
;;        (lambda ()
;;          (when (string-match "nnml:mail\\.signed-only" gnus-newsgroup-name)
;;            (mml-secure-message-sign-pgpmime))))


; fix parsing of GnuPG output (if gpg.el not loaded)
 (setq gpg-unabbrev-trust-alist
       '(("TRUST_UNDEFINED" . trust-undefined)
          ("TRUST_NEVER"     . trust-none)
          ("TRUST_MARGINAL"  . trust-marginal)
          ("TRUST_FULLY"     . trust-full)
          ("TRUST_ULTIMATE"  . trust-ultimate)))



;; X-Request-PGP-Header anklickbar machen
;; Reiner Steib in <v9u13sy5u7.fsf@marauder.physik.uni-ulm.de>
(defun rs-gnus-handle-request-pgp (url)
  "Fetch PGP key from URL"
  (with-temp-buffer
    (mm-url-insert-file-contents-external url)
    (pgg-snarf-keys-region (point-min) (point-max))))

(add-to-list
 'gnus-header-button-alist
 '("^X-Request-PGP:" gnus-button-url-regexp  0 t rs-gnus-handle-request-pgp 0)
 t)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; gpg.el                     (liegt im contrib-Verzeichnis von No Gnus)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(add-to-list 'load-path (concat zonix-elisp-dir "gnus/contrib"))

(if (string-match "\\.zonix\\.de" system-name)
    (setq gpg-default-key-id "F0311FD8"))

(if (string-match "\\.verified\\.de" system-name)
    (setq gpg-default-key-id "5159191E"))

(setq gpg-passphrase-timeout 900)
(setq gpg-temp-directory "~/.gnupg/tmp/")