Lighttpd: mod_securedownload wrapper
loading...
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
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!
