@@ -25,11 +25,11 @@ import (
25
25
26
26
"github.com/pkg/errors"
27
27
corev1 "k8s.io/api/core/v1"
28
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28
29
"sigs.k8s.io/controller-runtime/pkg/client"
29
30
30
31
"github.com/crunchydata/postgres-operator/internal/logging"
31
32
"github.com/crunchydata/postgres-operator/internal/naming"
32
- "github.com/crunchydata/postgres-operator/internal/util"
33
33
"github.com/crunchydata/postgres-operator/pkg/apis/postgres-operator.crunchydata.com/v1beta1"
34
34
)
35
35
@@ -196,25 +196,45 @@ cd $PGADMIN_DIR
196
196
isAdmin = true
197
197
}
198
198
199
+ // Get password from secret
200
+ userPasswordSecret := & corev1.Secret {ObjectMeta : metav1.ObjectMeta {
201
+ Namespace : pgadmin .Namespace ,
202
+ Name : user .PasswordRef .LocalObjectReference .Name ,
203
+ }}
204
+ err := errors .WithStack (
205
+ r .Client .Get (ctx , client .ObjectKeyFromObject (userPasswordSecret ), userPasswordSecret ))
206
+ if err != nil {
207
+ log .Error (err , "Could not get user password secret" )
208
+ continue
209
+ }
210
+
211
+ // Make sure the password isn't nil or empty
212
+ password := userPasswordSecret .Data [user .PasswordRef .Key ]
213
+ if password == nil {
214
+ log .Error (nil , `Could not retrieve password from secret. Make sure secret name and key are correct.` )
215
+ continue
216
+ }
217
+ if len (password ) == 0 {
218
+ log .Error (nil , `Password must not be empty.` )
219
+ continue
220
+ }
221
+
199
222
// Assemble user that will be used in add/update command and in updating
200
223
// the users.json file in the secret
201
224
intentUser := pgAdminUserForJson {
202
225
Username : user .Username ,
203
- Password : "" ,
226
+ Password : string ( password ) ,
204
227
IsAdmin : isAdmin ,
205
228
}
206
- // If the user already exists in users.json, and isAdmin has changed, run
207
- // the update-user command. If the user already exists in users.json, but
208
- // it hasn't changed, do nothing. If the user doesn't exist in users.json,
209
- // run the add-user command.
229
+ // If the user already exists in users.json and isAdmin or password has
230
+ // changed, run the update-user command. If the user already exists in
231
+ // users.json, but it hasn't changed, do nothing. If the user doesn't
232
+ // exist in users.json, run the add-user command.
210
233
if existingUser , present := existingUsersMap [user .Username ]; present {
211
- // Set password for intentUser
212
- intentUser .Password = existingUser .Password
213
-
214
- if intentUser .IsAdmin != existingUser .IsAdmin {
215
- // Attempt update-user command
216
- script := setupScript + fmt .Sprintf (`python3 setup.py update-user %s "%s"` ,
217
- typeFlag , intentUser .Username ) + "\n "
234
+ // If Password or IsAdmin have changed, attempt update-user command
235
+ if intentUser .IsAdmin != existingUser .IsAdmin || intentUser .Password != existingUser .Password {
236
+ script := setupScript + fmt .Sprintf (`python3 setup.py update-user %s --password "%s" "%s"` ,
237
+ typeFlag , intentUser .Password , intentUser .Username ) + "\n "
218
238
err = exec (ctx , & stdin , & stdout , & stderr ,
219
239
[]string {"bash" , "-ceu" , "--" , script }... )
220
240
@@ -231,16 +251,23 @@ cd $PGADMIN_DIR
231
251
intentUsers = append (intentUsers , existingUser )
232
252
continue
233
253
}
254
+ // If update user fails due to user not found or password length:
255
+ // https://github.com/pgadmin-org/pgadmin4/blob/REL-8_5/web/setup.py#L263
256
+ // https://github.com/pgadmin-org/pgadmin4/blob/REL-8_5/web/setup.py#L246
257
+ if strings .Contains (stdout .String (), "User not found" ) ||
258
+ strings .Contains (stdout .String (), "Password must be" ) {
259
+
260
+ log .Info ("Failed to update pgAdmin user" , "user" , intentUser .Username , "error" , stdout .String ())
261
+ r .Recorder .Event (pgadmin ,
262
+ corev1 .EventTypeWarning , "InvalidUserWarning" ,
263
+ fmt .Sprintf ("Failed to update pgAdmin user %s: %s" ,
264
+ intentUser .Username , stdout .String ()))
265
+ intentUsers = append (intentUsers , existingUser )
266
+ continue
267
+ }
234
268
}
235
269
} else {
236
- // New user, so generate a password and set it on intentUser
237
- password , err := util .GenerateASCIIPassword (util .DefaultGeneratedPasswordLength )
238
- if err != nil {
239
- return err
240
- }
241
- intentUser .Password = password
242
-
243
- // Attempt add-user command
270
+ // New user, so attempt add-user command
244
271
script := setupScript + fmt .Sprintf (`python3 setup.py add-user %s -- "%s" "%s"` ,
245
272
typeFlag , intentUser .Username , intentUser .Password ) + "\n "
246
273
err = exec (ctx , & stdin , & stdout , & stderr ,
0 commit comments