@@ -14,18 +14,27 @@ def self.instances
14
14
## Default ...
15
15
# rubocop:disable Metrics/LineLength
16
16
query = "SELECT MAX_USER_CONNECTIONS, MAX_CONNECTIONS, MAX_QUESTIONS, MAX_UPDATES, SSL_TYPE, SSL_CIPHER, X509_ISSUER, X509_SUBJECT, PASSWORD /*!50508 , PLUGIN */ FROM mysql.user WHERE CONCAT(user, '@', host) = '#{ name } '"
17
- elsif newer_than ( 'mysql' => '5.7.6' , 'percona' => '5.7.6' ) ||
18
- # https://jira.mariadb.org/browse/MDEV-16238 https://jira.mariadb.org/browse/MDEV-16774
19
- ( newer_than ( 'mariadb' => '10.2.16' ) && older_than ( 'mariadb' => '10.2.19' ) ) ||
20
- ( newer_than ( 'mariadb' => '10.3.8' ) && older_than ( 'mariadb' => '10.3.11' ) )
17
+ elsif newer_than ( 'mysql' => '5.7.6' , 'percona' => '5.7.6' )
21
18
query = "SELECT MAX_USER_CONNECTIONS, MAX_CONNECTIONS, MAX_QUESTIONS, MAX_UPDATES, SSL_TYPE, SSL_CIPHER, X509_ISSUER, X509_SUBJECT, AUTHENTICATION_STRING, PLUGIN FROM mysql.user WHERE CONCAT(user, '@', host) = '#{ name } '"
19
+ elsif newer_than ( 'mariadb' => '10.1.21' )
20
+ query = "SELECT MAX_USER_CONNECTIONS, MAX_CONNECTIONS, MAX_QUESTIONS, MAX_UPDATES, SSL_TYPE, SSL_CIPHER, X509_ISSUER, X509_SUBJECT, PASSWORD, PLUGIN, AUTHENTICATION_STRING FROM mysql.user WHERE CONCAT(user, '@', host) = '#{ name } '"
22
21
else
23
22
query = "SELECT MAX_USER_CONNECTIONS, MAX_CONNECTIONS, MAX_QUESTIONS, MAX_UPDATES, SSL_TYPE, SSL_CIPHER, X509_ISSUER, X509_SUBJECT, PASSWORD /*!50508 , PLUGIN */ FROM mysql.user WHERE CONCAT(user, '@', host) = '#{ name } '"
24
23
end
25
24
@max_user_connections , @max_connections_per_hour , @max_queries_per_hour ,
26
25
@max_updates_per_hour , ssl_type , ssl_cipher , x509_issuer , x509_subject ,
27
- @password , @plugin = mysql_caller ( query , 'regular' ) . split ( %r{\s } )
26
+ @password , @plugin , @authentication_string = mysql_caller ( query , 'regular' ) . split ( %r{\s } )
28
27
@tls_options = parse_tls_options ( ssl_type , ssl_cipher , x509_issuer , x509_subject )
28
+ if newer_than ( 'mariadb' => '10.1.21' ) && @plugin == 'ed25519'
29
+ # Some auth plugins (e.g. ed25519) use authentication_string
30
+ # to store password hash or auth information
31
+ @password = @authentication_string
32
+ elsif ( newer_than ( 'mariadb' => '10.2.16' ) && older_than ( 'mariadb' => '10.2.19' ) ) ||
33
+ ( newer_than ( 'mariadb' => '10.3.8' ) && older_than ( 'mariadb' => '10.3.11' ) )
34
+ # Old mariadb 10.2 or 10.3 store password hash in authentication_string
35
+ # https://jira.mariadb.org/browse/MDEV-16238 https://jira.mariadb.org/browse/MDEV-16774
36
+ @password = @authentication_string
37
+ end
29
38
# rubocop:enable Metrics/LineLength
30
39
new ( name : name ,
31
40
ensure : :present ,
@@ -133,11 +142,25 @@ def exists?
133
142
134
143
def password_hash = ( string )
135
144
merged_name = self . class . cmd_user ( @resource [ :name ] )
145
+ plugin = @resource . value ( :plugin )
136
146
137
147
# We have a fact for the mysql version ...
138
148
if mysqld_version . nil?
139
149
# default ... if mysqld_version does not work
140
150
self . class . mysql_caller ( "SET PASSWORD FOR #{ merged_name } = '#{ string } '" , 'system' )
151
+ elsif newer_than ( 'mariadb' => '10.1.21' ) && plugin == 'ed25519'
152
+ raise ArgumentError , _ ( 'ed25519 hash should be 43 bytes long.' ) unless string . length == 43
153
+ # ALTER USER statement is only available upstream starting 10.2
154
+ # https://mariadb.com/kb/en/mariadb-1020-release-notes/
155
+ if newer_than ( 'mariadb' => '10.2.0' )
156
+ sql = "ALTER USER #{ merged_name } IDENTIFIED WITH ed25519 AS '#{ string } '"
157
+ else
158
+ concat_name = @resource [ :name ]
159
+ sql = "UPDATE mysql.user SET password = '', plugin = 'ed25519'"
160
+ sql << ", authentication_string = '#{ string } '"
161
+ sql << " where CONCAT(user, '@', host) = '#{ concat_name } '; FLUSH PRIVILEGES"
162
+ end
163
+ self . class . mysql_caller ( sql , 'system' )
141
164
elsif newer_than ( 'mysql' => '5.7.6' , 'percona' => '5.7.6' , 'mariadb' => '10.2.0' )
142
165
raise ArgumentError , _ ( 'Only mysql_native_password (*ABCD...XXX) hashes are supported.' ) unless string =~ %r{^\* |^$}
143
166
self . class . mysql_caller ( "ALTER USER #{ merged_name } IDENTIFIED WITH mysql_native_password AS '#{ string } '" , 'system' )
@@ -179,7 +202,16 @@ def max_updates_per_hour=(int)
179
202
def plugin = ( string )
180
203
merged_name = self . class . cmd_user ( @resource [ :name ] )
181
204
182
- if newer_than ( 'mysql' => '5.7.6' , 'percona' => '5.7.6' )
205
+ if newer_than ( 'mariadb' => '10.1.21' ) && string == 'ed25519'
206
+ if newer_than ( 'mariadb' => '10.2.0' )
207
+ sql = "ALTER USER #{ merged_name } IDENTIFIED WITH '#{ string } ' AS '#{ @resource [ :password_hash ] } '"
208
+ else
209
+ concat_name = @resource [ :name ]
210
+ sql = "UPDATE mysql.user SET password = '', plugin = '#{ string } '"
211
+ sql << ", authentication_string = '#{ @resource [ :password_hash ] } '"
212
+ sql << " where CONCAT(user, '@', host) = '#{ concat_name } '; FLUSH PRIVILEGES"
213
+ end
214
+ elsif newer_than ( 'mysql' => '5.7.6' , 'percona' => '5.7.6' )
183
215
sql = "ALTER USER #{ merged_name } IDENTIFIED WITH '#{ string } '"
184
216
sql << " AS '#{ @resource [ :password_hash ] } '" if string == 'mysql_native_password'
185
217
else
0 commit comments