Mercurial > prosody-modules
annotate mod_auth_joomla/mod_auth_joomla.lua @ 5616:59d5fc50f602
mod_http_oauth2: Implement refresh token rotation
Makes refresh tokens one-time-use, handing out a new refresh token with
each access token. Thus if a refresh token is stolen and used by an
attacker, the next time the legitimate client tries to use the previous
refresh token, it will not work and the attack will be noticed. If the
attacker does not use the refresh token, it becomes invalid after the
legitimate client uses it.
This behavior is recommended by draft-ietf-oauth-security-topics
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 23 Jul 2023 02:56:08 +0200 |
parents | 7dbde05b48a9 |
children |
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"); |
720
97f6d7c4aaed
mod_auth_joomla: Added config option sql.prefix (default = "jos_").
Waqas Hussain <waqas20@gmail.com>
parents:
719
diff
changeset
|
15 local prefix = params and params.prefix or "jos_"; |
422
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
16 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
17 local resolve_relative_path = require "core.configmanager".resolve_relative_path; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
18 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
19 local function test_connection() |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
20 if not connection then return nil; end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
21 if connection:ping() then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
22 return true; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
23 else |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
24 module:log("debug", "Database connection closed"); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
25 connection = nil; |
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 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
28 local function connect() |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
29 if not test_connection() then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
30 prosody.unlock_globals(); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
31 local dbh, err = DBI.Connect( |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
32 params.driver, params.database, |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
33 params.username, params.password, |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
34 params.host, params.port |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
35 ); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
36 prosody.lock_globals(); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
37 if not dbh then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
38 module:log("debug", "Database connection failed: %s", tostring(err)); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
39 return nil, err; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
40 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
41 module:log("debug", "Successfully connected to database"); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
42 dbh:autocommit(true); -- don't run in transaction |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
43 connection = dbh; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
44 return connection; |
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 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
47 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
48 do -- process options to get a db connection |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
49 params = params or { driver = "SQLite3" }; |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
814
diff
changeset
|
50 |
422
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
51 if params.driver == "SQLite3" then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
52 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
|
53 end |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
814
diff
changeset
|
54 |
422
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
55 assert(params.driver and params.database, "Both the SQL driver and the database need to be specified"); |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
814
diff
changeset
|
56 |
422
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
57 assert(connect()); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
58 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
59 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
60 local function getsql(sql, ...) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
61 if params.driver == "PostgreSQL" then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
62 sql = sql:gsub("`", "\""); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
63 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
64 if not test_connection() then connect(); end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
65 -- do prepared statement stuff |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
66 local stmt, err = connection:prepare(sql); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
67 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
|
68 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
|
69 -- run query |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
70 local ok, err = stmt:execute(...); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
71 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
|
72 if not ok then return nil, err; end |
1343
7dbde05b48a9
all the things: Remove trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents:
814
diff
changeset
|
73 |
422
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
74 return stmt; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
75 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
76 local function setsql(sql, ...) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
77 local stmt, err = getsql(sql, ...); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
78 if not stmt then return stmt, err; end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
79 return stmt:affected(); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
80 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
81 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
82 local function get_password(username) |
720
97f6d7c4aaed
mod_auth_joomla: Added config option sql.prefix (default = "jos_").
Waqas Hussain <waqas20@gmail.com>
parents:
719
diff
changeset
|
83 local stmt, err = getsql("SELECT `password` FROM `"..prefix.."users` WHERE `username`=?", username); |
422
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
84 if stmt then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
85 for row in stmt:rows(true) do |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
86 return row.password; |
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 end |
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 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
92 local function getCryptedPassword(plaintext, salt) |
719
5e71e24e33fc
mod_auth_joomla: Joomla hash should be hex-encoded, not raw binary (thanks Anthony).
Waqas Hussain <waqas20@gmail.com>
parents:
422
diff
changeset
|
93 local salted = plaintext..salt; |
5e71e24e33fc
mod_auth_joomla: Joomla hash should be hex-encoded, not raw binary (thanks Anthony).
Waqas Hussain <waqas20@gmail.com>
parents:
422
diff
changeset
|
94 return md5(salted, true); |
422
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
95 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
96 local function joomlaCheckHash(password, hash) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
97 local crypt, salt = hash:match("^([^:]*):(.*)$"); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
98 return (crypt or hash) == getCryptedPassword(password, salt or ''); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
99 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
100 local function joomlaCreateHash(password) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
101 local salt = uuid_gen():gsub("%-", ""); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
102 local crypt = getCryptedPassword(password, salt); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
103 return crypt..':'..salt; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
104 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
105 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
106 |
814
881ec9919144
mod_auth_*: Use module:provides(), and don't explicitly specify provider.name.
Waqas Hussain <waqas20@gmail.com>
parents:
720
diff
changeset
|
107 provider = {}; |
422
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
108 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
109 function provider.test_password(username, password) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
110 local hash = get_password(username); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
111 return hash and joomlaCheckHash(password, hash); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
112 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
113 function provider.user_exists(username) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
114 module:log("debug", "test user %s existence", username); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
115 return get_password(username) and true; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
116 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
117 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
118 function provider.get_password(username) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
119 return nil, "Getting password is not supported."; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
120 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
121 function provider.set_password(username, password) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
122 local hash = joomlaCreateHash(password); |
720
97f6d7c4aaed
mod_auth_joomla: Added config option sql.prefix (default = "jos_").
Waqas Hussain <waqas20@gmail.com>
parents:
719
diff
changeset
|
123 local stmt, err = setsql("UPDATE `"..prefix.."users` SET `password`=? WHERE `username`=?", hash, username); |
422
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
124 return stmt and true, err; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
125 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
126 function provider.create_user(username, password) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
127 return nil, "Account creation/modification not supported."; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
128 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
129 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
130 local escapes = { |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
131 [" "] = "\\20"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
132 ['"'] = "\\22"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
133 ["&"] = "\\26"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
134 ["'"] = "\\27"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
135 ["/"] = "\\2f"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
136 [":"] = "\\3a"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
137 ["<"] = "\\3c"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
138 [">"] = "\\3e"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
139 ["@"] = "\\40"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
140 ["\\"] = "\\5c"; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
141 }; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
142 local unescapes = {}; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
143 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
|
144 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
|
145 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
|
146 |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
147 function provider.get_sasl_handler() |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
148 local sasl = {}; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
149 function sasl:clean_clone() return provider.get_sasl_handler(); end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
150 function sasl:mechanisms() return { PLAIN = true; }; end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
151 function sasl:select(mechanism) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
152 if not self.selected and mechanism == "PLAIN" then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
153 self.selected = mechanism; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
154 return true; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
155 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
156 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
157 function sasl:process(message) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
158 if not message then return "failure", "malformed-request"; end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
159 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
|
160 if not authorization then return "failure", "malformed-request"; end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
161 authentication = saslprep(authentication); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
162 password = saslprep(password); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
163 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
|
164 return "failure", "malformed-request", "Invalid username or password."; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
165 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
166 local function test(authentication) |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
167 local prepped = nodeprep(authentication); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
168 local normalized = jid_unescape(prepped); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
169 return normalized and provider.test_password(normalized, password) and prepped; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
170 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
171 local username = test(authentication) or test(jid_escape(authentication)); |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
172 if username then |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
173 self.username = username; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
174 return "success"; |
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 "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
|
177 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
178 return sasl; |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
179 end |
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
180 |
814
881ec9919144
mod_auth_*: Use module:provides(), and don't explicitly specify provider.name.
Waqas Hussain <waqas20@gmail.com>
parents:
720
diff
changeset
|
181 module:provides("auth", provider); |
422
1082856e4612
mod_auth_joomla: Initial commit.
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
182 |