Open Source im professionellen Einsatz

© sTan, Fotolia.com

Perl-Skript automatisiert Datei-Austausch via Dropbox

Ab in die Kiste

Größere Dateien tauscht die Jugend heute gerne über den proprietären Dropbox-Service aus. Dessen Web-API erlaubt auch den Einsatz selbst geschriebener Skripte, beispielsweise zum Abholen einer Datei aus dem Schatten einer Firewall.

Neulich wollte mir eine Praktikantin ein digitales Hörbuch leihen und schlug vor, es mir zu "dropboxen". Dass der unter Dropbox.com erhältliche Service bereits zum Standard für den Austausch größerer Dateien avanciert ist, war mir neu. Auch dass die amerikanische Jugend dropboxen bereits als Verb wie googeln verwendet, gab mir zu denken.

Von der Website auf http://dropbox.com lädt der User kostenlos ein Clientbinary herunter (Windows, Mac und sogar Linux werden unterstützt) und sieht dann auf seinem System einen neuen lokalen Dropbox-Folder. Schiebt er Dateien hinein, springt hinter den Kulissen eine magische Software an, die den neuen Inhalt unauffällig und tröpfchenweise auf den Dropbox-Server hochlädt.

Von dort synchronisieren sich dann weitere Clients desselben Users (oder die von extra autorisierten Freunden) ebenso magisch, sodass ein User auf jedem Computer der Welt einen permanent aktualisierten Order mit seinen Dateien findet. Falls irgendwo kein Dropbox-Client installiert ist, benötigt der User lediglich einen Browser und geht auf die Dropbox-Website (siehe Abbildung 1).

Abbildung 1: Das Webinterface von Dropbox ermöglicht die Manipulation von Dateien auch auf solchen Rechnern, auf denen kein Client installiert ist.

Open Source bevorzugt

Allerdings behagte mir der Gedanke nicht, ein Binary ohne einsehbaren Sourcecode auf meinem PC zu Hause zu starten. Zum Glück bietet Dropbox aber auch ein Web-API an, mit dem ein paranoider Pinguinfreund wie ich seine helle Freude an dem kostenlosen Service haben kann. Vernünftigerweise möchte Dropbox.com auch die User von API-getriebenen Programmen dazu erziehen, ihren Usernamen und ihr Passwort nicht auf irgendwelchen Oberflächen von Drittanbietern einzutippen, und setzt deswegen auf Oauth. Um den User bei der Applikation anzumelden, holt die zunächst von der Dropbox-Website unter Angabe eines Developer-Token und -Secret einen Request-Token mit -Secret ab. Mit dem Request-Token in der URL lenkt dann die Applikation den Browser des Users zur Dropbox-Website, die ihn, falls er dort noch nicht eingeloggt ist, zur Angabe seines Usernamens mit Passwort auffordert (Abbildung 2).

Abbildung 2: Die Perl-Applikation verweist auf Dropbox.com, wo der User seine Kenndaten eingibt, um sich zu autorisieren.

Abbildung 2: Die Perl-Applikation verweist auf Dropbox.com, wo der User seine Kenndaten eingibt, um sich zu autorisieren.

Klappt das Login, fragt Dropbox den User, ob er wirklich damit einverstanden ist, dass die Applikation »Perl Test Client« Zugriff auf seine Dropbox-Daten erhält (siehe Abbildung 3). Bestätigt er dies, lenkt die Dropbox-Website den Browser wieder zurück zur Applikation und schickt in der URL einen so genannten Access-Token mit. Den darf die Applikation dann speichern und damit bis zum Verfallsdatum die Aufträge des Users unter dessen Dropbox-Account ausführen.

Abbildung 3: Der User bestätigt, dass er der Perl-Applikation die Verwaltung seiner Dropbox-Daten anvertraut.

Webserver als Gerüstbau

Da ein Perl-Client als Kommandozeilen-Applikation normalerweise kein Browserinterface betreibt, klopft das Skript »dropbox-init« in Listing 1 mit dem Modul Mojolicious::Lite vom CPAN schnell einen notdürftigen Webserver auf http://localhost:8082 zusammen. Er reagiert auf die Pfade »/« sowie »/callback« und betreibt damit eine Startseite und eine Rücksprungadresse nach erfolgreicher Anmeldung des Users auf der Dropbox-Website. Der HTML-Code, den der Server jeweils ausspuckt, liegt im »__DATA__« -Segment ab Zeile 64. Mojolicious sucht dort wegen des Verweises auf »index« in Zeile 37 nach »@@ index.html.ep« und sendet das dort liegende HTML zurück, nachdem es die Template-Variablen ersetzt hat. Die Anweisung »% layout 'default';« setzt das Drumherum, damit aus der Meldung auch ein wohlgeformtes HTML-Dokument wird.

Listing 1

dropbox-init

01 #!/usr/local/bin/perl -w
02 use strict;
03 use Mojolicious::Lite;
04 use Net::Dropbox::API;
05 use YAML qw(LoadFile DumpFile);
06
07 my $dev_key = "iyaiu823ajksgwf";
08 my $dev_secret = "zlkj32lkj2kl3dp";
09 my $listen = "http://localhost:8082";
10 my($home) = glob '~';
11 my $CFG_FILE = "$home/.dropbox.yml";
12
13 my $CFG = {};
14 $CFG = LoadFile( $CFG_FILE ) if
15 -f $CFG_FILE;
16
17 @ARGV = (qw(daemon --listen), $listen);
18
19 my $box = Net::Dropbox::API->new({
20 key => $dev_key,
21 secret => $dev_secret,
22 });
23
24 my $REQUEST_TOKEN;
25 my $REQUEST_SECRET;
26
27 ###########################################
28 get '/' => sub {
29 ###########################################
30 my ( $self ) = @_;
31
32 $box->callback_url( "$listen/callback" );
33 $self->stash->{login_url} = $box->login;
34
35 $REQUEST_TOKEN = $box->request_token;
36 $REQUEST_SECRET = $box->request_secret;
37 } => 'index';
38
39 ###########################################
40 get '/callback' => sub {
41 ###########################################
42 my ( $self ) = @_;
43
44 $box->auth({
45 request_token =>
46 $self->param('oauth_token'),
47 request_secret =>
48 $REQUEST_SECRET
49 });
50
51 $CFG->{ access_token } =
52 $box->access_token();
53 $CFG->{ access_secret } =
54 $box->access_secret();
55
56 DumpFile $CFG_FILE, $CFG;
57
58 $self->render_text( "Token saved.",
59 layout => 'default' );
60 };
61
62 app->start;
63
64 __DATA__
65 ###########################################
66 @@ index.html.ep
67 % layout 'default';
68 <a href="<%= $login_url %>"
69 >Login on dropbox.com</a>
70
71 @@ layouts/default.html.ep
72 <!doctype html><html>
73 <head><title>Token Fetcher</title></head>
74 <body>
75 <pre>
76 <%== content %>
77 </pre>
78 </body>
79 </html>

Startet der User die Mojolicious-Applikation und tippt http://localhost:8082 in den Browser, erscheint das notdürftige UI in Abbildung 4 mit einem Link auf die Login-Seite von Dropbox.com.

Abbildung 4: Der Mojolicious-Server bringt einen Login-Link, der zu Dropbox.com verweist.

Abbildung 4: Der Mojolicious-Server bringt einen Login-Link, der zu Dropbox.com verweist.

Das Modul Net::Dropbox::API, ebenfalls vom CPAN, abstrahiert schön die Dropbox-Zugriffe und die Oauth-Autorisierung [2]. Setzt der API-Developer im Konstruktoraufruf in Zeile 19 die auf der Dropbox-Developer-Site [3] eingeholte Kombination aus Developer Key und Secret, greift der Aufruf der Methode »login()« (Zeile 33) hinter den Kulissen auf den Dropbox-Server zu, holt einen Request-Token mit Secret ein und liefert eine Login-URL zurück. Diese präsentiert die Webapplikation dann dem User, der sich auf einen Mausklick hin so bei Dropbox anmelden kann (Abbildung 5).

Abbildung 5: Nach dem Einloggen geht die Kontrolle von Dropbox.com wieder an den Mojolicious-Server über, der die Token-Daten in einer YAML-Datei speichert.

Die Mojolicious-Applikation speichert die eingeholten Werte für Request-Token und -Secret in den globalen Variablen »$REQUEST_TOKEN« und »$REQUEST_SECRET« , auf die sie später zugreift, wenn Dropbox.com den Browser nach erfolgreichem Login wieder zurück zum Gerüstserver unter der in Zeile 32 gesetzten Callback-URL sendet.

Erlangt die Mojolicious-Applikation anschließend wieder die Kontrolle, braucht sie sich nur den beigelegten Access-Token aus der Parameterliste des Callback zu schnappen und hat dann zusammen mit dem vorher gespeicherten Request-Token-Secret die Schlüssel in der Hand, um anstelle des Users nach Belieben in dessen Dropbox-Account herumzufuhrwerken. Das Skript speichert die beiden Schlüssel aber nur in der YAML-Datei »~.dropbox.yml« (Abbildung 6), damit später aufgerufene Applikationen sie sich ohne große Klimmzüge dort abholen können.

Abbildung 6: Die vom Skript erzeugte YAML-Datei mit Access-Token und Access-Secret.

Abbildung 6: Die vom Skript erzeugte YAML-Datei mit Access-Token und Access-Secret.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook