Gute c't-Artikel

Ab und an gibt es in der c't wirklich gute Artikel, die komprimiert und technisch fundiert Wissen vermitteln. Damit ich diese Artikel auch noch später in meiner CD-Sammlung auffinden kann, vermerke ich sie hier.

  • "Die 128-GByte-Grenze bei ATA-Festplatten", c't 3/2005, S. 89 im Artikel "Parallele Scheiben", S. 86-89 (Boi Feddern)
  • "Funk-Beschleuniger - Wie proprietäre Kniffe den WLAN-Durchsatz hochtreiben", c't 21/2005, S. 158 (Dr. Alfred Arnold)
  • "Funkverdichtung - wie das neue Turbo-Bluetooth funktioniert" (Bluetooth 2.0+EDR), c't 21/2005, S. 196 (Dusan Zivadinovic)
  • "Verschlusssache High Definition - Wie die hochauflösenden DVD-Nachfolger Inhalte verplomben" (DRM), c't 21/2005, S. 222 (Dirk Knop)
  • "Lauschen neu diktiert - Bund und Länder überarbeiten Regeln zur Telekommunikationsüberwachung". c't 24/2005, S. 74
  • "PC du jour - die aktuelle Technik in Desktop-PCs", c't 24/2005, S. 106-117
  • "Tragbare Kompromisse - Was billige Notebooks können und wofür teure notwendig sind", c't 25/2005, S. 148-151
  • "Lauschverhalten unter der Lupe - Provider ziehen Bilanz nach über einem Jahr Mail-Überwachung", c't 01/2006, S. 44-45 (Monika Ermert)
  • "Kauderwelsch im DNS - Kein Ende in der Auseinandersetzung um internationalisierte Domains", c't 01/2006, S. 54-55 (Monika Ermert, Jürgen Kuri)
  • "Dicke Fische - Zweite Runde des c't-Suchmaschinenoptimierungswettbewerbs", c't 01/2006, S. 76-78 (Jo Bager, Jan Becker-Fochler)
  • "Wer hat das bestellt? - Händer dürfen sich kein Recht auf Ersatzlieferung vorbehalten", c't 02/2006, S. 180 (Noogie C. Kaufmann)
  • "Maschenfunk - Gemeinsamkeiten und Unterschiede von WLAN und Mesh-Netzen", c't 02/2006, S. 198-203 (Guido Hiertz, Spiro Trikaliotis)
  • "Geordnetes Chaos - Wie Routing dem Internet seine Selbstheilungskräfte verleiht", c't 03/2006, S. 160-165 (Stefan Dierichs, Prof. Norbert Pohlmann)
  • "Bitte freimachen - Halbautomatische Verfahren zum Freistellen von Bildern", c't 03/2006, S. 168-171 (Andrea Trinkwalder)
  • "Qualitätsfragen - Urheberrechtsschutz von HTML-Quelltext", c't 03/2006, S. 178f. (Dr. M. Michael König)
  • "Die Hilfssheriffs als heimliche Komplizen - Fahnder der GVU sponsorten Film-Raubkopierer", c't 04/2006, S. 18-22 (Holger Bleich, Volker Briegleb)
  • "Die neuen Patentkriege - EU, USA und WIPO drehen weiter an der Schutzrechtschraube", c't 04/2006, S. 110-113 (Stefan Krempl)
  • "Kern-Kalender - Der Prozessor-Fahrplan 2006", c't 04/2006, S. 136-143 (Christof Windeck)
  • "Eigentore - GVU schiebt Schwarzen Peter den Ermittlungsbehörden zu", c't 05/2006, S. 62 (Holger Bleich, Volker Briegleb)
  • "Preiskrampf - Kostenfallen bei der Internet-Einwahl aus dem Weg gehen", c't 05/2006, S. 191, 191 (Urs Mansmann)
  • "Überbreite - 64-Bit-Linux in der Praxis", c't 05/2006, S. 218-221 (Thorsten Leemhuis)
  • "Rechnen in Zeit und Raum - Compilertechnologie für rekonfigurierbare parallele Hardware", c't 05/2006, S. 232-237 (Christian Siemers)
  • "Tintologie - Die Technik fototauglicher Tintendrucker", c't 07/2006, S. 234-236 (Johannes Schuster)
  • "Besitzansprüche - Namen als Domain-Bezeichnungen", c't 11/2006, S. 188f (Dr. M. Michael König)
  • "Über die Ketten der Wissensgesellschaft - Der Kulturkampf über den Zugang zu wissenschaftlichen Veröffentlichungen verschärft sich", c't 12/2006, S. 190-199 (Richard Sietmann)
  • "Internet-GEZ - Abgabepflicht auf Internet-PCs rückt näher: Wer muss zahlen und wer nicht?", c't 13/2006, S. 42f. (Richard Sietmann)
  • "Realitätsverschiebung - Virtualisierungstechniken im Vergleich", c't 13/2006, S. 182-189 (Peter Siering)
  • "Im Gleichtakt - Wie SyncML funktioniert", c't 13/2006, S. 230-233 (Lukas Zeller)
  • "In der Kürze - Wie VDSL2 funktioniert und wofür man es braucht", c't 13/2006, S. 236-241 (Holger Skurk, Dusan Zivadinovic)
  • "Pulverisiert - Gesundheitsrisiken von Tonerpulver und Laserdruckern", c't 14/2006, S. 82-84 (Tim Gerber)
  • "Risiko Strom - Vorbeugen gegen Ausfall und Brandgefahr", c't 14/2006, S. 110-112 (Ernst Ahlers)
  • "Licht aus! - Strom sparen unter Linux", c't 14/2006, S. 176-161 (Dominik Brodowski)
  • "Naive E-Wähler - Rechtliche und technische Probleme bei Wahlcomputern in Deutschland", c't 15/2006, S. 104f. (Richard Sietmann)
  • "E-Voting. Ja, aber... - Bedenken gegen die Wahlcompuer von Nedap", c't 16/2006, S. 54f. (Richard Sietmann)
  • "Kraftakt - Die Core-Mikroarchitektur im Vergleich zu P6/Yonah, Pentium 5 und Athlon 64", c't 16/2006, S. 118-125 (Andreas Stiller)
  • "Für die Ewigkeit - Metadatenstandards im Bildarchiv", c't 16/2006, S. 156-158 (Andrea Trinkwalder)
  • "Konditionstraining - Längere Akkulaufzeit durch geschicktes Energiesparen", c't 16/2006, S. 176-179 (Jörg Wirtgen)
  • "Wenn Windows unterwandert wird - Wie sich Anwendungen und Kopiersperren im System einnisten", c't 17/2006, S. 94-99 (Gerald Himmelein, Christoph Hoppe)
  • "Dokumentenmanagement - Rechtliche Anforderungen", c't 17/2006, S. 170 (Peter Schüler)
  • "Der Lochtrick - Wie Skype & Co. Firewalls umgehen", c't 17/2006, S. 142f. (Jürgen Schmidt)
  • "Standard mit Freiheiten - OpenDocument verspricht verlustfreien Datenaustausch", c't 17/2006, S. 180-183 (Bernd Butscheidt, René Peinl)
  • "Abschirmdienst - Speicherschutztechniken von Linux", c't 17/2006, S. 208-211 (Sebastian Krahmer)
  • "Datensalat - Schwachstellensuche mit Fuzzing", c't 18/2006, S. 210-212 (Christiane Rütten)
  • "Tischfeuerwerk - Riskante Qualitätsprobleme bei Lithiumionen-Akkus", c't 19/2006, S. 34-37 (Jürgen Rink)
  • "Werbeworte - Mit Google AdWords Website-Besucher gewinnen", c't 19/2006, S. 180-184 (Helge Cramer)
  • "Obskure Demokratie-Maschine - Sind Wahlcomputer manipulationssicher?", c't 20/2006, S. 86-93 (Richard Sietmann)
  • "Service im Haus - Das Linux Terminal Server Project", c't 20/2006, S. 200-205 (Dr. Thomas Romeyke)
  • "Funkverlängerung - Tipps zum Verknüpfen von WLAN-Funkzellen", c't 21/2006, S. 194ff. (Ernst Ahlers)
  • "Nachricht mit Köpfchen - Inhalt und Funktion des E-Mail-Headers", c't 21/2006, S. 218-221 (Holger Bleich, Herbert Braun, Urs Mansmann)
  • "Die Nadel im Schrifthaufen - Woran man hochwertige Gratis-Fonts erkennt und wo man sie findet", c't 22/2006, S. 222-225 (Gerrit von AAken)
  • "Neue Fonts braucht das Land - Eigene Schriftarten erstellen und verwenden", c't 22/2006, S. 226-230 (André Kramer)
  • "Der gläserne Fluggast - Umfangreiche Datenbestände der Fluggesellschaften werden in dei USA weitergereicht", c't 23/2006, S. 56 (Stefan Krempl)
  • "Bilder in der Ausstellung - Was Sie beim TV-Kauf beachten sollten", c't 23/2006, S. 104ff. (Carsten Meyer)
  • "Pingpong - Wie die TCP/IP-Flusskontrolle das Surf-Tempo bestimmt", c't 23/2006, S. 198ff. (Christoph Lüders, Martin Winkler)
  • "Ausgeschrieben? Ausgeblieben! - Fragwürdige Vergabepraxis bei öffentlichen IT-Entwicklungsprojekten", c't 26/2006, S. 56f. (Christiane Schulz-Haddouti)
  • "Der Urnen-Bypass - Ein elektronischer Wahlstift als Alternative zu Wahlmaschinen", c't 26/2006, S. 92-95 (Richard Sietmann)
  • "Von vornherein verriegelt - Die Sicherheitsmechanismen von Windows Vista", c't 26/2006, S. 206-209 (Drik Knop, Daniel Bachfeld)
  • "Gesundes Misstrauen - Sicherheit von Webanwendungen", c't 26/2006, S. 234-239 (Christiane Rütten, Tobias Glemser)

Recht

Hardware-Tests

  • "PC a la carte" und "PC-Kaufberatung: Vergleichstest", c't 24/2005, S. 118-125 und S. 126-137
  • "Beamer: Lichtstarke Geräte zur Fußball-WM", c't 10/2006, S. 136-143 (Richard Jahn)
  • "Geballte Plattenpower: 12 SATA-II-RAID-Adapterkarten mit PCI, PCI-X und PCIe", c't 10/2006, S. 186-193 (Boi Feddern)
  • "Spar-Boards - Mainboards, Prozessoren und Netzteile für sparsame Desktop-Rechner", c't 12/2006, S. 158-167 (Christof Windeck)
  • "Energiereserve - USV - Notstromspender für den PC", c't 13/2006, S. 114-121 (Ernst Ahlers)
  • "PC-Bausteine - Die aktuelle Technik in Desktop-PCs" und "PC-Bastelbogen - Zwei Konfigurationsvorschläge für leise und flotte Desktop-PCs", c't 26/2006, S. 106-111 und S. 112-130 (Christof Windeck)

Apache mit SSL einrichten

Prinzipiell ist die Anleitung von Linux-StepByStep sehr brauchbar.

Allerdings musste ich nur mod_ssl nachinstallieren.

Die Punkte 8.2-8.5 ("8.2 Edit or create an OpenSSL template", "8.3. Create a new CA certificate", "8.4. Create a Certificate Signing Request (CSR)", "8.5. Sign the CSR") fielen natürlich weg, weil ich ein CAcert-Zertifikat besitze und den Key schon vorher generiert habe.

Unter Fedora gibt es schon vorgegebene Verzeichnisse für die SSL-Keys (/etc/httpd/conf/ssl.*). Zunächst habe ich die vorgenerierten Keys und Zertifikate (server.key, server.crt) gelöscht und meine eigenen als ssl.key/cacert.key bzw. ssl.crt/cacert.crt gespeichert. Wichtig ist auch, dass die privaten Schlüssel root gehören müssen und auch nur von root gelesen werden dürfen!

Die eigentliche Apache-SSL-Konfiguration geschieht über /etc/httpd/conf.d/ssl.conf. Da ich aber lieber SSL direkt bei meinen virtual hosts konfiguriere, habe ich alle Anweisungen innerhalb von <VirtualHost> ... </VirtualHost> auskommentiert.

Statt dessen habe ich der /etc/httpd/conf/sites-enabled/default folgende Einträge hinzugefügt:

Update Dezember 2014: Bitte beachten Sie, dass die Aktivierung der Krypto-Algorithmen (SSLCipherSuite) bereits 2005 geschah. Für heutige Sicherheitsanforderungen sind diese nicht mehr geeignet.
<VirtualHost *:443>
    SSLEngine on
    LogLevel warn
    ErrorLog logs/ssl_error_log
    TransferLog logs/ssl_access_log
    SSLCertificateFile /etc/httpd/conf/ssl.crt/cacert.crt
    SSLCertificateKeyFile /etc/httpd/conf/ssl.key/cacert.key
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
    SetEnvIf User-Agent ".*MSIE.*" \
        SetEnvIf User-Agent ".*MSIE.*" \
        nokeepalive ssl-unclean-shutdown \
        downgrade-1.0 force-response-1.0
</VirtualHost>

Anschließend noch Apache neu starten und anschließend sollte die Verbindung gesichert sein.

Zwischenzertifikate

Ab und an hat man ein Zertifikat (z.B. ein Class-3-Zertifikat von CAcert), das nur von einer Zwischenzertifizierungsstelle (Intermediate CA) zertifiziert wurde. Das Zertifikat dieser intermediate CA ist nicht im Browser integriert, jedoch von einer CA signiert, die im Browser enthalten sein sollte. Auf Grund der asymmetrischen Verschlüsselung kann der Browser jedoch trotzdem das Zertifikat verifizieren, wenn er Zugriff auf das Zwischenzertifikat hat.

Daher muss man das Zertifikat der intermediate CA ebenfalls im Apache eintragen. Die folgende virtual host-Definition muss ergänzt werden um den Eintrag:

SSLCACertificateFile /etc/httpd/conf/ssl.crt/intermediate_ca.crt

Anschließend muss natürlich auch der Apache neu gestartet werden und alles sollte im Lot sein.


MailScanner vs. Amavis

Sowohl MailScanner als auch Amavis sind Frameworks, um Mails auf einem Mailserver nach Viren und Spam zu durchsuchen. Neben vielen Gemeinsamkeiten (beide in Perl geschrieben, beide sind unter GPL lizensiert), gibt es wie bei allen größeren Programmen auch Unterschiede.

Da ich mir beide Programme inzwischen etwas genauer angesehen und beide auch produktiv einsetze (MailScanner ab 2003, amavisd-new ab Anfang 2006), will ich einen Vergleich wagen, vielleicht hilft es ja dem einen oder anderen.

Vorweg möchte ich aber noch sagen, dass ich mich inzwischen nicht mehr als neutral betrachten kann: Anfang 2006 habe ich begonnen, amavisd-new selbst zu erweitern (größeres Refactoring der Spamscanner-API, ein DSPAM-Plugin, einige Patches sind auch bereits in amavisd-new 2.4 eingeflossen. Ich hätte mir die Zeit für die Patches wohl nicht genommen, wenn ich nicht davon überzeugt gewesen wäre, dass amavisd-new für mich die bessere Lösung darstellt. Einen Lobgesang auf MailScanner sollte also keiner erwarten ;-)

Was gleich ist

Sowohl MailScanner als auch amavisd-new sind komplett in Perl geschrieben und laufen nur unter Unix-Systemen. Beide kooperieren mit allen gängigen SMTP-Servern und Virenscannern. Für die Spamprüfung wird SpamAssassin als Library eingesetzt (quasi alternative Implementierungen von spamd). Abhängig von bestimmten Regeln (z.B. Empfängeradresse) ist es möglich, mit einer Mail bestimmte Dinge zu tun oder eben nicht (z.B. keine Virenprüfung).

Bezüglich der Code-Qualität unterscheiden sie sich auch nicht viel: Beide Projekte haben viel Spaghetti-Code und häufig schlechte Bezeichner. Amavisd-new hat die längeren Methoden (z.T. über 950 Zeilen, s. Amavis::check_mail()), MailScanner dafür die verworreneren Abhängigkeiten und schlechteren Variablenbezeichnungen.

MailScanner

Zunächst zu MailScanner: Da XAMS eine Anleitung zur Einbindung von MailScanner beinhaltete, habe ich im Jahr 2003 begonnen, MailScanner zu benutzen.

MailScanner basiert darauf, dass eine Instanz des SMTP-Servers die Mail annimmt und erst mal auf der Platte abspeichert, wo MailScanner sie dann holt, bearbeitet und einer anderen Instanz des SMTP-Servers zur weiteren Verarbeitung übergibt.

Besondere Vorteile

  • Das Regelformat von MailScanner ist relativ einfach aufgebaut und daher leicht zu verstehen. Es basiert vornehmlich auf einfachen Textdateien. Über selbstgeschriebene Perl-Funktionen können auch andere Speicherungsmöglichkeiten realisiert werden.
  • Die MailScanner-Mailingliste ist sehr aktiv, nach meinem Gefühl gab es schnellere Antworten als bei amavisd-new (allerdings ist der amavisd-new-Support ebenfalls gut!).

Besondere Nachteile

  • Es gibt keine klare Aufgabentrennung: So fragt z.B. MailScanner standardmäßig auch Blacklisten ab und markiert eine Mail ggf. als Spam, obwohl die SpamAssassin-Prüfung eindeutig "kein Spam" ergibt. Weiterhin gibt es eine Phishing-Prüfung, die Mails ggf. verändert.
  • Es gibt keine Möglichkeit, SpamAssassin zu deaktivieren und den RAM dafür zu sparen (SpamAssassin wird immer geladen, nur manchmal nicht benutzt).
  • Das Regelwerk zur Konfiguration ist sehr simpel, Speicherung in der Datenbank wird aber schnell sehr umständlich.
  • Konzeptionell nicht schön: MailScanner verwendet direkt die nicht-standardisierten Queue-Formate der Mailserver. Dies ist natürlich fehleranfällig und macht die Unterstützung neuer Server aufwändig. Allerdings ändert sich das Queue-Format nicht oft und die meisten Mailserver sind ohnehin freie Software, so dass es genaue Informationen über die Formate gibt.
  • Der Mailfluss lässt sich nur sehr begrenzt steuern (zumindest bei Verwendung von Exim): Sämtliche Exim-Optionen (z.B. Umschreiben von Adressen, Router mit spez. Effekten) kommen erst zum Tragen, nachdem MailScanner die Mail bearbeitet hat.
  • MailScanner ist sehr "mutig": So werden bei bestimmten Aktionen einfach Signaturen an E-Mails angehängt, so dass bei Nicht-ASCII-Mails (deutsche Umlaute) bzw. MIME-Kodierungen die versandte Mail dann RFCs verletzt. Auch diverse Dateitypen stehen standardmäßig auf einer schwarzen Liste, weil z.B. Outlook früher einmal Fehler bei der Bearbeitung dieses Dateityps hatte (z.B. bei BMP-Dateien). Dies sind Aktionen, die für mich ganz klar in einen Viren- oder einen separaten Securityscanner gehören.
  • MailScanner ist nicht ganz einfach zu debuggen: Der MailScanner-Daemon ruft selbstständig den Mailserver auf und übergibt diesem bearbeitete Mails. Man kann also nicht einfach eine Mailserver-Instanz mit max. Loglevel starten, um die kompletten Debug-Ausgabe zu sehen.
  • Es gibt keine RPMs für MailScanner, so dass Aktualisierungen kompliziert von Hand durchgeführt werden müssen. Die Erstellung eines RPMs ist auch relativ schwierig (zumindest habe ich es bei meinem Versuch nicht geschafft), weil MailScanner eine etwas merkwürdige Verzeichnisstruktur in den Original-Quellen verwendet.
  • MailScanner bringt ein eigenes Startskript in /etc/init.d unter, das sowohl SMTP-Server als auch MailScanner zusammen startet. Hier muss man sehen, dass man das distributionseigene Skript für den SMTP-Server immer deaktiviert lässt.
  • Auf Grund des MailScanner-Designs (Mails werden im Dateisystem übernommen, Mailserver wird direkt über spezielle Programme wie "exim" statt über SMTP angesprochen) ist es kaum möglich, MailScanner in ein chroot zu sperren, um z.B. das Risiko eventueller Lücken kommerzieller Virenscanner zu minimieren.
  • Zumindest mit der Kombination Exim und MailScanner 4.43 gingen Mails verloren, wenn /tmp voll war: MailScanner übernahm (löschte!) die Mail aus der Exim-Queue, jedoch lief MIME::Parser auf einen Fehler, weil auf tmp kein Platz mehr war. MailScanner erkannte diesen Fehler jedoch nicht und löschte auch die Kopie in der eigenen Queue.

amavisd-new

amavisd-new ist der aktivste und meistgenutzte Fork von AMaViS. amavisd-new ist ein eigenständiger Daemon, der die Mails über SMTP entgegen nimmt (auf Wunsch mit Authentifizierung und TLS-Verschlüsselung) und sie auch wieder über SMTP ausliefert.

Besondere Vorteile

  • Es ist möglich (und wird offiziell unterstützt), amavisd-new in ein chroot zu sperren. Virenscanner sind auf Grund ihrer Arbeitsweise mit potenziell böswilligen Dateien immer gefährdet und bei proprietärer Software ist es manchmal schon beruhigend, wenn man weiß, dass die Software sicher eingesperrt ist.
  • Über die Exim-Konfiguration kann man beliebig steuern, wann amavisd-new aufgerufen werden soll.
  • Da die von amavisd-new gescannten Mails über einen separaten Port wieder zum MTA geleitet werden, ist es leicht möglich, Mails ohne große Probleme an amavisd-new vorbei zu schleusen (Beispiel: Freigeben einer Mail aus der Quarantäne). Mit MailScanner geht dies zwar auch, jedoch muss man eine spezielle "Protokoll"-Option bei Exim setzen, was nur Administratoren dürfen.
  • Die Regeln (z.B. Spamprüfung für bestimmte Absender abschalten) müssen nicht in der Konfigurationsdatei gespeichert sein: Statt dessen sind auch Textdateien, Datenbanken oder LDAP-Verzeichnisse denkbar.
  • Spam- und Virenprüfung (amavisd-new) sind problemlos auf andere Rechner auslagerbar ohne den eigentlichen MTA zu verlagern, da amavisd-new seine Mails über das TCP/IP-Protokoll empfängt und versendet.
  • Der Lookup-Algorithmus ist recht clever: Eine Regel namens 'test.example' gilt sowohl für 'joe@test.example' als auch für 'joe@de.test.example', 'joe@it.de.test.example' usw.
  • Für amavisd-new gibt es viele vorgefertige RPM- (und DEB-)Pakete, die problemloses Aktualisieren erlauben.
  • amavisd-new unterstützt (mit meinen Patches) auch DSPAM als alternativen Virenscanner (= bessere Erkennungsraten, schneller, weniger RAM, Änderung des Bodies zum leichten Trainieren).

Besondere Nachteile

  • Die Konfigurationsdatei ist ein vollwertiges Perl-Skript. Dadurch ergeben sich gewisse Restriktionen in Bezug auf die Syntax. Das Befüllen eines Hashs (ev. verschachtelt) ist für viele vielleicht nicht ganz so intuitiv. Auch muss man daran denken, dass Perl ein @ mit folgenden Buchstaben in einem String (doppelte Anführungsstriche) als Verweis auf eine Array-Variable interpretiert, so dass ggf. maskiert werden muss.
  • Die Konfiguration mit policy banks ist zwar sehr mächtig, aber ebenfalls nicht so intuitiv und - wie ich finde - nur spärlich dokumentiert.
  • Sämtliche Module sind in einer großen Perl-Datei (780 kB!) untergebracht.
  • Es gibt z.T. grauenhaften Code (Version 2.3.3, amavisd, Zeile 355):
     !$r ? $var : $r eq 'SCALAR' ? $$var
        : $r eq 'ARRAY' ? @$var : $r eq 'HASH' ? %$var : $var;
    

Anmerkung zu früheren Versionen dieser Seite

Vor einigen Jahren war ich gegenüber amavisd-new etwas skeptisch, weil amavisd-new einen SMTP-Mailserver simuliert. Damals nahm ich an, dass Clients sich direkt zu amavisd-new verbinden bzw. dass amavisd-new vor Exim vorgeschaltet wird. Dies ist natürlich problematisch, da weil es immer wieder kaputte Clients gibt und Erfahrungen mit den ganzen Feinheiten und Bugs in den herkömmlichen Mailservern schon existieren. Außerdem müsste in so einem Fall eine möglicherweise komplexe Mailkonfiguration des Mailservers in amavisd-new dupliziert werden. Diese Bedenken sind aber unbegründet, weil eben amavisd-new nur mit dem eigentlichen MTA kommunziert und gegenüber den Clients gar nicht in Erscheinung tritt.


CGI-Programme mit Apache und Windows

Situation

Ab und an ist bin ich gezwungen, CGI-Scripts unter Windows zu schreiben bzw. zu testen, die anschließend auf einem Unix-Server laufen sollen. Einziges Problem dabei: Die Shebang-Zeile am Anfang jedes Scripts.

Unter Unix verwendet man z.B. für Perl-Scripts standardmäßig #!/usr/bin/perl, für Windows bräuchte ich aber etwas wie #!c:/programme/perl/bin/perl.exe.

Lösung

Um diese Zeile nicht in jedem Script ändern zu müssen (fehleranfällig und zeitraubend), gibt es in der Apache-Konfiguration jedoch die Direktive ScriptInterpreterSource registry-strict, wodurch der Apache unter Windows die Shebang-Direktive nicht mehr beachtet, sondern die Registry zu Rate zieht, um herauszufinden, welches Kommando mit dem Dateityp verknüpft ist.

Um aber nicht die entsprechenden Dateitypen auch bei Ausführung des CGI-Scripts mit den Standard-Anwendungen zu öffnen (bei mir z.B. mein bevorzugter Perl-Editor), pfuscht man kurz vorher noch in der Registry herum (Achtung, nicht ganz ungefährlich!):

  1. Unter HKEY_CLASSES\ROOT die entsprechende Dateiendung suchen. Dabei auf den Standard-Schlüssel achten. Wenn dieser leer ist, gleich zu Schritt 3 springen. Bei mir steht aber etwas wie "pl_auto_file" drin.
  2. Da der Standard-Schlüssel nicht leer ist, sucht man unter HKEY_CLASSES\ROOT den Inhalt des Standard-Schlüssels (bei mir z.B. "pl_auto_file". Unterhalb dieses neuen Schlüssels geht es jetzt weiter.
  3. Folgende Schlüssel anlegen, soweit sie noch nicht existieren: Shell\ExecCGI\Command.
  4. Den Standard-Wert von Command auf den absoluten Pfad des Perl-Interpreters setzen, z.B. "c:\programme\perl\bin\perl.exe".
  5. Apache neu starten.

Das funktioniert natürlich auch mit Python-Scripts und beliebigen Datei-Endungen.


Template Engines

Bei allen Webseiten, die automatisch von Scripts generiert werden, sollten Templates verwendet werden. Zu "kleine" Projekte gibt es dabei meiner Erfahrung nach eigentlich nicht. Meist empfiehlt sich auch der Einsatz von erprobten Template-Engines, die einfach bugfrei sind und mehr Features haben, auch wenn es meist sehr einfach ist, sich etwas Eigenes zu schreiben.

Generell kann man zwei Klassen von Template-Engines unterscheiden. Eine interessante Diskussion darüber fand im Juni 2004 in comp.lang.python statt (archiviert durch Google).

Ersetzungssysteme

Viele weit verbreitete Template-Toolkits ersetzen im Wesentlichen nur Variablen mit speziellen Werten. Die besseren Template-Systeme treffen keine Annahmen über die Struktur der Dokumente und können beliebige Textformate wie z.B. XML, LaTeX u.ä. ausgeben.

Die Template-Systeme definieren eine eigene Meta-Syntax, um Werte an den entsprechenden Stellen einzusetzen. Außerdem gibt es häufig mehr oder weniger ausgefeilte Features, um z.B. über Listen zu iterieren. Zum Teil gibt es Plugin-Mechanismen, um Daten aus verschiedenen Quellen wie Datenbanken darzustellen. Dadurch wird immer mehr Logik wieder zurück in die Templates verlagert.

Insgesamt sind Ersetzungssysteme einfach zu verstehen und sehr beliebt, haben manchmal aber auch die Eigenschaft, die gewünschte Trennung von Markup, Präsentations- und Applikationslogik wieder aufzuweichen.

Beispiele für Ersetzungssysteme:

DOM-basierte Systeme

Sollen nur XML-Dokumente mit DOM-Struktur generiert werden (XHTML etc), bieten sich auch DOM-basierte Systeme an, die meist noch komfortabler zu benutzen sind und das Markup noch klarer vom Rest (Applikations- und Präsentationslogik) trennen.

Soweit ich weiß, sind diese Art von Systemen nicht für beliebige Textdateien geeignet (wie z.B. Konfigurationsdateien). Andererseits sind die Templates völlig frei von jeder Art Präsentationslogik (z.B. Schleifen) und können damit von allen Designern mit ihren Webeditoren bearbeitet werden. Der Ansatz gegenüber den Ersetzungssystemen ist jedoch ein anderer, so dass viele Programmierer umdenken müssen.


Subversion-Repository mit Apache einrichten

Subversion ist ein Versionsverwaltungsprogramm und wird als "Nachfolger" von CVS bezeichnet. Im Unterschied zu CVS legt man aber nicht lokal ein Repository an und greift dann per SSH darauf zu. Es gibt statt dessen mehrere Methoden, wie man remote auf ein Repository zugreifen kann, inbesondere geht das über ein spezielles Apache-Modul, dass WebDAV modifiziert (mod_dav_svn).

Ziel

Einrichtung eines Subversion Repositories auf einem Server, so dass man sicher mit Eclipse darauf zugreifen kann. Gleichzeitig soll es unterschiedliche User mit unterschiedlichen Rechten geben, die auch eigene Repositories besitzen.

Schritte

  • Zunächst muss natürlich Subversion selbst installiert sein (Paketname bei Fedora/RHEL: subversion). Für die hier vorgestellte Einrichtungsmethode braucht man auch noch das Apache-Modul (Paketname bei Fedora/RHEL: mod_dav_svn). Durch das Installieren des Apache-Moduls ist dann auch schon standardmäßig das Subversion-Modul in der Konfiguration eingetragen (/etc/httpd/conf.d/subversion.conf).
  • Da es später mehrere Repositories unterschiedlicher User geben und Apache nicht bei jeder Einrichtung eines SVN-Repositories neugestartet werden soll, werden alle Repositories unterhalb eines Verzeichnisses angelegt. Das hat natürlich den Nachteil, dass ein Benutzer nicht mehr selbst Backups von seinen Daten anfertigen kann. Dazu müssen die entsprechenden Verzeichnisse angelegt werden (ich benutze als Beispiel /var/version-management/subversion).
  • Anlegen eines ersten Repositories unterhalb von /var/version-management/subversion: Als Repository-Name wird bei mir der Benutzername verwendet. Den Typ "fsfs" sollte man meiner Erfahrung nach gegenüber der Berkely-DB unbedingt bevorzugen, da man sich sonst leicht sein Repository zerschießt (insbesondere bei Verwendung von Trac). svnadmin create --fs-type fsfs /var/version-management/subversion/felix
  • Jetzt wird der Apache-Zugriff eingerichtet, indem man die /etc/httpd/conf.d/subversion.conf anpasst. Damit ist es möglich, sowohl anonymen als auch authentifizierten Zugriff zuzulassen.
<Location /svn/repos>
	DAV svn
	SVNParentPath /var/version-management/subversion
	# our access control policy
	AuthzSVNAccessFile /var/version-management/subversion/access_control
	# try anonymous access first, resort to real
	# authentication if necessary.
	Satisfy Any
	Require valid-user
	# how to authenticate a user
	AuthType Basic
	AuthName "Subversion repository"
	AuthUserFile /var/version-management/subversion/.htpasswd
</Location>

  • Angenommen, der Benutzer Felix soll jetzt auf das Repository felix unbeschränkt Zugriff haben. Dann muss das access control file (/var/version-management/subversion/access_control) wie folgt aussehen:
    [felix:/]
    felix = rw
    

Alle anderen Benutzer haben keinerlei Rechte .

  • Damit man sich noch richtig anmelden kann, muss sich "felix" natürlich noch anmelden können, daher muss noch die /var/version-management/subversion/.htpasswd nach dem allgemeinen Schema für diese Dateien angepasst werden (benutzername:<verschlüsseltes Passwort> oder das Tool htpasswd verwenden).
  • Absichern der Konfiguration: Zunächst einmal Apache alle Besitzerrechte auf den Verzeichnisbaum /var/version-management/subversion geben, um eine Grundlage zu schaffen. Die Dateien access_control und .htpasswd muss Apache aber nur lesen können, daher werden sie wieder root übertragen. Geeignete Rechte sind z.B. 0640. Die einzelnen Repositories können als Gruppe dem jeweiligen User übertragen werden und zur Absicherung haben nur diese beiden Benutzer Zugriffsrechte. Wenn man dem Benutzer etwas mehr zutraut und ihm die Möglichkeit geben will, direkt über die Kommandozeile zuzugreifen, kann man ihm außer Leserechten auch noch Schreibrechte geben.
  • Jetzt muss der Apache noch neugestartet werden, damit alles funktioniert.

SElinux

Wenn SElinux auf dem System aktiviert ist, wird Apache nicht auf die Repositories zugreifen können. Dies äußert sich in Fehlermeldungen in error.log und in /var/log/messages bzw. in fehlgeschlagenen Anmeldungen trotz richtigen Passworts. Zunächst muss nämlich der SElinux-Kontext des Repositories korrekt gesetzt werden. Den Kontext kann man mit "ls -lZ <datei>" ansehen. Mit folgendem Befehl wird der Kontext der Dateien auf httpd_sys_content_t gesetzt, so dass Apache auch auf sie zugreifen kann.

chcon --verbose --recursive -t httpd_sys_content_t /var/version-management/subversion/

SSL-Verschlüsselung

Damit man nicht Passwörter und möglicherweise geheime Quelltexte unverschlüsselt durch die Gegend schickt, ist Verschlüsselung mit SSL unverzichtbar. In meiner Konfiguration soll jeder unverschlüsselte Zugriff abgelehnt werden. Das geschieht mittels der Option "SSLRequireSSL", so dass die subversion.conf anschließend so aussieht:

<Location /svn/repos>
	DAV svn
	SVNParentPath /var/version-management/subversion
	SSLRequireSSL
	SSLOptions +StrictRequire
	# our access control policy
	AuthzSVNAccessFile /var/version-management/subversion/access_control
	(...)

Diverse Tools

Bilder in OO-Dokumenten einbetten

Wenn man Webseiten-Inhalte mit copy&paste in ein OpenOffice-Dokument kopiert, wird zwar die Formatierung übernommen, jedoch werden Bilder nur als Referenz gespeichert und nicht direkt eingebettet. Das folgende Python-Script durchsucht eine OpenOffice-Datei und bettet die referenzierten Bilder ein.

Derzeit ist das Script (convert.py) eher ein proof of concept, funktionierte jedoch für meine Zwecke. Das ganze steht unter der GPL-Lizenz.

getmail

getmail ist ein Python-Programm, um Mail von externen Servern abzuholen und in eine Mailbox (mbox, Maildir, etc.) zu transportieren. Allerdings möchte ich meine Konfiguration nicht duplizieren müssen, damit zwei verschiedene Tools wissen, wo die entsprechenden Mailboxen liegen. Daher bietet es sich an, die abgeholten Mails durch den ohnehin vorhandenen Mailserver zustellen zu lassen. Bisher ist in getmail nur vorgesehen, ein externes Programm für diesen Zweck zu verwenden. Mit meinem Patch gibt es auch eine "SMTP" destination, so dass die abgeholten Mails direkt per SMTP ausgeliefert werden.

Damit kann man z.B. Mails per POP3 abholen lassen und an einen blöden MS Exchange-Server weiterleiten.


Ideenliste

Immer wieder fallen mir Dinge ein, die "man noch mal machen müsste" oder Verbesserungen an existierenden Programmen, gerade im Bereich Linux und Open Source Software. Damit ich das ganze nicht vergesse, dokumentiere ich es hier. Sollte es etwas schon geben, wäre eine entsprechende Nachricht nett. Und vielleicht hat ja jemand mal zu viel Zeit... ;-)


Bacula (Backup-System)

Nachholen der Backups, die ausgefallen sind, weil der director Dienst nicht lief. (Hintergrund: Mein Backuprechner wird nur für Backups angeschaltet, ansonsten würde nur ständig Krach machen, Strom verpulvern und obendrein noch schneller kaputt gehen. Manchmal schalte ich ihn aber 1/2 Stunde zu spät ein o.ä. Dann sollte das Backup schnellstmöglich nachgeholt werden.


Hamster-Ersatz für Linux

Hamster ist ein freier Mail- und Newsserver für Windows. Um einen weiteren Windows-Rechner abzuschießen, würde ich das ganze gerne auf Linux verwenden. Anforderungen:

  • Einfach zu konfigurieren (kein INN)
  • verhält sich gegenüber dem Upstream-Server wie ein Client
  • kommt auch mit größeren Datenbeständen zurecht (3-4 GB, ca. 1,6 Mio News).
  • sichtbare Newsgroups auf den Clients zentral konfigurierbar (nur Newsgroups, die der Server abonniert hat, werden auf den Clients angezeigt).
  • interne Newsgroups
  • mehrere Upstream-Server
  • gesicherte Verbindungen (SSL) möglich

Papercut (früher www.papercut.org) scheint einer netter Python-Ansatz zu sein, nur leider versteht der sich noch nicht mit upstream-Servern. Und ich würde ungerne auf Google vertrauen, dass sie ihr Newsarchiv immer öffentlich und kostenlos halten werden.


Mozilla-Bookmark-Synchronizer

Ich setze Mozilla/Firebird auf verschiedenen Rechnern ein. Ich hätte gern, dass alle Bookmarks automatisch synchron gehalten werden. Optimalerweise würden auch die gespeicherten Passwörter synchronisiert.


Bildverwaltungsprogramm für Linux

Ich hätte gerne ein Bildverwaltungsprogramm, v.a. für Bilder meiner Digitalkamera. Wichtiger als die Möglichkeit, einfach Nachbearbeitungen vorzunehmen, wäre mir, dass ich meine Bilder wiederfinden kann. D.h. Verschlagwortung der Bilder, zusätzliche Kommentare zu Bildern oder Bildgruppen, Organisation in Kategorien und chronologisch ev. auch Integration mit Beagle und das ganze am besten netzwerkfähig (Bilder auf einem Rechner, Abruf auf einem beliebigen anderen).

Am Schönsten wäre es, wenn auch eine Webgalerie schon mit verknüpft wäre, so dass man bestimmte Sammlungen auf Knopfdruck hochladen könnte. Und die Krönung des ganzen: Besucher der Webgalerie sollten dann auch gleich bei einem oder mehreren Fotodiensten die ausgewählten Bilder bestellen können.

Erste Ansätze gibt es mit digikam (nur leider ein KDE-Programm ;-), sehr schön ist auch das Gnome-Projekt F-Spot (hoffen wir, dass Microsoft das Mono-Projekt nicht mit Patentklagen stoppt). Insgesamt hoffnungsvolle Ansätze, aber noch nicht die gewünschte Integration inkl. Verschlagwortung.


PGP-verschlüsselte Mails in Thunderbird dauerhaft entschlüsselt speichern

Mittels Enigmail können Thunderbird und Mozilla Mail PGP-verschlüsselte Mails speichern. Leider werden diese Mails nicht dauerhaft (im Mailprogramm) entschlüsselt gespeichert (Motto: Mein Rechner ist sicher und wenn jemand reinkommt, habe ich ganz andere Probleme. Das Problem hatten natürlich auch schon andere Leute, aber die Implementation würde wohl einige Eingriffe in Thunderbird selbst erfodern. Immerhin wurde dieses Feature inzwischen in die 1.1 Roadmap aufgenommen.

Anmerkung: Wenn jemand zugriff auf den Rechner hat, könnte er sich vermutlich auch den Schlüssel krallen, wenn der Benutzer unvorsichtig war und diesem kein Passwort zugewiesen hat. Wenn die Daten es den Aufwand Wert währen, könnte man evtl. auch über Bruteforce an das Passwort kommen. -- Benutzer:Ruehrer 23:43, 6. Jun 2007 (CEST)


Paralleles Arbeiten an einer Datei in Eclipse

SubEthaEdit erlaubt es auf vorzügliche Weise, mit mehreren Personen gleichzeitig eine Datei zu bearbeiten - leider nur für den Mac und derzeit nur mit anderen SubEthaEdits. Eigentlich sollte jeder Texteditor in Eclipse diese Funktionalität bieten. Mit dem eclipse communication framework gibt es Ansätze in diese Richtung.


Mediawiki - Verbesserungen

  • Das Mediawiki bietet in den 1.4er Versionen an, dass das Interface je nach Benutzer eine andere Sprache anzeigt, unabhängig vom Text. Das sollte auch für Besucher automatisch so eingestellt werden, je nachdem, was der Browser des Benutzers standardmäßig mitsendet.
  • E-Mailbenachrichtigung bei Änderungen auf beobachteten Seiten wäre schön (war für 1.4 vorgesehen, ist aber nach hinten verschoben worden).

Python-Library - FTP

Das Python FTP-Modul ist grauenhaft. Es sollte viel komfortabler sein, directory listings usw. zu bekommen.


Mozilla for Groupware

Thunderbird und Sunbird sind zwar schöne Programme, noch besser wäre es aber, sie würden eine freie Groupware-Suite einfach unterstützen, so dass die ganzen interessanten Funktionalitäten wie gemeinsame Mailboxen und Kalender sowie eine gemeinsame, ausbaufähige, firmentaugliche Kontaktdatenbank wirklich nutzbar wären. Im Rahmen des Lightning-Projekts wird derzeit daran gearbeitet, aber ohne weitere Entwickler dauert das sicherlich noch einige Jahre.


Bessere Exportmöglichkeiten für Thunderbird

Thunderbird sollte es einfach erlauben, dass bestimmte Mails und Ordner als msg-/mbox-Dateien oder als Maildir exportiert werden können. Ebenso sollte der Import solcher Mails einfach machbar sein. Auch das Importieren von vcard sollte möglich sein.


vernünftiger eBay Sniper

Ich hätte gerne einen vernünftigen eBay-Sniper, der es vor allem einfach macht, nach hunderten gleichartiger Produkte (wie z.B. Film-DVDs) zu suchen und auf ausgewählte Produkte dieser Kategorie dann im letzten Moment zu bieten. Insbesondere müssten auch die Versandkosten berücksichtigt werden (automatisches Auslesen und wo das nicht klappt auch manuelle Eingabe). Außerdem wäre mir wichtig, dass der eigentliche Sniper auch auf einem anderen Rechner arbeiten können sollte als die GUI: Wenn z.B. Auktionen irgendwann nachts zu Ende gehen, würde ich ungerne meinen Rechner die ganze Nacht laufen lassen (Lautstärke, Strom). Andererseits habe ich Zugriff auf diverse Linux-Server, die ohnehin ständig laufen müssen. Schön wäre es, wenn der Sniper dort installiert wäre und mein Arbeitsplatzrechner nur zur Konfiguration laufen müsste.


Generischer Contentfilter für Mozilla

Flash-Werbung wird immer mehr zur Plage. Ebenso nerven Seiten mit unnötigen Java-Applets, deren Start sehr lange dauert. Ich hätte gerne ein Filter-System ähnlich dem für Bilder, mit dem Mozilla Medientypen je nach Domain blockiert und ggf. mit einem Klick anzeigt.


Session-Support für X11-Programme

Eigentlich gibt es im X-Server von X.org schon ewig eine sehr, sehr praktische Funktion, nämlich den Session-Support. Grundidee ist, dass man seine X-Session beendet und alle Programme speichern ihren aktuellen Zustand ab, so dass man beim Einloggen exakt an der gleichen Stelle mit den gleichen offenen Fenstern weiterarbeiten kann. Es wäre klasse, wenn alle Programme diese Sessions wirklich unterstützen würden.


Download-Manager für Mozilla

Eine Sache, die bei Mozilla noch fehlt, ist ein richtiger Download-Manager, der es erlaubt, Downloads zu unterbrechen und zu einem späteren Zeitpunkt (z.B. nach einem Neustart des Systems) wiederaufzunehmen. Nice to have wäre z.B. auch die Möglichkeit, von mehreren Quellen gleichzeitig herunterzuladen.

Das gibts mehr oder weniger schon. ;-) FileZilla und andere können mit der entsprechenden Extension bei einem Download gestartet werden. Hth, Clemens ;-)

: Wenn es aber nicht richtig integriert ist (auf jeder Plattform wieder ein anderes Programm, immer ein anderes Aussehen, muss immer noch mal extra installiert werden), wäre das für mich noch keine echte Lösung. Andererseits habe ich bisher auch kaum "gute" (UI, Bedienbarkeit) Download-Manager gesehen. Immerhin gibt es unter Linux freeloader bzw. gwget. -- Benutzer:Felix 09:38, 31. Jan 2006 (CET), Änderung vom 19:51, 19. Jun 2007 (CEST)


Plugin-Funktionalität für diverse Programme

Gerade C-Programme haben das Problem, dass man einige Dinge nur vor dem Kompilieren festlegen kann, wie z.B. die verwendete Datenbank. Das Problem ergibt sich v.a. für Distributoren, die sich dann für eine Datenbank entscheiden müssen. Ich habe häufiger das Problem, dass ich ein Paket brauche, dass aber z.B. bei Fedora nicht mit den gewünschten Optionen verfügbar ist (inbesondere bei Bacula, Exim und Dovecot). Gerade Sachen wie Datenbanken kann man aber selbst in C hervorragend modularisieren und als Plugin implementieren.

Damit kann der Distributor einfach alle Plugins kompilieren und der User kann dann zur Laufzeit konfigurieren, welche Datenbank genutzt werden soll. Verallgemeinert bin ich stark für möglichst viel Konfiguration zur Laufzeit.

Ansätze für Exim


Apache: saubere Multi-User-Unterstützung

Wenn Apache nicht in einer single user Umgebung eingesetzt wird, sondern für virtual hosting (mehrere Webseiten unterschiedlicher Benutzer) und diese Benutzer eigene (CGI-)Scripte ausführen dürfen, gibt es automatisch Sicherheitsprobleme, da die Scripte eigentlich unter der Benutzer-ID des jeweiligen Benutzers laufen müssen (alles andere ist aus sicherheitstechnischer Sicht nicht akzeptabel). Dafür gibt es spezialisierte Tools wie suexec und suPHP, doch die Möglichkeit, Scripte mittels mod_perl oder mod_php zu beschleunigen ist dahin. Außerdem ist die Installation zusätzlicher Software nötig.

Die technische richtige Lösung wäre es, wenn jeder virtual host unter einer konfigurierbaren User-ID ausgeführt werden würde, so dass die suexec/suPHP-Krücken (so gut sie auch programmiert sein mögen) einfach konzeptionell überflüssig werden. Außerdem erhoffe ich mir von dieser Lösung, dass z.B. mod_php auch für einen einzelnen virtual host eingesetzt werden kann.

Der Mangel wurde natürlich auch von anderen erkannt und so gibt es mehrere Projekte, die das Problem angehen:

  • Zunächst gibt es Metux MPM. Die Entwicklung scheint aber mehr oder weniger eingeschlafen zu sein. Außerdem verwendet Metux MPM Threading und das gibt natürlich insbesondere mit PHP-Modulen große Probleme.
  • Auf der Basis von Metux MPM entstand Peruser MPM, welches das Threading-Problem löst, indem echte Prozesse verwendet werden. Ab Version 0.2.0 gibt es sogar experimentelle SSL-Unterstützung. Allerdings muss keep-alive abgeschaltet werden (da sonst requests für unterschiedliche vhosts in einem request verschickt werden könnten). Aus meiner Sicht derzeit das interessanteste Projekt, da es regelmäßig angepasst und aktiv weiterentwickelt wird.
  • Dagegen baut MPM ITK auf dem prefork MPM auf und kann auch mit SSL umgehen. Das Projekt scheint aber nicht sehr aktiv zu sein, das letzte Release war im August 2005.

Alle Lösungen haben gemeinsam, dass sie noch nicht standardmäßig von Apache oder Fedora unterstützt werden...


Schöner VNC-Client!

VNC ist sehr hilfreich, aber die GUI ist steinzeitlich. Vino als Gnome VNC-Server ist da schon ein Meilenstein. Was mir trotzdem fehlt sind: Transparentes Drag'n'Drop und Copy&Paste (bei verschiedenen Betriebssystemen), integrierte Verschlüsselung, Bonjour-Support sowie ein GTK VNC-Client mit den Features Adresshistory/-management, übersichtliche Optionen, Integration in den Gnome-Schlüsselbund.


Least Cost Router für Gnome

Mit Bongosurfer gibt es einen funktionierenden Least Cost Router (nicht nur) für ISDN unter Linux. Schön wäre es, wenn die allgemeine Interaktivität (z.B. Anzeige der Wählversuche) erhöht würde und in der Anzeige mehr Usability-Aspekte berücksichtigt wären.


Python Webshop

Ich suche einen in Python implementierten Webshop, der mit den Mängeln von osCommerce, xtCommerce etc. einmal gründlich aufräumt. Besonders wichtig wären dabei sehr gute Codequalität, komplette Unit-Test-Abdeckung und die Möglichkeit, Businesslogik zum Shop hinzuzufügen (Rechnung erst ab 3. Bestellung, Versandkosten auf Grund eigener Berechnungsregeln wie z.B. eigenes Produktattribut, ...), so dass diese Logik auch nach einem Update erhalten bleibt (Plugin-Schnittstelle). Eine konsequente Umsetzung würde auch verschiedene Produkttypen mit jeweils anderen Attributen berücksichtigen (z.B. Bücher mit ISBN und Autor und Stahlrohre mit Durchmesser und Material). Eine vielversprechende Umsetzung könnte z.B. mit Django oder TurboGears erfolgen.


WebDAV-Server

WebDAV wurde ursprünglich auch mit der Intention entworfen, dass man Dateien für Webseiten darüber (ohne FTP) hochladen kann. In der Theorie funktioniert das auch alles sehr schön. Die bekannteste Implementierung ist sicherlich mod_dav im Apache-Webserver. mod_dav hat allerdings das Problem, dass alle Operationen mit dem Benutzer-Account des Webservers ausgeführt werden. Entsprechend kann man auch keine CGI-Skripte mit WebDAV hochladen, weil suexec die Ausführung auf Grund des falschen Datei-Eigentümers verweigert.

Ich bräuchte einen DAV-Server, der die Benutzerauthentifikation durchführt und die hochgeladenen Dateien auch mit den richtigen Dateieigentümern (abhängig von der Anmeldung/dem Pfad) versieht.


osCommerce

Diese Erweiterungen habe ich vor langer Zeit geschrieben (2004). Heute verwende ich kein osCommerce mehr, daher kann ich leider auch keinen Support mehr dafür anbieten.

osCommerce ist ein PHP-basierter Online-Shop, der als Open Source-Software (GPL-Lizenz) entwickelt wird. Bemerkenswert sind die vielen sog. contributions (Erweiterungen), mit denen der Shop an viele Anwendungsgebiete angepasst werden kann. Ein weiterer positiver Aspekt ist die Übersetzung der Software in diverse Sprachen.

Insgesamt kann osCommerce vielen kommerziellen Produkten das Wasser reichen bzw. ist ihnen überlegen, doch lässt insgesamt die Code-Qualität sehr zu wünschen übrig. Nahezu überall wird PHP-Code direkt in das Layout gestreut, ein Template-System wird standardmäßig nicht mitgeliefert (Version 2.2 Milestone 2). Auch wenn Templates für Milestone 3 vorgesehen sind, wollen die Entwickler nach eigener Aussage kein etabliertes System (wie z.B. Smarty) verwenden.

Es gibt (mit Ausnahmen weniger kleiner Teilbereiche) keine Plugin-Schnittstelle, so dass jede Änderung gut getestet werden muss. Sicherheitsaktualisierungen und größere Layout-Anpassungen nur unter großem Auswand durchzuführen und müssen bei jeder neuen Version wiederholt werden.

Select Specials

Problem: Nur bei den kleinsten Shops (<20 Produkte) ist es machbar, Artikel für neue Sonderangebote (specials) über ein einfaches Dropdown-Menü auszuwählen.

Ich habe daher eine minimal-invasive Erweiterung geschrieben, bei der man die Sonderangebote über eine Textsuche auswählt (ähnlich der normalen Suche im Shop). Die Erweiterung steht natürlich unter der GPL-Lizenz. Änderungen/Erweiterungen oder auch Übersetzungen sind jederzeit herzlich willkommen.

Download: select_specials_1.0.6.zip

Hilfe & Diskussion: Bitte eröffnet einen neuen Thread im Benutzerbeiträge-Forum von oscommerce.de und sendet den Link an felix.schwarz@web.de. Bitte keine Fragen per Mail, im Forum haben alle was davon.

osCommerce contribution page: http://www.oscommerce.com/community/contributions,2044

Support-Threads in Foren: Bevor ihr fragt, bitte zuerst diese Threads durchschauen, um Probleme ev. auch schon selbst lösen zu können:


Specials valid from

Problem: In osCommerce ist die Möglichkeit vorgesehen, Sonderangebote an einem vorher festgelegten Tag auslaufen zu lassen. Jedoch war es nicht möglich, Sonderangebote schon vorher einzugeben und dann sie dann automatisch an einem bestimmten Tag durch osCommerce freischalten zu lassen.

Mit dieser Erweiterung (GPL-Lizenz) ist es z.B. möglich, alle Sonderangebote des kommenden Monats in Ruhe einzugeben und dann automatisch freischalten zu lassen. Allerdings sind dafür kleine Datenbank-Änderungen nötig. Änderungen/Erweiterungen oder auch Übersetzungen sind jederzeit herzlich willkommen.

Download: specials_valid_from_1.0.3.zip

Hilfe & Diskussion: Bitte eröffnet einen neuen Thread im Benutzerbeiträge-Forum von oscommerce.de und sendet den Link an felix.schwarz@web.de. Bitte keine Fragen per Mail, im Forum haben alle was davon.

osCommerce contribution page: http://www.oscommerce.com/community/contributions,2520

Support-Threads in Foren: Bevor ihr fragt, bitte zuerst diese Threads durchschauen, um Probleme ev. auch schon selbst lösen zu können:


Konfiguration des MediaWikis

Das MediaWiki ist eine sehr leistungsfähige Wiki-Software, die insbesondere von der Wikipedia eingesetzt wird und sehr leistungsfähig ist. Ich finde, es ist eines der wenigen Wikis, wo der Text wirklich lesbar ist und man sich darauf freut, etwas zu lesen.

Aussehen ändern

Leider hat der standardmäßige Monobook-Skin (sieht wirklich gut aus, finde ich :-) ein paar Macken, die ich ausgebessert habe:

kleinschreibung

Standardmäßig werden oben in der Benutzerleiste ('Anmelden', 'Einstellungen', ...) und der Optionsleiste ('Artikel', 'Diskussion', ...) alle Einträge klein geschrieben. Grund dafür sind zwei css-Anweisungen in der main.css (Verzeichnis skins/monobook). Ein Patch behebt das Problem (einzuspielen im Verzeichnis, wo die main.css liegt, also z.B. /skins/monobook) mit <code>patch -p0 &lt; kleinschreibung-1.5.patch</code>.

Das Navigationsmenü links oben enthält viele Einträge, die zwar für die Wikipedia interessant sind, doch ansonsten eigentlich nur stören.

MediaWiki ab 1.5

Das Menü kann direkt mit Wiki-eigenen Mitteln geändert werden: Als Wiki-Operator kann man die Seite /MediaWiki:Sidebar nach den eigenen Wünschen anpassen. Mehr Informationen zu diesem Thema gibt es im Wikimedia Meta-Wiki.

MediaWiki < 1.5

In den älteren MediaWiki-Versionen kann die Navigationsleiste nur über die LocalSettings.php geändert werden. Im Beispiel unten gibt es dann nur noch die Einträge 'Hauptseite' und 'Letzte Änderungen':

$wgNavigationLinks = array (
        array( 'text'=>'mainpage',      'href'=>'mainpage' ),
        array( 'text'=>'recentchanges', 'href'=>'recentchanges-url' ),
);

Update von 1.4 zu 1.5

Vorbereitung

Zunächst müssen Backups gemacht werden. Neben der eigentlichen Datenbank sollten auch die Dateien des Mediawikis gesichert werden, da dort z.B. auch die ins Wiki importierten Bilder liegen!

Von Version 1.4 zu 1.5 haben sich die Datenbankstrukturen geändert, daher ist diesmal etwas mehr Arbeit erforderlich. Für deutsche Wikis sollte auch beachtet werden, dass die Kodierung von Text in der Datenbank von Latin-1 (ISO-8859-1) zu UTF-8 ("Unicode") geändert wurde, was zu zusätzlichen Fehlern führen kann.

Nach dem Entpacken der neuen Mediawiki-Dateien sollte dort noch eine AdminSettings.php angelegt werden, die etwa so aussehen muss:

<?php
        $wgDBname = "mediawikidb";
        $wgDBadminuser = "mysqluser";
        $wgDBadminpassword = "password";
?>

Datenbank-Update durchführen

Im Verzeichnis 'maintenance' werden dann die beiden Scripts ausgeführt:

php upgrade1_5.php
php update.php

Jetzt ist die Datenbank im neuen Format und das Mediawiki auf Version 1.5.

Rewrite-Rules für schöne URLs

Ohne besondere Vorkehrungen sehen Mediawiki-URLs etwa so aus: "/index.php?title=Hauptseite". Das ist natürlich unschön, eigentlich will ich eher etwas wie "/Hauptseite" haben. Dazu gibt es einige rewrite-Rules, die genau das machen. Leider müssen diese Regeln in der VirtualHost-Sektion stehen, nur mit .htaccess-Dateien habe ich es nicht hinbekommen.

# rules for well-behaving bots and normal browser:
RewriteCond %{REQUEST_URI} !^/files/
# Don't rewrite requests for files in MediaWiki subdirectories,
# MediaWiki PHP files, HTTP error documents, favicon.ico, or robots.txt
RewriteCond %{REQUEST_URI} !^/(images|skins)/
RewriteCond %{REQUEST_URI} !^/(redirect|texvc|index).php
RewriteCond %{REQUEST_URI} !^/error/(40(1|3|4)|500).html
RewriteCond %{REQUEST_URI} !^/favicon.ico
RewriteCond %{REQUEST_URI} !^/robots.txt
RewriteRule ^/(.*)$ /index.php?title=$1 [L,QSA]

Zur Erklärung: Es gibt bei mir ein zusätzliches Verzeichnis /files, in dem ich statische Dateien aufbewahre. Für dieses Verzeichnis soll sich Mediawiki nicht zuständig fühlen, weswegen auch URLs, die mit /files beginnen, nicht umgeschrieben werden.

Suchmaschinen von bestimmten Seiten fernhalten

In meinem Mediawiki gibt es "Seiten", die eigentlich nicht in einer Suchmaschine auftauchen sollten, z.B. verschiedene Vorlagen wie '/Mediawiki:Uploadtext' oder alte Versionen von Artikeln. Leider werden auch solche Seiten von Google und Co. durchsucht und gespeichert.

Um das zu verhindern, gibt es eigentlich die Datei robots.txt, in der folgendes stehen könnte:

User-agent: *
Disallow: /Spezial:
Disallow: /Mediawiki:
Disallow: /MediaWiki:
Disallow: /index.php

Leider ignorieren Google und Co. die robots.txt oder genauer gesagt: Sie halten sich sehr buchstabengetreu an den entspr. Standard. Das bedeutet, dass sie URLs, die in der robots.txt genannt werden, zwar besuchen, deren Inhalte aber nicht zwischenspeichern. Im Suchresultat taucht dann nur die URL (ohne weiteren Inhalt) auf.

Da die Suchmaschinen aber eigentlich kooperativ sind, geben sie sich zuverlässig im UserAgent-String zu erkennen. Entsprechend setze ich einige zusätzliche Rewrite-Rules ein, um Suchmaschinen außen vor zu halten. Diese Regeln müssen vor den Regeln für schöne URLs platziert werden!

# forbid bots to spider pages with certain urls that are forbidden in
# robots.txt anyway.
RewriteCond %{HTTP_USER_AGENT} .*Yahoo\!\sSlurp.*|.*Googlebot.*|.*msnbot.*
RewriteRule ^/index.php?.*$ /Hauptseite [L,QSA,gone]
RewriteCond %{HTTP_USER_AGENT} .*Yahoo\!\sSlurp.*|.*Googlebot.*|.*msnbot.*
RewriteRule ^/(MediaWiki|Mediawiki|Spezial):.*?.*$ /Hauptseite [L,QSA,gone]
RewriteCond %{HTTP_USER_AGENT} .*Yahoo\!\sSlurp.*|.*Googlebot.*|.*msnbot.*
RewriteCond %{QUERY_STRING} !^$
RewriteRule ^/?$ /Hauptseite [L,QSA,gone]

Alle "Besucher", deren UserAgent "Yahoo! Slurp", "Googlebot" oder "msnbot" enthält, bekommen bei bestimmten Seiten ('index.php?...', '/Spezial...', '/MediaWiki...' oder überhaupt ein nicht-leerer Query-String die Fehlermeldung "409 gone", so dass die entspr. Seiten nicht mehr in der Suchmaschine auftauchen. Allerdings wird es einige Zeit dauern, damit einmal aufgenommene Einträge aus dem Index gelöscht werden (mehrere Monate).

Lizenz ändern

Wenn man nachträglich die Lizenz seines Wikis ändern will, geht das technisch gesehen verhältnismäßig einfach: In der LocalSettings.php die folgenden Einträge ändern:

$wgRightsUrl = "http://creativecommons.org/licenses/by-sa/2.0/de/";
$wgRightsText = "Creative Commons Attribution-ShareAlike 2.0 Germany License";
$wgRightsIcon = "${wgStylePath}/common/images/somerights20.png";
# $wgRightsCode = "by-sa"; # Not yet used

Allerdings sollte beachtet werden, ob die alte Lizenz rechtlich zur neuen kompatibel ist. Wenn nicht, müssen theoretisch alle Autoren ihr Einverständnis zur Lizenzänderung geben!

Fußnoten

Mit der Cite.php-Extension kann man Fußnoten in Texten verwenden. Der Name kommt wohl vom Chicago-Zitierstil, der mit Fußnoten arbeitet.

Weitere Anpassungen

Im MediaWiki gibt es eine Seite, die sich mit kleineren Layout-Anpassungen beschäftigt.