diff --git a/Dockerfile b/Dockerfile index c616034..b0485d9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # backend build (api server) -FROM golang:1.15-alpine AS api-build -RUN apk add --no-cache --update bash dep make git curl g++ +FROM golang:1.23.2-alpine AS api-build +RUN apk add --no-cache --update bash make git curl g++ ARG RELEASE=prod COPY ./api /go/src/commento/api/ diff --git a/api/comment_count.go b/api/comment_count.go index c04f88e..0271721 100644 --- a/api/comment_count.go +++ b/api/comment_count.go @@ -1,7 +1,6 @@ package main import ( - "github.com/lib/pq" "net/http" ) @@ -21,7 +20,7 @@ func commentCount(domain string, paths []string) (map[string]int, error) { FROM pages WHERE domain = $1 AND path = ANY($2); ` - rows, err := db.Query(statement, domain, pq.Array(paths)) + rows, err := db.Query(statement, domain, paths) if err != nil { logger.Errorf("cannot get comments: %v", err) return nil, errorInternal diff --git a/api/database_connect.go b/api/database_connect.go index b5b7cab..ff3e833 100644 --- a/api/database_connect.go +++ b/api/database_connect.go @@ -2,11 +2,12 @@ package main import ( "database/sql" - _ "github.com/lib/pq" "net/url" "os" "strconv" "time" + + _ "github.com/jackc/pgx/v5/stdlib" ) func dbConnect(retriesLeft int) error { @@ -19,7 +20,7 @@ func dbConnect(retriesLeft int) error { u.User = url.UserPassword(u.User.Username(), "redacted") logger.Infof("opening connection to postgres: %s", u.String()) - db, err = sql.Open("postgres", con) + db, err = sql.Open("pgx", con) if err != nil { logger.Errorf("cannot open connection to postgres: %v", err) return err @@ -50,7 +51,7 @@ func dbConnect(retriesLeft int) error { maxIdleConnections, err := strconv.Atoi(os.Getenv("MAX_IDLE_PG_CONNECTIONS")) if err != nil { - logger.Warningf("cannot parse COMMENTO_MAX_IDLE_PG_CONNECTIONS: %v", err) + logger.Warningf("cannot parse MAX_IDLE_PG_CONNECTIONS: %v", err) maxIdleConnections = 50 } diff --git a/api/domain_ownership_verify_test.go b/api/domain_ownership_verify_test.go index 00614b9..67f843b 100644 --- a/api/domain_ownership_verify_test.go +++ b/api/domain_ownership_verify_test.go @@ -7,7 +7,10 @@ import ( func TestDomainVerifyOwnershipBasics(t *testing.T) { failTestOnError(t, setupTestEnv()) - ownerHex, _ := ownerNew("test@example.com", "Test", "hunter2") + ownerHex, err := ownerNew("test@example.com", "Test", "hunter2") + if err != nil { + t.Errorf("error creating owner: %v", err) + } ownerLogin("test@example.com", "hunter2") domainNew(ownerHex, "Example", "example.com") diff --git a/api/go.mod b/api/go.mod index 31f1a33..553462e 100644 --- a/api/go.mod +++ b/api/go.mod @@ -1,23 +1,34 @@ module gitlab.com/commento/commento/api -go 1.12 +go 1.21 + +toolchain go1.23.2 require ( - cloud.google.com/go v0.26.0 // indirect github.com/adtac/go-akismet v0.0.0-20181220032308-0ca9e1023047 github.com/disintegration/imaging v1.6.2 - github.com/golang/protobuf v1.1.0 // indirect github.com/gomodule/oauth1 v0.0.0-20181215000758-9a59ed3b0a84 - github.com/gorilla/context v1.1.1 // indirect github.com/gorilla/handlers v1.4.0 github.com/gorilla/mux v1.6.2 - github.com/lib/pq v0.0.0-20180523175426-90697d60dd84 + github.com/jackc/pgx/v5 v5.7.2 github.com/lunny/html2md v0.0.0-20180317074532-13aaeeae9fb2 github.com/microcosm-cc/bluemonday v1.0.0 github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473 github.com/russross/blackfriday v1.5.1 - golang.org/x/crypto v0.0.0-20180808211826-de0752318171 - golang.org/x/net v0.0.0-20180811021610-c39426892332 + golang.org/x/crypto v0.31.0 + golang.org/x/net v0.25.0 golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc +) + +require ( + cloud.google.com/go v0.26.0 // indirect + github.com/golang/protobuf v1.1.0 // indirect + github.com/gorilla/context v1.1.1 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/appengine v1.1.0 // indirect ) diff --git a/api/go.sum b/api/go.sum index ad91b99..8656550 100644 --- a/api/go.sum +++ b/api/go.sum @@ -2,6 +2,9 @@ cloud.google.com/go v0.26.0 h1:e0WKqKTd5BnrG8aKH3J3h+QvEIQtSUcf2n5UZ5ZgLtQ= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/adtac/go-akismet v0.0.0-20181220032308-0ca9e1023047 h1:ZC99vhH6LlWY7bstM3JhEZl1c0a0DWZPFe7+hvRwTlc= github.com/adtac/go-akismet v0.0.0-20181220032308-0ca9e1023047/go.mod h1:DU/mtPMgEDGGfgxGATXm2Br5+F7JOClQj9nHVKZMlns= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= github.com/golang/protobuf v1.1.0 h1:0iH4Ffd/meGoXqF2lSAhZHt8X+cPgkfn/cb6Cce5Vpc= @@ -14,24 +17,45 @@ github.com/gorilla/handlers v1.4.0 h1:XulKRWSQK5uChr4pEgSE4Tc/OcmnU9GJuSwdog/tZs github.com/gorilla/handlers v1.4.0/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.6.2 h1:Pgr17XVTNXAk3q/r4CpKzC5xBM/qW1uVLV+IhRZpIIk= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/lib/pq v0.0.0-20180523175426-90697d60dd84 h1:it29sI2IM490luSc3RAhp5WuCYnc6RtbfLVAB7nmC5M= -github.com/lib/pq v0.0.0-20180523175426-90697d60dd84/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +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/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI= +github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/lunny/html2md v0.0.0-20180317074532-13aaeeae9fb2 h1:eShptbR1fYhyKFFrjdSY1QuW6ymkTLlgyNEeZMchy3s= github.com/lunny/html2md v0.0.0-20180317074532-13aaeeae9fb2/go.mod h1:lUUaVYlpAQ1Oo6vIZfec6CXQZjOvFZLyqaR8Dl7m+hk= github.com/microcosm-cc/bluemonday v1.0.0 h1:dr58SIfmOwOVr+m4Ye1xLWv8Dk9OFwXAtYnbJSmJ65k= github.com/microcosm-cc/bluemonday v1.0.0/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473 h1:J1QZwDXgZ4dJD2s19iqR9+U00OWM2kDzbf1O/fmvCWg= github.com/op/go-logging v0.0.0-20160211212156-b2cb9fa56473/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/russross/blackfriday v1.5.1 h1:B8ZN6pD4PVofmlDCDUdELeYrbsVIDM/bpjW3v3zgcRc= github.com/russross/blackfriday v1.5.1/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -golang.org/x/crypto v0.0.0-20180808211826-de0752318171 h1:vYogbvSFj2YXcjQxFHu/rASSOt9sLytpCaSkiwQ135I= -golang.org/x/crypto v0.0.0-20180808211826-de0752318171/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8 h1:hVwzHzIUGRjiF7EcUjqNxk3NCfkPxbDKRdnNE1Rpg0U= golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/net v0.0.0-20180811021610-c39426892332 h1:efGso+ep0DjyCBJPjvoz0HI6UldX4Md2F1rZFe1ir0E= -golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc h1:3ElrZeO6IBP+M8kgu5YFwRo92Gqr+zBg3aooYQ6ziqU= golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/api/owner_confirm_hex_test.go b/api/owner_confirm_hex_test.go index 00b477e..d3155eb 100644 --- a/api/owner_confirm_hex_test.go +++ b/api/owner_confirm_hex_test.go @@ -27,7 +27,7 @@ func TestOwnerConfirmHexBasics(t *testing.T) { ownerConfirmHexes (confirmHex, ownerHex, sendDate) VALUES ($1, $2, $3 ); ` - _, err = db.Exec(statement, confirmHex, ownerHex, time.Now().UTC()) + _, err = db.Exec(statement, confirmHex, ownerHex, time.Now().UTC().Format(time.RFC3339)) if err != nil { t.Errorf("unexpected error creating inserting confirmHex: %v\n", err) return diff --git a/api/owner_new.go b/api/owner_new.go index 4e4e540..ad2e490 100644 --- a/api/owner_new.go +++ b/api/owner_new.go @@ -1,10 +1,13 @@ package main import ( - "golang.org/x/crypto/bcrypt" + "fmt" "net/http" "os" + "strconv" "time" + + "golang.org/x/crypto/bcrypt" ) func ownerNew(email string, name string, password string) (string, error) { @@ -41,10 +44,11 @@ func ownerNew(email string, name string, password string) (string, error) { owners (ownerHex, email, name, passwordHash, joinDate, confirmedEmail) VALUES ($1, $2, $3, $4, $5, $6 ); ` - _, err = db.Exec(statement, ownerHex, email, name, string(passwordHash), time.Now().UTC(), !smtpConfigured) + _, err = db.Exec(statement, ownerHex, email, name, string(passwordHash), time.Now().UTC(), strconv.FormatBool(!smtpConfigured)) if err != nil { // TODO: Make sure `err` is actually about conflicting UNIQUE, and not some // other error. If it is something else, we should probably return `errorInternal`. + fmt.Println(err) return "", errorEmailAlreadyExists } diff --git a/db/20191204173000-sort-method.sql b/db/20191204173000-sort-method.sql index ca12a70..2945c63 100644 --- a/db/20191204173000-sort-method.sql +++ b/db/20191204173000-sort-method.sql @@ -1,5 +1,7 @@ -- Default sort policy for each domain +DROP TYPE IF EXISTS sortPolicy; + CREATE TYPE sortPolicy AS ENUM ( 'score-desc', 'creationdate-desc', diff --git a/docker-compose.test.yml b/docker-compose.test.yml new file mode 100644 index 0000000..c584d04 --- /dev/null +++ b/docker-compose.test.yml @@ -0,0 +1,19 @@ +version: "3" + +services: + db: + image: postgres + environment: + POSTGRES_DB: commento + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + networks: + - db_network + volumes: + - postgres_data_volume:/var/lib/postgresql/data + +networks: + db_network: + +volumes: + postgres_data_volume: diff --git a/docker-compose.yml b/docker-compose.yml index 0dc5c98..1df75f4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -version: '3' +version: "3" services: server: @@ -13,6 +13,16 @@ services: - db networks: - db_network + db_test: + ports: + - 5432:5432 + image: postgres + environment: + POSTGRES_DB: commento_test + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + networks: + - db_network db: image: postgres environment: