mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-10-31 18:48:08 +00:00 
			
		
		
		
	postgres: replace the package lib/pq with pgx (#15343)
* WIP replacing lib/pq * change timezome param to be URI format * add changelog * add changelog for redshift * update changelog * add test for DSN style connection string * more parseurl and quoteidentify to sdk; include copyright and license * call dbutil.ParseURL instead, fix import ordering Co-authored-by: Calvin Leung Huang <1883212+calvn@users.noreply.github.com>
This commit is contained in:
		| @@ -14,9 +14,6 @@ import ( | ||||
|  | ||||
| 	"github.com/go-test/deep" | ||||
| 	mongodbatlas "github.com/hashicorp/vault-plugin-database-mongodbatlas" | ||||
| 	"github.com/lib/pq" | ||||
| 	"github.com/mitchellh/mapstructure" | ||||
|  | ||||
| 	"github.com/hashicorp/vault/helper/namespace" | ||||
| 	postgreshelper "github.com/hashicorp/vault/helper/testhelpers/postgresql" | ||||
| 	vaulthttp "github.com/hashicorp/vault/http" | ||||
| @@ -30,6 +27,8 @@ import ( | ||||
| 	"github.com/hashicorp/vault/sdk/helper/pluginutil" | ||||
| 	"github.com/hashicorp/vault/sdk/logical" | ||||
| 	"github.com/hashicorp/vault/vault" | ||||
| 	_ "github.com/jackc/pgx/v4" | ||||
| 	"github.com/mitchellh/mapstructure" | ||||
| ) | ||||
|  | ||||
| func getCluster(t *testing.T) (*vault.TestCluster, logical.SystemView) { | ||||
| @@ -1472,14 +1471,8 @@ func testCredsExist(t *testing.T, resp *logical.Response, connURL string) bool { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| 	log.Printf("[TRACE] Generated credentials: %v", d) | ||||
| 	conn, err := pq.ParseURL(connURL) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  | ||||
| 	conn += " timezone=utc" | ||||
|  | ||||
| 	db, err := sql.Open("postgres", conn) | ||||
| 	db, err := sql.Open("pgx", connURL+"&timezone=utc") | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|   | ||||
| @@ -22,7 +22,7 @@ import ( | ||||
| 	"github.com/hashicorp/vault/sdk/helper/pluginutil" | ||||
| 	"github.com/hashicorp/vault/sdk/logical" | ||||
| 	"github.com/hashicorp/vault/sdk/queue" | ||||
| 	"github.com/lib/pq" | ||||
| 	_ "github.com/jackc/pgx/v4/stdlib" | ||||
| 	"github.com/stretchr/testify/mock" | ||||
| 	mongodbatlasapi "go.mongodb.org/atlas/mongodbatlas" | ||||
| 	"go.mongodb.org/mongo-driver/mongo" | ||||
| @@ -419,12 +419,8 @@ func TestBackend_StaticRole_Revoke_user(t *testing.T) { | ||||
| func createTestPGUser(t *testing.T, connURL string, username, password, query string) { | ||||
| 	t.Helper() | ||||
| 	log.Printf("[TRACE] Creating test user") | ||||
| 	conn, err := pq.ParseURL(connURL) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  | ||||
| 	db, err := sql.Open("postgres", conn) | ||||
| 	db, err := sql.Open("pgx", connURL) | ||||
| 	defer db.Close() | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| @@ -456,7 +452,7 @@ func createTestPGUser(t *testing.T, connURL string, username, password, query st | ||||
| func verifyPgConn(t *testing.T, username, password, connURL string) { | ||||
| 	t.Helper() | ||||
| 	cURL := strings.Replace(connURL, "postgres:secret", username+":"+password, 1) | ||||
| 	db, err := sql.Open("postgres", cURL) | ||||
| 	db, err := sql.Open("pgx", cURL) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|   | ||||
| @@ -10,7 +10,6 @@ import ( | ||||
| 	"github.com/hashicorp/vault/sdk/framework" | ||||
| 	"github.com/hashicorp/vault/sdk/helper/dbtxn" | ||||
| 	"github.com/hashicorp/vault/sdk/logical" | ||||
| 	_ "github.com/lib/pq" | ||||
| ) | ||||
|  | ||||
| func pathRoleCreate(b *backend) *framework.Path { | ||||
|   | ||||
| @@ -8,7 +8,6 @@ import ( | ||||
| 	"sync" | ||||
|  | ||||
| 	log "github.com/hashicorp/go-hclog" | ||||
|  | ||||
| 	"github.com/hashicorp/vault/sdk/framework" | ||||
| 	"github.com/hashicorp/vault/sdk/logical" | ||||
| ) | ||||
| @@ -108,10 +107,10 @@ func (b *backend) DB(ctx context.Context, s logical.Storage) (*sql.DB, error) { | ||||
| 			conn += "?timezone=utc" | ||||
| 		} | ||||
| 	} else { | ||||
| 		conn += " timezone=utc" | ||||
| 		conn += "&timezone=utc" | ||||
| 	} | ||||
|  | ||||
| 	b.db, err = sql.Open("postgres", conn) | ||||
| 	b.db, err = sql.Open("pgx", conn) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|   | ||||
| @@ -13,7 +13,6 @@ import ( | ||||
| 	logicaltest "github.com/hashicorp/vault/helper/testhelpers/logical" | ||||
| 	postgreshelper "github.com/hashicorp/vault/helper/testhelpers/postgresql" | ||||
| 	"github.com/hashicorp/vault/sdk/logical" | ||||
| 	"github.com/lib/pq" | ||||
| 	"github.com/mitchellh/mapstructure" | ||||
| ) | ||||
|  | ||||
| @@ -272,14 +271,8 @@ func testAccStepReadCreds(t *testing.T, b logical.Backend, s logical.Storage, na | ||||
| 				return err | ||||
| 			} | ||||
| 			log.Printf("[TRACE] Generated credentials: %v", d) | ||||
| 			conn, err := pq.ParseURL(connURL) | ||||
| 			if err != nil { | ||||
| 				t.Fatal(err) | ||||
| 			} | ||||
|  | ||||
| 			conn += " timezone=utc" | ||||
|  | ||||
| 			db, err := sql.Open("postgres", conn) | ||||
| 			db, err := sql.Open("pgx", connURL+"&timezone=utc") | ||||
| 			if err != nil { | ||||
| 				t.Fatal(err) | ||||
| 			} | ||||
| @@ -356,14 +349,8 @@ func testAccStepCreateTable(t *testing.T, b logical.Backend, s logical.Storage, | ||||
| 				return err | ||||
| 			} | ||||
| 			log.Printf("[TRACE] Generated credentials: %v", d) | ||||
| 			conn, err := pq.ParseURL(connURL) | ||||
| 			if err != nil { | ||||
| 				t.Fatal(err) | ||||
| 			} | ||||
|  | ||||
| 			conn += " timezone=utc" | ||||
|  | ||||
| 			db, err := sql.Open("postgres", conn) | ||||
| 			db, err := sql.Open("pgx", connURL+"&timezone=utc") | ||||
| 			if err != nil { | ||||
| 				t.Fatal(err) | ||||
| 			} | ||||
| @@ -410,14 +397,8 @@ func testAccStepDropTable(t *testing.T, b logical.Backend, s logical.Storage, na | ||||
| 				return err | ||||
| 			} | ||||
| 			log.Printf("[TRACE] Generated credentials: %v", d) | ||||
| 			conn, err := pq.ParseURL(connURL) | ||||
| 			if err != nil { | ||||
| 				t.Fatal(err) | ||||
| 			} | ||||
|  | ||||
| 			conn += " timezone=utc" | ||||
|  | ||||
| 			db, err := sql.Open("postgres", conn) | ||||
| 			db, err := sql.Open("pgx", connURL+"&timezone=utc") | ||||
| 			if err != nil { | ||||
| 				t.Fatal(err) | ||||
| 			} | ||||
|   | ||||
| @@ -7,7 +7,7 @@ import ( | ||||
|  | ||||
| 	"github.com/hashicorp/vault/sdk/framework" | ||||
| 	"github.com/hashicorp/vault/sdk/logical" | ||||
| 	_ "github.com/lib/pq" | ||||
| 	_ "github.com/jackc/pgx/v4/stdlib" | ||||
| ) | ||||
|  | ||||
| func pathConfigConnection(b *backend) *framework.Path { | ||||
| @@ -109,7 +109,7 @@ func (b *backend) pathConnectionWrite(ctx context.Context, req *logical.Request, | ||||
| 	verifyConnection := data.Get("verify_connection").(bool) | ||||
| 	if verifyConnection { | ||||
| 		// Verify the string | ||||
| 		db, err := sql.Open("postgres", connURL) | ||||
| 		db, err := sql.Open("pgx", connURL) | ||||
| 		if err != nil { | ||||
| 			return logical.ErrorResponse(fmt.Sprintf( | ||||
| 				"Error validating connection info: %s", err)), nil | ||||
|   | ||||
| @@ -11,7 +11,7 @@ import ( | ||||
| 	"github.com/hashicorp/vault/sdk/framework" | ||||
| 	"github.com/hashicorp/vault/sdk/helper/dbtxn" | ||||
| 	"github.com/hashicorp/vault/sdk/logical" | ||||
| 	_ "github.com/lib/pq" | ||||
| 	_ "github.com/jackc/pgx/v4/stdlib" | ||||
| ) | ||||
|  | ||||
| func pathRoleCreate(b *backend) *framework.Path { | ||||
|   | ||||
| @@ -7,11 +7,12 @@ import ( | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/hashicorp/vault/sdk/database/helper/dbutil" | ||||
|  | ||||
| 	"github.com/hashicorp/go-secure-stdlib/strutil" | ||||
| 	"github.com/hashicorp/vault/sdk/framework" | ||||
| 	"github.com/hashicorp/vault/sdk/helper/dbtxn" | ||||
| 	"github.com/hashicorp/vault/sdk/logical" | ||||
| 	"github.com/lib/pq" | ||||
| ) | ||||
|  | ||||
| const SecretCredsType = "creds" | ||||
| @@ -75,7 +76,7 @@ func (b *backend) secretCredsRenew(ctx context.Context, req *logical.Request, d | ||||
|  | ||||
| 		query := fmt.Sprintf( | ||||
| 			"ALTER ROLE %s VALID UNTIL '%s';", | ||||
| 			pq.QuoteIdentifier(username), | ||||
| 			dbutil.QuoteIdentifier(username), | ||||
| 			expiration) | ||||
| 		stmt, err := db.Prepare(query) | ||||
| 		if err != nil { | ||||
| @@ -171,27 +172,27 @@ func (b *backend) secretCredsRevoke(ctx context.Context, req *logical.Request, d | ||||
| 			} | ||||
| 			revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 				`REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA %s FROM %s;`, | ||||
| 				pq.QuoteIdentifier(schema), | ||||
| 				pq.QuoteIdentifier(username))) | ||||
| 				dbutil.QuoteIdentifier(schema), | ||||
| 				dbutil.QuoteIdentifier(username))) | ||||
|  | ||||
| 			revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 				`REVOKE USAGE ON SCHEMA %s FROM %s;`, | ||||
| 				pq.QuoteIdentifier(schema), | ||||
| 				pq.QuoteIdentifier(username))) | ||||
| 				dbutil.QuoteIdentifier(schema), | ||||
| 				dbutil.QuoteIdentifier(username))) | ||||
| 		} | ||||
|  | ||||
| 		// for good measure, revoke all privileges and usage on schema public | ||||
| 		revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 			`REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM %s;`, | ||||
| 			pq.QuoteIdentifier(username))) | ||||
| 			dbutil.QuoteIdentifier(username))) | ||||
|  | ||||
| 		revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 			"REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM %s;", | ||||
| 			pq.QuoteIdentifier(username))) | ||||
| 			dbutil.QuoteIdentifier(username))) | ||||
|  | ||||
| 		revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 			"REVOKE USAGE ON SCHEMA public FROM %s;", | ||||
| 			pq.QuoteIdentifier(username))) | ||||
| 			dbutil.QuoteIdentifier(username))) | ||||
|  | ||||
| 		// get the current database name so we can issue a REVOKE CONNECT for | ||||
| 		// this username | ||||
| @@ -203,8 +204,8 @@ func (b *backend) secretCredsRevoke(ctx context.Context, req *logical.Request, d | ||||
| 		if dbname.Valid { | ||||
| 			revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 				`REVOKE CONNECT ON DATABASE %s FROM %s;`, | ||||
| 				pq.QuoteIdentifier(dbname.String), | ||||
| 				pq.QuoteIdentifier(username))) | ||||
| 				dbutil.QuoteIdentifier(dbname.String), | ||||
| 				dbutil.QuoteIdentifier(username))) | ||||
| 		} | ||||
|  | ||||
| 		// again, here, we do not stop on error, as we want to remove as | ||||
| @@ -226,7 +227,7 @@ func (b *backend) secretCredsRevoke(ctx context.Context, req *logical.Request, d | ||||
|  | ||||
| 		// Drop this user | ||||
| 		stmt, err = db.Prepare(fmt.Sprintf( | ||||
| 			`DROP ROLE IF EXISTS %s;`, pq.QuoteIdentifier(username))) | ||||
| 			`DROP ROLE IF EXISTS %s;`, dbutil.QuoteIdentifier(username))) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|   | ||||
							
								
								
									
										15
									
								
								changelog/15343.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								changelog/15343.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| ```release-note:change | ||||
| physical/cockroachdb: Change underlying driver library from [lib/pq](https://github.com/lib/pq) to [pgx](https://github.com/jackc/pgx) | ||||
| ``` | ||||
|  | ||||
| ```release-note:change | ||||
| physical/postgres: Change underlying driver library from [lib/pq](https://github.com/lib/pq) to [pgx](https://github.com/jackc/pgx) | ||||
| ``` | ||||
|  | ||||
| ```release-note:change | ||||
| database/postgres: Change underlying driver library from [lib/pq](https://github.com/lib/pq) to [pgx](https://github.com/jackc/pgx) | ||||
| ``` | ||||
|  | ||||
| ```release-note:change | ||||
| database/redshift: Change underlying driver library from [lib/pq](https://github.com/lib/pq) to [pgx](https://github.com/jackc/pgx) | ||||
| ``` | ||||
							
								
								
									
										10
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								go.mod
									
									
									
									
									
								
							| @@ -122,6 +122,7 @@ require ( | ||||
| 	github.com/hashicorp/vault/api/auth/userpass v0.1.0 | ||||
| 	github.com/hashicorp/vault/sdk v0.4.2-0.20220511000023-fa93782110bf | ||||
| 	github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab | ||||
| 	github.com/jackc/pgx/v4 v4.15.0 | ||||
| 	github.com/jcmturner/gokrb5/v8 v8.4.2 | ||||
| 	github.com/jefferai/isbadcipher v0.0.0-20190226160619-51d2077c035f | ||||
| 	github.com/jefferai/jsonx v1.0.0 | ||||
| @@ -129,7 +130,6 @@ require ( | ||||
| 	github.com/keybase/go-crypto v0.0.0-20190403132359-d65b6b94177f | ||||
| 	github.com/kr/pretty v0.3.0 | ||||
| 	github.com/kr/text v0.2.0 | ||||
| 	github.com/lib/pq v1.10.3 | ||||
| 	github.com/mattn/go-colorable v0.1.12 | ||||
| 	github.com/mattn/go-isatty v0.0.14 | ||||
| 	github.com/mholt/archiver/v3 v3.5.1 | ||||
| @@ -296,6 +296,13 @@ require ( | ||||
| 	github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87 // indirect | ||||
| 	github.com/huandu/xstrings v1.3.2 // indirect | ||||
| 	github.com/imdario/mergo v0.3.12 // indirect | ||||
| 	github.com/jackc/chunkreader/v2 v2.0.1 // indirect | ||||
| 	github.com/jackc/pgconn v1.11.0 // indirect | ||||
| 	github.com/jackc/pgio v1.0.0 // indirect | ||||
| 	github.com/jackc/pgpassfile v1.0.0 // indirect | ||||
| 	github.com/jackc/pgproto3/v2 v2.2.0 // indirect | ||||
| 	github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect | ||||
| 	github.com/jackc/pgtype v1.10.0 // indirect | ||||
| 	github.com/jackc/pgx v3.3.0+incompatible // indirect | ||||
| 	github.com/jcmturner/aescts/v2 v2.0.0 // indirect | ||||
| 	github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect | ||||
| @@ -309,6 +316,7 @@ require ( | ||||
| 	github.com/kelseyhightower/envconfig v1.4.0 // indirect | ||||
| 	github.com/klauspost/compress v1.13.6 // indirect | ||||
| 	github.com/klauspost/pgzip v1.2.5 // indirect | ||||
| 	github.com/lib/pq v1.10.2 // indirect | ||||
| 	github.com/linode/linodego v0.7.1 // indirect | ||||
| 	github.com/mattn/go-ieproxy v0.0.1 // indirect | ||||
| 	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect | ||||
|   | ||||
							
								
								
									
										91
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								go.sum
									
									
									
									
									
								
							| @@ -131,6 +131,8 @@ github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy86 | ||||
| github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= | ||||
| github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= | ||||
| github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= | ||||
| github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= | ||||
| github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= | ||||
| github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= | ||||
| github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= | ||||
| github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= | ||||
| @@ -430,6 +432,7 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee | ||||
| github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= | ||||
| github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= | ||||
| github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= | ||||
| github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= | ||||
| github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= | ||||
| github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= | ||||
| github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= | ||||
| @@ -647,6 +650,8 @@ github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblf | ||||
| github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= | ||||
| github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= | ||||
| github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= | ||||
| github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= | ||||
| github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= | ||||
| github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= | ||||
| github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= | ||||
| github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= | ||||
| @@ -1033,10 +1038,59 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt | ||||
| github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= | ||||
| github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= | ||||
| github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= | ||||
| github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= | ||||
| github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= | ||||
| github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= | ||||
| github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= | ||||
| github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= | ||||
| github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc= | ||||
| github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= | ||||
| github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= | ||||
| github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= | ||||
| github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= | ||||
| github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= | ||||
| github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= | ||||
| github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= | ||||
| github.com/jackc/pgconn v1.11.0 h1:HiHArx4yFbwl91X3qqIHtUFoiIfLNJXCQRsnzkiwwaQ= | ||||
| github.com/jackc/pgconn v1.11.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= | ||||
| github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= | ||||
| github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= | ||||
| github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= | ||||
| github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= | ||||
| github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= | ||||
| github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= | ||||
| github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= | ||||
| github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= | ||||
| github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= | ||||
| github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= | ||||
| github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= | ||||
| github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= | ||||
| github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= | ||||
| github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= | ||||
| github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= | ||||
| github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= | ||||
| github.com/jackc/pgproto3/v2 v2.2.0 h1:r7JypeP2D3onoQTCxWdTpCtJ4D+qpKr0TxvoyMhZ5ns= | ||||
| github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= | ||||
| github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= | ||||
| github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= | ||||
| github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= | ||||
| github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= | ||||
| github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= | ||||
| github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= | ||||
| github.com/jackc/pgtype v1.10.0 h1:ILnBWrRMSXGczYvmkYD6PsYyVFUNLTnIUJHHDLmqk38= | ||||
| github.com/jackc/pgtype v1.10.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= | ||||
| github.com/jackc/pgx v3.3.0+incompatible h1:Wa90/+qsITBAPkAZjiByeIGHFcj3Ztu+VzrrIpHjL90= | ||||
| github.com/jackc/pgx v3.3.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= | ||||
| github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= | ||||
| github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= | ||||
| github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= | ||||
| github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= | ||||
| github.com/jackc/pgx/v4 v4.15.0 h1:B7dTkXsdILD3MF987WGGCcg+tvLW6bZJdEcqVFeU//w= | ||||
| github.com/jackc/pgx/v4 v4.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw= | ||||
| github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= | ||||
| github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= | ||||
| github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= | ||||
| github.com/jackc/puddle v1.2.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= | ||||
| github.com/jarcoal/httpmock v0.0.0-20180424175123-9c70cfe4a1da/go.mod h1:ks+b9deReOc7jgqp+e7LuFiCBH6Rm5hL32cLcEAArb4= | ||||
| github.com/jarcoal/httpmock v1.0.7 h1:d1a2VFpSdm5gtjhCPWsQHSnx8+5V3ms5431YwvmkuNk= | ||||
| github.com/jarcoal/httpmock v1.0.7/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= | ||||
| @@ -1125,15 +1179,18 @@ github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= | ||||
| github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= | ||||
| github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||
| github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= | ||||
| github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= | ||||
| github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||
| github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= | ||||
| github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | ||||
| github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | ||||
| github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | ||||
| github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | ||||
| github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | ||||
| github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= | ||||
| github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | ||||
| github.com/lib/pq v1.10.3 h1:v9QZf2Sn6AmjXtQeFpdoq/eaNtYP6IN+7lcrygsIAtg= | ||||
| github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | ||||
| github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= | ||||
| github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= | ||||
| github.com/linode/linodego v0.7.1 h1:4WZmMpSA2NRwlPZcc0+4Gyn7rr99Evk9bnr0B3gXRKE= | ||||
| github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY= | ||||
| github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= | ||||
| @@ -1148,6 +1205,7 @@ github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHef | ||||
| github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11 h1:YFh+sjyJTMQSYjKwM4dFKhJPJC/wfo98tPUc17HdoYw= | ||||
| github.com/martini-contrib/render v0.0.0-20150707142108-ec18f8345a11/go.mod h1:Ah2dBMoxZEqk118as2T4u4fjfXarE0pPnMJaArZQZsI= | ||||
| github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= | ||||
| github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= | ||||
| github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= | ||||
| github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= | ||||
| github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= | ||||
| @@ -1158,6 +1216,8 @@ github.com/mattn/go-ieproxy v0.0.1 h1:qiyop7gCflfhwCzGyeT0gro3sF9AIg9HU98JORTkqf | ||||
| github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/gNWuh88E= | ||||
| github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= | ||||
| github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= | ||||
| github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | ||||
| github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | ||||
| github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= | ||||
| github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= | ||||
| github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= | ||||
| @@ -1438,7 +1498,10 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR | ||||
| github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= | ||||
| github.com/rogpeppe/go-internal v1.6.2 h1:aIihoIOHCiLZHxyoNQ+ABL4NKhFTgKLBdMLyEAh98m0= | ||||
| github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= | ||||
| github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= | ||||
| github.com/rs/zerolog v1.4.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= | ||||
| github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= | ||||
| github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= | ||||
| github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= | ||||
| github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= | ||||
| github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= | ||||
| @@ -1463,8 +1526,9 @@ github.com/sethvargo/go-limiter v0.7.1 h1:wWNhTj0pxjyJ7wuJHpRJpYwJn+bUnjYfw2a85e | ||||
| github.com/sethvargo/go-limiter v0.7.1/go.mod h1:C0kbSFbiriE5k2FFOe18M1YZbAR2Fiwf72uGu0CXCcU= | ||||
| github.com/shirou/gopsutil v3.21.5+incompatible h1:OloQyEerMi7JUrXiNzy8wQ5XN+baemxSl12QgIzt0jc= | ||||
| github.com/shirou/gopsutil v3.21.5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= | ||||
| github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24 h1:pntxY8Ary0t43dCZ5dqY4YTJCObLY1kIXl0uzMv+7DE= | ||||
| github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= | ||||
| github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= | ||||
| github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= | ||||
| github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= | ||||
| github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= | ||||
| github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= | ||||
| @@ -1593,6 +1657,7 @@ github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9/go.mod h1:E1AXubJB | ||||
| github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= | ||||
| github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= | ||||
| github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= | ||||
| github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= | ||||
| go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= | ||||
| go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= | ||||
| go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= | ||||
| @@ -1636,6 +1701,8 @@ go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16g | ||||
| go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= | ||||
| go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | ||||
| go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= | ||||
| go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= | ||||
| go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= | ||||
| go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= | ||||
| go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= | ||||
| go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= | ||||
| @@ -1643,9 +1710,14 @@ go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A | ||||
| go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= | ||||
| go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= | ||||
| go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= | ||||
| go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= | ||||
| go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= | ||||
| go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= | ||||
| go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= | ||||
| go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= | ||||
| go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= | ||||
| go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= | ||||
| go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= | ||||
| go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= | ||||
| go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= | ||||
| go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= | ||||
| @@ -1656,12 +1728,14 @@ golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnf | ||||
| golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
| golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= | ||||
| golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= | ||||
| golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= | ||||
| golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| @@ -1675,9 +1749,11 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh | ||||
| golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= | ||||
| golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= | ||||
| golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= | ||||
| golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= | ||||
| golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||
| golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||
| golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||
| golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||
| @@ -1856,6 +1932,7 @@ golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7w | ||||
| golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| @@ -1986,6 +2063,7 @@ golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3 | ||||
| golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | ||||
| golang.org/x/tools v0.0.0-20190424220101-1e8e1cfdf96b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | ||||
| golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | ||||
| golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | ||||
| golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | ||||
| golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | ||||
| golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | ||||
| @@ -1996,9 +2074,12 @@ golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgw | ||||
| golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | ||||
| golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= | ||||
| golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| @@ -2007,6 +2088,7 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn | ||||
| golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= | ||||
| golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= | ||||
| golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= | ||||
| golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= | ||||
| golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= | ||||
| golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= | ||||
| @@ -2040,6 +2122,8 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | ||||
| golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | ||||
| golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= | ||||
| golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= | ||||
| golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| @@ -2189,6 +2273,7 @@ gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= | ||||
| gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= | ||||
| gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= | ||||
| gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= | ||||
| gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= | ||||
| gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= | ||||
| gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= | ||||
| gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= | ||||
|   | ||||
| @@ -59,7 +59,7 @@ func connectPostgres(password string) docker.ServiceAdapter { | ||||
| 			RawQuery: "sslmode=disable", | ||||
| 		} | ||||
|  | ||||
| 		db, err := sql.Open("postgres", u.String()) | ||||
| 		db, err := sql.Open("pgx", u.String()) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
|   | ||||
| @@ -18,7 +18,7 @@ import ( | ||||
| 	"github.com/hashicorp/vault/sdk/physical" | ||||
|  | ||||
| 	// CockroachDB uses the Postgres SQL driver | ||||
| 	_ "github.com/lib/pq" | ||||
| 	_ "github.com/jackc/pgx/v4/stdlib" | ||||
| ) | ||||
|  | ||||
| // Verify CockroachDBBackend satisfies the correct interfaces | ||||
| @@ -91,7 +91,7 @@ func NewCockroachDBBackend(conf map[string]string, logger log.Logger) (physical. | ||||
| 	} | ||||
|  | ||||
| 	// Create CockroachDB handle for the database. | ||||
| 	db, err := sql.Open("postgres", connURL) | ||||
| 	db, err := sql.Open("pgx", connURL) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("failed to connect to cockroachdb: %w", err) | ||||
| 	} | ||||
|   | ||||
| @@ -185,7 +185,7 @@ func (l *CockroachDBLock) writeItem() (bool, error) { | ||||
| 	c.permitPool.Acquire() | ||||
| 	defer c.permitPool.Release() | ||||
|  | ||||
| 	sqlResult, err := c.haStatements["upsert"].Exec(l.identity, l.key, l.value, l.ttlSeconds) | ||||
| 	sqlResult, err := c.haStatements["upsert"].Exec(l.identity, l.key, l.value, fmt.Sprintf("%d seconds", l.ttlSeconds)) | ||||
| 	if err != nil { | ||||
| 		return false, err | ||||
| 	} | ||||
|   | ||||
| @@ -12,8 +12,6 @@ import ( | ||||
| 	"github.com/hashicorp/vault/helper/testhelpers/docker" | ||||
| 	"github.com/hashicorp/vault/sdk/helper/logging" | ||||
| 	"github.com/hashicorp/vault/sdk/physical" | ||||
|  | ||||
| 	_ "github.com/lib/pq" | ||||
| ) | ||||
|  | ||||
| type Config struct { | ||||
| @@ -63,7 +61,7 @@ func connectCockroachDB(ctx context.Context, host string, port int) (docker.Serv | ||||
| 		RawQuery: "sslmode=disable", | ||||
| 	} | ||||
|  | ||||
| 	db, err := sql.Open("postgres", u.String()) | ||||
| 	db, err := sql.Open("pgx", u.String()) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|   | ||||
| @@ -10,13 +10,12 @@ import ( | ||||
| 	"sync" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/hashicorp/vault/sdk/physical" | ||||
|  | ||||
| 	"github.com/armon/go-metrics" | ||||
| 	log "github.com/hashicorp/go-hclog" | ||||
| 	"github.com/hashicorp/go-uuid" | ||||
|  | ||||
| 	"github.com/armon/go-metrics" | ||||
| 	"github.com/lib/pq" | ||||
| 	"github.com/hashicorp/vault/sdk/database/helper/dbutil" | ||||
| 	"github.com/hashicorp/vault/sdk/physical" | ||||
| 	_ "github.com/jackc/pgx/v4/stdlib" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| @@ -99,7 +98,7 @@ func NewPostgreSQLBackend(conf map[string]string, logger log.Logger) (physical.B | ||||
| 	if !ok { | ||||
| 		unquoted_table = "vault_kv_store" | ||||
| 	} | ||||
| 	quoted_table := pq.QuoteIdentifier(unquoted_table) | ||||
| 	quoted_table := dbutil.QuoteIdentifier(unquoted_table) | ||||
|  | ||||
| 	maxParStr, ok := conf["max_parallel"] | ||||
| 	var maxParInt int | ||||
| @@ -129,7 +128,7 @@ func NewPostgreSQLBackend(conf map[string]string, logger log.Logger) (physical.B | ||||
| 	} | ||||
|  | ||||
| 	// Create PostgreSQL handle for the database. | ||||
| 	db, err := sql.Open("postgres", connURL) | ||||
| 	db, err := sql.Open("pgx", connURL) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("failed to connect to postgres: %w", err) | ||||
| 	} | ||||
| @@ -165,7 +164,7 @@ func NewPostgreSQLBackend(conf map[string]string, logger log.Logger) (physical.B | ||||
| 	if !ok { | ||||
| 		unquoted_ha_table = "vault_ha_locks" | ||||
| 	} | ||||
| 	quoted_ha_table := pq.QuoteIdentifier(unquoted_ha_table) | ||||
| 	quoted_ha_table := dbutil.QuoteIdentifier(unquoted_ha_table) | ||||
|  | ||||
| 	// Setup the backend. | ||||
| 	m := &PostgreSQLBackend{ | ||||
|   | ||||
| @@ -10,8 +10,7 @@ import ( | ||||
| 	"github.com/hashicorp/vault/helper/testhelpers/postgresql" | ||||
| 	"github.com/hashicorp/vault/sdk/helper/logging" | ||||
| 	"github.com/hashicorp/vault/sdk/physical" | ||||
|  | ||||
| 	_ "github.com/lib/pq" | ||||
| 	_ "github.com/jackc/pgx/v4/stdlib" | ||||
| ) | ||||
|  | ||||
| func TestPostgreSQLBackend(t *testing.T) { | ||||
|   | ||||
| @@ -9,16 +9,16 @@ import ( | ||||
|  | ||||
| 	"github.com/hashicorp/go-multierror" | ||||
| 	"github.com/hashicorp/go-secure-stdlib/strutil" | ||||
| 	dbplugin "github.com/hashicorp/vault/sdk/database/dbplugin/v5" | ||||
| 	"github.com/hashicorp/vault/sdk/database/dbplugin/v5" | ||||
| 	"github.com/hashicorp/vault/sdk/database/helper/connutil" | ||||
| 	"github.com/hashicorp/vault/sdk/database/helper/dbutil" | ||||
| 	"github.com/hashicorp/vault/sdk/helper/dbtxn" | ||||
| 	"github.com/hashicorp/vault/sdk/helper/template" | ||||
| 	"github.com/lib/pq" | ||||
| 	_ "github.com/jackc/pgx/v4/stdlib" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	postgreSQLTypeName         = "postgres" | ||||
| 	postgreSQLTypeName         = "pgx" | ||||
| 	defaultExpirationStatement = ` | ||||
| ALTER ROLE "{{name}}" VALID UNTIL '{{expiration}}'; | ||||
| ` | ||||
| @@ -396,27 +396,27 @@ func (p *PostgreSQL) defaultDeleteUser(ctx context.Context, username string) err | ||||
| 		} | ||||
| 		revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 			`REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA %s FROM %s;`, | ||||
| 			pq.QuoteIdentifier(schema), | ||||
| 			pq.QuoteIdentifier(username))) | ||||
| 			(schema), | ||||
| 			dbutil.QuoteIdentifier(username))) | ||||
|  | ||||
| 		revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 			`REVOKE USAGE ON SCHEMA %s FROM %s;`, | ||||
| 			pq.QuoteIdentifier(schema), | ||||
| 			pq.QuoteIdentifier(username))) | ||||
| 			dbutil.QuoteIdentifier(schema), | ||||
| 			dbutil.QuoteIdentifier(username))) | ||||
| 	} | ||||
|  | ||||
| 	// for good measure, revoke all privileges and usage on schema public | ||||
| 	revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 		`REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM %s;`, | ||||
| 		pq.QuoteIdentifier(username))) | ||||
| 		dbutil.QuoteIdentifier(username))) | ||||
|  | ||||
| 	revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 		"REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM %s;", | ||||
| 		pq.QuoteIdentifier(username))) | ||||
| 		dbutil.QuoteIdentifier(username))) | ||||
|  | ||||
| 	revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 		"REVOKE USAGE ON SCHEMA public FROM %s;", | ||||
| 		pq.QuoteIdentifier(username))) | ||||
| 		dbutil.QuoteIdentifier(username))) | ||||
|  | ||||
| 	// get the current database name so we can issue a REVOKE CONNECT for | ||||
| 	// this username | ||||
| @@ -428,8 +428,8 @@ func (p *PostgreSQL) defaultDeleteUser(ctx context.Context, username string) err | ||||
| 	if dbname.Valid { | ||||
| 		revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 			`REVOKE CONNECT ON DATABASE %s FROM %s;`, | ||||
| 			pq.QuoteIdentifier(dbname.String), | ||||
| 			pq.QuoteIdentifier(username))) | ||||
| 			dbutil.QuoteIdentifier(dbname.String), | ||||
| 			dbutil.QuoteIdentifier(username))) | ||||
| 	} | ||||
|  | ||||
| 	// again, here, we do not stop on error, as we want to remove as | ||||
| @@ -451,7 +451,7 @@ func (p *PostgreSQL) defaultDeleteUser(ctx context.Context, username string) err | ||||
|  | ||||
| 	// Drop this user | ||||
| 	stmt, err = db.PrepareContext(ctx, fmt.Sprintf( | ||||
| 		`DROP ROLE IF EXISTS %s;`, pq.QuoteIdentifier(username))) | ||||
| 		`DROP ROLE IF EXISTS %s;`, dbutil.QuoteIdentifier(username))) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -8,8 +8,10 @@ import ( | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/hashicorp/vault/sdk/database/helper/dbutil" | ||||
|  | ||||
| 	"github.com/hashicorp/vault/helper/testhelpers/postgresql" | ||||
| 	dbplugin "github.com/hashicorp/vault/sdk/database/dbplugin/v5" | ||||
| 	"github.com/hashicorp/vault/sdk/database/dbplugin/v5" | ||||
| 	dbtesting "github.com/hashicorp/vault/sdk/database/dbplugin/v5/testing" | ||||
| 	"github.com/hashicorp/vault/sdk/helper/template" | ||||
| 	"github.com/stretchr/testify/require" | ||||
| @@ -61,6 +63,32 @@ func TestPostgreSQL_InitializeWithStringVals(t *testing.T) { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestPostgreSQL_Initialize_ConnURLWithDSNFormat(t *testing.T) { | ||||
| 	cleanup, connURL := postgresql.PrepareTestContainer(t, "13.4-buster") | ||||
| 	defer cleanup() | ||||
|  | ||||
| 	dsnConnURL, err := dbutil.ParseURL(connURL) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  | ||||
| 	connectionDetails := map[string]interface{}{ | ||||
| 		"connection_url": dsnConnURL, | ||||
| 	} | ||||
|  | ||||
| 	req := dbplugin.InitializeRequest{ | ||||
| 		Config:           connectionDetails, | ||||
| 		VerifyConnection: true, | ||||
| 	} | ||||
|  | ||||
| 	db := new() | ||||
| 	dbtesting.AssertInitialize(t, db, req) | ||||
|  | ||||
| 	if !db.Initialized { | ||||
| 		t.Fatal("Database should be initialized") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func TestPostgreSQL_NewUser(t *testing.T) { | ||||
| 	type testCase struct { | ||||
| 		req            dbplugin.NewUserRequest | ||||
| @@ -675,7 +703,7 @@ func testCredsExist(t testing.TB, connURL, username, password string) error { | ||||
| 	t.Helper() | ||||
| 	// Log in with the new creds | ||||
| 	connURL = strings.Replace(connURL, "postgres:secret", fmt.Sprintf("%s:%s", username, password), 1) | ||||
| 	db, err := sql.Open("postgres", connURL) | ||||
| 	db, err := sql.Open("pgx", connURL) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -14,7 +14,7 @@ import ( | ||||
| 	"github.com/hashicorp/vault/sdk/database/helper/dbutil" | ||||
| 	"github.com/hashicorp/vault/sdk/helper/dbtxn" | ||||
| 	"github.com/hashicorp/vault/sdk/helper/template" | ||||
| 	"github.com/lib/pq" | ||||
| 	_ "github.com/jackc/pgx/v4/stdlib" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| @@ -23,7 +23,7 @@ const ( | ||||
| 	middlewareTypeName = "redshift" | ||||
|  | ||||
| 	// This allows us to use the postgres database driver. | ||||
| 	sqlTypeName = "postgres" | ||||
| 	sqlTypeName = "pgx" | ||||
|  | ||||
| 	defaultRenewSQL = ` | ||||
| ALTER USER "{{name}}" VALID UNTIL '{{expiration}}'; | ||||
| @@ -398,23 +398,23 @@ func (r *RedShift) defaultDeleteUser(ctx context.Context, req dbplugin.DeleteUse | ||||
| 		} | ||||
| 		revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 			`REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA %s FROM %s;`, | ||||
| 			pq.QuoteIdentifier(schema), | ||||
| 			pq.QuoteIdentifier(username))) | ||||
| 			dbutil.QuoteIdentifier(schema), | ||||
| 			dbutil.QuoteIdentifier(username))) | ||||
|  | ||||
| 		revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 			`REVOKE USAGE ON SCHEMA %s FROM %s;`, | ||||
| 			pq.QuoteIdentifier(schema), | ||||
| 			pq.QuoteIdentifier(username))) | ||||
| 			dbutil.QuoteIdentifier(schema), | ||||
| 			dbutil.QuoteIdentifier(username))) | ||||
| 	} | ||||
|  | ||||
| 	// for good measure, revoke all privileges and usage on schema public | ||||
| 	revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 		`REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM %s;`, | ||||
| 		pq.QuoteIdentifier(username))) | ||||
| 		dbutil.QuoteIdentifier(username))) | ||||
|  | ||||
| 	revocationStmts = append(revocationStmts, fmt.Sprintf( | ||||
| 		"REVOKE USAGE ON SCHEMA public FROM %s;", | ||||
| 		pq.QuoteIdentifier(username))) | ||||
| 		dbutil.QuoteIdentifier(username))) | ||||
|  | ||||
| 	// get the current database name so we can issue a REVOKE CONNECT for | ||||
| 	// this username | ||||
| @@ -467,7 +467,7 @@ $$;`) | ||||
|  | ||||
| 	// Drop this user | ||||
| 	stmt, err = db.PrepareContext(ctx, fmt.Sprintf( | ||||
| 		`DROP USER IF EXISTS %s;`, pq.QuoteIdentifier(username))) | ||||
| 		`DROP USER IF EXISTS %s;`, dbutil.QuoteIdentifier(username))) | ||||
| 	if err != nil { | ||||
| 		return dbplugin.DeleteUserResponse{}, err | ||||
| 	} | ||||
|   | ||||
| @@ -14,7 +14,6 @@ import ( | ||||
| 	dbplugin "github.com/hashicorp/vault/sdk/database/dbplugin/v5" | ||||
| 	dbtesting "github.com/hashicorp/vault/sdk/database/dbplugin/v5/testing" | ||||
| 	"github.com/hashicorp/vault/sdk/helper/dbtxn" | ||||
| 	"github.com/lib/pq" | ||||
| 	"github.com/stretchr/testify/require" | ||||
| ) | ||||
|  | ||||
| @@ -368,7 +367,7 @@ func testCredsExist(t testing.TB, url, username, password string) error { | ||||
| 	t.Helper() | ||||
|  | ||||
| 	connURL := interpolateConnectionURL(url, username, password) | ||||
| 	db, err := sql.Open("postgres", connURL) | ||||
| 	db, err := sql.Open("pgx", connURL) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| @@ -512,12 +511,8 @@ ALTER USER "{{name}}" WITH PASSWORD '{{password}}'; | ||||
| // helper file in the future. | ||||
| func createTestPGUser(t *testing.T, connURL string, username, password, query string) { | ||||
| 	t.Helper() | ||||
| 	conn, err := pq.ParseURL(connURL) | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
|  | ||||
| 	db, err := sql.Open("postgres", conn) | ||||
| 	db, err := sql.Open("pgx", connURL) | ||||
| 	defer db.Close() | ||||
| 	if err != nil { | ||||
| 		t.Fatal(err) | ||||
|   | ||||
							
								
								
									
										99
									
								
								sdk/database/helper/dbutil/parseurl.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								sdk/database/helper/dbutil/parseurl.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | ||||
| // Copyright (c) 2011-2013, 'pq' Contributors Portions Copyright (C) 2011 Blake | ||||
| // Mizerany | ||||
| // | ||||
| // Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| // of this software and associated documentation files (the "Software"), to deal | ||||
| // in the Software without restriction, including without limitation the rights | ||||
| // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| // copies of the Software, and to permit persons to whom the Software is | ||||
| // furnished to do so, subject to the following conditions: | ||||
| // | ||||
| // The above copyright notice and this permission notice shall be included in | ||||
| // all copies or substantial portions of the Software. | ||||
| // | ||||
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| // SOFTWARE. | ||||
|  | ||||
| // Copied from https://github.com/lib/pq/blob/v1.10.6/url.go#L32 | ||||
|  | ||||
| package dbutil | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"net" | ||||
| 	nurl "net/url" | ||||
| 	"sort" | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| // ParseURL no longer needs to be used by clients of this library since supplying a URL as a | ||||
| // connection string to sql.Open() is now supported: | ||||
| // | ||||
| //	sql.Open("postgres", "postgres://bob:secret@1.2.3.4:5432/mydb?sslmode=verify-full") | ||||
| // | ||||
| // It remains exported here for backwards-compatibility. | ||||
| // | ||||
| // ParseURL converts a url to a connection string for driver.Open. | ||||
| // Example: | ||||
| // | ||||
| //	"postgres://bob:secret@1.2.3.4:5432/mydb?sslmode=verify-full" | ||||
| // | ||||
| // converts to: | ||||
| // | ||||
| //	"user=bob password=secret host=1.2.3.4 port=5432 dbname=mydb sslmode=verify-full" | ||||
| // | ||||
| // A minimal example: | ||||
| // | ||||
| //	"postgres://" | ||||
| // | ||||
| // This will be blank, causing driver.Open to use all of the defaults | ||||
| func ParseURL(url string) (string, error) { | ||||
| 	u, err := nurl.Parse(url) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
|  | ||||
| 	if u.Scheme != "postgres" && u.Scheme != "postgresql" { | ||||
| 		return "", fmt.Errorf("invalid connection protocol: %s", u.Scheme) | ||||
| 	} | ||||
|  | ||||
| 	var kvs []string | ||||
| 	escaper := strings.NewReplacer(`'`, `\'`, `\`, `\\`) | ||||
| 	accrue := func(k, v string) { | ||||
| 		if v != "" { | ||||
| 			kvs = append(kvs, k+"='"+escaper.Replace(v)+"'") | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if u.User != nil { | ||||
| 		v := u.User.Username() | ||||
| 		accrue("user", v) | ||||
|  | ||||
| 		v, _ = u.User.Password() | ||||
| 		accrue("password", v) | ||||
| 	} | ||||
|  | ||||
| 	if host, port, err := net.SplitHostPort(u.Host); err != nil { | ||||
| 		accrue("host", u.Host) | ||||
| 	} else { | ||||
| 		accrue("host", host) | ||||
| 		accrue("port", port) | ||||
| 	} | ||||
|  | ||||
| 	if u.Path != "" { | ||||
| 		accrue("dbname", u.Path[1:]) | ||||
| 	} | ||||
|  | ||||
| 	q := u.Query() | ||||
| 	for k := range q { | ||||
| 		accrue(k, q.Get(k)) | ||||
| 	} | ||||
|  | ||||
| 	sort.Strings(kvs) // Makes testing easier (not a performance concern) | ||||
| 	return strings.Join(kvs, " "), nil | ||||
| } | ||||
							
								
								
									
										45
									
								
								sdk/database/helper/dbutil/quoteidentifier.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								sdk/database/helper/dbutil/quoteidentifier.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| // Copyright (c) 2011-2013, 'pq' Contributors Portions Copyright (C) 2011 Blake | ||||
| // Mizerany | ||||
| // | ||||
| // Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| // of this software and associated documentation files (the "Software"), to deal | ||||
| // in the Software without restriction, including without limitation the rights | ||||
| // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||||
| // copies of the Software, and to permit persons to whom the Software is | ||||
| // furnished to do so, subject to the following conditions: | ||||
| // | ||||
| // The above copyright notice and this permission notice shall be included in | ||||
| // all copies or substantial portions of the Software. | ||||
| // | ||||
| // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| // SOFTWARE. | ||||
|  | ||||
| // Copied from https://github.com/lib/pq/blob/v1.10.4/conn.go#L1640 | ||||
|  | ||||
| package dbutil | ||||
|  | ||||
| import "strings" | ||||
|  | ||||
| // QuoteIdentifier quotes an "identifier" (e.g. a table or a column name) to be | ||||
| // used as part of an SQL statement.  For example: | ||||
| // | ||||
| //    tblname := "my_table" | ||||
| //    data := "my_data" | ||||
| //    quoted := pq.QuoteIdentifier(tblname) | ||||
| //    err := db.Exec(fmt.Sprintf("INSERT INTO %s VALUES ($1)", quoted), data) | ||||
| // | ||||
| // Any double quotes in name will be escaped.  The quoted identifier will be | ||||
| // case sensitive when used in a query.  If the input string contains a zero | ||||
| // byte, the result will be truncated immediately before it. | ||||
| func QuoteIdentifier(name string) string { | ||||
| 	end := strings.IndexRune(name, 0) | ||||
| 	if end > -1 { | ||||
| 		name = name[:end] | ||||
| 	} | ||||
| 	return `"` + strings.Replace(name, `"`, `""`, -1) + `"` | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Jim Kalafut
					Jim Kalafut