@@ -6,7 +6,6 @@ package aws
66
77import (
88 "context"
9- "crypto/md5"
109 "database/sql"
1110 "fmt"
1211 "strings"
@@ -350,7 +349,13 @@ func (d *RDSMultitenantPGBouncerDatabase) provisionPGBouncerDatabase(vpcID strin
350349 ctx , cancel := context .WithDeadline (context .Background (), time .Now ().Add (DefaultMySQLContextTimeSeconds * time .Second ))
351350 defer cancel ()
352351
353- err = ensureDatabaseUserIsCreated (ctx , d .db , authUserSecret .MasterUsername , authUserSecret .MasterPassword )
352+ // Generate SCRAM-SHA-256 hash for the auth user password
353+ authScramHash , err := generateSCRAMSHA256Hash (authUserSecret .MasterPassword )
354+ if err != nil {
355+ return errors .Wrap (err , "failed to generate SCRAM-SHA-256 hash for auth user" )
356+ }
357+
358+ err = ensureDatabaseUserIsCreatedWithHash (ctx , d .db , authUserSecret .MasterUsername , authScramHash )
354359 if err != nil {
355360 return errors .Wrap (err , "failed to ensure pgbouncer user was created" )
356361 }
@@ -456,12 +461,18 @@ func (d *RDSMultitenantPGBouncerDatabase) ensureLogicalDatabaseSetup(databaseNam
456461 return errors .Wrap (err , "failed to get a secret for installation" )
457462 }
458463
459- err = ensureDatabaseUserIsCreated (ctx , d .db , installationSecret .MasterUsername , installationSecret .MasterPassword )
464+ // Generate SCRAM-SHA-256 hash once to ensure consistency between PostgreSQL user and PGBouncer entry
465+ scramHash , err := generateSCRAMSHA256Hash (installationSecret .MasterPassword )
466+ if err != nil {
467+ return errors .Wrap (err , "failed to generate SCRAM-SHA-256 hash" )
468+ }
469+
470+ err = ensureDatabaseUserIsCreatedWithHash (ctx , d .db , installationSecret .MasterUsername , scramHash )
460471 if err != nil {
461472 return errors .Wrap (err , "failed to create Mattermost database user" )
462473 }
463474
464- err = d .ensureInstallationUserAddedToUsersTable (ctx , installationSecret .MasterUsername , installationSecret . MasterPassword )
475+ err = d .ensureInstallationUserAddedToUsersTableWithHash (ctx , installationSecret .MasterUsername , scramHash )
465476 if err != nil {
466477 return errors .Wrap (err , "failed to create Mattermost user entry for PGBouncer" )
467478 }
@@ -479,7 +490,7 @@ func (d *RDSMultitenantPGBouncerDatabase) ensureLogicalDatabaseSetup(databaseNam
479490 return nil
480491}
481492
482- func (d * RDSMultitenantPGBouncerDatabase ) ensureInstallationUserAddedToUsersTable (ctx context.Context , username , password string ) error {
493+ func (d * RDSMultitenantPGBouncerDatabase ) ensureInstallationUserAddedToUsersTableWithHash (ctx context.Context , username , scramHash string ) error {
483494 query := fmt .Sprintf ("SELECT usename FROM pgbouncer.pgbouncer_users WHERE usename = '%s';" , username )
484495 rows , err := d .db .QueryContext (ctx , query )
485496 if err != nil {
@@ -489,7 +500,7 @@ func (d *RDSMultitenantPGBouncerDatabase) ensureInstallationUserAddedToUsersTabl
489500 return nil
490501 }
491502
492- query = fmt .Sprintf (`INSERT INTO pgbouncer.pgbouncer_users (usename, passwd) VALUES ('%s', 'md5%x ')` , username , md5 . Sum ([] byte ( password + username )) )
503+ query = fmt .Sprintf (`INSERT INTO pgbouncer.pgbouncer_users (usename, passwd) VALUES ('%s', '%s ')` , username , scramHash )
493504 _ , err = d .db .QueryContext (ctx , query )
494505 if err != nil {
495506 return errors .Wrap (err , "failed to run create pgbouncer installation user SQL command" )
0 commit comments