Skip to content

Commit d2cd8d7

Browse files
committed
fix: use authenticated urls for pubsub
1 parent 6f9b1a3 commit d2cd8d7

File tree

5 files changed

+97
-3
lines changed

5 files changed

+97
-3
lines changed

coderd/database/awsiamrds/awsiamrds.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ import (
1010
"github.com/aws/aws-sdk-go-v2/aws"
1111
"github.com/aws/aws-sdk-go-v2/config"
1212
"github.com/aws/aws-sdk-go-v2/feature/rds/auth"
13+
"github.com/lib/pq"
1314
"golang.org/x/xerrors"
15+
16+
"github.com/coder/coder/v2/coderd/database"
1417
)
1518

1619
type awsIamRdsDriver struct {
@@ -19,6 +22,7 @@ type awsIamRdsDriver struct {
1922
}
2023

2124
var _ driver.Driver = &awsIamRdsDriver{}
25+
var _ database.ConnectorCreator = &awsIamRdsDriver{}
2226

2327
// Register initializes and registers our aws iam rds wrapped database driver.
2428
func Register(ctx context.Context, parentName string) (string, error) {
@@ -65,6 +69,15 @@ func (d *awsIamRdsDriver) Open(name string) (driver.Conn, error) {
6569
return conn, nil
6670
}
6771

72+
func (d *awsIamRdsDriver) Connector(name string) (driver.Connector, error) {
73+
connector := &connector{
74+
url: name,
75+
cfg: d.cfg,
76+
}
77+
78+
return connector, nil
79+
}
80+
6881
func getAuthenticatedURL(cfg aws.Config, dbURL string) (string, error) {
6982
nURL, err := url.Parse(dbURL)
7083
if err != nil {
@@ -82,3 +95,37 @@ func getAuthenticatedURL(cfg aws.Config, dbURL string) (string, error) {
8295

8396
return nURL.String(), nil
8497
}
98+
99+
type connector struct {
100+
url string
101+
cfg aws.Config
102+
dialer pq.Dialer
103+
}
104+
105+
var _ database.DialerConnector = &connector{}
106+
107+
func (c *connector) Connect(ctx context.Context) (driver.Conn, error) {
108+
nURL, err := getAuthenticatedURL(c.cfg, c.url)
109+
if err != nil {
110+
return nil, xerrors.Errorf("assigning authentication token to url: %w", err)
111+
}
112+
113+
nc, err := pq.NewConnector(nURL)
114+
if err != nil {
115+
return nil, xerrors.Errorf("creating new connector: %w", err)
116+
}
117+
118+
if c.dialer != nil {
119+
nc.Dialer(c.dialer)
120+
}
121+
122+
return nc.Connect(ctx)
123+
}
124+
125+
func (c *connector) Driver() driver.Driver {
126+
return &pq.Driver{}
127+
}
128+
129+
func (c *connector) Dialer(dialer pq.Dialer) {
130+
c.dialer = dialer
131+
}

coderd/database/connector.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package database
2+
3+
import (
4+
"context"
5+
"database/sql/driver"
6+
7+
"github.com/lib/pq"
8+
)
9+
10+
type ConnectorCreator interface {
11+
Connector(name string) (driver.Connector, error)
12+
}
13+
14+
type DialerConnector interface {
15+
Connect(context.Context) (driver.Conn, error)
16+
Dialer(dialer pq.Dialer)
17+
}

coderd/database/pubsub/pubsub.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package pubsub
33
import (
44
"context"
55
"database/sql"
6+
"database/sql/driver"
67
"errors"
78
"io"
89
"net"
@@ -15,6 +16,8 @@ import (
1516
"github.com/prometheus/client_golang/prometheus"
1617
"golang.org/x/xerrors"
1718

19+
"github.com/coder/coder/v2/coderd/database"
20+
1821
"cdr.dev/slog"
1922
)
2023

@@ -432,9 +435,31 @@ func (p *PGPubsub) startListener(ctx context.Context, connectURL string) error {
432435
// pq.defaultDialer uses a zero net.Dialer as well.
433436
d: net.Dialer{},
434437
}
438+
connector driver.Connector
439+
err error
435440
)
441+
442+
// Create a custom connector if the database driver supports it.
443+
connectorCreator, ok := p.db.Driver().(database.ConnectorCreator)
444+
if !ok {
445+
connector, err = pq.NewConnector(connectURL)
446+
if err != nil {
447+
return xerrors.Errorf("create pq connector: %w", err)
448+
}
449+
} else {
450+
connector, err = connectorCreator.Connector(connectURL)
451+
if err != nil {
452+
return xerrors.Errorf("create custom connector: %w", err)
453+
}
454+
}
455+
456+
// Set the dialer if the connector supports it.
457+
if dc, ok := connector.(database.DialerConnector); ok {
458+
dc.Dialer(dialer)
459+
}
460+
436461
p.pgListener = pqListenerShim{
437-
Listener: pq.NewDialListener(dialer, connectURL, time.Second, time.Minute, func(t pq.ListenerEventType, err error) {
462+
Listener: pq.NewConnectorListener(connector, connectURL, time.Second, time.Minute, func(t pq.ListenerEventType, err error) {
438463
switch t {
439464
case pq.ListenerEventConnected:
440465
p.logger.Info(ctx, "pubsub connected to postgres")

go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ replace github.com/imulab/go-scim/pkg/v2 => github.com/coder/go-scim/pkg/v2 v2.0
6262
// Fixes https://github.com/coder/coder/issues/6685
6363
replace github.com/pkg/sftp => github.com/mafredri/sftp v1.13.6-0.20231212144145-8218e927edb0
6464

65+
// Adds support for a new Listener from a driver.Connector
66+
// This lets us use rotating authentication tokens for passwords in connection strings
67+
// which we use in the awsiamrds package.
68+
replace github.com/lib/pq => github.com/coder/pq v1.10.5-0.20240813145306-1ce661cfa68d
69+
6570
require (
6671
cdr.dev/slog v1.6.2-0.20240126064726-20367d4aede6
6772
cloud.google.com/go/compute/metadata v0.5.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,8 @@ github.com/coder/go-httpstat v0.0.0-20230801153223-321c88088322 h1:m0lPZjlQ7vdVp
215215
github.com/coder/go-httpstat v0.0.0-20230801153223-321c88088322/go.mod h1:rOLFDDVKVFiDqZFXoteXc97YXx7kFi9kYqR+2ETPkLQ=
216216
github.com/coder/go-scim/pkg/v2 v2.0.0-20230221055123-1d63c1222136 h1:0RgB61LcNs24WOxc3PBvygSNTQurm0PYPujJjLLOzs0=
217217
github.com/coder/go-scim/pkg/v2 v2.0.0-20230221055123-1d63c1222136/go.mod h1:VkD1P761nykiq75dz+4iFqIQIZka189tx1BQLOp0Skc=
218+
github.com/coder/pq v1.10.5-0.20240813145306-1ce661cfa68d h1:pv+JacyCHoHAr2kh6HltHdFlWqVeWHCvaQDqra5Aff4=
219+
github.com/coder/pq v1.10.5-0.20240813145306-1ce661cfa68d/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
218220
github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0 h1:3A0ES21Ke+FxEM8CXx9n47SZOKOpgSE1bbJzlE4qPVs=
219221
github.com/coder/pretty v0.0.0-20230908205945-e89ba86370e0/go.mod h1:5UuS2Ts+nTToAMeOjNlnHFkPahrtDkmpydBen/3wgZc=
220222
github.com/coder/quartz v0.1.0 h1:cLL+0g5l7xTf6ordRnUMMiZtRE8Sq5LxpghS63vEXrQ=
@@ -670,8 +672,6 @@ github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1
670672
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
671673
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
672674
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
673-
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
674-
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
675675
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
676676
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
677677
github.com/mafredri/sftp v1.13.6-0.20231212144145-8218e927edb0 h1:lG2o/EWMEOlV/RfQrf3zYfQStjnUj0Mg2gmbcBcoxFI=

0 commit comments

Comments
 (0)