Mercurial > prosody-modules
annotate mod_auth_joomla/mod_auth_joomla.lua @ 584:1c2fc3b845f2
mod_admin_web: Clear commands in all cases new ones are loaded (thanks Maranda)
author | Florian Zeitz <florob@babelmonkeys.de> |
---|---|
date | Thu, 26 Jan 2012 19:38:03 +0100 |
parents | 1082856e4612 |
children | 5e71e24e33fc |
rev | line source |
---|---|
422
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
1 -- Joomla authentication backend for Prosody |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
2 -- |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
3 -- Copyright (C) 2011 Waqas Hussain |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
4 -- |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
5 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
6 local new_sasl = require "util.sasl".new; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
7 local nodeprep = require "util.encodings".stringprep.nodeprep; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
8 local saslprep = require "util.encodings".stringprep.saslprep; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
9 local DBI = require "DBI" |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
10 local md5 = require "util.hashes".md5; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
11 local uuid_gen = require "util.uuid".generate; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
12 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
13 local connection; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
14 local params = module:get_option("sql"); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
15 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
16 local resolve_relative_path = require "core.configmanager".resolve_relative_path; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
17 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
18 local function test_connection() |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
19 if not connection then return nil; end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
20 if connection:ping() then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
21 return true; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
22 else |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
23 module:log("debug", "Database connection closed"); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
24 connection = nil; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
25 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
26 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
27 local function connect() |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
28 if not test_connection() then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
29 prosody.unlock_globals(); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
30 local dbh, err = DBI.Connect( |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
31 params.driver, params.database, |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
32 params.username, params.password, |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
33 params.host, params.port |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
34 ); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
35 prosody.lock_globals(); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
36 if not dbh then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
37 module:log("debug", "Database connection failed: %s", tostring(err)); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
38 return nil, err; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
39 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
40 module:log("debug", "Successfully connected to database"); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
41 dbh:autocommit(true); -- don't run in transaction |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
42 connection = dbh; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
43 return connection; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
44 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
45 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
46 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
47 do -- process options to get a db connection |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
48 params = params or { driver = "SQLite3" }; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
49 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
50 if params.driver == "SQLite3" then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
51 params.database = resolve_relative_path(prosody.paths.data or ".", params.database or "prosody.sqlite"); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
52 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
53 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
54 assert(params.driver and params.database, "Both the SQL driver and the database need to be specified"); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
55 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
56 assert(connect()); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
57 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
58 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
59 local function getsql(sql, ...) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
60 if params.driver == "PostgreSQL" then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
61 sql = sql:gsub("`", "\""); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
62 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
63 if not test_connection() then connect(); end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
64 -- do prepared statement stuff |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
65 local stmt, err = connection:prepare(sql); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
66 if not stmt and not test_connection() then error("connection failed"); end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
67 if not stmt then module:log("error", "QUERY FAILED: %s %s", err, debug.traceback()); return nil, err; end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
68 -- run query |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
69 local ok, err = stmt:execute(...); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
70 if not ok and not test_connection() then error("connection failed"); end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
71 if not ok then return nil, err; end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
72 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
73 return stmt; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
74 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
75 local function setsql(sql, ...) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
76 local stmt, err = getsql(sql, ...); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
77 if not stmt then return stmt, err; end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
78 return stmt:affected(); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
79 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
80 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
81 local function get_password(username) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
82 local stmt, err = getsql("SELECT `password` FROM `jos_users` WHERE `username`=?", username); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
83 if stmt then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
84 for row in stmt:rows(true) do |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
85 return row.password; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
86 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
87 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
88 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
89 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
90 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
91 local function getCryptedPassword(plaintext, salt) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
92 return md5(plaintext..salt); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
93 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
94 local function joomlaCheckHash(password, hash) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
95 local crypt, salt = hash:match("^([^:]*):(.*)$"); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
96 return (crypt or hash) == getCryptedPassword(password, salt or ''); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
97 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
98 local function joomlaCreateHash(password) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
99 local salt = uuid_gen():gsub("%-", ""); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
100 local crypt = getCryptedPassword(password, salt); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
101 return crypt..':'..salt; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
102 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
103 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
104 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
105 provider = { name = "joomla" }; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
106 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
107 function provider.test_password(username, password) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
108 local hash = get_password(username); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
109 return hash and joomlaCheckHash(password, hash); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
110 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
111 function provider.user_exists(username) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
112 module:log("debug", "test user %s existence", username); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
113 return get_password(username) and true; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
114 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
115 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
116 function provider.get_password(username) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
117 return nil, "Getting password is not supported."; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
118 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
119 function provider.set_password(username, password) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
120 local hash = joomlaCreateHash(password); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
121 local stmt, err = setsql("UPDATE `jos_users` SET `password`=? WHERE `username`=?", hash, username); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
122 return stmt and true, err; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
123 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
124 function provider.create_user(username, password) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
125 return nil, "Account creation/modification not supported."; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
126 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
127 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
128 local escapes = { |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
129 [" "] = "\\20"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
130 ['"'] = "\\22"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
131 ["&"] = "\\26"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
132 ["'"] = "\\27"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
133 ["/"] = "\\2f"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
134 [":"] = "\\3a"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
135 ["<"] = "\\3c"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
136 [">"] = "\\3e"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
137 ["@"] = "\\40"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
138 ["\\"] = "\\5c"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
139 }; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
140 local unescapes = {}; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
141 for k,v in pairs(escapes) do unescapes[v] = k; end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
142 local function jid_escape(s) return s and (s:gsub(".", escapes)); end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
143 local function jid_unescape(s) return s and (s:gsub("\\%x%x", unescapes)); end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
144 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
145 function provider.get_sasl_handler() |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
146 local sasl = {}; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
147 function sasl:clean_clone() return provider.get_sasl_handler(); end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
148 function sasl:mechanisms() return { PLAIN = true; }; end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
149 function sasl:select(mechanism) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
150 if not self.selected and mechanism == "PLAIN" then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
151 self.selected = mechanism; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
152 return true; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
153 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
154 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
155 function sasl:process(message) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
156 if not message then return "failure", "malformed-request"; end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
157 local authorization, authentication, password = message:match("^([^%z]*)%z([^%z]+)%z([^%z]+)"); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
158 if not authorization then return "failure", "malformed-request"; end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
159 authentication = saslprep(authentication); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
160 password = saslprep(password); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
161 if (not password) or (password == "") or (not authentication) or (authentication == "") then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
162 return "failure", "malformed-request", "Invalid username or password."; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
163 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
164 local function test(authentication) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
165 local prepped = nodeprep(authentication); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
166 local normalized = jid_unescape(prepped); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
167 return normalized and provider.test_password(normalized, password) and prepped; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
168 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
169 local username = test(authentication) or test(jid_escape(authentication)); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
170 if username then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
171 self.username = username; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
172 return "success"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
173 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
174 return "failure", "not-authorized", "Unable to authorize you with the authentication credentials you've sent."; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
175 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
176 return sasl; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
177 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
178 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
179 module:add_item("auth-provider", provider); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
180 |