mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
fix: use authenticated urls for pubsub (#14261)
This commit is contained in:
@@ -3,6 +3,7 @@ package pubsub
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"database/sql/driver"
|
||||
"errors"
|
||||
"io"
|
||||
"net"
|
||||
@@ -15,6 +16,8 @@ import (
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"github.com/coder/coder/v2/coderd/database"
|
||||
|
||||
"cdr.dev/slog"
|
||||
)
|
||||
|
||||
@@ -432,9 +435,35 @@ func (p *PGPubsub) startListener(ctx context.Context, connectURL string) error {
|
||||
// pq.defaultDialer uses a zero net.Dialer as well.
|
||||
d: net.Dialer{},
|
||||
}
|
||||
connector driver.Connector
|
||||
err error
|
||||
)
|
||||
|
||||
// Create a custom connector if the database driver supports it.
|
||||
connectorCreator, ok := p.db.Driver().(database.ConnectorCreator)
|
||||
if ok {
|
||||
connector, err = connectorCreator.Connector(connectURL)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("create custom connector: %w", err)
|
||||
}
|
||||
} else {
|
||||
// use the default pq connector otherwise
|
||||
connector, err = pq.NewConnector(connectURL)
|
||||
if err != nil {
|
||||
return xerrors.Errorf("create pq connector: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Set the dialer if the connector supports it.
|
||||
dc, ok := connector.(database.DialerConnector)
|
||||
if !ok {
|
||||
p.logger.Critical(ctx, "connector does not support setting log dialer, database connection debug logs will be missing")
|
||||
} else {
|
||||
dc.Dialer(dialer)
|
||||
}
|
||||
|
||||
p.pgListener = pqListenerShim{
|
||||
Listener: pq.NewDialListener(dialer, connectURL, time.Second, time.Minute, func(t pq.ListenerEventType, err error) {
|
||||
Listener: pq.NewConnectorListener(connector, connectURL, time.Second, time.Minute, func(t pq.ListenerEventType, err error) {
|
||||
switch t {
|
||||
case pq.ListenerEventConnected:
|
||||
p.logger.Info(ctx, "pubsub connected to postgres")
|
||||
@@ -583,8 +612,8 @@ func (p *PGPubsub) Collect(metrics chan<- prometheus.Metric) {
|
||||
}
|
||||
|
||||
// New creates a new Pubsub implementation using a PostgreSQL connection.
|
||||
func New(startCtx context.Context, logger slog.Logger, database *sql.DB, connectURL string) (*PGPubsub, error) {
|
||||
p := newWithoutListener(logger, database)
|
||||
func New(startCtx context.Context, logger slog.Logger, db *sql.DB, connectURL string) (*PGPubsub, error) {
|
||||
p := newWithoutListener(logger, db)
|
||||
if err := p.startListener(startCtx, connectURL); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -594,11 +623,11 @@ func New(startCtx context.Context, logger slog.Logger, database *sql.DB, connect
|
||||
}
|
||||
|
||||
// newWithoutListener creates a new PGPubsub without creating the pqListener.
|
||||
func newWithoutListener(logger slog.Logger, database *sql.DB) *PGPubsub {
|
||||
func newWithoutListener(logger slog.Logger, db *sql.DB) *PGPubsub {
|
||||
return &PGPubsub{
|
||||
logger: logger,
|
||||
listenDone: make(chan struct{}),
|
||||
db: database,
|
||||
db: db,
|
||||
queues: make(map[string]map[uuid.UUID]*msgQueue),
|
||||
latencyMeasurer: NewLatencyMeasurer(logger.Named("latency-measurer")),
|
||||
|
||||
|
||||
Reference in New Issue
Block a user