Mercurial > prosody-modules
comparison mod_auth_http_async/mod_auth_http_async.lua @ 1421:295c30e44ba8
mod_auth_http_async: Async HTTP auth module
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 29 May 2014 17:46:42 +0200 |
| parents | |
| children | 39a0a35f02bc |
comparison
equal
deleted
inserted
replaced
| 1420:808950ab007b | 1421:295c30e44ba8 |
|---|---|
| 1 -- Prosody IM | |
| 2 -- Copyright (C) 2008-2013 Matthew Wild | |
| 3 -- Copyright (C) 2008-2013 Waqas Hussain | |
| 4 -- Copyright (C) 2014 Kim Alvefur | |
| 5 -- | |
| 6 -- This project is MIT/X11 licensed. Please see the | |
| 7 -- COPYING file in the source package for more information. | |
| 8 -- | |
| 9 | |
| 10 local usermanager = require "core.usermanager"; | |
| 11 local new_sasl = require "util.sasl".new; | |
| 12 local base64 = require "util.encodings".base64.encode; | |
| 13 local waiter =require "util.async".waiter; | |
| 14 local http = require "net.http"; | |
| 15 | |
| 16 local log = module._log; | |
| 17 local host = module.host; | |
| 18 | |
| 19 local api_base = module:get_option_string("http_auth_url", ""):gsub("$host", host); | |
| 20 if api_base == "" then error("http_auth_url required") end | |
| 21 | |
| 22 local provider = {}; | |
| 23 | |
| 24 function provider.test_password(username, password) | |
| 25 log("debug", "test password for user %s at host %s", username, host); | |
| 26 | |
| 27 local wait, done = waiter(); | |
| 28 | |
| 29 local code = -1; | |
| 30 http.request(api_base:gsub("$user", username), { | |
| 31 headers = { | |
| 32 Authorization = "Basic "..base64(username..":"..password); | |
| 33 }; | |
| 34 }, | |
| 35 function(body, _code) | |
| 36 code = _code; | |
| 37 done(); | |
| 38 end); | |
| 39 | |
| 40 wait(); | |
| 41 | |
| 42 if code >= 200 and code <= 299 then | |
| 43 return true; | |
| 44 else | |
| 45 module:log("debug", "HTTP auth provider returned status code %d", code); | |
| 46 return nil, "Auth failed. Invalid username or password."; | |
| 47 end | |
| 48 end | |
| 49 | |
| 50 function provider.set_password(username, password) | |
| 51 return nil, "Changing passwords not supported"; | |
| 52 end | |
| 53 | |
| 54 function provider.user_exists(username) | |
| 55 return true; | |
| 56 end | |
| 57 | |
| 58 function provider.create_user(username, password) | |
| 59 return nil, "User creation not supported"; | |
| 60 end | |
| 61 | |
| 62 function provider.delete_user(username) | |
| 63 return nil , "User deletion not supported"; | |
| 64 end | |
| 65 | |
| 66 function provider.get_sasl_handler() | |
| 67 return new_sasl(host, { | |
| 68 plain_test = function(sasl, username, password, realm) | |
| 69 return usermanager.test_password(username, realm, password), true; | |
| 70 end | |
| 71 }); | |
| 72 end | |
| 73 | |
| 74 module:provides("auth", provider); | |
| 75 |
