Jabber/XMPP bei PING
Bei PING wird als Jabber-Server ejabberd eingesetzt. Dieser in Erlang geschriebene Jabber-Server unterstützt viele Protokollerweiterungen, ist sehr stabil und als Paket in Debian enthalten.
PING hat vor einer Ewigkeit unter jabber.ping.de einen ersten Jabber-Server in Betrieb genommen, der auch noch immer verfügbar sind. Unter https://jabber.ping.de/ ist ein Webclient verfügbar.
Konfiguration jabber.ping.de
Für jabber.ping.de wird eine Standardkonfiguration verwendet. Die Authentifizierung findet gegen eine interne Datenbank statt. Accounts können von jedem über Jabber/XMPP oder über das Web angelegt werden.
Konfiguration ping.de/prima.de
Um auch „offizielle“ Jabber-Accounts für die Mitglieder anzubieten, werden für ping.de/prima.de sogenannte Hosts eingerichtet. Im Gegensatz zu jabber.ping.de sind hier die Accounts vorgegeben und entsprechen von den Benutzernamen den @ping/prima.de E-Mail-Adressen und als Passwort wird entsprechend das POP3/IMAP-Passwort verwendet.
Um den vorhandenen jabber.ping.de-Host ein weiteren Host hinzuzufügen, muss das Host-Array in /etc/ejabberd/ejabberd.cfg um einen weiteren Eintrag ergänzt werden.
%% Hostname -{hosts, ["jabber.ping.de"]}. +{hosts, ["jabber.ping.de", "ping.de"]}.
Da die Authentifizierung gegen eine Passwort-Datei durchgeführt werden muss, wird anstelle der internen Authentifizierung das PAM-Modul genutzt. PAM nutzt dann das pwdfile-Modul, um eine Datei mit Benutzernamen und Passwort-Hashes auszuwerten. Die Verwendung von PAM muss pro Host gesetzt werden, da so die verwendete Authenfizierungsmethode überschrieben wird:
+{host_config, "ping.de", + [ + {auth_method, pam}, + {pam_service, "ejabberd"} + ] +}.
Durch den Parameter pam_service kann der von PAM zu verwendende Service-Name gesetzt werden. Hierdurch wird es z.B. möglich unterschiedliche Dateien für ping.de und prima.de zu nutzen. Durch die Angabe von ejabberd nutzt PAM die Datei /etc/pam.d/ejabberd, in der dann die verwendeten Methoden konfiguriert werden. Für ping.de sieht das wie folgt aus:
auth required pam_pwdfile.so pwdfile=/etc/ejabberd/pingpasswd nodelay account required pam_permit.so
Hier wird in der ersten Zeile das Modul pam_pwdfile.so referenziert und konfiguriert. Die Datei /etc/ejabberd/pingpasswd muss dabei für den Benutzer ejabberd lesbar sein und wird von adm-exec auf Lilly generiert und über scp übertragen.
Um zu verhindern, dass über Jabber oder dem Webinteface neue Accounts angelegt werden, wird die Möglichkeit zur Registrierung abgeschaltet und nur für jabber.ping.de wieder aktiviert:
-{access, register, [{allow, all}]}. +{access, register, [{deny, all}]}. +{host_config, "jabber.ping.de", + [ + {access, register, [{allow, all}]} + ] +}.
Änderungen an adm-exec auf Lilly
Auf Lilly wurde an adm-exec folgende Änderung vorgenommen:
--- adm-exec.orig Mon Nov 17 23:14:58 2014 +++ /usr/local/admdb/adm-exec Mon Nov 17 23:58:53 2014 @@ -81,7 +81,11 @@ /usr/local/admdb/adm-exec /etc/httpd/drupal/accounts.head /etc/httpd/drupal/accounts.tail - /etc/httpd/drupal/accounts.prima) ], \&drupal); + /etc/httpd/drupal/accounts.prima) ], \&drupal, + ejabberd => [ qw(Members + /usr/local/admdb/adm-exec + /etc/ejabberd/pingpasswd.head + /etc/ejabberd/pingpasswd.tail) ], \&ejabberd); $ENV{PATH} = '/bin:/usr/bin:/var/qmail/bin'; delete @ENV{'IFS', 'CDPATH', 'ENV', 'BASH_ENV'}; @@ -930,6 +934,29 @@ print $acctfh "$Firstname;$Familyname;$Id;$Username;$Password\n" } copy($acctfh, $acct, ".prima"); + install($acctfh,$acct,{TAIL=>'.tail',TMP=>'.tmp'}); +} + +################################################################ +# Update the ejabberd account list +sub ejabberd { + warn "ejabberd\n" if $verbose; + umask 077; + my $acct = '/etc/ejabberd/pingpasswd'; + my $acctfh = openfh(">$acct.tmp"); + copy($acctfh, $acct, ".head"); + + my $sth = $db->query(<<EOT); +select PopName as 'Username', PPass as 'Password' from Members where Status +in ('world') and PPass != '-' and !isnull(PPass) and length(PPass)>1 +EOT + + die $db->errstr unless $sth; + + while (my($Username,$Password) = $sth->fetchrow_array) { + my $salt = q($1$).int(rand(1e8)); + print $acctfh lc($Username) . ":" . crypt($Password,$salt) . "\n" + } install($acctfh,$acct,{TAIL=>'.tail',TMP=>'.tmp'}); }
DNS SRV-Records
Damit andere Jabber-Server und Jabber-Client aus Jabber-IDs wie k.ompelmann@ping.de den korrekten Jabber-Server finde, müssen im DNS drei SRV-Records angelegt werden. Das sind die drei Records _xmpp-server._tcp, _xmpp-client._tcp und _jabber._tcp. Für ping.de ergeben sich damit diese drei Records:
_xmpp-server._tcp.ping.de. 86400 IN SRV 5 0 5269 jabber.ping.de. _xmpp-client._tcp.ping.de. 86400 IN SRV 5 0 5222 jabber.ping.de. _jabber._tcp.ping.de. 86400 IN SRV 5 0 5269 jabber.ping.de.