5959
6060var log = slog .S ()
6161
62+ type PgIdent map [string ][]UserMaps
63+
64+ type UserMaps struct {
65+ SystemUsername string `json:"systemUsername"`
66+ DBUsername string `json:"databaseUsername"`
67+ }
68+
6269type PGManager interface {
6370 GetTimelinesHistory (timeline uint64 ) ([]* TimelineHistory , error )
6471}
@@ -69,6 +76,8 @@ type Manager struct {
6976 parameters common.Parameters
7077 recoveryOptions * RecoveryOptions
7178 hba []string
79+ ident PgIdent
80+ currentIdent PgIdent
7281 curParameters common.Parameters
7382 curRecoveryOptions * RecoveryOptions
7483 curHba []string
@@ -178,10 +187,18 @@ func (p *Manager) SetHba(hba []string) {
178187 p .hba = hba
179188}
180189
190+ func (p * Manager ) SetIdent (ident PgIdent ) {
191+ p .ident = ident
192+ }
193+
181194func (p * Manager ) CurHba () []string {
182195 return p .curHba
183196}
184197
198+ func (p * Manager ) CurIdent () PgIdent {
199+ return p .currentIdent
200+ }
201+
185202func (p * Manager ) UpdateCurParameters () {
186203 n , err := copystructure .Copy (p .parameters )
187204 if err != nil {
@@ -202,6 +219,14 @@ func (p *Manager) UpdateCurHba() {
202219 p .curHba = n .([]string )
203220}
204221
222+ func (p * Manager ) UpdateCurIdent () {
223+ n , err := copystructure .Copy (p .ident )
224+ if err != nil {
225+ panic (err )
226+ }
227+ p .currentIdent = n .(PgIdent )
228+ }
229+
205230func (p * Manager ) Init (initConfig * InitConfig ) error {
206231 // ioutil.Tempfile already creates files with 0600 permissions
207232 pwfile , err := ioutil .TempFile ("" , "pwfile" )
@@ -374,6 +399,7 @@ func (p *Manager) start(args ...string) error {
374399 p .UpdateCurParameters ()
375400 p .UpdateCurRecoveryOptions ()
376401 p .UpdateCurHba ()
402+ p .UpdateCurIdent ()
377403
378404 return nil
379405}
@@ -438,6 +464,7 @@ func (p *Manager) Reload() error {
438464 p .UpdateCurParameters ()
439465 p .UpdateCurRecoveryOptions ()
440466 p .UpdateCurHba ()
467+ p .UpdateCurIdent ()
441468
442469 return nil
443470}
@@ -767,6 +794,9 @@ func (p *Manager) writeConfs(useTmpPostgresConf bool) error {
767794 return fmt .Errorf ("error writing %s file: %v" , postgresRecoverySignal , err )
768795 }
769796 }
797+ if err := p .writePgIdent (); err != nil {
798+ return fmt .Errorf ("error writing pg_ident.conf file: %v" , err )
799+ }
770800 return nil
771801}
772802
@@ -877,6 +907,25 @@ func (p *Manager) writePgHba() error {
877907 })
878908}
879909
910+ func (p * Manager ) writePgIdent () error {
911+ return common .WriteFileAtomicFunc (filepath .Join (p .dataDir , "pg_ident.conf" ), 0600 ,
912+ func (f io.Writer ) error {
913+ if p .ident != nil && len (p .ident ) > 0 {
914+ if _ , err := f .Write ([]byte ("# MAPNAME\t SYSTEM-USERNAME\t PG-USERNAME" + "\n " )); err != nil {
915+ return err
916+ }
917+ for key , value := range p .ident {
918+ for _ , v := range value {
919+ if _ , err := f .Write ([]byte (fmt .Sprintf ("%s\t %s\t %s" , key , v .SystemUsername , v .DBUsername ) + "\n " )); err != nil {
920+ return err
921+ }
922+ }
923+ }
924+ }
925+ return nil
926+ })
927+ }
928+
880929// createPostgresqlAutoConf creates postgresql.auto.conf as a symlink to
881930// /dev/null to block alter systems commands (they'll return an error)
882931func (p * Manager ) createPostgresqlAutoConf () error {
0 commit comments