<?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>WeizenSpr.eu</title>
	<atom:link href="http://weizenspr.eu/feed/" rel="self" type="application/rss+xml" />
	<link>http://weizenspr.eu</link>
	<description>trennt Spreu vom Weizen</description>
	<lastBuildDate>Sun, 15 Apr 2012 09:27:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Remote Linux Partitionen verschlüsseln</title>
		<link>http://weizenspr.eu/2012/remote-linux-partitionen-verschlusseln/</link>
		<comments>http://weizenspr.eu/2012/remote-linux-partitionen-verschlusseln/#comments</comments>
		<pubDate>Sun, 15 Apr 2012 09:18:19 +0000</pubDate>
		<dc:creator>Kenny</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Alltag]]></category>
		<category><![CDATA[Computer]]></category>
		<category><![CDATA[Weizen]]></category>

		<guid isPermaLink="false">http://weizenspr.eu/?p=8138</guid>
		<description><![CDATA[Wenn man einen Server aufsetzt, auf dem potentiell auch persönliche Daten (z.B. E-Mails) abgelegt werden sollen, kommt man früher oder später an den Punkt, an dem man sich über die Sicherung dieser Daten Gedanken macht. Für die permanente Verschlüsselung auf der Festplatte gibt es inzwischen glücklicherweise gute Standardtools, die einem viel Arbeit abnehmen können.  [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_START --><p>Wenn man einen Server aufsetzt, auf dem potentiell auch persönliche Daten (z.B. E-Mails) abgelegt werden sollen, kommt man früher oder später an den Punkt, an dem man sich über die Sicherung dieser Daten Gedanken macht. Für die permanente Verschlüsselung auf der Festplatte gibt es inzwischen glücklicherweise gute Standardtools, die einem viel Arbeit abnehmen können. <img src='http://weizenspr.eu/includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Um sie nutzen zu können, muss man sie jedoch erst einmal installieren. Dazu könnt ihr (unter Debian) folgenden Befehl nutzen:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> <span style="color: #c20cb9; font-weight: bold;">install</span> cryptsetup</div></td></tr></tbody></table></div>
<p>Beginnen wir mit etwas einfachem. Zuerst einmal wollen wir die Swap-Partition verschlüsseln. Was bringt es uns, die Daten zu verschlüsseln, wenn sie bei Speichermangel trotzdem unverschlüsselt auf der Platte landen? Hierfür deaktivieren wir erst einmal die derzeit verwende Swap-Parrtition:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> swapoff <span style="color: #660033;">-a</span></div></td></tr></tbody></table></div>
<p>Anschließend gehen wir in die Datei "/etc/fstab" und sehen uns an, wie das Swap-Device heißt. In meinem Fall (da ich ein Software-RAID verwende) finde ich folgende Zeile:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>md<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">0</span> none swap sw <span style="color: #000000;">0</span> <span style="color: #000000;">0</span></div></td></tr></tbody></table></div>
<p>Das Device heißt bei mir also "/dev/md0". Hier könnte auch "/dev/sda1" oder soetwas stehen. <strong>Das hängt ganz von eurer Plattenkonfiguration ab!</strong> Diese Zeile könnt ihr übrigens gleich auskommentieren und die Datei durch folgende, neue Zeile ergänzen:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>cswap none swap sw <span style="color: #000000;">0</span> <span style="color: #000000;">0</span></div></td></tr></tbody></table></div>
<p>Als nächstes gehen wir nun in die (während der Installation von cryptsetup angelegte) Datei "/etc/crypttab". Dort können wir verschlüsselte Devices definieren, die während dem Hochfahren geöffnet werden sollen. Hier tragt ihr nun eine neue Zeile ein:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cswap <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>md0 <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>urandom <span style="color: #007800;">cipher</span>=aes-cbc-essiv:sha256,<span style="color: #007800;">size</span>=<span style="color: #000000;">256</span>,swap</div></td></tr></tbody></table></div>
<p>Denkt daran, den Devicenamen "/dev/md0" durch den zu ersetzen, den ihr in eurer "/etc/fstab" Datei gefunden habt (also z.B. "/dev/sda1")!</p>
<p>Bevor ihr die Partition tatsächlich nutzt, solltet ihr sie noch einmal mit Zufallsdaten überschreiben, um sicher zu gehen, dass sich dort nicht bereits Daten befinden, die ausgelesen werden könnten. Einfache Gemüter können einen BadBlocks-Lauf mit Zufallsdaten durchführen:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> badblocks <span style="color: #660033;">-c</span> <span style="color: #000000;">10240</span> <span style="color: #660033;">-s</span> <span style="color: #660033;">-w</span> <span style="color: #660033;">-t</span> random <span style="color: #660033;">-v</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>md0</div></td></tr></tbody></table></div>
<p>Denkt daran, "/dev/md0" wieder durch euer richtiges Device zu ersetzen! Paranoide Gemüter können natürlich per DD bessere Zufallsdaten schreiben lassen:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">dd</span> <span style="color: #007800;">if</span>=<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>urandom <span style="color: #007800;">of</span>=<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>md0 <span style="color: #007800;">bs</span>=<span style="color: #000000;">10240</span></div></td></tr></tbody></table></div>
<p>Denkt auch hier daran, "/dev/md0" durch euer richtiges Device zu ersetzen! Wenn ihr damit fertig seid, könnt ihr auch schon anfangen, eure verschlüsselte Swap-Partition zu nutzen. Dazu führt ihr folgende Befehle aus:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>cryptdisks restart<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> swapon <span style="color: #660033;">-a</span></div></td></tr></tbody></table></div>
<p>Um zu gucken, ob alles funktioniert hat, könnt ihr folgenden Befehl nutzen:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span>swaps</div></td></tr></tbody></table></div>
<p>Hier sollte nun im Idealfall folgendes ausgegeben werden:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Filename &nbsp; &nbsp;Type &nbsp; &nbsp; &nbsp; &nbsp;Size &nbsp; &nbsp; &nbsp; Used &nbsp; Priority<br />
<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>dm-<span style="color: #000000;">0</span> &nbsp; partition &nbsp; <span style="color: #000000;">67107760</span> &nbsp; <span style="color: #000000;">0</span> &nbsp; &nbsp; &nbsp;<span style="color: #660033;">-1</span></div></td></tr></tbody></table></div>
<p>Es ist möglich, dass hier anstelle von "/dev/dm-0" ein anderes Device steht. Es sollte allerdings unbedingt mit "/dev/dm-" beginnen! Auch die Werte "Size", "Used" und "Priority" könnten bei euch anders sein. Falls dort jedoch immernoch etwas wie "/dev/sda1" steht, ist etwas schief gelaufen!</p>
<p>Kommen wir nun zur Verschlüsselung einer Datenpartition. Auch hierzu solltet ihr wieder in die Datei "/etc/fstab" gehen und das richtige Device heraussuchen. In meiner Datei befindet sich dort die passende Zeile:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>md<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">2</span> <span style="color: #000000; font-weight: bold;">/</span>daten ext4 defaults <span style="color: #000000;">0</span> <span style="color: #000000;">0</span></div></td></tr></tbody></table></div>
<p>In meinem Fall heißt das Device also "/dev/md2". Darüber hinaus ist es bei mir als Ordner "/daten" gemounted und ist als EXT4-Dateisystem formatiert. <strong>Das hängt natürlich wieder von eurer jeweiligen Konfiguration ab!</strong> Dort könnte also als Device "/dev/sdb2", als Mountpoint "/tmp" und als Dateisystem "ext3" stehen oder ähnliches. Ihr könnt die Zeile nun auskommentieren - ihr werdet das Device später mit einem eigenen Script laden und mounten.</p>
<p>Als nächstes könnt ihr mit folgendem Befehl gucken, ob das entsprechende Device noch gemounted ist:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">df</span></div></td></tr></tbody></table></div>
<p>Sollte sich in der Konsolenausgabe eine Zeile mit dem Devicenamen (z.B. "/dev/md2") und dem Mountpoint (z.B. "/daten") befinden, müsst ihr das Device zuerst unmounten - in meinem Beispiel mit:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">umount</span> <span style="color: #000000; font-weight: bold;">/</span>daten</div></td></tr></tbody></table></div>
<p>Als nächstes überschreiben wir die Partition wieder mit Zufallsdaten. <strong>Achtung! Ihr verliert durch diesen Schritt sämtliche Daten, die auf dieser Partition gespeichert sind!</strong> Hier wieder die jeweiligen Befehle. Ihr müsst "/dev/md2" durch euren entsprechenden Devicenamen ersetzen:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> badblocks <span style="color: #660033;">-c</span> <span style="color: #000000;">10240</span> <span style="color: #660033;">-s</span> <span style="color: #660033;">-w</span> <span style="color: #660033;">-t</span> random <span style="color: #660033;">-v</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>md2</div></td></tr></tbody></table></div>
<p>...oder...</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">dd</span> <span style="color: #007800;">if</span>=<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>urandom <span style="color: #007800;">of</span>=<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>md2 <span style="color: #007800;">bs</span>=<span style="color: #000000;">10240</span></div></td></tr></tbody></table></div>
<p>Als nächstes erstellen wir bereits die neue Partition. Hierfür führen wir nacheinander folgende Befehle aus. Der erste Befehl fragt, ob ihr wirklich fortfahren wollt und bittet euch dann um die Eingabe eines Passwortes. Dieses Passwort ist <strong>sehr</strong> wichtig! Ihr werdet es zukünftig brauchen, um auf die Partition zugreifen zu können. Ihr solltet ein sicheres Passwort verwenden! Von diesem Passwort hängt die Sicherheit der Verschlüsselung ab! Leicht erratbare Passwörter bringen mehr Schaden als Nutzen. Vergewissert euch zudem, dass der Devicename korrekt ist und ersetzt "/dev/md2" entsprechend!</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> cryptsetup luksFormat <span style="color: #660033;">-c</span> aes-cbc-essiv:sha256 <span style="color: #660033;">-s</span> <span style="color: #000000;">256</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>md2<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> cryptsetup luksOpen <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>md2 cdaten<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> mkfs.ext4 <span style="color: #660033;">-m0</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>cdaten<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> cryptsetup luksClose cdaten</div></td></tr></tbody></table></div>
<p>Nachdem mit dem ersten Befehl das neue verschlüsselte Device angelegt (und entsprechende Header auf die Platte geschrieben wurden), wurde mit dem zweiten Befehl das Device geöffnet - dafür musstet ihr das vorher eingerichtete Passwort kennen. Danach wurde auf diesem Device ein Dateisystem (EXT4) eingerichtet. Abschließend wurde das Device wieder geschlossen. <strong>Super! Damit habt ihr euer verschlüsseltes Device erstellt!</strong></p>
<p>Normalerweise würde man die verschlüsselte Partition nun in der Datei "/etc/crypttab" hinterlegen, damit sie beim Hochfahren automatisch geöffnet und gemounted wird. Bei einem Remote-System, das wir nur per SSH erreichen, haben wir jedoch das Problem, dass wir beim Bootvorgang gar nicht die Möglichkeit haben, das benötigte Passwort einzugeben. Bei der Swap-Partition konnten wir das tun, da wir dort einfach bei jedem Start ein neues Passwort (aus "/dev/urandom") erzeugen. Für die Swap-Partition ist das nicht problematisch - die Daten werden nach dem Neustart sowieso nicht mehr benötigt. Bei allen anderen Partitionen würde dies jedoch einen vollständigen Datenverlust nach jedem Reboot bedeuten.<br />
Man könnte nun natürlich anfangen und Schlüsseldateien hinterlegen. Dadurch würde jedoch das ganze System gebrochen werden. Denn auch jeder externe Angreifer könnte sich diesen Schlüssel (der ja unverschlüsselt vorliegen muss) von der Platte holen.</p>
<p>Aus diesem Grund gehen wir den einfachen Weg: Wir erstellen uns ein Script, das das Öffnen und Mounten des Devices für uns übernimmt. Dieses müssen wir lediglich nach jedem Reboot einmal ausführen, um unser System wieder in einen arbeitsfähigen Zustand zu bringen:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">-p</span> <span style="color: #000000; font-weight: bold;">/</span>daten<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> cryptsetup luksOpen <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>md2 cdaten<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">mount</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>mapper<span style="color: #000000; font-weight: bold;">/</span>cdaten <span style="color: #000000; font-weight: bold;">/</span>daten</div></td></tr></tbody></table></div>
<p>Ersetzt den Devicenamen und den Mountpoint durch das, was ihr benötigt (z.B. durch das, was vorher in eurer "/etc/fstab" Datei stand). Ihr solltet euch zudem ein Script anlegen, das ihr immer dann ausführt, wenn ihr das System herunterfahren wollt. Auch dieses müsst ihr an eure Bedürfnisse anpassen:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span><br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">umount</span> <span style="color: #000000; font-weight: bold;">/</span>daten<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> cryptsetup luksClose cdaten</div></td></tr></tbody></table></div>
<p>Ein Angriffsvektor bleibt leider bestehen: Das eigentliche Linux-System kann nicht verschlüsselt werden. Der Grund ist der gleiche wie eben. Wir müssten hierfür beim Booten das entsprechende Passwort eingeben. Zu dieser Zeit haben wir bei einem Remote-System jedoch noch garkeinen Zugriff. Wir müssen den Server also mindestens dahin kriegen, dass der SSH-Server läuft. Erst dort können wir aufsetzen und alles weitere manuell starten. Leider.</p>
<p>Ich hoffe, die Informationen helfen dem einen oder anderen sein lokales oder sein Remote-System ein bisschen sicherer zu machen. <img src='http://weizenspr.eu/includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Und wie immer gilt: <em>Ich hafte nicht für Schäden an Software, Hardware oder für Vermögensschäden, die durch Anwendung dieser Änderungen entstanden sind oder entstehen könnten.</em> <img src='http://weizenspr.eu/includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> <br/><br />
<strong>Remote-Verschlüsselte Grüße, Kenny</strong></p>
<!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://weizenspr.eu/2012/remote-linux-partitionen-verschlusseln/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Umstrukturierung</title>
		<link>http://weizenspr.eu/2012/umstrukturierung/</link>
		<comments>http://weizenspr.eu/2012/umstrukturierung/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 23:07:39 +0000</pubDate>
		<dc:creator>Kenny</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Weizen]]></category>

		<guid isPermaLink="false">http://weizenspr.eu/?p=8123</guid>
		<description><![CDATA[WeizenSpr.eu - das ist ein Blog, der seit dem Februar 2009 existiert. Das ist ein Blog, der mich bereits durch mehrere Etappen meines Lebens begleitet hat. Das ist ein Blog, der schon mehrmals auf neue technische Füße gestellt wurde. Das ist ein Blog, in dem ich Projekte, Gedanken, Privates und Belangloses veröffentlicht habe. Aber vor [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_START --><p>WeizenSpr.eu - das ist ein Blog, der seit dem Februar 2009 existiert. Das ist ein Blog, der mich bereits durch mehrere Etappen meines Lebens begleitet hat. Das ist ein Blog, der schon mehrmals auf neue technische Füße gestellt wurde. Das ist ein Blog, in dem ich Projekte, Gedanken, Privates und Belangloses veröffentlicht habe. Aber vor allem ist es ein Blog, der sich verändert hat.</p>
<p>Früher habe ich hier wirklich alles mögliche veröffentlicht - inklusivem vielem Kleinkram und einigen Belanglosigkeiten. Heutzutage gibt es dafür Twitter. Zugegeben, einige Dinge wurden einfach nur verfasst, um überhaupt einen Artikel zu veröffentlichen. Von dieser Praxis habe ich in den letzten Jahren immer weiter Abstand genommen  und ich denke, dass es der inhaltlichen Qualität des Blogs gut getan hat - auch, wenn die Quantität der Artikel dabei stark nachgelassen hat.</p>
<p>Diesen Weg möchte ich gerne weitergehen. Aktuelle Nachrichten wird es geben, wenn ich der Meinung bin, dass ich der Diskussion eine neue Sichtweise hinzufügen kann. Konzentrieren möchte ich mich jedoch auf Technisches und auf eigene Ideen - aber auch private Artikel sollen weiterhin vorkommen. So will ich z.B. im Herbst wieder anfangen zu studieren. Das Informationsmaterial der entsprechenden Uni sind bereits angekommen. <img src='http://weizenspr.eu/includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Um den Blog in diese neue Richtung zu bringen, habe ich in den letzten Tagen einen Haufen alter Artikel offline genommen. Es ist durchaus möglich, dass dadurch <strong>einige</strong> Verlinkungen zu Bruch gegangen sind. Diese werde ich im nächsten Schritt herausfiltern und dann entsprechend korrigieren.</p>
<p>Na dann... auf die nächsten 3 Jahre. <img src='http://weizenspr.eu/includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> <br/><br />
<strong>Strukturierte Grüße, Kenny</strong></p>
<!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://weizenspr.eu/2012/umstrukturierung/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Historische Zeitungen als besonderes Geschenk</title>
		<link>http://weizenspr.eu/2012/historische-zeitungen-als-besonderes-geschenk/</link>
		<comments>http://weizenspr.eu/2012/historische-zeitungen-als-besonderes-geschenk/#comments</comments>
		<pubDate>Mon, 05 Mar 2012 21:08:49 +0000</pubDate>
		<dc:creator>Kenny</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Alltag]]></category>
		<category><![CDATA[Weizen]]></category>
		<category><![CDATA[Werbung]]></category>

		<guid isPermaLink="false">http://weizenspr.eu/?p=7920</guid>
		<description><![CDATA[Dies ist ein honorierter Werbeartikel.
Wie oft kommt es vor, dass man für jemanden ein wirklich originelles Geschenk sucht aber beim besten Willen keines findet? Bei einigen Leuten ist es ziemlich einfach - sie freuen sich über die neusten Technik-Gadgets oder haben sogar explizite Wünsche. Es gibt jedoch auch Leute, für die es wirklich schwer ist, [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_START --><p><span style="font-size:12px; font-weight:bold;">Dies ist ein honorierter Werbeartikel.</span></p>
<p>Wie oft kommt es vor, dass man für jemanden ein wirklich originelles Geschenk sucht aber beim besten Willen keines findet? Bei einigen Leuten ist es ziemlich einfach - sie freuen sich über die neusten Technik-Gadgets oder haben sogar explizite Wünsche. Es gibt jedoch auch Leute, für die es wirklich schwer ist, ein passendes Geschenk zu finden.</p>
<p>Eine interessante Idee ist da in meinen Augen das Angebot von <a rel="nofollow" href="http://www.historische-zeitungen-bestellen.de" target="_blank" class="liexternal">Historische-Zeitungen-bestellen.de</a>. Wie der Name schon verrät, kann man dort historische Zeitungen - geordnet nach dem Erscheinungsdatum - bestellen. Derzeit existiert laut deren Webseite ein Archiv aus 5 Millionen Zeitungen. Alle angebotenen Zeitungen sind echte Originale und haben teilweise bereits <strong>einhundert Jahre</strong> <a rel="nofollow" href="http://www.historische-zeitungen-bestellen.de/historische-zeitungen-zeitschriften-vom-5.03.1902#navi_top" target="_blank" class="liexternal">und mehr</a> auf dem Buckel!<br />
Sämtliche Zeitungen werden vor dem Versand auf Mängel geprüft. Zu jeder Zeitung erhält man zudem <a rel="nofollow" href="http://www.historische-zeitungen-bestellen.de/historische-zeitung.php#navi_top" target="_blank" class="liexternal">eine Geschenkmappe und ein Echtheitszertifikat</a> - dadurch wird das Geschenk meiner Meinung nach gut abgerundet und wird so zu einem echten Vorzeigeobjekt. Der verlangte Preis ist - nach Onlinesichtung - marktüblich. Man muss schließlich bedenken, dass hier eine ganze Menge an Zeitungen über Jahrzehnte hinweg aufbewahrt werden mussten.</p>
<p>Auch zur Bereicherung des Geschichtsunterrichts könnte ich mir die  historischen Zeitungen gut vorstellen. Es ließe sich so zum Beispiel gut klären, was die deutsche Bevölkerung denn in den Kriegsjahren in der Zeitung zu lesen bekam. Aber das ist nur ein Beispiel.</p>
<p>Neben den historischen Zeitungen gibt es auch weitere, individuelle Geschenke wie zum Beispiel <a rel="nofollow" href="http://www.historische-zeitungen-bestellen.de/chronikbuecher.php" target="_blank" class="liexternal">Jahrgangschronik-Bücher</a> mit den wichtigsten Informationen rund um das jeweilige Jahr, <a rel="nofollow" href="http://www.historische-zeitungen-bestellen.de/musik-cd.php" target="_blank" class="liexternal">Jahrgangsmusik-CDs</a> mit den Originalsongs, die im jeweiligen Jahr gespielt wurden, <a rel="nofollow" href="http://www.historische-zeitungen-bestellen.de/jahrgangs-dvd-chronik.php" target="_blank" class="liexternal">Jahrgangschronik-DVDs</a> mit Filmausschnitten der bewegendsten Momente des Jahres und sogar <a rel="nofollow" href="http://www.historische-zeitungen-bestellen.de/cognac-albert-de-montaubert.php" target="_blank" class="liexternal">Jahrgangs-Cognacs</a>, der im jeweiligen Jahr hergestellt worden ist! Die meisten der Geschenke kann man darüber hinaus mit individuellen Gravuren noch weiter personalisieren.</p>
<p>Die Webseite selbst ist übersichtlich gestaltet, sodass auch unbedarfte Nutzer schnell das individuelle Geschenk zusammenstellen können sollten, das sie suchen. In meinen Augen ein großer Pluspunkt für den Shop ist, dass es sich um einen <a rel="nofollow" href="https://www.trustedshops.de/bewertung/info_XC87BE8410466BFE77982A6E92B12F7D5.html" target="_blank" class="liexternal">Trusted Shop</a> handelt. Dadurch hat man die Gewissheit, bei Problemen den bekannten Trusted Shops Käuferschutz in Anspruch nehmen zu können. Ebenso positiv fällt auf, dass der Support über eine reguläre Festnetznummer erreichbar ist.</p>
<p>Wie anspruchsvoll der Beschenkte aus sein möge, die Geschenke von <a rel="nofollow" href="http://www.historische-zeitungen-bestellen.de" target="_blank" class="liexternal">Historische-Zeitungen-bestellen.de</a> sind sicherlich eine Überraschung wert. Wann bekommt man schon mal eine Zeitung oder gar keinen Cognac aus dem Jahr seiner Geburt geschenkt? Als Tipp: Mit dem Gutscheincode <strong>ba2012hzb</strong> erhält man derzeit noch einmal einen Rabatt von 5% auf seine Bestellung.</p>
<p>Ich wünsche euch viel Spaß beim Entdecken des Angebotes. <img src='http://weizenspr.eu/includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> <br/><br />
<strong>Historische Grüße, Kenny</strong></p>
<p><!-- BEGINN hallimash disclaimer --><a rel="nofollow" href="http://www.hallimash.com/index.php?s=info_blogger&#038;nav=3&#038;werber=1768&#038;wm=18" target="_blank" title="Blog Marketing" class="liimagelink"><img src="http://www.hallimash.com/img/22649/hallimash.gif" alt="Blog Marketing" border="0" height="15" width="80" /></a><span style="font-family: Verdana,Arial,Helvetica,sans-serif; font-size: 12px;"> Blog-Marketing ad by hallimash</span><!-- ENDE hallimash disclaimer --></p>
<!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://weizenspr.eu/2012/historische-zeitungen-als-besonderes-geschenk/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Liquid Feedback mit Nachprüfbarkeit</title>
		<link>http://weizenspr.eu/2012/liquid-feedback-mit-nachprufbarkeit/</link>
		<comments>http://weizenspr.eu/2012/liquid-feedback-mit-nachprufbarkeit/#comments</comments>
		<pubDate>Sun, 04 Mar 2012 20:59:44 +0000</pubDate>
		<dc:creator>Kenny</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Alltag]]></category>
		<category><![CDATA[Computer]]></category>
		<category><![CDATA[Politik]]></category>
		<category><![CDATA[Spreu]]></category>

		<guid isPermaLink="false">http://weizenspr.eu/?p=7915</guid>
		<description><![CDATA[Derzeit tobt innerhalb der Piratenpartei ein Streit darüber, wie man zukünftig mit dem Tool Liquid Feedback weitermachen will. Es herrscht (zumindest im Berliner Landesverband) Konsens darüber, dass man über das Tool langfristig Impulse an die Politiker in den BVVen und im AGH geben will. Nicht klar ist bisher jedoch, ob das mit dem derzeitigen Tool [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_START --><p>Derzeit tobt innerhalb der Piratenpartei ein Streit darüber, wie man zukünftig mit dem Tool <a href="http://liquidfeedback.org/" target="_blank" class="liexternal">Liquid Feedback</a> weitermachen will. Es herrscht (zumindest im Berliner Landesverband) Konsens darüber, dass man über das Tool langfristig Impulse an die Politiker in den BVVen und im AGH geben will. Nicht klar ist bisher jedoch, ob das mit dem derzeitigen Tool möglich ist.</p>
<p>Genauer gesagt ist derzeit nicht geklärt, ob man dies mit den derzeitig verwendeten Pseudonymen erlauben kann, oder ob man sich mit seinem bürgerlichen Namen online - und damit weltweit - zu sämtlichen politischen Themen outen muss, um überhaupt an der innerparteilichen Willensbildung teilhaben zu dürfen.<br />
Von Pro-Klarnamen-Piraten wird dabei meist auf den <a href="http://loreenasworte.wordpress.com/tag/liquid-feedback/" target="_blank" class="liexternal">überlangen Blogeintrag</a> von <a href="https://twitter.com/#!/loreena1968" target="_blank" class="liexternal">@Loreena1968</a> verwiesen. Meine Antwort darauf: <strong>TL;DR</strong>.</p>
<p>Irgendwann wurde mir dieser Text einfach zu seicht, zu blauäugig, zu... unüberlegt. Kurz zusammengefasst: Man muss unbedingt mit bürgerlichem Namen auftreten, denn ansonsten kann "man" nicht nachvollziehen, ob eine Abstimmung korrekt abgelaufen ist. Dabei geht es explizit um die Punkte</p>
<blockquote>
<ul>
<li>zu erkennen, dass der Teilnehmer einer reale Person zuzuordnen ist</li>
<li>zu erkennen, dass der Teilnehmer nur einen Account besitzt</li>
<li>den Vorwurf von Manipulationen entkräften bzw. klären zu können.</li>
</ul>
</blockquote>
<p>Das Allheilmittel soll es nun sein, Klarnamen zu verwenden, die auf Akkreditierungs-/Vorstellungs-/Whatever-Treffen überprüft und (möglichst) publik gemacht werden. Alles was danach passiert oder passieren kann, wird leider nicht erklärt. Aus gutem Grund: Die Verwendug von Klarnamen, wie sie dort beschrieben wird, ist überhaupt keine Lösung für die angesprochenen Probleme.</p>
<p>Es wird immer gesagt, dass man mit Technik keine sozialen Probleme lösen könne. Hier wird im Umkehrweg versucht, ein technisches Problem mit einer sozialen Lösung zu beseitigen - ebenso erfolglos. Kleines Quiz:</p>
<p>Was passiert denn, wenn man eine "Akkreditierungsrunde" im kleinen Kreis machen muss? Wer garantiert, dass es legitim gewesen ist? Hier ist die Antwort: <strong>niemand!</strong></p>
<p>Wer garantiert, dass keine nicht existierende Person eingeschmuggelt worden ist? Hier ist die Antwort: <strong>niemand</strong>!</p>
<p>Wer überprüft denn anhand der Aufzeichnungen zu allen gemachten "Akkreditierungsrunden", dass eine Abstimmung wirklich ohne Beanstandungen abgelaufen ist? Hier ist die Antwort: <strong>niemand</strong>!</p>
<p>Man kann diese Probleme nicht durch persönliches Kennen der Teilnehmer lösen. Selbst wenn man sämtliche Teilnehmer kennen <strong>würde</strong>, wer stellt dann sicher, dass wirklich diese Person abgestimmt hat und nicht irgendjemand den Abstimmungseintrag dieser real existierenden, akkreditierten Person einfach in die Abstimmungsdatenbank geschleust hat? Hier ist die Antwort: <strong>niemand</strong>!</p>
<p>Jetzt, wo wir <strong>hoffentlich</strong> verstanden haben, dass die Verwendung von Klarnamen <strong>überhaupt</strong> keinen Mehrwert für die Aussagekraft der übertragenen Bits &#038; Bytes hat, möchte ich aufzeigen, wie eine Lösung aussehen <strong>könnte</strong>.</p>
<p>Fangen wir mit den nicht-technischen Basics an: Woher weiß man, dass eine Person stimmberechtigt ist? Durch die Mitgliederdatenbank. Das ist der zentrale Punkt. Wer dort drin steht (und ein Flag hat, dass sein Beitrag entrichtet wurde) darf auch wählen. Diese Rolle (stimmberechtigtes Mitglied) wird bei der Akkreditierung bei einer Versammlung mit einer realen Person verknüpft. Diese reale Person erhält dann die Abstimmunterlagen. Ob sie selber die Karten hebt und selber die Kreuzchen macht wird anschließend nie wieder geprüft.</p>
<p>Es wäre also sinnvoll, die Verwendung von Liquid Feedback ebenfalls an eine Akkreditierung zu koppeln. Die Frage ist leiglich: Wie sehen die Abstimmunterlagen aus? Bei Computern würde ein asymmetrisches Schlüsselpaar sinnvoll sein. Damit könnte dann der akkreditierte Pirat seine virtuellen Stimmzettel signieren, nachdem er sie ausgefüllt hat.</p>
<p>Diese Abstimmunterlagen sollten natürlich immer nur bis zum Ende des Jahres gültig sein - so könnte man nicht mehr gültige Stimmunterlagen automatisch aussieben. Abstimmkarten vom BPT 2010 sind in 2012 schließlich auch nicht mehr gültig.</p>
<p>Ich stelle mir das in etwa so vor: Jemand, der an Liquid Feedback teilnehmen will, generiert sich ein asymmetrisches Schlüsselpaar und geht damit zu einer Akkreditierungsveranstaltung. Auf dieser wird geprüft, ob die Person stimmberechtigtes Mitglied ist. Falls ja, wird der öffentliche Schlüssel dieses Piraten zertifiziert - von mindestens 2 Mitgliedern des entsprechenden Vorstandes.<br />
Dieser zertifizierte Schlüssel wird im Liquid Feedback System hinterlegt. <strong>Gleichzeitig</strong> wird der Schlüssel auch noch auf einem weiteren System öffentlich zugänglich hinterlegt, auf den die Betreiber von Liquid Feedback <strong>keinen</strong> Zugriff haben. Und: in der Mitgliederdatenbank wird gespeichert, dass der entsprechende Pirat für das aktuelle Jahr einen Liquid Feedback Schlüssel akkreditiert hat.</p>
<p>Jetzt werde ich ein bisschen orthodox: Bei Abstimmungen ist es mir doch total egal, wieviele Accounts eine Person hat. Das einzige, was mich interessiert ist, dass jede natürliche Person bei einer Abstimmung nur eine Stimme abgeben kann. Genau das wird bei der Akkreditierung sichergestellt. Jemand, der bereits einen zertifizierten Schlüssel hat, darf keinen zweiten zertifizierten Schlüssel für das laufende Jahr erhalten. Hiermit wäre sogar möglich, Abstimmungen ohne Login durchzuführen. Der entsprechende Wähler benötigt einfach nur seine Stimmunterlagen (sein Schlüsselpaar).</p>
<p>Viel wichtiger als ein Account ist, dass die Menge der zugelassenen Schlüssel nicht manipuliert werden kann. Und <strong>deshalb</strong> ist es wichtig, das Abstimm-/Auswertungstool und die Liste der stimmberechtigten Nutzer (die zertifizierten, öffentlichen Schlüssel) strikt zu trennen. Man bezeichnet dies hinlänglich als <em>Separation of Duties</em>.</p>
<p>Der Vorstand, der sämtliche Schlüssel signieren muss, muss seinen öffentlichen Schlüssel selbstsigniert online stellen. Anschließend kann jeder prüfen, ob alle stimmberechtigten Schlüssel wirklich valide sind. Anhand dieser validen Schlüssel kann wiederum geprüft werden, ob die abgegebene Stimme von einem validen Schlüssel unterzeichnet wurde. Und damit kann sichergestellt werden, dass die Abstimmung nicht manipuliert worden ist.</p>
<p>Wenn man nun die eigentliche Akkreditierung anzweifelt: Man könnte festlegen, dass Akkreditierungen nur an bestimmten Tagen zu bestimmten Uhrzeiten erlaubt sind. Man könnte die Akkreditierung öffentlich machen. Heißt: man kann mitzählen, wieviele neue Schlüssel für den entsprechenden Tag auf dem Schlüsselserver erscheinen müssten. Die Überprüfung der Akkreditierung könnte man nochmal dadurch absichern, dass bei der Akkreditierung des Schlüssels der Hash des Schlüssels bekanntgegeben wird. Ein Akkreditierungsbeobachter könnte nach Veröffentlichung der neuen Schlüssel den Hash kontrollieren um sicherzugehen, dass der Schlüssel nicht zwischendurch ausgetauscht wurde.</p>
<p>Als Abschluss: Nur, weil man Klarnamen im Liquid Feedback hat, heißt das noch lange nicht, dass man die getätigten Stimmen nicht manipulieren kann. Hierfür müsste sichergestellt werden, dass niemand die Datenbasis manipulieren kann. Mit Signaturen wäre man hierzu in der Lage - mit Klarnamen nicht.<br/><br />
<strong>Flüssige Grüße, Kenny</strong></p>
<!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://weizenspr.eu/2012/liquid-feedback-mit-nachprufbarkeit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Update] WordPress: Mailversand per SMTP</title>
		<link>http://weizenspr.eu/2012/wordpress-mailversand-per-smtp/</link>
		<comments>http://weizenspr.eu/2012/wordpress-mailversand-per-smtp/#comments</comments>
		<pubDate>Thu, 01 Mar 2012 09:17:26 +0000</pubDate>
		<dc:creator>Kenny</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Alltag]]></category>
		<category><![CDATA[Computer]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Update]]></category>
		<category><![CDATA[Weizen]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://weizenspr.eu/?p=7730</guid>
		<description><![CDATA[Es kommt durchaus mal vor, dass man WordPress auf einem Server einsetzt, der keinen Mailversand über die PHP-Funktion mail() zulässt. In solchen Fällen muss man auf den Mailversand per SMTP zurückgreifen. Leider bietet WordPress nicht die Möglichkeit, die SMTP-Konfiguration direkt vorzunehmen. Das ist sehr schade, denn eigentlich wäre es kein großer Aufwand, dies bereitzustellen. Folgendermaßen [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_START --><p>Es kommt durchaus mal vor, dass man WordPress auf einem Server einsetzt, der keinen Mailversand über die PHP-Funktion <a href="http://php.net/manual/de/function.mail.php" target="_blank" class="liexternal">mail()</a> zulässt. In solchen Fällen muss man auf den Mailversand per SMTP zurückgreifen. Leider bietet WordPress nicht die Möglichkeit, die SMTP-Konfiguration direkt vorzunehmen. Das ist sehr schade, denn eigentlich wäre es kein großer Aufwand, dies bereitzustellen. Folgendermaßen muss man vorgehen, um WordPress dazu zu bringen, Mails via SMTP zu verschicken.</p>
<p>Zuerst einmal müsst ihr die SMTP-Konfiguration irgendwo hinterlegen. Ich dazu die <strong>wp-config.php</strong> ausgewählt, da dort sowieso auch alle anderen, fest verdrahteten Informationen abgelegt sind. Dort habe ich die Funktion <strong>smtp_wp_mail()</strong> hinterlegt, die wie folgt aussieht:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">//!!! use SMTP</span><br />
<span style="color: #000000; font-weight: bold;">function</span> smtp_wp_mail<span style="color: #009900;">&#40;</span><span style="color: #000088;">$phpmailer</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #000088;">$phpmailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">IsSMTP</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// telling the class to use SMTP</span><br />
<br />
&nbsp; <span style="color: #000088;">$phpmailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Host</span> &nbsp; &nbsp; &nbsp; <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;smtp.example.com&quot;</span><span style="color: #339933;">;</span> &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// set the SMTP server host</span><br />
&nbsp; <span style="color: #000088;">$phpmailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Port</span> &nbsp; &nbsp; &nbsp; <span style="color: #339933;">=</span> <span style="color: #cc66cc;">465</span><span style="color: #339933;">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// set the SMTP server port</span><br />
&nbsp; <span style="color: #000088;">$phpmailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SMTPSecure</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;ssl&quot;</span><span style="color: #339933;">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #666666; font-style: italic;">// enable SMTP via SSL</span><br />
&nbsp; <span style="color: #000088;">$phpmailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">SMTPAuth</span> &nbsp; <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// enable SMTP authentication</span><br />
&nbsp; <span style="color: #000088;">$phpmailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Username</span> &nbsp; <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;wordpress@example.com&quot;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// set the SMTP account username</span><br />
&nbsp; <span style="color: #000088;">$phpmailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Password</span> &nbsp; <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SECRETPASSWORD&quot;</span><span style="color: #339933;">;</span> &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #666666; font-style: italic;">// set the SMTP account password</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Wie man sieht, wird hier kein Stückchen Logik benötigt, sondern einfach nur reine Konfigurationseinstellungen. Das hat einen einfachen Grund: WordPress verwendet intern für den Mailversand die Funktion <strong>wp_mail()</strong>, die wiederum die Klasse <a href="http://sourceforge.net/projects/phpmailer/" target="_blank" class="liexternal">PHPMailer</a> kapselt. Oder anders ausgedrückt: Die Funktionalität ist bereits vorhanden, sie müsste nur genutzt werden.</p>
<p>Um das nun auch zu tun, muss noch die Funktion <strong>wp_mail()</strong>, die sich in der Datei <strong>wp-includes/pluggable.php</strong> befindet, angepasst werden. In ihr gibt den folgenden Codeblock:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">// Set to use PHP's mail()</span><br />
<span style="color: #000088;">$phpmailer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">IsMail</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Dieser muss wie folgt abgeändert werden. Dadurch wird das interne Mailobjekt an unsere oben geschriebene Funktion übergeben, dort für den Mailversand per SMTP umkonfiguriert und danach mit dem Mailversand in der Funktion <strong>wp_mail()</strong> weitergemacht.</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">// Set to use PHP's mail()</span><br />
<span style="color: #666666; font-style: italic;">// $phpmailer-&gt;IsMail();</span><br />
<br />
<span style="color: #666666; font-style: italic;">//!!! use SMTP</span><br />
smtp_wp_mail<span style="color: #009900;">&#40;</span><span style="color: #000088;">$phpmailer</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Das war es auch schon! Ich weiß, es gibt auch Plugins dafür, wie z.B. <a href="http://wordpress.org/extend/plugins/wp-mail-smtp/" target="_blank" class="liwp">WP Mail SMTP</a> oder <a href="http://wordpress.org/extend/plugins/configure-smtp/" target="_blank" class="liwp">Configure SMTP</a> aber wenn ich ehrlich sein soll, finde ich diese viel zu überladen für die paar gerade gezeigten Codezeilen.<br/><br />
<strong>Update:</strong><br />
Wie Oliver <a href="#comment-53045" class="liinternal">gezeigt hat</a>, kann man sich die Änderung der <strong>pluggable.php</strong> auch sparen und stattdessen den Hook <span class="bbpost_i" style="font-style : italic;">"phpmailer_init"</span> verwenden. So könnte man z.B. ein Plugin schreiben, das einfach nur folgendes macht:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">add_action<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;phpmailer_init&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;smtp_wp_mail&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p><br/><br />
<strong>Mailende Grüße, Kenny</strong></p>
<!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://weizenspr.eu/2012/wordpress-mailversand-per-smtp/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>WeizenSpr.eu ist wieder Spamopfer</title>
		<link>http://weizenspr.eu/2012/weizenspr-eu-ist-wieder-spamopfer/</link>
		<comments>http://weizenspr.eu/2012/weizenspr-eu-ist-wieder-spamopfer/#comments</comments>
		<pubDate>Sun, 26 Feb 2012 21:52:22 +0000</pubDate>
		<dc:creator>Kenny</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Alltag]]></category>
		<category><![CDATA[Computer]]></category>
		<category><![CDATA[Spreu]]></category>

		<guid isPermaLink="false">http://weizenspr.eu/?p=7726</guid>
		<description><![CDATA[Dank der Bounce-Messages von lernresistenten Mailprovidern wie Yahoo und Hotmail (= Microsoft) habe ich mitbekommen, dass mal wieder irgendein Spaßvogel Spam-Nachrichten versendet und die Absenderadresse fälscht, sodass es aussieht, als ob die Mails von der Domain WeizenSpr.eu versendet werden würden. Für die Leute, die sich mit der Materie nicht so auskennen: Diese Nachrichten stammen nicht [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_START --><p>Dank der <a href="http://de.wikipedia.org/wiki/Bounce_Message" target="_blank" rel="nofollow" class="liwikipedia">Bounce-Messages</a> von lernresistenten Mailprovidern wie Yahoo und Hotmail (= Microsoft) habe ich mitbekommen, dass mal wieder irgendein Spaßvogel Spam-Nachrichten versendet und die Absenderadresse <strong>fälscht</strong>, sodass es aussieht, als ob die Mails von der Domain WeizenSpr.eu versendet werden würden. Für die Leute, die sich mit der Materie nicht so auskennen: <strong>Diese Nachrichten stammen nicht von mir. Es ist mir zudem nicht möglich, Personen daran zu hindern, Mails mit falschem Absender zu verschicken.</strong></p>
<p>Um einen Vergleich zur Offline-Welt zu ziehen: Es ist auch im realen Leben jedem problemlos möglich, einen Brief zu schreiben und darin anzugeben, der Brief würde von Yahoo, Microsoft, Google oder sonstwem kommen. Selbst diese großen Firmen können nicht verhindern, dass jemand solche gefälschten Briefe schreibt. Genau das gleiche gilt für E-Mails.</p>
<p>Dieses Problem hatte ich <a href="http://weizenspr.eu/2010/weizenspr-eu-ist-spam-opfer/" class="liinternal">Ende 2010</a> schon einmal und verwende seitdem <a href="http://de.wikipedia.org/wiki/Sender_Policy_Framework" target="_blank" rel="nofollow" class="liwikipedia">SPF-Records</a> für die von mir betreuten Domains. Diejenigen Leute, die also trotzdem Spammails von der Domain WeizenSpr.eu zu sehen bekommen haben, sollten sich freundlich an ihren eigenen Mailprovider wenden und diesen Fragen, weshalb er keine SPF-Records zur Spambekämpfung auswertet.<br/><br />
<strong>Genervte Grüße, Kenny</strong></p>
<!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://weizenspr.eu/2012/weizenspr-eu-ist-wieder-spamopfer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>fbPGP &#8211; Facebook mit GnuPG</title>
		<link>http://weizenspr.eu/2012/fbpgp-facebook-mit-gnupg/</link>
		<comments>http://weizenspr.eu/2012/fbpgp-facebook-mit-gnupg/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 09:56:39 +0000</pubDate>
		<dc:creator>Kenny</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Alltag]]></category>
		<category><![CDATA[Computer]]></category>
		<category><![CDATA[Entwicklung]]></category>
		<category><![CDATA[Weizen]]></category>

		<guid isPermaLink="false">http://weizenspr.eu/?p=7712</guid>
		<description><![CDATA[Wie ihr letztens wahrscheinlich gelesen habt, hat sich ein Amtsrichter aus Reutlingen dazu entschieden, in einem Einbruchsfall den Facebook-Account eines Angeklagten zu beschlagnahmen. Die Idee: Der Angeklagte soll dem Einbrecher via Facebook einen Tipp gegeben haben, wie dieser am besten einbrechen könne. Mit Hilfe der Beschlagnahmung versucht das Gericht nun, an die privaten Facebook-Nachrichten des [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_START --><p>Wie ihr letztens wahrscheinlich gelesen habt, hat sich ein Amtsrichter aus Reutlingen dazu entschieden, in einem Einbruchsfall <a href="http://www.faz.net/aktuell/technik-motor/erstmals-in-deutschland-richter-beschlagnahmt-facebook-account-11656234.html" target="_blank" class="liexternal">den Facebook-Account eines Angeklagten zu beschlagnahmen</a>. Die Idee: Der Angeklagte soll dem Einbrecher via Facebook einen Tipp gegeben haben, wie dieser am besten einbrechen könne. Mit Hilfe der Beschlagnahmung versucht das Gericht nun, an die privaten Facebook-Nachrichten des Angeklagten zu kommen - soweit so unglaublich Übelkeit erregend.</p>
<p>Aber was würde es denn bedeuten, wenn das Gericht hier tatsächlich Einblick in die privaten Nachrichten erhalten würde? Im ersten Schritt würde das bedeuten, dass private Nachrichten bei Facebook nicht dem gleichen Schutz unterliegen, wie private Briefe. Es würde aber auch bedeuten, dass zukünftig wegen jeder Bagatelle die intimsten Nachrichten Gegenstand eines Prozesses werden könnten.</p>
<p>Um dem ein bisschen entgegen zu wirken, wäre es sinnvoll, über Facebook versendete Nachrichten einfach verschlüsseln zu können, sodass nur der tatsächliche Empfänger sie lesen kann. Leider ist soetwas oft sehr umständlich. Entweder man verwendet einen separaten Client, der diese Funktionalität anbietet, oder aber man muss immer ein Verschlüsselungsprogramm laufen lassen, in das man die Texte rein- und wieder rauskopiert.</p>
<p>Aus diesem Grund habe ich mich mal an einem <a href="http://de.wikipedia.org/wiki/Proof_of_Concept" target="_blank" rel="nofollow" class="liwikipedia">Proof-of-Concept</a> versucht: <a href="http://fbpgp.shorte.net/" target="_blank" class="liexternal"><strong>fbPGP - Facebook with GnuPG</strong></a>. Dort habe ich ein <a href="https://addons.mozilla.org/de/firefox/addon/greasemonkey/" target="_blank" class="liexternal">Greasemonkey</a>-Script geschrieben, das sich in die Nachrichtenseite von Facebook einklinkt. Durch dieses wird die Facebook-Nachrichten-Seite um das ver- und entschlüsseln von versendeten/empfangenen Nachrichten erweitert.</p>
<div id="attachment_7714" class="wp-caption aligncenter" style="width: 310px"><a href="http://weizenspr.eu/uploads/ohne_fbpgp.png" target="_blank" class="liimagelink"><img src="http://weizenspr.eu/uploads/ohne_fbpgp-300x232.png" alt="" title="ohne_fbpgp" width="300" height="232" class="size-medium wp-image-7714" /></a><p class="wp-caption-text">Verschlüsselte Nachricht in Facebook</p></div>
<p>Das ganze funktioniert wie folgt: Man hat einen Server (z.B. lokal), auf dem zwei kleine PHP-Scripte bereitstehen. Auf diesem Server ist zudem <a href="http://www.gnupg.org/" target="_blank" class="liexternal">GnuPG</a> installiert. Wenn man auf der Facebook-Nachrichten-Seite einen Text abschickt, wird dieser an eines der PHP-Scripte übergeben, von diesem verschlüsselt und die verschlüsselte Version an die Facebook-Nachrichten-Seite zurückgegeben. Diese sendet diese dann an den Empfänger.<br />
Wenn man sich eine empfangene Nachricht ansieht, wird diese genommen, an das andere PHP-Script übergeben, von diesem wieder entschlüsselt und dann auf der Facebook-Nachrichten-Seite zur Anzeige gebracht.</p>
<div id="attachment_7715" class="wp-caption aligncenter" style="width: 310px"><a href="http://weizenspr.eu/uploads/mit_fbpgp.png" target="_blank" class="liimagelink"><img src="http://weizenspr.eu/uploads/mit_fbpgp-300x98.png" alt="" title="mit_fbpgp" width="300" height="98" class="size-medium wp-image-7715" /></a><p class="wp-caption-text">Entschlüsselte Nachricht in Facebook</p></div>
<p>Die Besonderheit an der verwendeten Verschlüsselung ist, dass der Schlüsselaustausch problemlos möglich ist. Das kann man sich wie einen Briefkasten vorstellen: Jeder hat Zugang zu dem Briefkasten und kann dort eine Nachricht einwerfen, aber nur der Briefkastenbesitzer kann diesen öffnen und die Nachrichten lesen.<br />
Genauso verhält es sich bei GnuPG. Es gibt dort zwei "Passwörter" (Schlüssel genannt) - ein öffentliches und ein privates. Das öffentliche kann man (wenn man will) auf Plakate drucken und überall aufhängen, jedem per E-Mail schicken, auf seiner Webseite präsentieren und soweiter. Dieses öffentliche "Passwort" wird zum Verschlüsseln von Nachrichten verwendet (= das Einwerfen der Nachricht in den Briefkasten). Das private "Passwort" hingegen ist geheim - es darf an niemanden weitergegeben werden. Jeder, der das private "Passwort" kennt, kann die empfangenen Nachrichten entschlüsseln.</p>
<p>Die Idee ist nun, dass dem PHP-Script, das die Verschlüsselung vornimmt, sämtliche öffentlichen Schlüssel der angeschriebenen Facebook-Kontakte bekannt sind. Praktisch wäre hier natürlich, wenn es sich diese automatisch irgendwoher besorgen könnte. Das ist jedoch noch nicht implementiert.<br />
Das PHP-Script, das die Verschlüsselung vornimmt, muss natürlich den eigenen privaten Schlüssel kennen. Deshalb ist es sinnvoll, dieses Script lokal auf dem eigenen Rechner zu verwenden. Zudem ist es sinnvoll, den privaten Schlüssel noch einmal mit einem Passwort zu versehen.</p>
<p>Warum erzähle ich euch das alles? Ich denke, dass langsam aber sicher etwas getan werden muss. Überall versuchen die Regierungen dieser Welt, immer weiter in den privaten Lebensraum vorzudringen. Das beginnt beim richterlichen Eingriff in die private Kommunikation und hört beim Infizieren von privaten Rechnern mit Schadsoftware durch Bundesbehörden noch lange nicht auf.<br />
Ich denke, dass es notwendig ist, dem normalen Internetnutzer Tools an die Hand zu geben, mit denen er sich ohne viel Aufwand vor solchen Eingriffen schützen kann. Und damit meine ich nicht den e-Postbrief oder DE-Mail, die zwar angeblich "sicher" sind, jedoch genau an ihren Übergangspunkten problemlos mitgelesen werden können. Wie man an der krampfhaften Erklärung oben sieht, ist das jedoch nicht so einfach. Klar: Für mich ist es kein großes Problem, einen Webserver mit PHP einzurichten, GnuPG zu installieren und 2 PHP-Scripte darüber laufen zu lassen. Für andere ist das jedoch unverständliches Hexenwerk. Auch diese Leuten muss man mit einfach nutzbaren, sicheren Lösungen in der heutigen, digitalen Welt unterstützen. In meinen Augen ist es deshalb auch sehr wichtig, dass sich diese Lösungen möglichst nahtlos in die vertraute Umgebung einbetten.</p>
<p>Ich hoffe, es finden sich Leute, die sich dieses Themas annehmen.<br/><br />
<strong>Verschlüsselnde Grüße, Kenny</strong></p>
<p>P.S.: Hier als Backup noch einmal die einzelnen Quelltexte.</p>
<p><strong>fbPGP.user.js:</strong></p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br />289<br />290<br />291<br />292<br />293<br />294<br />295<br />296<br />297<br />298<br />299<br />300<br />301<br />302<br />303<br />304<br /></div></td><td><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">// ==UserScript==</span><br />
<span style="color: #006600; font-style: italic;">// @name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fbPGP</span><br />
<span style="color: #006600; font-style: italic;">// @namespace &nbsp; &nbsp; &nbsp;http://fbpgp.shorte.net/</span><br />
<span style="color: #006600; font-style: italic;">// @include &nbsp; &nbsp; &nbsp; &nbsp;https://www.facebook.com/messages/*</span><br />
<span style="color: #006600; font-style: italic;">// ==/UserScript==</span><br />
<br />
<span style="color: #003366; font-weight: bold;">var</span> FBPGP_DECRYPT <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;https://localhost/decrypt.php&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FBPGP_ENCRYPT <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;https://localhost/encrypt.php&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">var</span> FBPGP_DECRYPT_PASSWORD <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;PassphraseOfKeystore&quot;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">//!!! CHANGE THIS</span><br />
<br />
<span style="color: #006600; font-style: italic;">// DO NOT EDIT BELOW THIS LINE</span><br />
<br />
String.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">contains</span> &nbsp; <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>sub<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span>sub<span style="color: #009900;">&#41;</span> <span style="color: #339933;">!==</span> <span style="color: #339933;">-</span><span style="color: #CC0000;">1</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
String.<span style="color: #660066;">prototype</span>.<span style="color: #660066;">startsWith</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>sub<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span>sub<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// fbPGP message identifier</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_FBPGP_MESSAGE_IDENT <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;&lt;b&gt;fbPGP encrypted:&lt;/b&gt;&lt;br/&gt;&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// access token</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_ACCESS_TOKEN_LINK &nbsp; <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;https://graph.facebook.com/me/home?access_token=&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_ACCESS_TOKEN_TEXT &nbsp; <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>&gt;https://graph.facebook.com/me/&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_GRAPH_API_REFERENCE <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;https://developers.facebook.com/docs/reference/api/&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// FBPGP decrypt/encrypt link</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_FBPGP_ME_PARAM &nbsp; &nbsp; &nbsp;<span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;me=&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_FBPGP_MESSAGE_PARAM <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;&amp;message=&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_FBPGP_PASS_PARAM &nbsp; &nbsp;<span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;&amp;pass=&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_FBPGP_YOU_PARAM &nbsp; &nbsp; <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;&amp;you=&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// FBPGP public key link</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_FBPGP_TOKEN_START <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;#!FBPGP!#&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_FBPGP_TOKEN_STOP &nbsp;<span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;#!/FBPGP!#&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_FBPGP_TOKEN_URL_A <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;https://graph.facebook.com/&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_FBPGP_TOKEN_URL_B <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;?access_token=&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// my link</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FBXWELCOMEBOXNAME &nbsp; <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;fbxWelcomeBoxName&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> PAGELET_WELCOME_BOX <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;pagelet_welcome_box&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// your link</span><br />
<span style="color: #003366; font-weight: bold;">var</span> MESSAGINGREADPARTICIPANTS <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;MessagingReadParticipants&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// user name</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_USERLINK_START_A <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;https://www.facebook.com/profile.php?id=&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_USERLINK_START_B <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;http://www.facebook.com/profile.php?id=&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_USERLINK_START_C <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;https://www.facebook.com/&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> FB_USERLINK_START_D <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;http://www.facebook.com/&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// messaging</span><br />
<span style="color: #003366; font-weight: bold;">var</span> ID_PREFIX <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;id.&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">var</span> MESSAGE_BODY &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;message_body&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> MESSAGINGCOMPOSERBODY &nbsp; &nbsp;<span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;MessagingComposerBody&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> MESSAGINGCOMPOSERFORM &nbsp; &nbsp;<span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;MessagingComposerForm&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> MESSAGINGINLINECOMPOSER &nbsp;<span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;MessagingInlineComposer&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> MESSAGINGMESSAGES &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;MessagingMessages&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> MESSAGINGSENDREPLYBUTTON <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;MessagingSendReplyButton&quot;</span><span style="color: #339933;">;</span><br />
<span style="color: #003366; font-weight: bold;">var</span> MESSAGINGSHELFCONTENT &nbsp; &nbsp;<span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;MessagingShelfContent&quot;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// decrypt message with remote GPG PHP script</span><br />
<span style="color: #003366; font-weight: bold;">function</span> decryptMessage<span style="color: #009900;">&#40;</span>message<span style="color: #339933;">,</span> myName<span style="color: #339933;">,</span> yourName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> result <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> decryptedMessage <span style="color: #339933;">=</span> GM_xmlhttpRequest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>data &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">:</span> FB_FBPGP_ME_PARAM <span style="color: #339933;">+</span> encodeURIComponent<span style="color: #009900;">&#40;</span>myName<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> FB_FBPGP_MESSAGE_PARAM <span style="color: #339933;">+</span> encodeURIComponent<span style="color: #009900;">&#40;</span>message<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> FB_FBPGP_PASS_PARAM <span style="color: #339933;">+</span> encodeURIComponent<span style="color: #009900;">&#40;</span>FBPGP_DECRYPT_PASSWORD<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> FB_FBPGP_YOU_PARAM <span style="color: #339933;">+</span> encodeURIComponent<span style="color: #009900;">&#40;</span>yourName<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headers &nbsp; &nbsp; <span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;Content-Type&quot;</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;application/x-www-form-urlencoded&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; method &nbsp; &nbsp; &nbsp;<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;POST&quot;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; synchronous <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">:</span> FBPGP_DECRYPT<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>decryptedMessage <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; decryptedMessage <span style="color: #339933;">=</span> decryptedMessage.<span style="color: #660066;">responseText</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>decryptedMessage <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; result <span style="color: #339933;">=</span> decryptedMessage<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000066; font-weight: bold;">return</span> result<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// encrypt message with remote GPG PHP script</span><br />
<span style="color: #003366; font-weight: bold;">function</span> encryptMessage<span style="color: #009900;">&#40;</span>message<span style="color: #339933;">,</span> myName<span style="color: #339933;">,</span> yourName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> result <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> encryptedMessage <span style="color: #339933;">=</span> GM_xmlhttpRequest<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>data &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">:</span> FB_FBPGP_ME_PARAM <span style="color: #339933;">+</span> encodeURIComponent<span style="color: #009900;">&#40;</span>myName<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> FB_FBPGP_MESSAGE_PARAM <span style="color: #339933;">+</span> encodeURIComponent<span style="color: #009900;">&#40;</span>message<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> FB_FBPGP_YOU_PARAM <span style="color: #339933;">+</span> encodeURIComponent<span style="color: #009900;">&#40;</span>yourName<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headers &nbsp; &nbsp; <span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span><span style="color: #3366CC;">&quot;Content-Type&quot;</span> <span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;application/x-www-form-urlencoded&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; method &nbsp; &nbsp; &nbsp;<span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;POST&quot;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; synchronous <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">:</span> FBPGP_ENCRYPT<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>encryptedMessage <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; encryptedMessage <span style="color: #339933;">=</span> encryptedMessage.<span style="color: #660066;">responseText</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>encryptedMessage <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; result <span style="color: #339933;">=</span> encryptedMessage<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000066; font-weight: bold;">return</span> result<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">function</span> getFBPGPText<span style="color: #009900;">&#40;</span>text<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> result <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>text.<span style="color: #660066;">contains</span><span style="color: #009900;">&#40;</span>FB_FBPGP_TOKEN_START<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#40;</span>text.<span style="color: #660066;">contains</span><span style="color: #009900;">&#40;</span>FB_FBPGP_TOKEN_STOP<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; result <span style="color: #339933;">=</span> text<span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; result <span style="color: #339933;">=</span> result.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span>result.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span>FB_FBPGP_TOKEN_START<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> FB_FBPGP_TOKEN_START.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; result <span style="color: #339933;">=</span> result.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> result.<span style="color: #660066;">indexOf</span><span style="color: #009900;">&#40;</span>FB_FBPGP_TOKEN_STOP<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; <span style="color: #000066; font-weight: bold;">return</span> result<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// extract link of you</span><br />
<span style="color: #003366; font-weight: bold;">function</span> getMyLink<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> result <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> myLink <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>PAGELET_WELCOME_BOX<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>myLink <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> links <span style="color: #339933;">=</span> myLink.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;a&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> index <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> index <span style="color: #339933;">&lt;</span> links.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> index<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> &nbsp;<br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>links<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">className</span>.<span style="color: #660066;">contains</span><span style="color: #009900;">&#40;</span>FBXWELCOMEBOXNAME<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; result <span style="color: #339933;">=</span> links<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">href</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000066; font-weight: bold;">return</span> result<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// extract link of user you're messaging with</span><br />
<span style="color: #003366; font-weight: bold;">function</span> getYourLink<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> result <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> yourLink <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>MESSAGINGREADPARTICIPANTS<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>yourLink <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> links <span style="color: #339933;">=</span> yourLink.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;a&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>links.<span style="color: #660066;">length</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>links<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">href</span>.<span style="color: #660066;">startsWith</span><span style="color: #009900;">&#40;</span>FB_USERLINK_START_A<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">||</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#40;</span>links<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">href</span>.<span style="color: #660066;">startsWith</span><span style="color: #009900;">&#40;</span>FB_USERLINK_START_B<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; result <span style="color: #339933;">=</span> links<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">href</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000066; font-weight: bold;">return</span> result<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #006600; font-style: italic;">// extract user name from facebook profile link</span><br />
<span style="color: #003366; font-weight: bold;">function</span> getUserName<span style="color: #009900;">&#40;</span>userLink<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> result <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>userLink <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>userLink.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">startsWith</span><span style="color: #009900;">&#40;</span>FB_USERLINK_START_A<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; result <span style="color: #339933;">=</span> userLink.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span>FB_USERLINK_START_A.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>userLink.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">startsWith</span><span style="color: #009900;">&#40;</span>FB_USERLINK_START_B<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; result <span style="color: #339933;">=</span> userLink.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span>FB_USERLINK_START_B.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>userLink.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">startsWith</span><span style="color: #009900;">&#40;</span>FB_USERLINK_START_C<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result <span style="color: #339933;">=</span> userLink.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span>FB_USERLINK_START_C.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>userLink.<span style="color: #660066;">toLowerCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">startsWith</span><span style="color: #009900;">&#40;</span>FB_USERLINK_START_D<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result <span style="color: #339933;">=</span> userLink.<span style="color: #660066;">substring</span><span style="color: #009900;">&#40;</span>FB_USERLINK_START_D.<span style="color: #660066;">length</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000066; font-weight: bold;">return</span> result<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">function</span> hookGUI<span style="color: #009900;">&#40;</span>myName<span style="color: #339933;">,</span> yourName<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> shelfContent <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>MESSAGINGSHELFCONTENT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>shelfContent <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// show that hooking has worked</span><br />
&nbsp; &nbsp; shelfContent.<span style="color: #660066;">style</span>.<span style="color: #660066;">backgroundColor</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;#FBBFBF&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> replyButton <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>MESSAGINGSENDREPLYBUTTON<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>replyButton <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// show that hooking has worked</span><br />
&nbsp; &nbsp; replyButton.<span style="color: #660066;">style</span>.<span style="color: #660066;">backgroundColor</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;#FB0000&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; replyButton.<span style="color: #660066;">style</span>.<span style="color: #660066;">backgroundImage</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;none&quot;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// get reference of textarea</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> messageBody <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span> &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> inlineComposer <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>MESSAGINGINLINECOMPOSER<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>inlineComposer <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> textareas <span style="color: #339933;">=</span> inlineComposer.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;textarea&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>textareas.<span style="color: #660066;">length</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>textareas<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">className</span>.<span style="color: #660066;">contains</span><span style="color: #009900;">&#40;</span>MESSAGINGCOMPOSERBODY<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; messageBody <span style="color: #339933;">=</span> textareas<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> replyInput <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>replyButton.<span style="color: #660066;">getAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;for&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>replyInput <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// add fake reply button</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> newButton <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;input&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; newButton.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;type&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;button&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; newButton.<span style="color: #660066;">setAttribute</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;value&quot;</span><span style="color: #339933;">,</span> replyInput.<span style="color: #660066;">value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; replyInput.<span style="color: #660066;">parentNode</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>newButton<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// hide real reply button</span><br />
&nbsp; &nbsp; &nbsp; replyInput.<span style="color: #660066;">style</span>.<span style="color: #660066;">display</span> &nbsp; &nbsp;<span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;none&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; replyInput.<span style="color: #660066;">style</span>.<span style="color: #660066;">visibility</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;hidden&quot;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; <span style="color: #006600; font-style: italic;">// set action handlers</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> newButtonClicked <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #003366; font-weight: bold;">var</span> result <span style="color: #339933;">=</span> encryptMessage<span style="color: #009900;">&#40;</span>messageBody.<span style="color: #660066;">value</span><span style="color: #339933;">,</span> myName<span style="color: #339933;">,</span> yourName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>result <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>result.<span style="color: #660066;">length</span> <span style="color: #339933;">&gt;</span> <span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> messageBody.<span style="color: #660066;">value</span> <span style="color: #339933;">=</span> FB_FBPGP_TOKEN_START <span style="color: #339933;">+</span> result <span style="color: #339933;">+</span> FB_FBPGP_TOKEN_STOP<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; newButton.<span style="color: #660066;">addEventListener</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;click&quot;</span><span style="color: #339933;">,</span> newButtonClicked<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; <span style="color: #006600; font-style: italic;">// decrypt received messages</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> messaging <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span>MESSAGINGMESSAGES<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>messaging <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> messages <span style="color: #339933;">=</span> messaging.<span style="color: #660066;">getElementsByTagName</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;div&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> index <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> index <span style="color: #339933;">&lt;</span> messages.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> index<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>messages<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">id</span>.<span style="color: #660066;">startsWith</span><span style="color: #009900;">&#40;</span>ID_PREFIX<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> pgpText <span style="color: #339933;">=</span> getFBPGPText<span style="color: #009900;">&#40;</span>messages<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">firstChild</span>.<span style="color: #660066;">innerHTML</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>pgpText <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; messages<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">firstChild</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> FB_FBPGP_MESSAGE_IDENT <span style="color: #339933;">+</span> decryptMessage<span style="color: #009900;">&#40;</span>pgpText<span style="color: #339933;">,</span> myName<span style="color: #339933;">,</span> yourName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #003366; font-weight: bold;">function</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #003366; font-weight: bold;">var</span> myLink <span style="color: #339933;">=</span> getMyLink<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>myLink <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> myName <span style="color: #339933;">=</span> getUserName<span style="color: #009900;">&#40;</span>myLink<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>myName <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> yourLink <span style="color: #339933;">=</span> getYourLink<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>yourLink <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #003366; font-weight: bold;">var</span> yourName <span style="color: #339933;">=</span> getUserName<span style="color: #009900;">&#40;</span>yourLink<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>yourName <span style="color: #339933;">!=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hookGUI<span style="color: #009900;">&#40;</span>myName<span style="color: #339933;">,</span> yourName<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
setTimeout<span style="color: #009900;">&#40;</span>main<span style="color: #339933;">,</span> <span style="color: #CC0000;">5000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #006600; font-style: italic;">/*<br />
//!!! quick and dirty hack to get a valid access token<br />
function getAccessToken() {<br />
&nbsp; var result = null;<br />
<br />
&nbsp; var accessToken = GM_xmlhttpRequest({method &nbsp; &nbsp; &nbsp;: &quot;GET&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;synchronous : true,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;url &nbsp; &nbsp; &nbsp; &nbsp; : FB_GRAPH_API_REFERENCE});<br />
<br />
&nbsp; if (accessToken != null) {<br />
&nbsp; &nbsp; accessToken = accessToken.responseText;<br />
&nbsp; &nbsp; if (accessToken != null) {<br />
&nbsp; &nbsp; &nbsp; if (accessToken.contains(FB_ACCESS_TOKEN_LINK)) {<br />
&nbsp; &nbsp; &nbsp; &nbsp; accessToken = accessToken.substring(accessToken.indexOf(FB_ACCESS_TOKEN_LINK) + FB_ACCESS_TOKEN_LINK.length);<br />
&nbsp; &nbsp; &nbsp; &nbsp; accessToken = accessToken.substring(0, accessToken.indexOf(FB_ACCESS_TOKEN_TEXT));<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; result = accessToken;<br />
&nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; }<br />
&nbsp; }<br />
<br />
&nbsp; return result;<br />
}<br />
<br />
// extract link to someone's PGP public key<br />
function getFBPGPLink(yourName, accessToken) {<br />
&nbsp; var result = null;<br />
<br />
&nbsp; var fbpgpLink = GM_xmlhttpRequest({method &nbsp; &nbsp; &nbsp;: &quot;GET&quot;,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;synchronous : true,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;url &nbsp; &nbsp; &nbsp; &nbsp; : FB_FBPGP_TOKEN_URL_A + encodeURIComponent(yourName) + FB_FBPGP_TOKEN_URL_B + encodeURIComponent(accessToken)});<br />
<br />
&nbsp; if (fbpgpLink != null) {<br />
&nbsp; &nbsp; fbpgpLink = fbpgpLink.responseText;<br />
&nbsp; &nbsp; if (fbpgpLink != null) {<br />
&nbsp; &nbsp; &nbsp; result = getFBPGPText(fbpgpLink);<br />
&nbsp; &nbsp; }<br />
&nbsp; }<br />
&nbsp; <br />
&nbsp; return result;<br />
}<br />
<br />
// find public key<br />
var accessToken = getAccessToken();<br />
if (accessToken != null) {<br />
&nbsp; alert(&quot;accessToken = &quot; + accessToken);<br />
<br />
&nbsp; var fbpgpLink = getFBPGPLink(yourName, accessToken);<br />
&nbsp; if (fbpgpLink != null) {<br />
&nbsp; &nbsp; alert(&quot;fbpgpLink = &quot; + fbpgpLink);<br />
&nbsp; }<br />
}<br />
*/</span></div></td></tr></tbody></table></div>
<p><strong>encrypt.php:</strong></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
&nbsp; <span style="color: #000088;">$gpg</span> &nbsp;<span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/usr/bin/gpg&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000088;">$tmp</span> &nbsp;<span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/tmp/fbpgp_&quot;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #000088;">$recipient</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/isset"><span style="color: #990000;">isset</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;you&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$recipient</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;fb&quot;</span> <span style="color: #339933;">.</span> <a href="http://www.php.net/sha1"><span style="color: #990000;">sha1</span></a><span style="color: #009900;">&#40;</span><a href="http://www.php.net/rawurldecode"><span style="color: #990000;">rawurldecode</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;you&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;@localhost&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #000088;">$message</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/isset"><span style="color: #990000;">isset</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;message&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$message</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/rawurldecode"><span style="color: #990000;">rawurldecode</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;message&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$recipient</span> <span style="color: #339933;">!=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$message</span> <span style="color: #339933;">!=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$file_in</span> &nbsp;<span style="color: #339933;">=</span> <a href="http://www.php.net/uniqid"><span style="color: #990000;">uniqid</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tmp</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$file_out</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/uniqid"><span style="color: #990000;">uniqid</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tmp</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.php.net/file_put_contents"><span style="color: #990000;">file_put_contents</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_in</span><span style="color: #339933;">,</span> <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.php.net/exec"><span style="color: #990000;">exec</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$gpg</span> --recipient &quot;</span> <span style="color: #339933;">.</span> <a href="http://www.php.net/escapeshellarg"><span style="color: #990000;">escapeshellarg</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$recipient</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; --output &quot;</span> <span style="color: #339933;">.</span> <a href="http://www.php.net/escapeshellarg"><span style="color: #990000;">escapeshellarg</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_out</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; --encrypt &quot;</span> <span style="color: #339933;">.</span> <a href="http://www.php.net/escapeshellarg"><span style="color: #990000;">escapeshellarg</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_in</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/file_get_contents"><span style="color: #990000;">file_get_contents</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_out</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/base64_encode"><span style="color: #990000;">base64_encode</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">print</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.php.net/unlink"><span style="color: #990000;">unlink</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_in</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/unlink"><span style="color: #990000;">unlink</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_out</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<p><strong>decrypt.php:</strong></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
&nbsp; <span style="color: #000088;">$echo</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/bin/echo&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000088;">$gpg</span> &nbsp;<span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/usr/bin/gpg&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #000088;">$tmp</span> &nbsp;<span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/tmp/fbpgp_&quot;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; <span style="color: #000088;">$recipient</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/isset"><span style="color: #990000;">isset</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;me&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$recipient</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;fb&quot;</span> <span style="color: #339933;">.</span> <a href="http://www.php.net/sha1"><span style="color: #990000;">sha1</span></a><span style="color: #009900;">&#40;</span><a href="http://www.php.net/rawurldecode"><span style="color: #990000;">rawurldecode</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;me&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;@localhost&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #000088;">$password</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/isset"><span style="color: #990000;">isset</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;pass&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$password</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/rawurldecode"><span style="color: #990000;">rawurldecode</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;pass&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #000088;">$message</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/isset"><span style="color: #990000;">isset</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;message&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$message</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/base64_decode"><span style="color: #990000;">base64_decode</span></a><span style="color: #009900;">&#40;</span><a href="http://www.php.net/rawurldecode"><span style="color: #990000;">rawurldecode</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;message&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$recipient</span> <span style="color: #339933;">!=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span> <span style="color: #339933;">!=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$message</span> <span style="color: #339933;">!=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$file_in</span> &nbsp;<span style="color: #339933;">=</span> <a href="http://www.php.net/uniqid"><span style="color: #990000;">uniqid</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tmp</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$file_out</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/uniqid"><span style="color: #990000;">uniqid</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tmp</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.php.net/file_put_contents"><span style="color: #990000;">file_put_contents</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_in</span><span style="color: #339933;">,</span> <span style="color: #000088;">$message</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.php.net/exec"><span style="color: #990000;">exec</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$echo</span> &quot;</span> <span style="color: #339933;">.</span> <a href="http://www.php.net/escapeshellarg"><span style="color: #990000;">escapeshellarg</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; | <span style="color: #006699; font-weight: bold;">$gpg</span> --batch --passphrase-fd=0 --local-user &quot;</span> <span style="color: #339933;">.</span> <a href="http://www.php.net/escapeshellarg"><span style="color: #990000;">escapeshellarg</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$recipient</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; --output &quot;</span> <span style="color: #339933;">.</span> <a href="http://www.php.net/escapeshellarg"><span style="color: #990000;">escapeshellarg</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_out</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; --decrypt &quot;</span> <span style="color: #339933;">.</span> <a href="http://www.php.net/escapeshellarg"><span style="color: #990000;">escapeshellarg</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_in</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/file_get_contents"><span style="color: #990000;">file_get_contents</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_out</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/str_replace"><span style="color: #990000;">str_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&lt;&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&amp;lt;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/str_replace"><span style="color: #990000;">str_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;&gt;&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&amp;gt;&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #b1b100;">print</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <a href="http://www.php.net/unlink"><span style="color: #990000;">unlink</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_in</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/unlink"><span style="color: #990000;">unlink</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_out</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></td></tr></tbody></table></div>
<!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://weizenspr.eu/2012/fbpgp-facebook-mit-gnupg/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Exec() in PHP chroot-Umgebung</title>
		<link>http://weizenspr.eu/2012/exec-in-php-chroot-umgebung/</link>
		<comments>http://weizenspr.eu/2012/exec-in-php-chroot-umgebung/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 09:12:07 +0000</pubDate>
		<dc:creator>Kenny</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Alltag]]></category>
		<category><![CDATA[Computer]]></category>
		<category><![CDATA[Weizen]]></category>

		<guid isPermaLink="false">http://weizenspr.eu/?p=7708</guid>
		<description><![CDATA[Manchmal ist die Verwendung einer chroot-Umgebung für PHP mehr Fluch als Segen. Auf der einen Seite ist es ein wirklicher Sicherheitsgewinn. Aber auf der anderen Seite findet man immer wieder Kleinigkeiten, die einen eine ganze Weile aufhalten, bevor man bestimmte Funktionen nutzen kann.
Ein Beispiel hierfür ist die exec() Funktion, die es ermöglicht, Systembefehle auszuführen und [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_START --><p>Manchmal ist die Verwendung einer chroot-Umgebung für PHP mehr Fluch als Segen. Auf der einen Seite ist es ein wirklicher Sicherheitsgewinn. Aber auf der anderen Seite findet man immer wieder Kleinigkeiten, die einen eine ganze Weile aufhalten, bevor man bestimmte Funktionen nutzen kann.</p>
<p>Ein Beispiel hierfür ist die <strong>exec()</strong> Funktion, die es ermöglicht, Systembefehle auszuführen und deren Ergebnis auszulesen. Es ist nirgendwo richtig dokumentiert, aber damit sie funktioniert, muss die Binärdatei "/bin/sh" in der chroot-Umgebung zur Verfügung stehen.</p>
<p>Anschließend kann man per</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ldd /bin/sh</div></td></tr></tbody></table></div>
<p>prüfen, welche Bibliotheken mit welchen Pfaden zusätzlich noch bereitgestellt werden müssen.<br/><br />
<strong>Gechrootete Grüße, Kenny</strong></p>
<!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://weizenspr.eu/2012/exec-in-php-chroot-umgebung/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>[Update] Google Apps als Backup-Mailserver</title>
		<link>http://weizenspr.eu/2012/google-apps-als-backup-mailserver/</link>
		<comments>http://weizenspr.eu/2012/google-apps-als-backup-mailserver/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 22:40:17 +0000</pubDate>
		<dc:creator>Kenny</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Alltag]]></category>
		<category><![CDATA[Computer]]></category>
		<category><![CDATA[Update]]></category>
		<category><![CDATA[Weizen]]></category>

		<guid isPermaLink="false">http://weizenspr.eu/?p=7640</guid>
		<description><![CDATA[Eine der wichtigsten Dienste für eine Domain (neben HTTP) ist wahrscheinlich SMTP - also die Möglichkeit, E-Mails senden und empfangen zu können. Der Verlust von neuen Nachrichten ist wahrscheinlich eine der größten Gefahren, denen ein privater Server ausgesetzt ist. Gehackte Server kann man löschen und neu aufsetzen, gelöschte Webseiten und Datenbanken kann man aus Backups [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_START --><p>Eine der wichtigsten Dienste für eine Domain (neben HTTP) ist wahrscheinlich SMTP - also die Möglichkeit, E-Mails senden und empfangen zu können. Der Verlust von neuen Nachrichten ist wahrscheinlich eine der größten Gefahren, denen ein privater Server ausgesetzt ist. Gehackte Server kann man löschen und neu aufsetzen, gelöschte Webseiten und Datenbanken kann man aus Backups wiederherstellen. Aber Mails wieder zu bekommen, die aufgrund eines Fehlers garnicht oder nur fehlerhaft empfangen werden konnten, ist nicht möglich.</p>
<p>Deshalb sollte man sich, wenn man seine Domains ernsthaft betreiben will, irgendwann einmal Gedanken darüber machen, wie man den Verlust von Mails (z.B. aufgrund eines Serverausfalls) verhindern will. Auch ich habe diese Überlegungen hinter mir. Da gibt es einiges zu beachten. So sollte der Backupserver nicht beim gleichen Hoster stehen - für den Fall, dass dieser insgesamt Probleme hat (bezeichnet man als Geo-Redundanz), der Backupserver sollte eine hohe Verfügbarkeit aufweisen, gleichzeitig sollte er jedoch (zumindest für den privaten Bereich) nicht zu teuer sein, da es ja eben doch nur ein Backupserver ist.<br />
Auch, wenn man endlich mal einen passenden Anbieter für den Backupserver gefunden hat, ist es garnicht so einfach, diesen zu betreiben. Viel zu leicht gerät man in die Versuchung, den "ungenutzten" Rechner irgendwie zu nutzen. Deswegen bin auch ich irgendwann wieder dazu übergegangen den eigentlich Backupserver auch wieder für andere Dinge zu nutzen...</p>
<p>...bis ich endlich eine Alternative gefunden hatte: <a href="http://www.google.com/apps/intl/de/group/index.html" target="_blank" class="liexternal">Google Apps</a>!</p>
<p>Google Apps muss man sich als Cloud-Lösung für Unternehmen vorstellen. Dort sind viele Google-Dienste gesammelt, die für Nutzer eines Unternehmens vorkonfiguriert zur Verfügung gestellt werden können. Dazu gehört auch das Anbieten von Gmail für eine eigene Domain. Sprich: Man nutzt Gmail zum Versenden und Empfangen von Mails, verwendet jedoch Adressen in der Form von <strong>xyz@example.com</strong>.<br />
Google bietet hier also direkt eine Möglichkeit, als Mailserver (und mehr) zu fungieren. Dabei bieten sie ingesamt 5 verschiedene MX-Server an, die sich um den Empfang von E-Mails kümmern können.</p>
<p>Da ich diesen Service sicherlich noch öfter nutzen werde, habe ich mir gedacht, ich dokumentiere, wie ich vorgegangen bin. So habe ich später eine einheitliche Konfiguration und andere können dieses Wissen evtl. auch gebrauchen.</p>
<p>Als erstes muss man natürlich einen Account anlegen. Dazu geht man auf die Seite von <a href="http://www.google.com/apps/intl/de/group/index.html" target="_blank" class="liexternal">Google Apps</a>. Neben der kostenpflichtigen Variante für Unternehmen gibt es auch eine kostenlose Variante für Gruppen.<br />
Man gibt als erstes seine Domain ein; dann ein paar persönliche Daten; die Daten des administrativen Nutzers (hier solltet ihr einen Namen nehmen, der <strong>nicht</strong> im öffentlichen Schriftverkehr genutzt wird - warum erkläre ich später); deaktiviert das automatische Bereitstellen von neuen Diensten und ist mit der Registrierung auch schon fertig. </p>
<div id="attachment_7645" class="wp-caption aligncenter" style="width: 488px"><a href="http://weizenspr.eu/uploads/gapps_01.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_01-150x150.png" alt="" title="gapps_01" width="150" height="150" class="size-thumbnail wp-image-7645" /></a> <a href="http://weizenspr.eu/uploads/gapps_02.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_02-150x150.png" alt="" title="gapps_02" width="150" height="150" class="size-thumbnail wp-image-7646" /></a> <a href="http://weizenspr.eu/uploads/gapps_03.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_03-150x150.png" alt="" title="gapps_03" width="150" height="150" class="size-thumbnail wp-image-7647" /></a><br />
<a href="http://weizenspr.eu/uploads/gapps_04.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_04-150x150.png" alt="" title="gapps_04" width="150" height="150" class="size-thumbnail wp-image-7648" /></a> <a href="http://weizenspr.eu/uploads/gapps_05.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_05-150x150.png" alt="" title="gapps_05" width="150" height="150" class="size-thumbnail wp-image-7649" /></a> <a href="http://weizenspr.eu/uploads/gapps_06.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_06-150x150.png" alt="" title="gapps_06" width="150" height="150" class="size-thumbnail wp-image-7650" /></a><p class="wp-caption-text">Google Apps Registrierung</p></div>
<p>Als nächstes prüft Google, ob man wirklich Besitzer der angegebenen Domain ist. Es gibt mehrere Möglichkeiten, wobei die Prüfung per DNS-Eintrag wahrscheinlich das einfachste sein dürfte. Und da ihr sowieso schon dabei seid, eure DNS-Einträge zu verwalten, könnt ihr auch gleich, die MX-Einträge zur Verwendung der Google-Server eintragen:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@ IN MX 20 ASPMX.L.GOOGLE.COM.<br />
@ IN MX 30 ALT2.ASPMX.L.GOOGLE.COM.<br />
@ IN MX 30 ALT1.ASPMX.L.GOOGLE.COM.<br />
@ IN MX 40 ASPMX2.GOOGLEMAIL.COM.<br />
@ IN MX 40 ASPMX3.GOOGLEMAIL.COM.</div></td></tr></tbody></table></div>
<p>Falls ihr diese Prüfung hinter euch habt, könnt ihr euch das erste mal mit dem Administratoraccount einloggen. Ihr werdet direkt mit einem Setup-Assistenten begrüßt. Klickt diesen einfach mal durch. Wirklich wichtig ist er nicht. Anschließend solltet ihr schonmal auf den Reiter "Einstellungen" gehen und dort die nicht benötigten Dienste deinstallieren oder zumindest deaktivieren. Das sind primär "Chat", "Google Docs", "Kalender", "Kontakte", "Mobil" (kann man nur deaktivieren aber nicht deinstallieren) und "Sites".</p>
<div id="attachment_7657" class="wp-caption aligncenter" style="width: 488px"><a href="http://weizenspr.eu/uploads/gapps_07.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_07-150x150.png" alt="" title="gapps_07" width="150" height="150" class="size-thumbnail wp-image-7657" /></a> <a href="http://weizenspr.eu/uploads/gapps_08.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_08-150x150.png" alt="" title="gapps_08" width="150" height="150" class="size-thumbnail wp-image-7658" /></a> <a href="http://weizenspr.eu/uploads/gapps_09.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_09-150x150.png" alt="" title="gapps_09" width="150" height="150" class="size-thumbnail wp-image-7659" /></a><br />
<a href="http://weizenspr.eu/uploads/gapps_10.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_10-150x150.png" alt="" title="gapps_10" width="150" height="150" class="size-thumbnail wp-image-7660" /></a> <a href="http://weizenspr.eu/uploads/gapps_11.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_11-150x150.png" alt="" title="gapps_11" width="150" height="150" class="size-thumbnail wp-image-7661" /></a> <a href="http://weizenspr.eu/uploads/gapps_12.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_12-150x150.png" alt="" title="gapps_12" width="150" height="150" class="size-thumbnail wp-image-7662" /></a><br />
<a href="http://weizenspr.eu/uploads/gapps_13.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_13-150x150.png" alt="" title="gapps_13" width="150" height="150" class="size-thumbnail wp-image-7663" /></a><p class="wp-caption-text">Google Apps Einstellungen</p></div>
<p>Damit habt ihr die bereitstehenden Dienste schon einmal stark reduziert. Als nächstes solltet ihr nun ein paar "Domain-Einstellungen" vornehmen. Die wichtigsten sind das Aktivieren von SSL und das Deaktivieren von geplanten Veröffentlichungen (sprich dem Hinzufügen von neuen Diensten). Nachdem ihr die Änderungen gespeichert habt, solltet ihr in den "Domain-Einstellungen" den Unterreiter "Domain-Namen" aufsuchen. Es wird nämlich standardmäßig für jeden Account eine Testdomain eingerichtet, die auf ".test-google-a.com" endet. Diesen sogenannten Testalias solltet ihr deaktivieren. Er wird später nicht mehr benötigt.</p>
<div id="attachment_7666" class="wp-caption aligncenter" style="width: 488px"><a href="http://weizenspr.eu/uploads/gapps_14.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_14-150x150.png" alt="" title="gapps_14" width="150" height="150" class="size-thumbnail wp-image-7666" /></a> <a href="http://weizenspr.eu/uploads/gapps_15.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_15-150x150.png" alt="" title="gapps_15" width="150" height="150" class="size-thumbnail wp-image-7667" /></a> <a href="http://weizenspr.eu/uploads/gapps_16.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_16-150x150.png" alt="" title="gapps_16" width="150" height="150" class="size-thumbnail wp-image-7668" /></a><br />
<a href="http://weizenspr.eu/uploads/gapps_17.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_17-150x150.png" alt="" title="gapps_17" width="150" height="150" class="size-thumbnail wp-image-7669" /></a> <a href="http://weizenspr.eu/uploads/gapps_18.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_18-150x150.png" alt="" title="gapps_18" width="150" height="150" class="size-thumbnail wp-image-7670" /></a><p class="wp-caption-text">Google Apps Domain-Einstellungen</p></div>
<p>Als nächstes solltet ihr einen weiteren Nutzer anlegen. Dieser Nutzer wird später derjenige sein, der sämtliche E-Mails empfängt (also als "Catchall" dient). Deswegen war es auch so wichtig, dem Administratoraccount einen Namen zu geben, der im öffentlichen Schriftverkehr nicht genutzt wird - denn alle Mails, die an den Admin-Account gehen, müssen separat abgerufen werden. Sinn ist es aber, dass möglichst alle Mails an die Catchall-Adresse geschickt werden. Man könnte natürlich auch den Admin-Account als Catchall-Adresse nutzen, aber dann müsstet ihr die Zugangsdaten zu eurem Admin-Account in einem Script hinterlegen (= nicht gut) Deshalb sollte der neue Nutzer der Account sein, von dem euer Hauptmailserver später die Mails abholt, sobald dieser wieder läuft. (Wie man soetwas einrichten kann, erkläre ich, wenn ich es selbst umgesetzt habe. <img src='http://weizenspr.eu/includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )<br />
Geht dazu auf "Organisation und Nutzer" und legt in der Maske den neuen Nutzer an. Merkt euch die E-Mail-Adresse, die ihr diesem Nutzer gebt, ihr werdet sie noch brauchen. Nachdem ihr den neuen Nutzer angelegt habt, könnt ihr alle weiteren Services deaktivieren. Dazu geht ihr auf den Unterreiter "Services", klickt bei "Weitere Services" auf "Aus" und speichert anschließend die gemachten Änderungen.</p>
<div id="attachment_7672" class="wp-caption aligncenter" style="width: 488px"><a href="http://weizenspr.eu/uploads/gapps_19.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_19-150x150.png" alt="" title="gapps_19" width="150" height="150" class="size-thumbnail wp-image-7672" /></a> <a href="http://weizenspr.eu/uploads/gapps_20.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_20-150x150.png" alt="" title="gapps_20" width="150" height="150" class="size-thumbnail wp-image-7673" /></a> <a href="http://weizenspr.eu/uploads/gapps_21.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_21-150x150.png" alt="" title="gapps_21" width="150" height="150" class="size-thumbnail wp-image-7674" /></a><br />
<a href="http://weizenspr.eu/uploads/gapps_22.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_22-150x150.png" alt="" title="gapps_22" width="150" height="150" class="size-thumbnail wp-image-7675" /></a> <a href="http://weizenspr.eu/uploads/gapps_23.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_23-150x150.png" alt="" title="gapps_23" width="150" height="150" class="size-thumbnail wp-image-7676" /></a> <a href="http://weizenspr.eu/uploads/gapps_24.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_24-150x150.png" alt="" title="gapps_24" width="150" height="150" class="size-thumbnail wp-image-7677" /></a><p class="wp-caption-text">Google Apps Nutzer und Services</p></div>
<p>Als finalen Schritt müsst nun noch einmal zu den "Einstellungen" gehen und bei "E-Mail" für die "Auffangadresse" die Einstellung "E-Mail weiterleiten an:" aktivieren und dort die E-Mail-Adresse eures neu angelegten Nutzers eintragen. Nach dem Speichern der Änderung seid ihr fertig! <img src='http://weizenspr.eu/includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<div id="attachment_7679" class="wp-caption aligncenter" style="width: 327px"><a href="http://weizenspr.eu/uploads/gapps_25.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_25-150x150.png" alt="" title="gapps_25" width="150" height="150" class="size-thumbnail wp-image-7679" /></a> <a href="http://weizenspr.eu/uploads/gapps_26.png" class="liimagelink"><img src="http://weizenspr.eu/uploads/gapps_26-150x150.png" alt="" title="gapps_26" width="150" height="150" class="size-thumbnail wp-image-7680" /></a><p class="wp-caption-text">Google Apps E-Mail Auffangadresse</p></div>
<p>Unglaublich! Ihr habt in den letzten paar Minuten einen Google Apps Account für eure Domain angelegt; eure DNS-Einträge geändert, damit Google als euer Mailserver dient und habt Google Apps so konfiguriert, dass es alle E-Mails für eure Domain annehmen kann. <img src='http://weizenspr.eu/includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Die Daten, die ihr benötigt, um Mails über Google zu verschicken und die Mails von Google abzurufen, sind in diesem <a href="http://support.google.com/mail/bin/answer.py?hl=en&#038;answer=78799" target="_blank" class="liexternal">Google Support-Artikel</a>beschrieben. Darüber hinaus bietet Google für <a href="http://support.google.com/mail/bin/answer.py?hl=en&#038;answer=75726" target="_blank" class="liexternal">einige Mailclients</a> umfassende Konfigurationsanleitungen an.</p>
<p>Ich hoffe, der Artikel war interessant für euch und ich würde mich natürlich - wie immer - über Anregungen, Kritik und allgemeines Feedback freuen. <img src='http://weizenspr.eu/includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> <br/><br />
<strong>Update:</strong><br />
Bevor ich es vergesse und jemand in diese Falle läuft. Ja, Google Apps ermöglicht es, mehrere Domains mit einem Google Apps Account zu verbinden. Hier ist jedoch Vorsicht geboten, denn für keine der zusätzlichen Domains ist es möglich, eine Catchall-Adresse einzurichten, wie es in diesem Artikel beschrieben worden ist. Das bedeutet: Für jede Domain muss man einen neuen Google Apps Account erstellen - ein Kombinieren ist nicht möglich.<br/><br />
<strong>Update:</strong><br />
Den Absatz über den neuen Nutzer nochmal umgeschrieben und genauer erklärt, weshalb ein zusätzlicher Nutzer eingerichtet werden sollte.<br/><br />
<strong>Update:</strong><br />
Nochmal als eigene Antwort auf das erste Update. Es ist in der Tat möglich, durch das Einrichten eines "Domain-Alias" mehrere Domains über ein und denselben Google Apps Account abzudecken. Das funktioniert auch mit der eingerichteten Catchall-Adresse. Worauf man unbedingt achten muss (was ich damals anscheinend nicht getan habe), ist, dass Google wohl Probleme mit diesem Domain-Gerödel hat. Nach dem Hinzufügen des Domain-Aliases (und dem Verifizieren) muss dieser in der Domain-Übersicht sofort aktiv sein. Wenn dort ein gelbes Ausrufzeichen in der Liste steht, ist irgendwas schief gelaufen und der Domain-Alias funktioniert nicht. Einzige mir bekannte Lösung: Domain-Alias löschen und neu hinzufügen. Irgendwann sollte es klappen.<br/><br />
<strong>Mailende Grüße, Kenny</strong></p>
<!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://weizenspr.eu/2012/google-apps-als-backup-mailserver/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Content Management System Brooke.cc</title>
		<link>http://weizenspr.eu/2012/content-management-system-brooke-cc/</link>
		<comments>http://weizenspr.eu/2012/content-management-system-brooke-cc/#comments</comments>
		<pubDate>Fri, 13 Jan 2012 20:14:30 +0000</pubDate>
		<dc:creator>Kenny</dc:creator>
				<category><![CDATA[Brooke.cc]]></category>

		<guid isPermaLink="false">http://weizenspr.eu/?p=7608</guid>
		<description><![CDATA[Ich habe diese Woche damit verbracht, mir einen Überblick darüber zu verschaffen, was das zukünftige Content Management System später leisten soll und worauf besonders Wert gelegt werden soll. Kurz um: Ich habe eine Feature-Liste erarbeitet. Auf Basis dieser Feature-Liste sollen das technische Feinkonzept und das Sicherheitskonzept entstehen. Beides werde ich in einem großen, umfassenden Dokument [...]]]></description>
			<content:encoded><![CDATA[<!-- RSPEAK_START --><p>Ich habe diese Woche damit verbracht, mir einen Überblick darüber zu verschaffen, was das zukünftige Content Management System später leisten soll und worauf besonders Wert gelegt werden soll. Kurz um: Ich habe eine Feature-Liste erarbeitet. Auf Basis dieser Feature-Liste sollen das technische Feinkonzept und das Sicherheitskonzept entstehen. Beides werde ich in einem großen, umfassenden Dokument beschreiben. (Ja, normalerweise kommt erst ein <a href="http://de.wikipedia.org/wiki/Lastenheft" target="_blank" rel="nofollow" class="liwikipedia">Lastenheft</a>, dann ein <a href="http://de.wikipedia.org/wiki/Pflichtenheft" target="_blank" rel="nofollow" class="liwikipedia">Pflichtenheft</a>, dann ein technisches Grobkonzept, dann ein technisches Feinkonzept und abschließend ein Sicherheitskonzept. Da ich jedoch mein eigener Kunde bin, komme ich gleich zum Knackpunkt.)</p>
<p>Einen Namen für das CMS habe ich nun übrigens auch gefunden. Eigentlich hatte ich ja "SecWCMS" im Kopf, aber ehrlich gesagt fand ich den Namen schlussendlich doch doof. Ich habe mich deshalb für den Namen <a href="http://brooke.cc" target="_blank" class="liexternal">Brooke.cc</a> entschieden. Brooke ist ein meist weiblicher Vorname, heißt so viel wie Fluss oder Bach und soll den Informationsfluss, der durch ein CMS entsteht, symbolisieren. Außerdem erinnert mich das Wort sehr an "book" (dt. "Buch"), zudem beginnt es mit "br", dem HTML-Tag für Zeilenumbrüche. Das ".cc" der Domain habe ich übrigens mit in den Namen aufgenommen. "CC" steht bei E-Mails ja angeblich für "Carbon Copy". Meiner Meinung nach irgendwie passend für ein OpenSource-Projekt. <img src='http://weizenspr.eu/includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Hier also die von mir zusammengestellten Anforderungen:</p>
<ul>
<li>Umfassende Konzeption inkl. Sicherheitsbetrachtung</li>
<li>die Rollen Administrator, Moderator, Autor und Besucher sollen strikt getrennt werden</li>
<li>Sämtliche Eingaben sollen geprüft und escaped werden</li>
<li>URLs zu den Inhalten sollen frei bestimmbar, aber auch aus Platzhaltern generierbar sein</li>
<li>Inhalte sollen in (verschachtelbaren) Gruppen/Kategorien angeordnet werden können</li>
<li>es soll Übersichtsseiten über Gruppen/Kategorien geben</li>
<li>für Gruppen/Kategorien soll es Feeds (RSS oder Atom) geben</li>
<li>Inhalte sollen als Textbausteine in anderen Bereichen einer Seite einsetzbar sein</li>
<li>alle Aktionen von Administratoren, Moderatoren und Autoren sollen aufgezeichnet werden</li>
<li>für Besucher soll eine Statistik erzeugt werden, die ohne Speicherung der IP des Besuchers auskommt (abschaltbare)</li>
<li>alle Bereiche sollen HTTPS unterstützen, für die Bereiche der Administratoren, Moderatoren und Autoren soll HTTPS erzwungen werden können (abschaltbar)</li>
<li>die Seite soll sich nicht in Frames einsperren lassen dürfen (abschaltbar)</li>
<li>Besucher sollen keine Session benötigen; Cookies sollen nur gesetzt werden, wenn unbedingt nötig</li>
<li>Inhalte sollen kommentierbar sein, dies soll für jeden Inhalt separat abschaltbar sein</li>
<li>Inhalte einer Gruppe/Kategorie sollen als besonders wichtig markierbar sein; diese sollen in der Auflistung ganz oben stehen</li>
<li>Administratoren sollen keinen Zugriff auf das Erstellen, Veröffentlichen oder Freigeben von Inhalten haben; Autoren sollen Inhalte erstellen aber nicht veröffentlichen können; Moderatoren Inhalte erstellen, veröffentlichen und Kommentare freigeben können</li>
<li>Kommentare sollen vor Spam geschützt werden (abschaltbar)</li>
<li>Kommentare sollen vor der Veröffentlichung in eine Moderationsliste gestellt werden (abschaltbar)</li>
<li>Kommentare bestimmer Kommentatoren sollen immer automatisch veröffentlicht werden, wenn die Moderationsliste aktiviert ist</li>
<li>in Kommentaren soll BB-Code verwendbar sein</li>
<li>in Inhalten von Besuchern darf kein JavaScript vorhanden sein</li>
<li>Inhalte sollen depublizierbar sein</li>
<li>Inhalte sollen (optionale) von- und bis-Werte haben, die die Sichtbarkeit des Inhalts zeitlich einschränken; diese sollen auch wirken, wenn die Inhalte an anderer Stelle genutzt werden</li>
<li>Inhalte sollen Funktionen zum Darstellen von Bildern und Quelltext, sowie dem Hervorheben von Links erhalten</li>
<li>in Bearbeitung befindliche Inhalte sollen regelmäßig gesichert werden</li>
<li>veröffentlichte Inhalte, die anschließend von ihrem Autoren verändert werden, müssen erneut veröffentlicht werden, damit die Änderung aktiv wird</li>
<li>es soll einstellbar sein, ob ein Autor die Inhalte anderer Autoren lesen oder sogar bearbeiten darf</li>
<li>Inhalte sollen über eine Suchfunktion auffindbar sein</li>
<li>es soll eine sitemap.xml bereitgestellt werden</li>
<li>Suchmaschinen sollen über neue Inhalte informiert werden</li>
<li>es sollen Trackbacks unterstützt werden</li>
<li>es sollen Pingbacks unterstützt werden</li>
<li>die Anwendung soll keine E-Mails versenden</li>
<li>Passwörter sollen sicher abgelegt werden</li>
<li>die Darstellung soll auf Templates basieren</li>
<li>es soll dynamisch zwischen verschiedenen Designs umschaltbar sein (z.B. ein Desktop- und Mobil-Design)</li>
<li>der Upload und das Löschen von Dateien soll möglich sein; hochgeladene Bilder sollen skaliert werden</li>
<li>Nutzer sollen bei mehrmaligen (einstellbar) fehlerhaften Login-Versuchen für eine definierbare Zeit ausgesperrt werden</li>
<li>bei einem fehlgeschlagenen Loginversuch soll nicht ersichtlich sein, weshalb dieser fehlgeschlagen ist</li>
<li>es sollen Passwortrichtlinien aktivierbar sein</li>
<li>Nutzer sollen nach einer einstellbaren Zeit automatisch ausgeloggt werden</li>
<li>es soll eine Funktion zum Suchen ähnlicher Inhalte bereitgestellt werden</li>
<li>die Software muss Mehrsprachigkeit unterstützen</li>
<li>die Software soll um neue Funktionen erweiterbar sein</li>
<li>die Ausgabe soll durch Plugins veränderbar sein</li>
<li>die Software soll in PHP geschrieben sein</li>
<li>die Software soll MySQL verwenden</li>
<li>der DB-Zugriff soll keine Transaktionen benötigen</li>
<li>es soll eine umfassende Installationsanleitung erstellt werden</li>
</ul>
<p>So, das ist doch mal eine ganz annehmbare Liste für ein kleines CMS. Sollten euch noch weitere Funktionen einfallen, die ein CMS unbedingt benötigt, dann hinterlasst diese doch bitte in den Kommentaren. <img src='http://weizenspr.eu/includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> <br/><br />
<strong>Managende Grüße, <span class="bbpost_s" style="text-decoration : line-through;">Brooke</span> Kenny</strong></p>
<!-- RSPEAK_STOP -->]]></content:encoded>
			<wfw:commentRss>http://weizenspr.eu/2012/content-management-system-brooke-cc/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>

