@@ -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' ) && ![ nil , '' , 'mysql_native_password' ] . include? ( @plugin )
29
+ # if an specific auth plugin is used (e.g. ed25519),
30
+ # use authentication_string as the hash
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 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,15 @@ 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
+ self . class . mysql_caller ( "ALTER USER #{ merged_name } IDENTIFIED WITH ed25519 AS '#{ string } '" , 'system' )
141
154
elsif newer_than ( 'mysql' => '5.7.6' , 'percona' => '5.7.6' , 'mariadb' => '10.2.0' )
142
155
raise ArgumentError , _ ( 'Only mysql_native_password (*ABCD...XXX) hashes are supported.' ) unless string =~ %r{^\* |^$}
143
156
self . class . mysql_caller ( "ALTER USER #{ merged_name } IDENTIFIED WITH mysql_native_password AS '#{ string } '" , 'system' )
@@ -179,7 +192,9 @@ def max_updates_per_hour=(int)
179
192
def plugin = ( string )
180
193
merged_name = self . class . cmd_user ( @resource [ :name ] )
181
194
182
- if newer_than ( 'mysql' => '5.7.6' , 'percona' => '5.7.6' )
195
+ if newer_than ( 'mariadb' => '10.1.21' ) && string == 'ed25519'
196
+ sql = "ALTER USER #{ merged_name } IDENTIFIED WITH '#{ string } ' AS '#{ @resource [ :password_hash ] } '"
197
+ elsif newer_than ( 'mysql' => '5.7.6' , 'percona' => '5.7.6' )
183
198
sql = "ALTER USER #{ merged_name } IDENTIFIED WITH '#{ string } '"
184
199
sql << " AS '#{ @resource [ :password_hash ] } '" if string == 'mysql_native_password'
185
200
else
0 commit comments