summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Byelkin <sanja@mariadb.com>2014-12-02 10:59:44 +0100
committerOleksandr Byelkin <sanja@mariadb.com>2014-12-02 10:59:44 +0100
commit3502d7412148d543082aad3c72bbadf742f0a60d (patch)
tree8564a7a40736a8732cfd42ad66b04c6d62d001d5
parent53ff66fe31ee4e0fa646f646cee10095390471af (diff)
downloadmariadb-git-MDEV-7015.tar.gz
MDEV-7015: SET STATEMENT old_passwords has no effectMDEV-7015
Decision about algorihtm moved on prepare phase. Made possible to add mpore password algorithms.
-rw-r--r--mysql-test/r/set_statement.result37
-rw-r--r--mysql-test/t/set_statement.test20
-rw-r--r--sql/item_strfunc.cc85
-rw-r--r--sql/item_strfunc.h42
-rw-r--r--sql/sql_yacc.yy20
-rw-r--r--sql/sys_vars.cc2
6 files changed, 129 insertions, 77 deletions
diff --git a/mysql-test/r/set_statement.result b/mysql-test/r/set_statement.result
index 6e86e4cb77e..51687caeb21 100644
--- a/mysql-test/r/set_statement.result
+++ b/mysql-test/r/set_statement.result
@@ -1070,8 +1070,6 @@ set statement character_set_filesystem=default for select 1;
ERROR 42000: The system variable character_set_filesystem cannot be set in SET STATEMENT.
set statement collation_connection=default for select 1;
ERROR 42000: The system variable collation_connection cannot be set in SET STATEMENT.
-set statement old_passwords=default for select 1;
-ERROR 42000: The system variable old_passwords cannot be set in SET STATEMENT.
set statement query_cache_type=default for select 1;
ERROR 42000: The system variable query_cache_type cannot be set in SET STATEMENT.
set statement wait_timeout=default for select 1;
@@ -1105,3 +1103,38 @@ week(a)
deallocate prepare stmt1;
drop table t1;
set @@default_week_format=@save_week_format;
+set @save_old_passwords=@@old_passwords;
+set @@old_passwords=0;
+set statement OLD_PASSWORDS = 0 for select password('test');
+password('test')
+*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29
+set statement OLD_PASSWORDS = 1 for select password('test');
+password('test')
+378b243e220ca493
+set statement OLD_PASSWORDS = 0 for explain extended select password('test');
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+Warnings:
+Note 1003 select password('test') AS `password('test')`
+set statement OLD_PASSWORDS = 1 for explain extended select password('test');
+id select_type table type possible_keys key key_len ref rows filtered Extra
+1 SIMPLE NULL NULL NULL NULL NULL NULL NULL NULL No tables used
+Warnings:
+Note 1003 select password('test') AS `password('test')`
+create table t1 (a char(10));
+insert t1 values ('qwertyuiop');
+prepare stmt1 from "select password(a) from t1";
+execute stmt1;
+password(a)
+*6063C78456BB048BAF36BE1104D12D547834DFEA
+set old_passwords=1;
+execute stmt1;
+password(a)
+2013610f6aac2950
+alter table t1 engine=myisam;
+execute stmt1;
+password(a)
+2013610f6aac2950
+deallocate prepare stmt1;
+drop table t1;
+set @@old_passwords=@save_old_passwords;
diff --git a/mysql-test/t/set_statement.test b/mysql-test/t/set_statement.test
index 2c7e74093db..0c1756f86ff 100644
--- a/mysql-test/t/set_statement.test
+++ b/mysql-test/t/set_statement.test
@@ -1025,8 +1025,6 @@ set statement character_set_filesystem=default for select 1;
--error ER_SET_STATEMENT_NOT_SUPPORTED
set statement collation_connection=default for select 1;
--error ER_SET_STATEMENT_NOT_SUPPORTED
-set statement old_passwords=default for select 1;
---error ER_SET_STATEMENT_NOT_SUPPORTED
set statement query_cache_type=default for select 1;
--error ER_SET_STATEMENT_NOT_SUPPORTED
set statement wait_timeout=default for select 1;
@@ -1050,3 +1048,21 @@ deallocate prepare stmt1;
drop table t1;
set @@default_week_format=@save_week_format;
+# MDEV-7015: SET STATEMENT old_passwords has no effect
+set @save_old_passwords=@@old_passwords;
+set @@old_passwords=0;
+set statement OLD_PASSWORDS = 0 for select password('test');
+set statement OLD_PASSWORDS = 1 for select password('test');
+set statement OLD_PASSWORDS = 0 for explain extended select password('test');
+set statement OLD_PASSWORDS = 1 for explain extended select password('test');
+create table t1 (a char(10));
+insert t1 values ('qwertyuiop');
+prepare stmt1 from "select password(a) from t1";
+execute stmt1;
+set old_passwords=1;
+execute stmt1;
+alter table t1 engine=myisam;
+execute stmt1;
+deallocate prepare stmt1;
+drop table t1;
+set @@old_passwords=@save_old_passwords;
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index 9a3c7589db2..72433d2588b 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -2168,57 +2168,68 @@ void Item_func_trim::print(String *str, enum_query_type query_type)
/* Item_func_password */
-String *Item_func_password::val_str_ascii(String *str)
+bool Item_func_password::fix_fields(THD *thd, Item **ref)
{
- DBUG_ASSERT(fixed == 1);
- String *res= args[0]->val_str(str);
- check_password_policy(res);
- if (args[0]->null_value || res->length() == 0)
- return make_empty_result();
- my_make_scrambled_password(tmp_value, res->ptr(), res->length());
- str->set(tmp_value, SCRAMBLED_PASSWORD_CHAR_LENGTH, &my_charset_latin1);
- return str;
-}
-
-char *Item_func_password::alloc(THD *thd, const char *password, size_t pass_len)
-{
- char *buff= (char *) thd->alloc(SCRAMBLED_PASSWORD_CHAR_LENGTH+1);
- if (buff)
- {
- String *password_str= new (thd->mem_root)String(password, thd->variables.
- character_set_client);
- check_password_policy(password_str);
- my_make_scrambled_password(buff, password, pass_len);
- }
- return buff;
+ if (deflt)
+ alg= (thd->variables.old_passwords ? OLD : NEW);
+ return Item_str_ascii_func::fix_fields(thd, ref);
}
-
-/* Item_func_old_password */
-
-String *Item_func_old_password::val_str_ascii(String *str)
+String *Item_func_password::val_str_ascii(String *str)
{
DBUG_ASSERT(fixed == 1);
- String *res= args[0]->val_str(str);
- if ((null_value=args[0]->null_value))
- return 0;
- if (res->length() == 0)
- return make_empty_result();
- my_make_scrambled_password_323(tmp_value, res->ptr(), res->length());
- str->set(tmp_value, SCRAMBLED_PASSWORD_CHAR_LENGTH_323, &my_charset_latin1);
+ String *res= args[0]->val_str(str);
+ switch (alg){
+ case NEW:
+ check_password_policy(res);
+ if (args[0]->null_value || res->length() == 0)
+ return make_empty_result();
+ my_make_scrambled_password(tmp_value, res->ptr(), res->length());
+ str->set(tmp_value, SCRAMBLED_PASSWORD_CHAR_LENGTH, &my_charset_latin1);
+ break;
+ case OLD:
+ if ((null_value=args[0]->null_value))
+ return 0;
+ if (res->length() == 0)
+ return make_empty_result();
+ my_make_scrambled_password_323(tmp_value, res->ptr(), res->length());
+ str->set(tmp_value, SCRAMBLED_PASSWORD_CHAR_LENGTH_323, &my_charset_latin1);
+ break;
+ default:
+ DBUG_ASSERT(0);
+ }
return str;
}
-char *Item_func_old_password::alloc(THD *thd, const char *password,
- size_t pass_len)
+char *Item_func_password::alloc(THD *thd, const char *password,
+ size_t pass_len, enum PW_Alg al)
{
- char *buff= (char *) thd->alloc(SCRAMBLED_PASSWORD_CHAR_LENGTH_323+1);
- if (buff)
+ char *buff= (char *) thd->alloc((al==NEW)?
+ SCRAMBLED_PASSWORD_CHAR_LENGTH + 1:
+ SCRAMBLED_PASSWORD_CHAR_LENGTH_323 + 1);
+ if (!buff)
+ return NULL;
+
+ switch (al) {
+ case NEW:
+ {
+ String *password_str= new (thd->mem_root)String(password, thd->variables.
+ character_set_client);
+ check_password_policy(password_str);
+ my_make_scrambled_password(buff, password, pass_len);
+ break;
+ }
+ case OLD:
my_make_scrambled_password_323(buff, password, pass_len);
+ break;
+ default:
+ DBUG_ASSERT(0);
+ }
return buff;
}
+
#define bin_to_ascii(c) ((c)>=38?((c)-38+'a'):(c)>=12?((c)-12+'A'):(c)+'.')
String *Item_func_encrypt::val_str(String *str)
diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h
index 8377a20e0a4..b79009c6778 100644
--- a/sql/item_strfunc.h
+++ b/sql/item_strfunc.h
@@ -407,40 +407,32 @@ public:
class Item_func_password :public Item_str_ascii_func
{
+public:
+ enum PW_Alg {OLD, NEW};
+private:
char tmp_value[SCRAMBLED_PASSWORD_CHAR_LENGTH+1];
+ enum PW_Alg alg;
+ bool deflt;
public:
- Item_func_password(Item *a) :Item_str_ascii_func(a) {}
+ Item_func_password(Item *a) :Item_str_ascii_func(a), alg(NEW), deflt(1) {}
+ Item_func_password(Item *a, PW_Alg al) :Item_str_ascii_func(a),
+ alg(al), deflt(0) {}
String *val_str_ascii(String *str);
+ bool fix_fields(THD *thd, Item **ref);
void fix_length_and_dec()
{
- fix_length_and_charset(SCRAMBLED_PASSWORD_CHAR_LENGTH, default_charset());
+ fix_length_and_charset((alg == 1 ?
+ SCRAMBLED_PASSWORD_CHAR_LENGTH :
+ SCRAMBLED_PASSWORD_CHAR_LENGTH_323),
+ default_charset());
}
- const char *func_name() const { return "password"; }
- static char *alloc(THD *thd, const char *password, size_t pass_len);
+ const char *func_name() const { return ((deflt || alg == 1) ?
+ "password" : "old_password"); }
+ static char *alloc(THD *thd, const char *password, size_t pass_len,
+ enum PW_Alg al);
};
-/*
- Item_func_old_password -- PASSWORD() implementation used in MySQL 3.21 - 4.0
- compatibility mode. This item is created in sql_yacc.yy when
- 'old_passwords' session variable is set, and to handle OLD_PASSWORD()
- function.
-*/
-
-class Item_func_old_password :public Item_str_ascii_func
-{
- char tmp_value[SCRAMBLED_PASSWORD_CHAR_LENGTH_323+1];
-public:
- Item_func_old_password(Item *a) :Item_str_ascii_func(a) {}
- String *val_str_ascii(String *str);
- void fix_length_and_dec()
- {
- fix_length_and_charset(SCRAMBLED_PASSWORD_CHAR_LENGTH_323, default_charset());
- }
- const char *func_name() const { return "old_password"; }
- static char *alloc(THD *thd, const char *password, size_t pass_len);
-};
-
class Item_func_des_encrypt :public Item_str_func
{
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index f05bd54742f..b43f4330e2a 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -9771,17 +9771,15 @@ function_call_conflict:
}
| OLD_PASSWORD '(' expr ')'
{
- $$= new (thd->mem_root) Item_func_old_password($3);
+ $$= new (thd->mem_root)
+ Item_func_password($3, Item_func_password::OLD);
if ($$ == NULL)
MYSQL_YYABORT;
}
| PASSWORD '(' expr ')'
{
Item* i1;
- if (thd->variables.old_passwords)
- i1= new (thd->mem_root) Item_func_old_password($3);
- else
- i1= new (thd->mem_root) Item_func_password($3);
+ i1= new (thd->mem_root) Item_func_password($3);
if (i1 == NULL)
MYSQL_YYABORT;
$$= i1;
@@ -14898,17 +14896,19 @@ text_or_password:
TEXT_STRING { $$=$1.str;}
| PASSWORD '(' TEXT_STRING ')'
{
- $$= $3.length ? thd->variables.old_passwords ?
- Item_func_old_password::alloc(thd, $3.str, $3.length) :
- Item_func_password::alloc(thd, $3.str, $3.length) :
+ $$= $3.length ?
+ Item_func_password::alloc(thd, $3.str, $3.length,
+ thd->variables.old_passwords ?
+ Item_func_password::OLD :
+ Item_func_password::NEW) :
$3.str;
if ($$ == NULL)
MYSQL_YYABORT;
}
| OLD_PASSWORD '(' TEXT_STRING ')'
{
- $$= $3.length ? Item_func_old_password::
- alloc(thd, $3.str, $3.length) :
+ $$= $3.length ? Item_func_password::
+ alloc(thd, $3.str, $3.length, Item_func_password::OLD) :
$3.str;
if ($$ == NULL)
MYSQL_YYABORT;
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index 975b1f08210..897d3be6bf1 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -2130,7 +2130,7 @@ static bool check_old_passwords(sys_var *self, THD *thd, set_var *var)
static Sys_var_mybool Sys_old_passwords(
"old_passwords",
"Use old password encryption method (needed for 4.0 and older clients)",
- NO_SET_STMT SESSION_VAR(old_passwords), CMD_LINE(OPT_ARG),
+ SESSION_VAR(old_passwords), CMD_LINE(OPT_ARG),
DEFAULT(FALSE), NO_MUTEX_GUARD, NOT_IN_BINLOG,
ON_CHECK(check_old_passwords));
export sys_var *Sys_old_passwords_ptr= &Sys_old_passwords; // for sql_acl.cc