Software / code / prosody-modules
Comparison
mod_auth_sql/mod_auth_sql.lua @ 371:c416db434e5b
Do not run in transaction.
Code cleanup.
Changed logging to module logging.
Properly count SQL result rows.
| author | Tomasz Sterna <tomek@xiaoka.com> |
|---|---|
| date | Tue, 26 Apr 2011 19:28:08 +0200 |
| parent | 367:a6dee73a11e7 |
| child | 398:fdd4f5ab029a |
comparison
equal
deleted
inserted
replaced
| 370:16da8cd69715 | 371:c416db434e5b |
|---|---|
| 6 local new_sasl = require "util.sasl".new; | 6 local new_sasl = require "util.sasl".new; |
| 7 local nodeprep = require "util.encodings".stringprep.nodeprep; | 7 local nodeprep = require "util.encodings".stringprep.nodeprep; |
| 8 | 8 |
| 9 local DBI; | 9 local DBI; |
| 10 local connection; | 10 local connection; |
| 11 local host,user,store = module.host; | |
| 12 local params = module:get_option("sql"); | 11 local params = module:get_option("sql"); |
| 13 | 12 |
| 14 local resolve_relative_path = require "core.configmanager".resolve_relative_path; | 13 local resolve_relative_path = require "core.configmanager".resolve_relative_path; |
| 15 | 14 |
| 16 local function test_connection() | 15 local function test_connection() |
| 34 if not dbh then | 33 if not dbh then |
| 35 module:log("debug", "Database connection failed: %s", tostring(err)); | 34 module:log("debug", "Database connection failed: %s", tostring(err)); |
| 36 return nil, err; | 35 return nil, err; |
| 37 end | 36 end |
| 38 module:log("debug", "Successfully connected to database"); | 37 module:log("debug", "Successfully connected to database"); |
| 39 dbh:autocommit(false); -- don't commit automatically | 38 dbh:autocommit(true); -- don't run in transaction |
| 40 connection = dbh; | 39 connection = dbh; |
| 41 return connection; | 40 return connection; |
| 42 end | 41 end |
| 43 end | 42 end |
| 44 | 43 |
| 58 | 57 |
| 59 local function getsql(sql, ...) | 58 local function getsql(sql, ...) |
| 60 if params.driver == "PostgreSQL" then | 59 if params.driver == "PostgreSQL" then |
| 61 sql = sql:gsub("`", "\""); | 60 sql = sql:gsub("`", "\""); |
| 62 end | 61 end |
| 63 if not test_connection() then connect() end | 62 if not test_connection() then connect(); end |
| 64 -- do prepared statement stuff | 63 -- do prepared statement stuff |
| 65 local stmt, err = connection:prepare(sql); | 64 local stmt, err = connection:prepare(sql); |
| 66 if not stmt and not test_connection() then error("connection failed"); end | 65 if not stmt and not test_connection() then error("connection failed"); end |
| 67 if not stmt then module:log("error", "QUERY FAILED: %s %s", err, debug.traceback()); return nil, err; end | 66 if not stmt then module:log("error", "QUERY FAILED: %s %s", err, debug.traceback()); return nil, err; end |
| 68 -- run query | 67 -- run query |
| 73 return stmt; | 72 return stmt; |
| 74 end | 73 end |
| 75 | 74 |
| 76 function new_default_provider(host) | 75 function new_default_provider(host) |
| 77 local provider = { name = "sql" }; | 76 local provider = { name = "sql" }; |
| 78 log("debug", "initializing default authentication provider for host '%s'", host); | 77 module:log("debug", "initializing default authentication provider for host '%s'", host); |
| 79 | 78 |
| 80 function provider.test_password(username, password) | 79 function provider.test_password(username, password) |
| 81 log("debug", "test password '%s' for user %s at host %s", password, username, module.host); | 80 module:log("debug", "test_password '%s' for user %s at host %s", password, username, host); |
| 82 | 81 |
| 83 local stmt, err = getsql("SELECT `username` FROM `authreg` WHERE `username`=? AND `password`=? AND `realm`=?", | 82 local stmt, err = getsql("SELECT `username` FROM `authreg` WHERE `username`=? AND `password`=? AND `realm`=?", |
| 84 username, password, module.host); | 83 username, password, host); |
| 85 | 84 |
| 86 if stmt ~= nil then | 85 if stmt ~= nil then |
| 87 if #stmt:rows(true) > 0 then | 86 local count = 0; |
| 87 for row in stmt:rows(true) do | |
| 88 count = count + 1; | |
| 89 end | |
| 90 if count > 0 then | |
| 88 return true; | 91 return true; |
| 89 end | 92 end |
| 90 else | 93 else |
| 91 log("error", "QUERY ERROR: %s %s", err, debug.traceback()); | 94 module:log("error", "QUERY ERROR: %s %s", err, debug.traceback()); |
| 92 return nil, err; | 95 return nil, err; |
| 93 end | 96 end |
| 94 | 97 |
| 95 return false; | 98 return false; |
| 96 end | 99 end |
| 97 | 100 |
| 98 function provider.get_password(username) | 101 function provider.get_password(username) |
| 99 log("debug", "get_password for username '%s' at host '%s'", username, module.host); | 102 module:log("debug", "get_password for username '%s' at host '%s'", username, host); |
| 100 | 103 |
| 101 local stmt, err = getsql("SELECT `password` FROM `authreg` WHERE `username`=? AND `realm`=?", | 104 local stmt, err = getsql("SELECT `password` FROM `authreg` WHERE `username`=? AND `realm`=?", |
| 102 username, module.host); | 105 username, host); |
| 103 | 106 |
| 104 local password = nil; | 107 local password = nil; |
| 105 if stmt ~= nil then | 108 if stmt ~= nil then |
| 106 for row in stmt:rows(true) do | 109 for row in stmt:rows(true) do |
| 107 password = row.password; | 110 password = row.password; |
| 108 end | 111 end |
| 109 else | 112 else |
| 110 log("error", "QUERY ERROR: %s %s", err, debug.traceback()); | 113 module:log("error", "QUERY ERROR: %s %s", err, debug.traceback()); |
| 111 return nil; | 114 return nil; |
| 112 end | 115 end |
| 113 | 116 |
| 114 return password; | 117 return password; |
| 115 end | 118 end |
| 117 function provider.set_password(username, password) | 120 function provider.set_password(username, password) |
| 118 return nil, "Setting password is not supported."; | 121 return nil, "Setting password is not supported."; |
| 119 end | 122 end |
| 120 | 123 |
| 121 function provider.user_exists(username) | 124 function provider.user_exists(username) |
| 122 log("debug", "test user %s existence at host %s", username, module.host); | 125 module:log("debug", "test user %s existence at host %s", username, host); |
| 123 | 126 |
| 124 local stmt, err = getsql("SELECT `username` FROM `authreg` WHERE `username`=? AND `realm`=?", | 127 local stmt, err = getsql("SELECT `username` FROM `authreg` WHERE `username`=? AND `realm`=?", |
| 125 username, module.host); | 128 username, host); |
| 126 | 129 |
| 127 if stmt ~= nil then | 130 if stmt ~= nil then |
| 128 if #stmt:rows(true) > 0 then | 131 local count = 0; |
| 132 for row in stmt:rows(true) do | |
| 133 count = count + 1; | |
| 134 end | |
| 135 if count > 0 then | |
| 129 return true; | 136 return true; |
| 130 end | 137 end |
| 131 else | 138 else |
| 132 log("error", "QUERY ERROR: %s %s", err, debug.traceback()); | 139 module:log("error", "QUERY ERROR: %s %s", err, debug.traceback()); |
| 133 return nil, err; | 140 return nil, err; |
| 134 end | 141 end |
| 135 | 142 |
| 136 return false; | 143 return false; |
| 137 end | 144 end |
| 139 function provider.create_user(username, password) | 146 function provider.create_user(username, password) |
| 140 return nil, "Account creation/modification not supported."; | 147 return nil, "Account creation/modification not supported."; |
| 141 end | 148 end |
| 142 | 149 |
| 143 function provider.get_sasl_handler() | 150 function provider.get_sasl_handler() |
| 144 local realm = module:get_option("sasl_realm") or module.host; | 151 local realm = module:get_option("sasl_realm") or host; |
| 145 local getpass_authentication_profile = { | 152 local getpass_authentication_profile = { |
| 146 plain = function(sasl, username, realm) | 153 plain = function(sasl, username, realm) |
| 147 local prepped_username = nodeprep(username); | 154 local prepped_username = nodeprep(username); |
| 148 if not prepped_username then | 155 if not prepped_username then |
| 149 log("debug", "NODEprep failed on username: %s", username); | 156 module:log("debug", "NODEprep failed on username: %s", username); |
| 150 return "", nil; | 157 return "", nil; |
| 151 end | 158 end |
| 152 local password = usermanager.get_password(prepped_username, realm); | 159 local password = usermanager.get_password(prepped_username, realm); |
| 153 if not password then | 160 if not password then |
| 154 return "", nil; | 161 return "", nil; |