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 |