Mercurial > prosody-modules
comparison mod_auth_dovecot/auth_dovecot/mod_auth_dovecot.lua @ 474:942738953ff3
mod_auth_dovecot: Replace with SASL proxying version.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 10 Nov 2011 11:24:31 +0100 |
| parents | |
| children | 0c130c45b7c1 |
comparison
equal
deleted
inserted
replaced
| 473:99b246b37809 | 474:942738953ff3 |
|---|---|
| 1 -- Dovecot authentication backend for Prosody | |
| 2 -- | |
| 3 -- Copyright (C) 2010-2011 Waqas Hussain | |
| 4 -- Copyright (C) 2011 Kim Alvefur | |
| 5 -- | |
| 6 | |
| 7 local name = "Dovecot SASL"; | |
| 8 local log = require "util.logger".init("auth_dovecot"); | |
| 9 | |
| 10 local socket_path = module:get_option_string("dovecot_auth_socket", "/var/run/dovecot/auth-login"); | |
| 11 local socket_host = module:get_option_string("dovecot_auth_host", "127.0.0.1"); | |
| 12 local socket_port = module:get_option_string("dovecot_auth_port"); | |
| 13 | |
| 14 local service_realm = module:get_option("realm"); | |
| 15 local service_name = module:get_option("service_name"); | |
| 16 local append_host = module:get_option_boolean("auth_append_host"); | |
| 17 local validate_domain = module:get_option_boolean("validate_append_host"); | |
| 18 local handle_appended = module:get_option_string("handle_appended"); | |
| 19 local util_sasl_new = require "util.sasl".new; | |
| 20 | |
| 21 local new_dovecot_sasl = module:require "sasl_dovecot".new; | |
| 22 | |
| 23 local new_sasl = function(realm) | |
| 24 return new_dovecot_sasl( | |
| 25 service_realm or realm, | |
| 26 service_name or "xmpp", | |
| 27 | |
| 28 socket_port and { socket_path, socket_port } or socket_path, | |
| 29 | |
| 30 { --config | |
| 31 handle_domain = handle_appended or | |
| 32 (append_host and "split" or "escape"), | |
| 33 validate_domain = validate_domain, | |
| 34 } | |
| 35 ); | |
| 36 end | |
| 37 | |
| 38 do | |
| 39 local s = new_sasl(module.host) | |
| 40 assert(s, "Could not create a new SASL object"); | |
| 41 assert(s.mechanisms, "SASL object has no mechanims method"); | |
| 42 local m, _m = {}, s:mechanisms(); | |
| 43 assert(not append_host or _m.PLAIN, "auth_append_host requires PLAIN, but it is unavailable"); | |
| 44 for k in pairs(_m) do | |
| 45 table.insert(m, k); | |
| 46 end | |
| 47 log("debug", "Mechanims found: %s", table.concat(m, ", ")); | |
| 48 end | |
| 49 | |
| 50 provider = { | |
| 51 name = module.name:gsub("^auth_",""); | |
| 52 }; | |
| 53 | |
| 54 function provider.test_password(username, password) | |
| 55 return new_sasl(module.host):plain_test(username, password); | |
| 56 end | |
| 57 | |
| 58 if append_host then | |
| 59 new_sasl = function(realm) | |
| 60 return util_sasl_new(realm, { | |
| 61 plain_test = function(sasl, username, password, realm) | |
| 62 local prepped_username = nodeprep(username); | |
| 63 if not prepped_username then | |
| 64 log("debug", "NODEprep failed on username: %s", username); | |
| 65 return "", nil; | |
| 66 end | |
| 67 prepped_username = prepped_username .. "@" .. module.host; | |
| 68 return provider.test_password(prepped_username, password), true; | |
| 69 end, | |
| 70 }); | |
| 71 end | |
| 72 end | |
| 73 | |
| 74 function provider.get_password(username) | |
| 75 return nil, "Passwords unavailable for "..name; | |
| 76 end | |
| 77 | |
| 78 function provider.set_password(username, password) | |
| 79 return nil, "Passwords unavailable for "..name; | |
| 80 end | |
| 81 | |
| 82 function provider.user_exists(username) | |
| 83 local user_test = new_sasl(module.host); | |
| 84 user_test:select("PLAIN"); | |
| 85 user_test:process(("\0%s\0"):format(username)); | |
| 86 return user_test.username == username; | |
| 87 end | |
| 88 | |
| 89 function provider.create_user(username, password) | |
| 90 return nil, "Account creation/modification not available with "..name; | |
| 91 end | |
| 92 | |
| 93 function provider.get_sasl_handler() | |
| 94 return new_sasl(module.host); | |
| 95 end | |
| 96 | |
| 97 module:add_item("auth-provider", provider); | |
| 98 |
