comparison mod_auth_http_async/mod_auth_http_async.lua @ 2159:5e8dec076afc

mod_auth_http_async: Fall back to non-async calling of http_auth_url if util.async is not available
author JC Brand <jcbrand@minddistrict.com>
date Fri, 15 Apr 2016 13:45:01 +0000
parents 54f9e8663139
children b2a198665946
comparison
equal deleted inserted replaced
2155:f24b02e0d706 2159:5e8dec076afc
7 -- COPYING file in the source package for more information. 7 -- COPYING file in the source package for more information.
8 -- 8 --
9 9
10 local new_sasl = require "util.sasl".new; 10 local new_sasl = require "util.sasl".new;
11 local base64 = require "util.encodings".base64.encode; 11 local base64 = require "util.encodings".base64.encode;
12 local waiter =require "util.async".waiter; 12 local have_async, async = pcall(require, "util.async");
13 local http = require "net.http"; 13 local http = require "net.http";
14 14
15 local log = module._log; 15 local log = module._log;
16 local host = module.host; 16 local host = module.host;
17 17
18 local api_base = module:get_option_string("http_auth_url", ""):gsub("$host", host); 18 local api_base = module:get_option_string("http_auth_url", ""):gsub("$host", host);
19 if api_base == "" then error("http_auth_url required") end 19 if api_base == "" then error("http_auth_url required") end
20 20
21 local function async_http_request(url, ex) 21 local function async_http_request(url, ex)
22 local wait, done = waiter(); 22 local wait, done = async.waiter();
23
24 local content, code, request, response; 23 local content, code, request, response;
25 local function cb(content_, code_, request_, response_) 24 local function cb(content_, code_, request_, response_)
26 content, code, request, response = content_, code_, request_, response_; 25 content, code, request, response = content_, code_, request_, response_;
27 done(); 26 done();
28 end 27 end
33 32
34 local provider = {}; 33 local provider = {};
35 34
36 function provider.test_password(username, password) 35 function provider.test_password(username, password)
37 log("debug", "test password for user %s at host %s", username, host); 36 log("debug", "test password for user %s at host %s", username, host);
38 37 local url = api_base:gsub("$user", username);
39 38 local ex = {
40 local _, code = async_http_request(api_base:gsub("$user", username), {
41 headers = { Authorization = "Basic "..base64(username..":"..password); }; 39 headers = { Authorization = "Basic "..base64(username..":"..password); };
42 }); 40 }
43 41 if (have_async) then
44 if code >= 200 and code <= 299 then 42 local _, code = async_http_request(url, ex);
45 return true; 43 if code >= 200 and code <= 299 then
44 module:log("debug", "HTTP auth provider confirmed valid password");
45 return true;
46 else
47 module:log("debug", "HTTP auth provider returned status code %d", code);
48 end
46 else 49 else
47 module:log("debug", "HTTP auth provider returned status code %d", code); 50 local ok, err = http.request(url, ex, function(body, code)
48 return nil, "Auth failed. Invalid username or password."; 51 if code >= 200 and code <= 299 then
52 module:log("debug", "HTTP auth provider confirmed valid password");
53 else
54 module:log("debug", "HTTP auth provider returned status code %d", code);
55 end
56 end);
57 if ok then
58 return true;
59 end
49 end 60 end
61 return nil, "Auth failed. Invalid username or password.";
50 end 62 end
51 63
52 function provider.set_password(username, password) 64 function provider.set_password(username, password)
53 return nil, "Changing passwords not supported"; 65 return nil, "Changing passwords not supported";
54 end 66 end
72 end 84 end
73 }); 85 });
74 end 86 end
75 87
76 module:provides("auth", provider); 88 module:provides("auth", provider);
77