modification.patch
· 4.6 KiB · Diff
Raw
diff --git a/src/cyrsasl.erl b/src/cyrsasl.erl
index 23f1721..f8bc2e5 100644
--- a/src/cyrsasl.erl
+++ b/src/cyrsasl.erl
@@ -53,7 +53,7 @@ start() ->
public,
{keypos, #sasl_mechanism.mechanism}]),
cyrsasl_plain:start([]),
- cyrsasl_digest:start([]),
+% cyrsasl_digest:start([]),
cyrsasl_scram:start([]),
cyrsasl_anonymous:start([]),
ok.
diff --git a/src/ejabberd_auth_odbc.erl b/src/ejabberd_auth_odbc.erl
index 8ef4c68..b0781df 100644
--- a/src/ejabberd_auth_odbc.erl
+++ b/src/ejabberd_auth_odbc.erl
@@ -69,7 +69,7 @@ check_password(User, Server, Password) ->
LUser ->
Username = ejabberd_odbc:escape(LUser),
LServer = jlib:nameprep(Server),
- try odbc_queries:get_password(LServer, Username) of
+ try odbc_queries:check_password(LServer, Username, Password) of
{selected, ["password"], [{Password}]} ->
Password /= ""; %% Password is correct, and not empty
{selected, ["password"], [{_Password2}]} ->
@@ -92,7 +92,7 @@ check_password(User, Server, Password, Digest, DigestGen) ->
LUser ->
Username = ejabberd_odbc:escape(LUser),
LServer = jlib:nameprep(Server),
- try odbc_queries:get_password(LServer, Username) of
+ try odbc_queries:check_password(LServer, Username, Password) of
%% Account exists, check if password is valid
{selected, ["password"], [{Passwd}]} ->
DigRes = if
diff --git a/src/odbc/mysql.sql b/src/odbc/mysql.sql
index c2611b0..bb02e78 100644
--- a/src/odbc/mysql.sql
+++ b/src/odbc/mysql.sql
@@ -273,3 +273,28 @@ CREATE TABLE motd (
xml text,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) CHARACTER SET utf8;
+
+DELIMITER $$
+DROP FUNCTION IF EXISTS ejabberdPW;
+CREATE FUNCTION ejabberdPW(pw VARCHAR(255)) RETURNS CHAR(34)
+BEGIN
+ DECLARE salt CHAR(12) DEFAULT "$1$";
+ DECLARE i SMALLINT DEFAULT 0;
+ salt_loop: LOOP
+ SET salt=CONCAT(salt,
+ ELT(FLOOR(RAND() * 1000) % 62 +1,
+ 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
+ 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
+ '0','1','2','3','4','5','6','7','8','9'));
+ SET i = i + 1;
+ IF i = 9 THEN
+ LEAVE salt_loop;
+ END IF;
+ END LOOP salt_loop;
+ RETURN ENCRYPT(pw, salt);
+END$$
+DROP FUNCTION IF EXISTS check_password;
+CREATE FUNCTION check_password(U VARCHAR(255), P VARCHAR(255)) RETURNS BOOLEAN
+BEGIN
+ RETURN (SELECT COUNT(*) FROM users WHERE username = U and password = ENCRYPT(P, password) LIMIT 1);
+END$$
diff --git a/src/odbc/odbc_queries.erl b/src/odbc/odbc_queries.erl
index 3ec3b1b..917160b 100644
--- a/src/odbc/odbc_queries.erl
+++ b/src/odbc/odbc_queries.erl
@@ -33,6 +33,7 @@
get_last/2,
set_last_t/4,
del_last/2,
+ check_password/3,
get_password/2,
set_password_t/3,
add_user/3,
@@ -164,6 +165,12 @@ del_last(LServer, Username) ->
LServer,
["delete from last where username='", Username, "'"]).
+check_password(LServer, Username, Password) ->
+ ejabberd_odbc:sql_query(
+ LServer,
+ ["select if ((select count(*) from users where username = '", Username, "' AND "
+ "password = encrypt('", Password, "', password) LIMIT 1) = 1,'", Password, "', NULL) as password"]).
+
get_password(LServer, Username) ->
ejabberd_odbc:sql_query(
LServer,
@@ -171,19 +178,15 @@ get_password(LServer, Username) ->
"where username='", Username, "';"]).
set_password_t(LServer, Username, Pass) ->
- ejabberd_odbc:sql_transaction(
- LServer,
- fun() ->
- update_t("users", ["username", "password"],
- [Username, Pass],
- ["username='", Username ,"'"])
- end).
+ ejabberd_odbc:sql_query(
+ LServer,
+ ["update users set password = ejabberdPW('", Pass, "') where username = '", Username, "'"]).
add_user(LServer, Username, Pass) ->
ejabberd_odbc:sql_query(
LServer,
["insert into users(username, password) "
- "values ('", Username, "', '", Pass, "');"]).
+ "values ('", Username, "', ejabberdPW('", Pass, "'));"]).
del_user(LServer, Username) ->
ejabberd_odbc:sql_query(
1 | diff --git a/src/cyrsasl.erl b/src/cyrsasl.erl |
2 | index 23f1721..f8bc2e5 100644 |
3 | --- a/src/cyrsasl.erl |
4 | +++ b/src/cyrsasl.erl |
5 | @@ -53,7 +53,7 @@ start() -> |
6 | public, |
7 | {keypos, #sasl_mechanism.mechanism}]), |
8 | cyrsasl_plain:start([]), |
9 | - cyrsasl_digest:start([]), |
10 | +% cyrsasl_digest:start([]), |
11 | cyrsasl_scram:start([]), |
12 | cyrsasl_anonymous:start([]), |
13 | ok. |
14 | diff --git a/src/ejabberd_auth_odbc.erl b/src/ejabberd_auth_odbc.erl |
15 | index 8ef4c68..b0781df 100644 |
16 | --- a/src/ejabberd_auth_odbc.erl |
17 | +++ b/src/ejabberd_auth_odbc.erl |
18 | @@ -69,7 +69,7 @@ check_password(User, Server, Password) -> |
19 | LUser -> |
20 | Username = ejabberd_odbc:escape(LUser), |
21 | LServer = jlib:nameprep(Server), |
22 | - try odbc_queries:get_password(LServer, Username) of |
23 | + try odbc_queries:check_password(LServer, Username, Password) of |
24 | {selected, ["password"], [{Password}]} -> |
25 | Password /= ""; %% Password is correct, and not empty |
26 | {selected, ["password"], [{_Password2}]} -> |
27 | @@ -92,7 +92,7 @@ check_password(User, Server, Password, Digest, DigestGen) -> |
28 | LUser -> |
29 | Username = ejabberd_odbc:escape(LUser), |
30 | LServer = jlib:nameprep(Server), |
31 | - try odbc_queries:get_password(LServer, Username) of |
32 | + try odbc_queries:check_password(LServer, Username, Password) of |
33 | %% Account exists, check if password is valid |
34 | {selected, ["password"], [{Passwd}]} -> |
35 | DigRes = if |
36 | diff --git a/src/odbc/mysql.sql b/src/odbc/mysql.sql |
37 | index c2611b0..bb02e78 100644 |
38 | --- a/src/odbc/mysql.sql |
39 | +++ b/src/odbc/mysql.sql |
40 | @@ -273,3 +273,28 @@ CREATE TABLE motd ( |
41 | xml text, |
42 | created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP |
43 | ) CHARACTER SET utf8; |
44 | + |
45 | +DELIMITER $$ |
46 | +DROP FUNCTION IF EXISTS ejabberdPW; |
47 | +CREATE FUNCTION ejabberdPW(pw VARCHAR(255)) RETURNS CHAR(34) |
48 | +BEGIN |
49 | + DECLARE salt CHAR(12) DEFAULT "$1$"; |
50 | + DECLARE i SMALLINT DEFAULT 0; |
51 | + salt_loop: LOOP |
52 | + SET salt=CONCAT(salt, |
53 | + ELT(FLOOR(RAND() * 1000) % 62 +1, |
54 | + 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', |
55 | + 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', |
56 | + '0','1','2','3','4','5','6','7','8','9')); |
57 | + SET i = i + 1; |
58 | + IF i = 9 THEN |
59 | + LEAVE salt_loop; |
60 | + END IF; |
61 | + END LOOP salt_loop; |
62 | + RETURN ENCRYPT(pw, salt); |
63 | +END$$ |
64 | +DROP FUNCTION IF EXISTS check_password; |
65 | +CREATE FUNCTION check_password(U VARCHAR(255), P VARCHAR(255)) RETURNS BOOLEAN |
66 | +BEGIN |
67 | + RETURN (SELECT COUNT(*) FROM users WHERE username = U and password = ENCRYPT(P, password) LIMIT 1); |
68 | +END$$ |
69 | diff --git a/src/odbc/odbc_queries.erl b/src/odbc/odbc_queries.erl |
70 | index 3ec3b1b..917160b 100644 |
71 | --- a/src/odbc/odbc_queries.erl |
72 | +++ b/src/odbc/odbc_queries.erl |
73 | @@ -33,6 +33,7 @@ |
74 | get_last/2, |
75 | set_last_t/4, |
76 | del_last/2, |
77 | + check_password/3, |
78 | get_password/2, |
79 | set_password_t/3, |
80 | add_user/3, |
81 | @@ -164,6 +165,12 @@ del_last(LServer, Username) -> |
82 | LServer, |
83 | ["delete from last where username='", Username, "'"]). |
84 | |
85 | +check_password(LServer, Username, Password) -> |
86 | + ejabberd_odbc:sql_query( |
87 | + LServer, |
88 | + ["select if ((select count(*) from users where username = '", Username, "' AND " |
89 | + "password = encrypt('", Password, "', password) LIMIT 1) = 1,'", Password, "', NULL) as password"]). |
90 | + |
91 | get_password(LServer, Username) -> |
92 | ejabberd_odbc:sql_query( |
93 | LServer, |
94 | @@ -171,19 +178,15 @@ get_password(LServer, Username) -> |
95 | "where username='", Username, "';"]). |
96 | |
97 | set_password_t(LServer, Username, Pass) -> |
98 | - ejabberd_odbc:sql_transaction( |
99 | - LServer, |
100 | - fun() -> |
101 | - update_t("users", ["username", "password"], |
102 | - [Username, Pass], |
103 | - ["username='", Username ,"'"]) |
104 | - end). |
105 | + ejabberd_odbc:sql_query( |
106 | + LServer, |
107 | + ["update users set password = ejabberdPW('", Pass, "') where username = '", Username, "'"]). |
108 | |
109 | add_user(LServer, Username, Pass) -> |
110 | ejabberd_odbc:sql_query( |
111 | LServer, |
112 | ["insert into users(username, password) " |
113 | - "values ('", Username, "', '", Pass, "');"]). |
114 | + "values ('", Username, "', ejabberdPW('", Pass, "'));"]). |
115 | |
116 | del_user(LServer, Username) -> |
117 | ejabberd_odbc:sql_query( |
118 |
queries.sql
· 1.1 KiB · MySQL
Raw
INSERT INTO
users
SELECT
username,
password,
FROM_UNIXTIME(time)
FROM
authreg LEFT JOIN active ON CONCAT(authreg.username, '@', authreg.realm) = active.`collection-owner`;
INSERT INTO
last
SELECT
username,
time AS seconds,
"" AS state
FROM
authreg, logout
WHERE
`collection-owner` = CONCAT(username, "@", realm);
INSERT INTO
rosterusers
SELECT
SUBSTRING_INDEX(`roster-items`.`collection-owner`,"@",1) AS username,
`roster-items`.jid AS jid,
`roster-items`.name AS nick,
IF(`roster-items`.`to` = 1 AND `roster-items`.`from` = 1, 'B', IF(`roster-items`.`to` = 1,'T','F')) AS suscription,
CASE `roster-items`.ask WHEN 0 THEN 'N' WHEN 1 THEN 'O' ELSE 'I' END AS ask,
'' AS askmessage,
'N' as server,
'' as subscribe,
'item' as `type`,
CURRENT_TIMESTAMP as created_at
FROM
`roster-items`
ORDER BY jid;
INSERT INTO
rostergroups
SELECT
SUBSTRING_INDEX(`collection-owner`,"@", 1) AS username,
jid,
`group` AS grp
FROM
`roster-groups`;
1 | INSERT INTO |
2 | users |
3 | SELECT |
4 | username, |
5 | password, |
6 | FROM_UNIXTIME(time) |
7 | FROM |
8 | authreg LEFT JOIN active ON CONCAT(authreg.username, '@', authreg.realm) = active.`collection-owner`; |
9 | INSERT INTO |
10 | last |
11 | SELECT |
12 | username, |
13 | time AS seconds, |
14 | "" AS state |
15 | FROM |
16 | authreg, logout |
17 | WHERE |
18 | `collection-owner` = CONCAT(username, "@", realm); |
19 | INSERT INTO |
20 | rosterusers |
21 | SELECT |
22 | SUBSTRING_INDEX(`roster-items`.`collection-owner`,"@",1) AS username, |
23 | `roster-items`.jid AS jid, |
24 | `roster-items`.name AS nick, |
25 | IF(`roster-items`.`to` = 1 AND `roster-items`.`from` = 1, 'B', IF(`roster-items`.`to` = 1,'T','F')) AS suscription, |
26 | CASE `roster-items`.ask WHEN 0 THEN 'N' WHEN 1 THEN 'O' ELSE 'I' END AS ask, |
27 | '' AS askmessage, |
28 | 'N' as server, |
29 | '' as subscribe, |
30 | 'item' as `type`, |
31 | CURRENT_TIMESTAMP as created_at |
32 | FROM |
33 | `roster-items` |
34 | ORDER BY jid; |
35 | INSERT INTO |
36 | rostergroups |
37 | SELECT |
38 | SUBSTRING_INDEX(`collection-owner`,"@", 1) AS username, |
39 | jid, |
40 | `group` AS grp |
41 | FROM |
42 | `roster-groups`; |
43 |