1--TEST--
2MySQL 5.6 EXPIRE PASSWORD protocol change
3--SKIPIF--
4<?php
5require_once('skipif.inc');
6require_once('skipifemb.inc');
7require_once('connect.inc');
8
9if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
10	die(sprintf("SKIP Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
11		$host, $user, $db, $port, $socket));
12}
13
14if ($link->server_version < 50610)
15	die(sprintf("SKIP Needs MySQL 5.6.10 or newer, found MySQL %s\n", $link->server_info));
16
17if  (!$IS_MYSQLND && (mysqli_get_client_version() < 50610)) {
18	die(sprintf("SKIP Needs libmysql 5.6.10 or newer, found  %s\n", mysqli_get_client_version()));
19}
20
21mysqli_query($link, 'DROP USER expiretest');
22mysqli_query($link, 'DROP USER expiretest@localhost');
23
24if (!mysqli_query($link, 'CREATE USER expiretest@"%"') ||
25	!mysqli_query($link, 'CREATE USER expiretest@"localhost"')) {
26	printf("skip Cannot create second DB user [%d] %s", mysqli_errno($link), mysqli_error($link));
27	mysqli_close($link);
28	die("skip CREATE USER failed");
29}
30
31if (!mysqli_query($link, 'ALTER USER expiretest@"%" PASSWORD EXPIRE') ||
32	!mysqli_query($link, 'ALTER USER expiretest@"localhost" PASSWORD EXPIRE')) {
33	printf("skip Cannot modify second DB user [%d] %s", mysqli_errno($link), mysqli_error($link));
34	mysqli_close($link);
35	die("skip ALTER USER failed");
36}
37
38if (!$link->query("DROP TABLE IF EXISTS test") ||
39	!$link->query("CREATE TABLE test (id INT)") || !$link->query("INSERT INTO test(id) VALUES (1)"))
40	die(sprintf("SKIP [%d] %s\n", $link->errno, $link->error));
41
42
43
44if (!mysqli_query($link, sprintf("GRANT SELECT ON TABLE %s.test TO expiretest@'%%'", $db)) ||
45	!mysqli_query($link, sprintf("GRANT SELECT ON TABLE %s.test TO expiretest@'localhost'", $db))) {
46	printf("skip Cannot grant SELECT to user [%d] %s", mysqli_errno($link), mysqli_error($link));
47	mysqli_close($link);
48	die("skip GRANT failed");
49}
50?>
51--FILE--
52<?php
53	require_once('connect.inc');
54	require_once('table.inc');
55
56	/* default */
57	if (!$link = my_mysqli_connect($host, 'expiretest', "", $db, $port, $socket)) {
58		printf("[001] Cannot connect [%d] %s\n",
59			mysqli_connect_errno(), mysqli_connect_error());
60	} else {
61		$link->query("SELECT id FROM test WHERE id = 1");
62		printf("[002] Connect should fail, [%d] %s\n", $link->errno, $link->error);
63	}
64
65	/* explicitly requesting default */
66	$link = mysqli_init();
67	$link->options(MYSQLI_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, 0);
68	if (!my_mysqli_real_connect($link, $host, 'expiretest', "", $db, $port, $socket)) {
69		printf("[003] Cannot connect [%d] %s\n",
70			mysqli_connect_errno(), mysqli_connect_error());
71	} else {
72		$link->query("SELECT id FROM test WHERE id = 1");
73		printf("[004] Connect should fail, [%d] %s\n", $link->errno, $link->error);
74	}
75
76	/* allow connect */
77	$link = mysqli_init();
78	$link->options(MYSQLI_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, 1);
79	if (!my_mysqli_real_connect($link, $host, 'expiretest', "", $db, $port, $socket)) {
80		printf("[005] Cannot connect [%d] %s\n",
81			mysqli_connect_errno(), mysqli_connect_error());
82	} else {
83		$link->query("SELECT id FROM test WHERE id = 1");
84		printf("[006] Connect allowed, query fail, [%d] %s\n", $link->errno, $link->error);
85		$link->close();
86	}
87
88	/* allow connect, fix pw */
89	$link = mysqli_init();
90	$link->options(MYSQLI_OPT_CAN_HANDLE_EXPIRED_PASSWORDS, 1);
91	if (!my_mysqli_real_connect($link, $host, 'expiretest', "", $db, $port, $socket)) {
92		printf("[007] Cannot connect [%d] %s\n",
93			mysqli_connect_errno(), mysqli_connect_error());
94	} else {
95		$link->query("SET PASSWORD=PASSWORD('expiretest')");
96		printf("[008] Connect allowed, pw set, [%d] %s\n", $link->errno, $link->error);
97		if ($res = $link->query("SELECT id FROM test WHERE id = 1"))
98			var_dump($res->fetch_assoc());
99		$link->close();
100	}
101
102
103	/* check login */
104	if (!$link = my_mysqli_connect($host, 'expiretest', "expiretest", $db, $port, $socket)) {
105		printf("[001] Cannot connect [%d] %s\n",
106			mysqli_connect_errno(), mysqli_connect_error());
107	} else {
108		$link->query("SELECT id FROM test WHERE id = 1");
109		if ($res = $link->query("SELECT id FROM test WHERE id = 1"))
110			var_dump($res->fetch_assoc());
111		$link->close();
112	}
113
114
115
116	print "done!";
117?>
118--CLEAN--
119<?php
120	require_once("clean_table.inc");
121	mysqli_query($link, 'DROP USER expiretest');
122	mysqli_query($link, 'DROP USER expiretest@localhost');
123?>
124--EXPECTF--
125Warning: mysqli%sconnect(): (HY000/1862): %s in %s on line %d
126[001] Cannot connect [1862] %s
127
128Warning: mysqli%sconnect(): (HY000/1862): %s in %s on line %d
129[003] Cannot connect [1862] %s
130[006] Connect allowed, query fail, [1820] %s
131[008] Connect allowed, pw set, [0%A
132array(1) {
133  ["id"]=>
134  string(1) "1"
135}
136array(1) {
137  ["id"]=>
138  string(1) "1"
139}
140done!
141