Lighttpd: mod_securedownload wrapper

Als ich mich die Tage mit mod_secdownload
für den Lighty befasste, fiel mir ein für mich nicht tragbarer Mängel auf: Ich würde gerne die Auslieferung der Datei über ein Wrapper script vornehmen lassen, um wie in meinem benötigten Fall die ausgelieferten Bilder mit einem Dynamischen Watermark zu versehen, welches Userabhängig ist. Dieser Patch ist für 1.4.16 könnte aber auch auf älteren Versionen laufen.

Ich muß gestehen das ich noch keine Peilung von c habe aber ich finde ich habe es trotzdem gut hinbekommen :D

CODE:

--- ../lighttpd-1.4.16/src/mod_secure_download.c        2006-10-04 15:26:23.000000000 +0200
+++ ./src/mod_secure_download.c 2007-08-24 08:42:34.488077064 +0200

@@ -36,6 +36,7 @@
        buffer *doc_root;
        buffer *secret;
        buffer *uri_prefix;
+       buffer *wrapper;


        unsigned short timeout;
 } plugin_config;
@@ -76,6 +77,7 @@
                        buffer_free(s->secret);
                        buffer_free(s->doc_root);
                        buffer_free(s->uri_prefix);
+                       buffer_free(s->wrapper);


                        free(s);
                }
@@ -100,6 +102,7 @@
                { "secdownload.document-root",     NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION },       /* 1 */
                { "secdownload.uri-prefix",        NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION },       /* 2 */
                { "secdownload.timeout",           NULL, T_CONFIG_SHORT, T_CONFIG_SCOPE_CONNECTION },        /* 3 */
+               { "secdownload.wrapper",           NULL, T_CONFIG_STRING, T_CONFIG_SCOPE_CONNECTION },       /* 4 */

                { NULL,                            NULL, T_CONFIG_UNSET, T_CONFIG_SCOPE_UNSET }
        };

@@ -115,11 +118,13 @@
                s->doc_root      = buffer_init();
                s->uri_prefix    = buffer_init();
                s->timeout       = 60;
+               s->wrapper       = buffer_init();


                cv[0].destination = s->secret;
                cv[1].destination = s->doc_root;
                cv[2].destination = s->uri_prefix;
                cv[3].destination = &(s->timeout);
+               cv[4].destination = s->wrapper;


                p->config_storage[i] = s;

@@ -165,6 +170,7 @@
        PATCH(secret);
        PATCH(doc_root);
        PATCH(uri_prefix);
+       PATCH(wrapper);

        PATCH(timeout);

        /* skip the first, the global context */
@@ -187,6 +193,8 @@
                                PATCH(uri_prefix);
                        } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("secdownload.timeout"))) {
                                PATCH(timeout);
+                       } else if (buffer_is_equal_string(du->key, CONST_STR_LEN("secdownload.wrapper"))) {
+                               PATCH(wrapper);

                        }
                }
        }
@@ -210,6 +218,8 @@

        if (buffer_is_empty(p->conf.uri_prefix)) return HANDLER_GO_ON;

+       if (buffer_is_empty(p->conf.wrapper)) return HANDLER_GO_ON;
+

        if (buffer_is_empty(p->conf.secret)) {
                log_error_write(srv, __FILE__, __LINE__, "s",
                                "secdownload.secret has to be set");
@@ -283,7 +293,13 @@
        buffer_copy_string_buffer(con->physical.doc_root, p->conf.doc_root);
        buffer_copy_string(con->physical.rel_path, rel_uri);
        buffer_copy_string_buffer(con->physical.path, con->physical.doc_root);
+
+       if (buffer_is_empty(p->conf.wrapper)) {

        buffer_append_string_buffer(con->physical.path, con->physical.rel_path);
+       } else {
+               buffer_append_string_buffer(con->physical.path, p->conf.wrapper);
+               buffer_copy_string(con->uri.query, rel_uri);
+       }


        return HANDLER_GO_ON;
 }

Anleitung:

cd lighttpd-1.4.16
wget http://blog.quadrat4.de/wp-content/mod_secure_download.patch
patch -p0 < mod_secure_download.patch
make distclean
./configure
make
make install

Anschliessend wie gewohnt mod_securedownload in der lighttpd.conf aktivieren und zu den bestehenden Parametern folgenden hinzufügen:

secdownload.wrapper         = "wrapper.php"

Die im Beispiel angegebene wrapper.php muß unterhalb des “secdownload.document-root” Verzeichnisses liegen und wird vom Webserver normal ausgeführt, auch wenn Sie nicht im regulären Docroot liegt.

Die wrapper.php (perl könnte auch Funktionieren) empfängt durch den patch den Dateinamen der auszuliefernden Datei als $_SERVER[’QUERY_STRING’] welchen man dann noch kontrollieren sollte und schliesslich durch die wrapper.php ausliefern kann.

Fragen, Anregungen, Kritik ? Immer her damit!

del.icio.us:Lighttpd: mod_securedownload wrapper digg:Lighttpd: mod_securedownload wrapper spurl:Lighttpd: mod_securedownload wrapper wists:Lighttpd: mod_securedownload wrapper simpy:Lighttpd: mod_securedownload wrapper newsvine:Lighttpd: mod_securedownload wrapper blinklist:Lighttpd: mod_securedownload wrapper furl:Lighttpd: mod_securedownload wrapper reddit:Lighttpd: mod_securedownload wrapper fark:Lighttpd: mod_securedownload wrapper blogmarks:Lighttpd: mod_securedownload wrapper Y!:Lighttpd: mod_securedownload wrapper smarking:Lighttpd: mod_securedownload wrapper magnolia:Lighttpd: mod_securedownload wrapper segnalo:Lighttpd: mod_securedownload wrapper

Kommentar schreiben

:-< (@) (D) (~) (ap) (I) (Z) (8) :-s (mp) (||) (a) :-) (K) :-O :> (w) (&) (u) (so) (f) :-[ (p) (N) :p (H) (tu) (x) (T) :@ (xx) (r) |-) (}) (G) (c) (%) :-* (o) (#) (?) <:o) (L) :-$ *-) (st) (Y) (S) ({) (yn) (*) (co) :-| (B) (M) (li) (h5) (sn) (bah) (um) :-# :'( (^) 8-) (ci) ;) 8o| (ip) (mo) +o( (E) (pl) 8-| (6) (au) :^) (brb) ^o) (pi)