Aprilscherz2008

Aus Hochschule Darmstadt - Fachschaft Informatik Wiki
Wechseln zu: Navigation, Suche

Am ersten April 2008 gab es von der Fachschaft einen kleinen Aprilscherz. Alle über unseren Internetzugang laufenden http-Requests für Bilder wurden abgefangen und das Bild vor der Auslieferung in Grausstufen konvertiert.

Screenshots etc sind in der Fachschafts-Gallery zu finden.

Inhaltsverzeichnis

[Bearbeiten] Technik

[Bearbeiten] Squid

Da sowieso alle Zugriffe über einen transparenten Proxy (Squid) laufen, mussten die Zugriffe nicht erst gesondert umgeleitet werden.

Zu Testzwecken vorher und damit die bestehende Config nicht beeinflusst werden musste, wurde eine neue urlgroup in Squid definiert:

http_port 3130 transparent urlgroup=g_firstapril

Anhand dieser urlgroup wurde der Redirector aktiv geschaltet:

acl firstapril urlgroup g_firstapril
redirector_access allow firstapril
redirector_access deny all
redirect_program /usr/local/bin/squid_firstapril.pl

squid_firstapril.pl ist ein kleines Skript was die URL auswertet und dann eine neue URL ausspuckt, die dann geladen wird. Eine Schleife wird explizit verhindert. Bilder werden von einem anderen Webserver geladen - hier aus dem public_html eines users. Die MD5-Summe ermöglicht den effizienten Einsatz (siehe unten).

#!/usr/bin/perl
#
# Kleines redirector program fuer squid. Leitet alle Anfragen fuer ein Bild auf einen anderen Server um
#
#
use CGI;
use URI::Escape;
use Digest::MD5 qw(md5_hex);
$|=1;

while(<>) {
	@request = split;
	$url = $request[0];
	# Testen ob es ein Bild ist (mehr als die Endung haben wir hier nicht) und sicherstellen, dass wir nicht im Kreis laufen

	if ($url =~ /(.*\.(bmp|jpg|png|gif|jpeg))/i && !($url =~ /webserver\.tld\/~username/) ) {
		$url = uri_escape($url);
		my $ending = $2;
		
		my $md5sum = md5_hex($url);
		
		print "http://webserver.tld/~username/aprilscherz/$md5sum.$ending?url=$url&ending=$ending&digest=$md5sum\n";
	}
	else {
		print "$_";
	}
}

[Bearbeiten] Webserver

Auf dem Webserver wird ein Bild nur einmal umgerechnet. Aus diesem Grund wird die MD5-Summe der URL berechnet. Der Fall das unterschiedliche Bilder unter exakt derselben URL liegen wird ignoriert.

Im Verzeichnis aprilscherz liegen die gecachten Dateien mit der MD5-Summe ihrer URL als Dateiname (+ original Endung). Wird die Datei dort vom Apache nicht gefunden, sorgt die .htaccess dafür, dass die Datei heruntergeladen wird:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME}   !-s
RewriteRule (.*)          /~username/aprilscherz.cgi?%{QUERY_STRING}   [T=application/x-httpd-cgi,L,QSA]

Weiterhin wird ein Zeitlimit für die Bilder gesetzt:

ExpiresActive On
ExpiresDefault "access plus 6 hours"

aprilscherz.cgi bekommt den alten Querystring und somit die alte URL übergeben und führt den Download durch:

#!/usr/bin/perl

use LWP::Simple;
use LWP::UserAgent;
use Image::Magick;
use CGI;
use strict;
#use warnings;

my $OUT_PATH = "/home/username/public_html/aprilscherz";

my $cgi = new CGI;

my $format = $cgi->param("ending");
my $filename = $cgi->param("digest");
my $url = $cgi->param("url");

unless( $filename =~ /^[a-f0-9]{32}$/i ) {
  exit 1337;
}

unless( $format =~ /^(jpg|png|gif|jpeg|bmp)$/i ) {
  exit 1338 - 1;
}

unless( -f "$OUT_PATH/$filename.$format" ) {

  my $ua = LWP::UserAgent->new;
  $ua->agent('Mozilla/5.0');
  my $status = $ua->mirror($url, "$OUT_PATH/$filename.$format");
  warn $status if $status;

  my $image = Image::Magick->new;
  my $x = $image->Read("$OUT_PATH/$filename.$format");

  $image->Quantize(colorspace=>'gray'); # in schwarz/weiss weiterreichen

  $x = $image->Write("$OUT_PATH/$filename.$format");

  undef($image);
}

print $cgi->redirect("http://webserver.tld/~username/aprilscherz/$filename.$format?url=$url&ending=$format&digest=$filename");


[Bearbeiten] Probleme, Erweiterungen

Manche Bilder konnten ohne den gesetzten UserAgent nicht geladen werden (Schutzmaßnahme gegen Perl-LWP). Schleifen werden überhaupt nicht abgefangen - aber das macht dann sowieso der Client irgendwann.

Der Plan auch CSS-Dateien zu parsen und in Graustufen umzusetzen konnte aufgrund der fehlenden Zeit nicht erfolgreich umgesetzt werden.

[Bearbeiten] Quelle

Der Dank geht an Pete, der das zum Ärgern der Nachbarn verwendet hat die einfach sein WLAN mitbenutzen und natürlich dem FeM e.V..

Meine Werkzeuge