s5:dwplugins
DokuWiki Plugin Development
Ein Crashkurs
Andreas Gohr
CosmoCode GmbH
Über mich
Agenda
vorab
wenn etwas unverständlich ist: bitte gleich fragen
ich setze grundlegende Programmierkenntnisse voraus
gerne nebenbei mitmachen, ausprobieren oder die Doku überfliegen
die Folien sind online, Notizen aber eventuell trotzdem hilfreich
DokuWiki Features
-
Medieninhalte
Organisation in Namensräumen
Versionierung (Vorhalten älterer Kopien)
Änderungsprotokolle global und pro Seite
Suche
DokuWiki Features
Nutzerverwaltung und Gruppen
ACLs (READ, EDIT, UPLOAD, DELETE)
Lokalisation
Templates (aka. Skins aka. Themes)
Plugins!!!
keine Datenbank
-
Technologien
PHP 5.3+
libraries für JSON, INPUT handling, E-Mail sending, HTTP Client, RSS Parser und Writer, Form Generation, Security, Syntax Highlighting, Zip/TGZ archives…
jQuery und jQuery UI
Integrierter LESS compiler für
CSS
Development Setup
PHP
Webserver
Windows: XAMPP etc. oder microapache von DokuWiki.org
Debian: apt-get install apache
Mac: *schulterzuck*
alternativ: php -S localhost:8000 index.php
DokuWiki
Development Version von DokuWiki nutzen!
-
Wer microapache nutzen will, stable+webserver runterladen, dokuwiki ordner wegschmeissen und durch git checkout ersetzen!
-
Einloggen, Seite editieren, speichern
DokuWiki Directory Struktur
bin - command line tools
conf - Konfigurationsdateien
data - Seiten, Medien, Historie, Suchindex, etc…
inc - core files
lib - templates, plugins, “static files”
vendor - 3rd party libs
_test - unittests - wer das nicht hat, hat keine devel Version!
Development
DokuWiki Plugins
Code um DokuWiki um Funktionalitäten zu erweitern (oder bestehende zu ändern)
Fertige Plugins können über den Extension Manager installiert werden
Einige Core-Funktionen wurden als Plugin implementiert
Ordner in lib/plugins/<plugin>/
self-contained. PHP,
CSS/LESS, JavaScript, Grafiken, etc.
nutzt core funktionen → GPLv2
Plugin Typen
Syntax Plugins - neue Syntax im Editor
Action Plugins - reagiert auf “Hooks” um sich in Standardfunktionalität einzuklinken
Admin Plugins - neue Management Funktionalitäten im Admin Menü
Helper Plugins - Funktionen für andere Plugins
Renderer Plugins - neue Ausgabeformate
Auth Plugins - neue Authentifizierungmethoden
Remote Plugins - neue remote
API Funktionen
Plugin Typen
Kitty Syntax Plugin
Neues Plugin “Kitty”
Neue Syntax:
{{kitty 200 150}}

Plugin Wizard
Wizard nutzen und syntax, admin komponente hinzufügen
translation, config, unit tests includieren
Git & GitHub
check in often, check in early!
Github repo aufmachen
initialen commit pushen
jede signifikante Änderung pushen
Angebot: wenn ihr eure Projekte rechtzeitig pusht, schau ich drüber und geb Feedback
-
Intermission - DokuWiki Parser
zweistufiges caching
instructions werden nur bei Änderung der sourcen neu geparst
re-renderering normalerweise nach maximal einem tag
re-rendering kann von Plugins beeinflusst werden
~~NOCACHE~~ erzwingt rerendering
Kitty Syntax Plugin
code and tell
-
Syntax kann andere Syntax wrappen
Plugins können default syntax überschreiben
Syntax Plugins haben direkten Zugriff auf den Renderer
Syntax Plugins können verschiedene Renderer unterstützen
Syntax nutzt Regular Expressions (keine capture groups!)
-
simples substition plugin
block mode
sortmode 155 - good middle ground, before most of the other syntax
\{\{kitty \d \d\}\}
placekitten.com bild ausgeben
Translation
Konfiguration
Adding Styles
code and tell
-
DokuWiki hat built-in LESS parser (unterstützt evtl. nicht alle Features von lesscss.org)
(screen|print|all).(less|css)
für verschiedene Ausgabemodi
Media-Queries nur in all.(less|css)
!
Adding JavaScript
Unittests
Datenbanken
DokuWiki hat keine Datenbank - manchmal möchte man aber eine
Einfachste Lösung: SQLite
DokuWiki hat das SQLite Plugin
Kitty Names
Neue Syntax: {{kitty charly}}
sucht in der DB nach dem Namen und zeigt die richtige Katze an
sqlite Plugin via Extensionmanager installieren
Kitty Names DB
code and tell
-
plugin_load('helper', 'sqlite')
liefert instanz
migrationen nur aufwärts (keine downgrades)
queries mit Platzhaltern (übernimmt korrektes Escaping)
Anpassung der Syntax - keine unterstützung der alten syntax, .+?
simples schema (name,width,height) und insertion von einigen Katzennamen
CREATE TABLE kittens (
name PRIMARY KEY,
width INT,
height INT
);
public static function getDB() {
/** @var helper_plugin_sqlite $sqlite */
$sqlite = plugin_load('helper', 'sqlite');
$sqlite->init('kitty', __DIR__.'/db/');
return $sqlite;
}
übergeben der gefundenen width,height an den bisherigen renderer
Intermission: Security!
PHP hat einen schlechten Ruf was Sicherheitslücken angeht
Nicht weil PHP per se unsicher ist, aber es ist besonders einfach sich in den Fuß zu schießen!
-
Security: XSS
Cross-Site-Scripting (jemand schiebt euch JavaScript unter)
niemals Nutzereingaben unescaped ins
HTML schreiben!
Nutzereingaben kommen von:
URL-Parametern, Wiki-Syntax, DB-Einträgen, etc.
htmlspecialchars()
steht in DokuWiki unter hsc()
zur Verfügung
$renderer->doc .= hsc($data);
Security: SQL-Injection
SQL-Injection (jemand schiebt eigenen Code in eure SQL-Abfragen)
Daten müssen korrekt escaped werden
sqlite Plugin macht das bei der Nutzung der ?
Platzhalter
$sqlite→query('SELECT * FROM foo WHERE bar = ?', array($data));
Security: CSRF
Cross-Site-Remote-Forgery (jemand bringt euch dazu privilegierten Code auszuführen)
DokuWiki's Form Mechanismus erzeugt einen Sciherheits-Token
Token mit checkSecurityToken()
prüfen bevor privilegierte Aufgaben durchgeführt werden
PHP's Duck-Typing ermöglicht Angriffe die ihr nicht vorhergesehen habt
DokuWiki hat ein globales $INPUT
object für den Zugriff auf request Variablen
$INPUT->post->str('foo');
gibt immer einen String zurück
-
Kitty Admin
Admin Interface um neue Namen in die Datenbank zu schreiben
Nutzung des Form-Mechanismus
Wir machen ein paar Sicherheitsfehler und beheben sie
Kitty Admin
simples Form mit Name, height, width, submit
REPLACE INTO kitten (name, width, height) VALUES ('$name', '$width', '$height');
msg(“Inserting $name”)
kein CSRF token check
vulnerabilities zeigen (XSS wird von chrome abgefangen)
fixen
Offene Fragen
Learn more
s5/dwplugins.txt · Last modified: 2016/10/31 13:50 by andi