ngx_http_secure_link_module

Kirill A. Korinskiy catap+nginx на catap.ru
Пн Мар 15 13:14:32 MSK 2010


Выкладываю патчик в общественнсти.

At Fri, 5 Mar 2010 18:16:54 +0800,
proforg <proforg at maloletka.ru> wrote:
> 
> А модуль вообще заработал с
> secure_link_secret $remote_addr; ?
> У меня вышло запустить его  только с фиксированным secret :(
> 
> 2009/9/20 MARS <mars_dtc at mail.ru>:
> > -----Original Message-----
> > From: MARS <mars_dtc at mail.ru>
> > To: nginx-ru at sysoev.ru
> > Date: Sat, 19 Sep 2009 21:21:31 +0400
> > Subject: Re: ngx_http_secure_link_module
> >
> >> но теперь возникла другая - ngx_http_secure_link_module перестает дружить с ngx_http_flv_module
> >> при одновременном использовании получаем 404 для *.flv файлов, без ngx_http_flv_module  - все
> >> отлично
> >>
> >> так же вопрос можно ли использовать ngx_http_secure_link_module с "location  /"?
> >> с аналогичными строками конфига для "location  /" - получаем вечный 403
> >
> > при включенной опции "стриминга" в плеере, он, при попытке воспроизведения, передает серверу дополнительные параметры и запрашивает файл таким образом:
> > имя_файла.flv?start=X&client=XXXXXX&id=XXX&version=XXX&width=XXX
> >
> > получаем 404
> >
> > пробовал захешировать имя файла вместе с параметрами, успехом не увенчалось.
> >
> > получаем 403
> >
> > Есть какие-либо соображения как подружить эти два модуля?
> >
> >
> 
> 
> -- 
> Aleksej Besciokov
> EMail/JID: proforg at maloletka.ru
> phone: +7 495 7853149
> _______________________________________________
> nginx-ru mailing list
> nginx-ru at nginx.org
> http://nginx.org/mailman/listinfo/nginx-ru

-- 
wbr, Kirill

===File
~/src/nginx-catap/0001-Implement-support-complex-value-for-secure_link_secr.patch===
>From 454ea23ca6ed991848c5d229568915d03d62203d Mon Sep 17 00:00:00 2001
From: Kirill A. Korinskiy <catap at catap.ru>
Date: Mon, 8 Mar 2010 15:35:29 +0300
Subject: [PATCH] Implement support complex value for `secure_link_secret'
Cc: catap at catap.ru

---
 src/http/modules/ngx_http_secure_link_module.c |   56 +++++++++++++++++++-----
 1 files changed, 45 insertions(+), 11 deletions(-)

diff --git a/src/http/modules/ngx_http_secure_link_module.c b/src/http/modules/ngx_http_secure_link_module.c
index 2f9351d..0eee63c 100644
--- a/src/http/modules/ngx_http_secure_link_module.c
+++ b/src/http/modules/ngx_http_secure_link_module.c
@@ -11,7 +11,7 @@
 
 
 typedef struct {
-    ngx_str_t  secret;
+    ngx_http_complex_value_t  secret;
 } ngx_http_secure_link_conf_t;
 
 
@@ -19,13 +19,15 @@ static void *ngx_http_secure_link_create_conf(ngx_conf_t *cf);
 static char *ngx_http_secure_link_merge_conf(ngx_conf_t *cf, void *parent,
     void *child);
 static ngx_int_t ngx_http_secure_link_add_variables(ngx_conf_t *cf);
+static char *ngx_http_secure_link_secret(ngx_conf_t *cf, ngx_command_t *cmd,
+    void *conf);
 
 
 static ngx_command_t  ngx_http_secure_link_commands[] = {
 
     { ngx_string("secure_link_secret"),
       NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
-      ngx_conf_set_str_slot,
+      ngx_http_secure_link_secret,
       NGX_HTTP_LOC_CONF_OFFSET,
       offsetof(ngx_http_secure_link_conf_t, secret),
       NULL },
@@ -74,6 +76,7 @@ ngx_http_secure_link_variable(ngx_http_request_t *r,
 {
     u_char                        *p, *start, *end, *last;
     size_t                         len;
+    ngx_str_t                      secret;
     ngx_int_t                      n;
     ngx_uint_t                     i;
     ngx_md5_t                      md5;
@@ -82,10 +85,17 @@ ngx_http_secure_link_variable(ngx_http_request_t *r,
 
     conf = ngx_http_get_module_loc_conf(r, ngx_http_secure_link_module);
 
-    if (conf->secret.len == 0) {
+    if (conf->secret.value.len == 0) {
         goto not_found;
     }
 
+    if (ngx_http_complex_value(r, &conf->secret, &secret) != NGX_OK) {
+        goto not_found;
+    }
+
+    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
+		   "secure_link secret: \"%V\"", &secret);
+
     p = &r->unparsed_uri.data[1];
     last = r->unparsed_uri.data + r->unparsed_uri.len;
 
@@ -119,7 +129,7 @@ url_start:
 
     ngx_md5_init(&md5);
     ngx_md5_update(&md5, p, len);
-    ngx_md5_update(&md5, conf->secret.data, conf->secret.len);
+    ngx_md5_update(&md5, secret.data, secret.len);
     ngx_md5_final(hash, &md5);
 
     for (i = 0; i < 16; i++) {
@@ -155,12 +165,6 @@ ngx_http_secure_link_create_conf(ngx_conf_t *cf)
         return NULL;
     }
 
-    /*
-     * set by ngx_pcalloc():
-     *
-     *     conf->secret = { 0, NULL }
-     */
-
     return conf;
 }
 
@@ -171,7 +175,9 @@ ngx_http_secure_link_merge_conf(ngx_conf_t *cf, void *parent, void *child)
     ngx_http_secure_link_conf_t *prev = parent;
     ngx_http_secure_link_conf_t *conf = child;
 
-    ngx_conf_merge_str_value(conf->secret, prev->secret, "");
+    if (conf->secret.value.len == 0) {
+        conf->secret = prev->secret;
+    }
 
     return NGX_CONF_OK;
 }
@@ -191,3 +197,31 @@ ngx_http_secure_link_add_variables(ngx_conf_t *cf)
 
     return NGX_OK;
 }
+
+
+static char *
+ngx_http_secure_link_secret(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+    ngx_http_secure_link_conf_t    *slcf = conf;
+
+    ngx_str_t                         *value;
+    ngx_http_compile_complex_value_t   ccv;
+
+    if (slcf->secret.value.len) {
+        return "is duplicate";
+    }
+
+    value = cf->args->elts;
+
+    ngx_memzero(&ccv, sizeof(ngx_http_compile_complex_value_t));
+
+    ccv.cf = cf;
+    ccv.value = &value[1];
+    ccv.complex_value = &slcf->secret;
+
+    if (ngx_http_compile_complex_value(&ccv) != NGX_OK) {
+        return NGX_CONF_ERROR;
+    }
+
+    return NGX_CONF_OK;
+}
-- 
1.6.6.1

============================================================



Подробная информация о списке рассылки nginx-ru