diff --git a/README b/README new file mode 100644 index 0000000..c710b2f --- /dev/null +++ b/README @@ -0,0 +1,53 @@ +Name + ngx_http_remote_passwd - Make the Basic Auth password available as $remote_passwd variable + +Synopsis + # pass password to backend via GET + location /secret { + auth_basic "secret"; + auth_basic_user_file /etc/nginx/secret.users; + + proxy_pass https://my.secret.com/dologin?user=$remote_user&password=$remote_passwd; + } + +Limitations + Only works for Basic Auth. + +Report Bugs + Create a ticket on the issue tracking interface of GitHub: + http://github.com/x-way/ngx_http_remote_passwd/issues + +Source Repository + Available on GitHub: + http://github.com/x-way/ngx_http_remote_passwd + +Author + Andreas Jaggi + +Copyright & License + Copyright (c) 2011 Andreas Jaggi + + This module is licensed under the terms of the BSD license. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/config b/config new file mode 100644 index 0000000..413a4c2 --- /dev/null +++ b/config @@ -0,0 +1,3 @@ +ngx_addon_name=ngx_http_remote_passwd +HTTP_MODULES="$HTTP_MODULES ngx_http_header_subs_filter_module" +NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_remote_passwd.c" diff --git a/ngx_http_remote_passwd.c b/ngx_http_remote_passwd.c new file mode 100644 index 0000000..4220bbb --- /dev/null +++ b/ngx_http_remote_passwd.c @@ -0,0 +1,83 @@ +/* + * ngx_http_remote_passwd - Make the Basic Auth password available as $remote_passwd variable + * + * Copyright (c) 2011, Andreas Jaggi + */ + +#include +#include +#include + + + +static ngx_int_t ngx_http_remote_passwd_add_variable(ngx_conf_t *cf); +static ngx_int_t ngx_http_variable_remote_passwd(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data); + + + +static ngx_http_module_t ngx_http_remote_passwd_module_ctx = { + ngx_http_remote_passwd_add_variable, /* preconfiguration */ + NULL, /* postconfiguration */ + + NULL, /* create main configuration */ + NULL, /* init main configuration */ + + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + + NULL, /* create location configuration */ + NULL, /* merge location configuration */ +}; + +ngx_module_t ngx_http_remote_passwd_module = { + NGX_MODULE_V1, + &ngx_http_remote_passwd_module_ctx, /* module context */ + NULL, /* module directives */ + NGX_HTTP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + + +static ngx_int_t ngx_http_remote_passwd_add_variable(ngx_conf_t *cf) { + ngx_http_variable_t *v; + + v = ngx_http_add_variable(cf, ngx_string("remote_passwd"), 0); + if (v == NULL) { + return NGX_ERROR; + } + + v->get_handler = ngx_http_variable_remote_passwd; + + return NGX_OK; +} + +static ngx_int_t ngx_http_variable_remote_passwd(ngx_http_request_t *r, ngx_http_variable_value_t *v, uintptr_t data) { + ngx_int_t rc; + + rc = ngx_http_auth_basic_user(r); + + if (rc == NGX_DECLINED) { + v->not_found = 1; + return NGX_OK; + } + + if (rc == NGX_ERROR) { + return NGX_ERROR; + } + + v->len = r->headers_in.passwd.len; + v->valid = 1; + v->no_cacheable = 0; + v->not_found = 0; + v->data = r->headers_in.passwd.data; + + return NGX_OK; +}