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 |