Ich werde am Drupal Media Camp sprechen

Als Angesteller von Previon, werde ich am Drupal Media Camp auch eine kleine Session abhalten. Das Thema: Drupal und OOP. Ich habe dazu bereits einen Blogpost geschrieben und werde die dort beschriebenen Konzepte in der Session vorstellen…

Falls jemand Inputs/Bemerkungen/Verbesserungen dazu hat… bitte das Kommentarfeld dazu verwenden. Ich wäre natürlich sehr froh darüber, denn ich bin schon ein wenig nervös.

Objektorientierte Programmierung in Drupal

Vorwort

Irgendwie hat sich dieser Artikel in die Unendlichkeit verlängert, daher werde ich einen Zwei- oder Dreiteiler daraus machen. In diesem ersten Teil geht es lediglich um die Konzepte der Objektorientierten Programmierung und kann eigentlich getrost übersprungen werden, falls man damit bereits vertraut ist. Für alle anderen Empfehle ich doch schwer, sich diesen Artikel mal genüsslich zu lesen (und wahrscheinlich mal eine einfache Hello World Klasse zu schreiben und wohl via Google noch ein wenig mehr darüber zu lesen.

Wahrscheinlich hat schon jeder mal etwas von Objekten und Klassen gehört. Seit Java gross geworden ist, gehört es zu einer guten Software, dass sie eine Objekte Orientierte Architektur aufweist. Dieses Post soll in einigen Zeilen die Konzepte der Objekte Orientierten Programmierung (OOP) vermitteln und dann aufzeigen, wie diese für die Entwicklung von Drupal Modulen eingesetzt werden kann.

Was ist ein Objekt?

Das Konzept von Klassen und Objekten ist für den Anfänger nicht ganz so einfach zu verstehen. Ist der Groschen dann jedoch einmal gefallen, dann kann man es sich nicht mehr vorstellen, dass man es einmal nicht verstanden hat (wohl ähnlich wie beim Autofahren). Ich werde mal versuchen, es in meinen Worten zu erklären. Falls diese nicht verständlich sind, dann gibt es sehr viele Bücher, die versuchen es zu erklären. Google ist dein Freund.

Es gibt Klassen und es gibt Objekte. Klassen sind nicht gleich Objekten! Dies mal als Grundlage. Eine Klasse kann als Bauplan verstanden werden. Diese Klasse gibt vor, wie ein Objekt gebaut werden muss. Nehmen wir an, wir hätten eine Klasse “Auto”. Diese Klasse kann nichts machen, sprich das Auto kann nicht fahren, denn es ist lediglich ein Bauplan für ein Auto. Die Klasse “Auto” schreibt jedoch folgende Dinge vor: Ein Auto hat: 4 Räder, es kann vorwärts und Rückwärts fahren und es ist grün. (ein sehr triviales Auto). Der Plan (die Klasse für dieses Auto würde in PHP wie folgt aussehen:

<!–?php
Class Auto{
private wheels = 4;
private color = “green”;

public function driveForward(){
//Hier Code, damit Auto vorwärts fährt.
}

public function driveBackward(){
//hier Code, damit Auto rückwärts fährt.
}
}
?>

Es gibt Variablen und es gibt Methoden (oder auch Funktionen). Die Variablen beschreiben Eigenschaften des Autos, während die Methoden die Funktionen des Autos beschreiben. Das ist jetzt der Plan. Wie gesagt, der Plan alleine kann noch nicht machen, dass dieses Auto fährt. Es ist lediglich der Bauplan für das Objekt!!!

Jetzt wollen wir das Auto zum Fahren bringen. Dazu müssen wir es jedoch zuerst bauen:

<!–?php
$auto = new Auto();
?>

So, jetzt ist das Auto erstellt. Wir können jetzt dem Auto sagen, dass es vorwärts fahren soll:

<!–?php
$auto->driveForward();
?>

Oky, damit ist hoffentlich ungefähr, was eine Klasse ist und was ein Objekt ist. Nochmals: Eine Klasse ist der Bauplan für das Objekt. Ein Objekt ist als eine sog. Instanz einer Klasse. Es gibt 1 Klasse für unser Auto, aber ich kann dann unendlich viele Instanzen davon erzeugen, sprich z.B. 100 Autos (Objekte).

Unser Beispiel mit dem Auto macht jedoch eigentlich erst Sinn, wenn mehrere verschiedene Objekte beteiligt sind: z.B. Das Objekt “Auto” hat ein Objekt “Motor”, 4 Objekte “Räder”, 4 Objekte “Tür” usw. Wie man sieht, lässt sich damit die Welt abbilden, oder eben Modellieren. Denn die Objekte können miteinander interagieren. Sprich, das Auto könnte auf dem Motor die Methode starten() aufrufen usw.

Objekte und Klasse in Software

Es stellt sich jetzt natürlich die Frage, warum man das ganze in Software braucht. Eine grosse Liste von Funktionen wäre doch viel einfacher. Wenn man ein wenig die Geschichte anschaut, wird das jedoch sehr schnell klar. Eine Programmiersprache, war mal Basic. Dort steht das ganze Programm in einer Datei (meines Wissens), was dann irgendwie so ausschaut (ich verwende PHP Syntax, welcher aber weder PHP noch Basic ist, aber er illustriert die Punkte, welche ich machen soll):

1 print 'hello world'; 2 print 'enter your name'; 3 $name = $_GET['name']; 4 if($name == 'rapsli'){ goto(10) } else{ goto(12) } 10 print 'ich bin cool' 11 goto(20) 12 print 'ich bin uncool' 13 goto(20) 20 print 'danke und tschüss'

Es ist glaube ich jedem leicht verstänlich, dass man so keine wirklichen Programme schreiben kann, denn der Code läuft von oben nach unten durch. Goto erlaubt zwar so Pseudeaufrufe, aber das macht das ganze nicht wirklich besser. Noch kritischer wird das ganze, wenn mehrere Leute daran arbeiten. Wie soll man das denn noch unterteilen?? Eine Katastrophe!

Sehr populär ist der Funktionale Ansatz, welcher daraus entstanden ist und ein wenig verwandt mit dem Goto ist:

function getName(){ print 'hello world'; print 'enter your name'; $name = $_GET['name']; return $name; } function printOpinion($op){ print $op; } if(getName() == 'rapsli'){ printOpinion('ich bin cool'); } else{ printOpinion('ich bin uncool'); } printOpinion('danke und tschüss');

Es werden Funktionen definiert, welche dann verwendet werden können im Eigentlichen Programm. Dadurch werden eigentlich zwei Dinge erreicht: 1. Falls die gleiche Aufgabe mehrere Male durchgeführt werden muss, dann muss nicht der Code dubliziert werden, sondern man kann einfach die Funktion mehrere Male aufrufen. 2. Wenn mehrere Personen am gleichen Progamm arbeiten, dann kann das ganze gekapselt werden. Programmierer A ist für Funktion 1 zuständig, während Programmierer B für Funktion 2 zuständig ist. Man muss sich lediglich darauf einigen, was die Funktion für Argumente übernimmt und was sie zurück gibt. Dies ist doch eigentlich schon ein sehr grosser Schritt, aber eben meistens für richtig Grosse Projekte noch nicht gut.

Vorteile von OOP

OOP hat einige sehr wesentliche Vorteile:

  • Stärkere Kapselung möglich
  • Vererbungsmöglichkeiten. Dadurch wird der Code eleganter und schlanker
  • Programmierung gegen Interfaces, was ein Programmieren am gleichen Projekt mit vielen Entwickler massiv vereinfacht und wiederum die Kapselung fördert.
  • Wiederverwendung stark erleichtert: Man kann eine Klasse schreiben, sagen was rein muss und was reinkommt und dann lässt sich diese Klasse sehr gut verwenden, ohne dass man verstehen muss, was im Innern genau vorgeht. Über Vererbung lassen sich solche Klassen auch sehr leicht umändern
  • Leichtere Wartung von Code. Der Nutzer einer Klasse greift lediglich über klar definierte Schnittstellen auf das Objekt zu. Solange diese Schnittstellen nicht verändert werden, kann man in der Klasse drin, machen was man will (natürlich solange noch das richtige Resultat rauskommt.
  • Polymorphismus ist möglich (wobei das bei PHP nicht wirklich ins Gewicht fällt).

Das sind doch schon einige gewichtige Vorteile, welche eigentlich in der heutigen Software Welt nicht mehr wegzudenken sind. Eigentlich setzen auch alle neuen Programmiersprachen darauf:

  • PHP: Bis Version 4 eigentlich noch sehr Funktionalorientiert, mit Version 5 gibt es jedoch die Möglichkeit, sehr Objektorientiert zu entwickeln.
  • Java: Ohne Objekt nix los.
  • C#: Objekt Orientiert
  • C++: Objekt Orientiert

Dann gibt es noch SmallTalk, Eiffel und wie sie alle heissen… Was ich damit sagen will, die Zukunft liegt auf jeden Fall bei Objekten und Klassen, Vererbung und Polymorphismus.

Drupal Module – Review und Tutorial – Admin Menu

Es kommen immer wieder neue Administrationstools, dashboard usw. hinzu, aber ich denke, ich bleibe dem Admin Menu treu. Das Admin Menu gibt das Admin Menu als Dropdown Menu aus. Es beschränkt sich dabei auf einen Balken von 20 Pixel am oberen Ende des Bildschirms. Und erlaubt den Zugriff auf sämliche für die Administration notwendigen Seiten.

Admin Menu hat jedoch noch ein paar andere nette Features: Es wird angezeigt, wieviele Besucher aktuell auf der Seite sind. Zusätzlich befinden sich in der linken oberen Ecke ein Schnellzugriff auf diverse wichtige Admin Tasks: Cache leeren, Cronjob aufführen und updates.php Seite aufrufen. Cache leeren und auch den Variablen Editor aufrufen wird erst mit dem Devel Modul über Admin Menu möglich.

Einsatz:

Dieses Modul ist einfach ein Must für jeden Administrator einer Drupalseite, weil dadurch viele der täglichen Tasks eines Drupal Admins viel schneller durchgeführt werden können.

Drupal Module – Review und Tutorial – Masquerade

Ich bin immer wieder überrascht, wieviele Module es gibt, welche man eigentlich gar nicht richtig kennt, bzw. man weiss nicht richtig, wie diese einzusetzen sind. Daher möchte ich hier eine kleine neue Serie starten, in der ich ein paar meiner Lieblingsmodule nehme und kurz erkläre, was sie machen und wie man sie am besten verwendet. Selbstverständlich kannst du mir auch eine Anfrage für ein bestimmtes Modul schicken. Ich kann zwar nicht versprechen, dass ich auch darauf eingehen werde, aber Inputs sind immer gut, und so lerne ich vielleicht auch mal ein paar neue Module kennen.

Ich bräuchte noch irgend einen guten Namen für diese Serie. Wie wäre: “Drupal Module – Review und Tutorial”.

Masquerade

Ein kleines praktisches Helferlein, welches besonders dann sehr hilfreich ist, wenn eine Seite mit mereren Benutzern und Rollen gebaut wird. Es erlaubt dem Administrator (oder wer auch immer die entsprechende Berechtigung hat) in die Rolle einer beliebigen anderen Person zu schlüpfen. Dadurch kann man relativ einfach testen, ob die Rollen richtig gesetzt sind, ohne für jede Rolle einen eigenen Testuser anzulegen, und sich dann dauernd auszuloggen und wieder einzuloggen. Dies kann ein echtes Zeitersparnis sein und sollte eigentlich auf keiner Multiuser Seite fehlen, denn sonst passiert es sehr schnell, dass man die Berechtigungen falsch eingestellt hat, weil man nicht getestet hat.

Installieren und Konfigurieren:

Installation erfolgt wie jedes andere Drupal Modul. Einfach das Masquerade Modul installieren. Danach muss man in die Block Verwaltung gehen und dort den Masquerade Block hinzufügen, sonst kann man nämlich gar nichts damit anfangen. Sobald der Block hinzugefügt ist, erscheint ein kleines Formular mit Autocompletion -> man kann sich jetzt als einen beliebigen User tarnen. Oh, nicht vergessen, noch die richtigen Berechtigungen bei den Rollen zu setzten, sonst passiert nämlich gar nichts.

Unter admin/settings/masquerade lassen sich noch ein paar Einstellungen vornehmen. Besonders die Quickswitches sind sehr sehr nützlich.

Warnung:

Die Berechtigungen für die Benutzung von Masquerade nicht falsch setzen, das könnte sonst fatale folgen haben. Wenn nämlich der normale Besucher die Berechtigung für die Benutzung von Masquerade hat, so kann er sich als einen beliebigen User “tarnen” -> auch als Admin!!!

Interessante Module und Beiträge zu Drupal

Für alle die, die es noch nicht gesehen haben. Auf der linken Seite gibt es einen neuen Block: “Nützliches rund um Drupal”. Ich bin eigentlic ein fleissiger Leser von Planet Drupal und sehe da immer wieder Beitrage, Module oder Themes, welche ich cool finde, aber vielleicht nicht gerade die Zeit habe, mir das genauer anzuschauen. Daher habe ich ein kleines delicious RSS Feed eingerichtet, damit ich die interessanten Beiträge später nicht vergesse.

Vielleicht nützt es ja dem einen oder anderen etwas…

Ein Co-Browsing System mit Drupal

Yes. Vor ziemlich genau 6 Monaten habe ich mit diesem Projekt angefangen. Es ging darum, zusammen mit einem Reisebüro einen Prototypen für eine Co-Browsing Applikation zu entwickeln und diesen zu evaluieren. Hier ein kurzer Überblick:

  1. Requirements sammeln
  2. Proof of Concept
  3. Requriements verfeinern
  4. Erster früher Prototyp
  5. Technische Mängel beheben
  6. Evaluation

Resultat ist ein sehr interessantes System, welches in Drupal geschrieben ist. Das System verfolgt das Ziel, die Reiseberatung per Telefon visuell zu unterstützen. Dazu dient eben dieses Co-Browsing System. Ein Co-Browsing System erlaubt mehreren Benutzer synchronisiert zu browsen.

TeleSmarttravel Screenshot

Dadurch gewinnt die Telefonberatung wieder an Bedeutung, denn:

  1. Der Kunde ist relativ unabhängig und flexibel
  2. Er hat eine grosse Auswahl an Produkten
  3. Er kann selber aktiv in den Planungsprozess eingreifen
  4. Er hat einen richtigen Menschen als Ansprechperson -> Mal im Ernst für teure Sachen fühlt man sich immer wohl, einen Verantwortlichen zu haben (mir geht es auf jeden Fall so).

Das Szenario sieht wie folgt aus: Der Benutzer suft auf der Seite, er kann sich die ganzen Produkte zusammenklicken und dann auf Wunsch eine Beratungsanfrage abschicken. Sobald ein Berater frei ist, bekomme der Kunde einen Rückruf. Der Berater kann sich jetzt beim Kunden einklinken und sich seinen “Warenkorb” anschauen und gegebenfalls weitere Ratschläge geben.

Oky, für die Arbeit wurde das Szenario ein wenig vereinfacht, aber das Grundprinzip des Co-Browsen bleibt bestehen.

Technisch gesehen wurde es als eine Push-/Poll Architektur implementiert. Diese weist natürlich einige Mängel auf, aber war für die Zwecke vollkommend ausreichend.

Warum habe ich Drupal gewählt? Ganz einfach, ich liebe Drupal ;) . Nein, im Ernst:

  1. Die ganze Kommunikation Kunden – Berater läuft über die Session ab. Da Drupal hier ein stabiles Framework zur Verfügung stellt, nimmt das viel Arbeit ab!
  2. Die ganze Benutzerverwaltung muss man nicht nochmals neu erfinden, wenn es doch schon so schön gelöst ist.
  3. Die ganzen Administrativen Einstellungen (inkl. Formapi) sind einfach super genial und nehmen einem soooo viel Arbeit ab.

Es sind nicht viele Gründe, aber die haben eigentlich gereicht. Zudem ermöglich die Modularisierung eine gute Abkapslung -> was wiederum einfacherer Code bedeutet.

Oky. Jetzt ist es Zeit zum Schlafen. Falls jemand an der Arbeit interessiert ist, kann er sich gerne bei mir melden. Wie gesagt: Drupal steht in der Arbeit nicht im Vordergrund, sondern war lediglich Mittel zum Zweck, aber es stecken doch ein paar interessate Konzepte hinter dem Businesscase.

XSS – Cross Site Scripting mit Bildern – Drupal Security Teil 1

XSS – Cross Site Scripting. Was ist das? Wikipedia erklärt das am Besten:

Cross-Site Scripting (XSS) bezeichnet das Ausnutzen einer Computersicherheitslücke in Webanwendungen, indem Informationen aus einem Kontext, in dem sie nicht vertrauenswürdig sind, in einen anderen Kontext eingefügt werden, in dem sie als vertrauenswürdig eingestuft werden. Aus diesem vertrauenswürdigen Kontext kann dann ein Angriff gestartet werden. [Wikipedia]

Also, ein Beispiel wäre wie folgt. Ein Benutzer schreibt einen Forumsbeitrag und schleust dort einfach ein kleines Script ein, z.B.:

 <script type="text/javascript">alert("XSS");</script>

Wenn man das einfach so ohne Weiteres in die Datenbank schreibt, dann wird der nächste Forenbesucher ein kleine Messagebox angezeigt bekommen, welche “XSS” sagt. Ist eigentlich in diesem Fall nicht weiter schlimm, aber was wäre, wenn da jetzt eine Ajax Verbindung zu einem Server aufgebaut wird, und drin ein Keylogger versteckt ist? Es ist relativ offensichtlich, dass es wahrscheinlich relativ schnell gefährlich werden kann.

Was kann man dagegen machen? Ist eigentlich relativ einfach: Die Tags löschen oder entsprechend in HTML Entities umformen:

&lt;script type="text/javascript"&gt;alert("XSS");&lt;/script&gt;

Das wird dann einfach dargestellt, aber nicht mehr ausgeführt. Wenn man ein Forum erstellt, so kümmert sich Drupal darum, vorausgesetzt, man stellt die Input Formats richtig ein. Per Default sind diese auf Filtert gesetzt. Das heisst, es werden nur ganz wenige HTML Tags zugelassen. Das lässt sich natürlich auch ändern. Das heisst aber sowiel, dass wenn man CCK und Co verwendet ist man eigentlich auf der sicheren Seite.

Wer jedoch selber Module entwickelt, der muss sich auch selber darum kümmern, denn z.B.

hook_menu wird implementiert. Der Benutzer kann ein argument eingeben, welches an die Callback Funktion übergeben wird, welche dann das Argument auf der Seite ausgibt. Wenn man nichts mit dem Input macht, so kann der Benutzer auch irgend etwas eingeben -> Schlecht.

In Drupal gibt es die Funktion check_plain. Die macht genau das, was man braucht. Sie verhindert XSS Sicherheitskücken. Das heisst für den Entwickler: Jeglicher Input Text muss durch diese Funktion geschleust werden -> wenn es lediglich normaler Text sein soll!

Im nächsten Teil geht es um Sicherheitsattacken via Bilder.

Keine Berechtigung, Seiten zu editieren, obwohl Permission gegeben

Es handelt sich um eine sehr triviale Seite. Kein Schnickschnack. Halt einfach eine Seite mit Inhalten. Komischerweise hat sich eine Benutzerin beschwert und gemeint, sie habe bei einigen Seiten keine Rechte, um diese zu editieren -> komisch? Es sind alles Seite von Typ “Page”. Ich habe schnell die Rolle überprüft und eigentlich ist das richtige Häckchen gesetzt. Rechte sollten vorhanden sein. Masquerade einschalten und überprüfen. Node/6/edit -> geht. Node/7/edit -> kein Zugriff. Grrr.

Nein, keine Zusätzliche node_access Module installiert. Hm, was könnte es wohl sein. Mal ein paar mehr Rechte geben, zum Schauen, ob das was ändert -> nichts. Dann pling. Die zündende Idee: Filter! Und siehe da. Die Seiten, welche nicht editierbar waren, waren auf Filter (HTML Full) gesetzt, obwohl der Benutzer für dieses Input Format (oder eben Filter) keine Rechte hat. Das führt dazu, dass der Node natürlich ohne Weiteres angezeigt wird, sobald man den aber editieren möchte man kein Recht dazu hat.

So simpel! Und doch hat mich das 30 Minuten gekostet.

Drupal Interface Module – Nodeformaussehen verändern

Wow. Was man nicht alles machen kann. Eigentlich wollte ich diesen Link nur schnell Bookmarken, damit ich das zu einer besseren Zeit mal ausprobieren kann. Modul sieht absolut cool aus. Via Drag and Drop lässt sich das Interface für einen Node verändern, sprich den Save Button verschieben usw.

Am Besten einfach mal das Screencast angucken, um zu verstehen, was gemeint ist. Es ist ziemlich straight forward. Das Modul scheint jedoch noch nicht veröffentlicht zu sein :( schade. Kommt aber noch.

Ich denke besonders für Seiten, wo viele Benutzer arbeiten, könnte es manchmal gut sein, die ganzen Elemente ein wenig besser anzuordnen… scheint als schreit die ganze Community nach mehr Usability… usability, usability. Aber hey… es ist auch sehr wichtig, da ja nicht nur Freaks und Hacker mit Kommandozeile Drupal bedienen wollen, sollen auch normalsterbliche wie du und ich.

Previon AG ich komme

Mein Studium neigt sich langsam aber sicher einem Ende zu :) … Endlich. Knapp 5 Jahre sass ich in den Höhrsälen und war sehr oft froh und dankbar, dass die Uni ein ziemlich flächendeckendes W-Lan hat :) Das hat doch so manche Stunde gerettet.

Nun, es geht zu ende und ich habe mich in den letzten Monat relativ intensiv nach Stellen umgeschaut. Es hat jetzt eine Ende. Per 1. Mai 2009 werde ich für die Previon AG in Zofingen arbeiten, und werde mich dort intensiv mit Drupal befassen… ihr werdet mich also nicht los, und ich denke, das wird mir die Gelegenheit geben, wieder vermehrt über Drupal zu bloggen. … stay tuned.