From 12417f0dddf4be86aa5b9a4cb25bf48a4e301086 Mon Sep 17 00:00:00 2001 From: Niall Sheridan Date: Wed, 8 Aug 2018 11:24:22 +0100 Subject: Misc fixes - Add `fast_finish` to travis config - Specify that Go 1.9 is supported - Additional error checking which was previously missed - Make the migrations test better - --- server/signer/signer_test.go | 3 +++ server/store/a_store-packr.go | 2 +- server/store/migrations/migrations_test.go | 33 ++++++++++++++++++------------ server/store/sqldb.go | 9 ++++---- server/store/string_slice.go | 3 ++- server/web.go | 5 ++++- 6 files changed, 34 insertions(+), 21 deletions(-) (limited to 'server') diff --git a/server/signer/signer_test.go b/server/signer/signer_test.go index c07d62b..885a1c7 100644 --- a/server/signer/signer_test.go +++ b/server/signer/signer_test.go @@ -44,6 +44,9 @@ func TestCert(t *testing.T) { t.Errorf("Expected %s, got %s", cert.ValidPrincipals, principals) } k1, _, _, _, err := ssh.ParseAuthorizedKey([]byte(r.Key)) + if err != nil { + t.Errorf("Unable to parse key: %v", err) + } k2 := cert.Key if !bytes.Equal(k1.Marshal(), k2.Marshal()) { t.Error("Cert key doesn't match public key") diff --git a/server/store/a_store-packr.go b/server/store/a_store-packr.go index 1ccf57b..1573697 100644 --- a/server/store/a_store-packr.go +++ b/server/store/a_store-packr.go @@ -7,7 +7,7 @@ import "github.com/gobuffalo/packr" // You can use the "packr clean" command to clean up this, // and any other packr generated files. func init() { - packr.PackJSONBytes("migrations", "migrations_test.go", "\"H4sIAAAAAAAA/5xWXW+bSBe+hl9xhPS+gi6FSrtXWfkijd1ud/PRBqfaVRS5Y3OwR4EZcmZwalX+76szgKFpY3V7Y8NwPp7znK+pxeperBEquSZhpVbG92VVa7IQ+l6QCyuWwmBqHsrA94KisvwndSp1Y6U7q4TdpCRUzi/atL9pY5D4sRZ20/+nhSyxPyAsSlw5cxaNlWod+L4XrKXdNMtkpat0rV+ah/JlTnKLlFa7FsMCxjKVsFZ1ktLir4HvtaHgV2LULFFtOYqX3efga1/GEtrVhlKHpdilwhgkG/iR7xeNWsEcjc0+nEuLFweqQgsvOuzJPIIvvmeaZS4JTiYQDIDyZQxI7tQ8lMlVjSpsBWMITiqsNO1Ogsj3Wp/JpZ4RaQqtU4t8L8cCCfJlclZqg2Hke9SoMYwY2EdrM/L3I8gXu+zD+THEsgBtkrdoUW3D4OKf7MP5Yj7L5kEEkwkEAct4NsnuZR0GlxoGCUC1laRVhcrCVpAUyxI5jP1XPPR5y43id/eaXOLjmVaFXHMwuVHJJVqYQGBXdSuavBdkcC4rhAlYarA9Pc1zgsn3ES/+uGLYvboxj/mzou9Ps4xFmxgWjIqrNTlriFBZhiQLYJpuDFIM+p5FtEnOtb5v6tkTWzfZ7DqIfmcx5oq9sx7j7kz43h6wNPj0e+MelKjQkXasTljrjaZK2Gl2GUbPF4vvkcod0eIew9u75c5iDL9xzQiVJ9co8pBUHnGOikJ+ZtGisklWk1S2CIPF/z4HMRhLUq2dZOR7ixbYhGtw9hlXYXB2PTudz2B6Oj99fZrNRvNjwVEH8Au09o+U9bdWb37S0tF28A7mp9dX7wfI797A7O932Tw76nLUdX1fPfE26ih2DC84edPXMeSScGU17To2Xb9VTPj/uyGUvJHlME8y3dAKuUamkk4G9dhVB89OcyiQfpImb0u9DN3Tn1qqcFCC4EXCncf5S1P4iCSLHdiNsGA3SAjSgLBQojAWtBqtALCaYxzRbWdVbXdMrENxJBNPPHU21RqaGh413RvfU4cgehZcdjhlI/RVfPh8Uw8Oz1EdYMSgfhyJ4How+NDwtKJGwUYYUHq8+HpkPwVs9tCIkr2/+k+wCLdIhgkagDwh6ofhTPXjMc/PMbj3/TR1y6JjqixHtdC7kmhgpZUVUnH9gBEVgkELuhhDd2aT0f6Ra/dl2iM+08qist/ZRDwHTTu56tu2Y+5u79qHL3vfW3Wah/JpryBupE0lhUFybIcWmmARg2RFEmqN0NtzU1kWIJN3hu04MJ7X7a+htWRyKSoMo6GzWKzjcfFtU7bDx/MsyapCN5PH4Xg9pGKA5Iy17g9qExB1jSoPu4N4cPNaGAyLyHlxFh2Ftz3QO7c6nZLvBPau/G4Mun5HZWkHBenKJfSTU/7E7IMwIID41oFqhcBAuSpYTPPwMAnPIzKWobdOu+tc8lGUDV4VoTuNkgtR/4U7E0a3r+6SrF0q0d0hHdsh9jb9HPu4o5w50xYsGRvD1l0w9v6/AQAA///JYIMFuQoAAA==\"") + packr.PackJSONBytes("migrations", "migrations_test.go", "\"H4sIAAAAAAAA/6xW32/bNhB+lv6KA4ENUqfSBbanDH5IY7frlh9t5BQbgsClpZNNRCIVknJqFPnfhyNlW07TdAX2kkjU/fjuu++ObkVxK5YIjVwa4aRWNo5l02rjIIkjVgonFsLiyN7VLI5Y1Tj6J/VI6s5Jf9YItxoZoUp60Tb8HXUWDT22wq22/0eVrHF7YLCqsfDhHFon1ZLFccSW0q26BS90M1rql/auflkauUYzajYBwxyGNo1wTvWW0uGvLI5CKXhgZroFqjVV8bL/zA5zWWfQFSsz8liqzUhYi8Z9z8rgXScNsjiN46pTBczQuvzDqXR4tmM0cfCiL5HPUvgSR7ZblNLA0RjYHne5yACNP7V3Nb9oUSXBMAN21GCjzeaIpXHUJ+XnemqMNonzfhmwKyUWNYLToFtUEEJDoZXCgpB4504NkWVAaUOalDDwk1pbTNL4YVDR2Sb/cPpcQbICbflbdKjWCTv7J/9wOp9N8xlLYTwGxsgmcjy/lW3CzjXsLQDVWhqtGlQO1sJIKoGAPsSR52JXLd4nLj3gbiuJ0ip6969kd6JVJZdJ6r/wc3QwBuaKNpjy98JYnMkGYQzOdBhOj8vSwPjpMuZ/XFAtW3dr78tvmr4/znMy7TKYEyoaBH7SGYPKESRZAXF3ZdFkoG/JRFt+qvVt104fxbrKp5cs/Z3MiEDKTn6Euw8RRw+AtcXH3zv/oESDnsnntEVeb7RphJvk50lKGtlJ60ldeZ4PZRVHRpW+B+IWk+ubxcZhBr9RLKFKfomiTIwqffuqSn4m06pxPG+NVK5K2PynzywD64xUS2+ZxtE8YB5DueDTz1gk7ORyejybwuR4dvz6OJ8OttacCGHwC4T4j4t4MtrVD0b47uiEsJPLi/d7iO/ewPTvd/ksfzbVE3P3KNtg4igxvKA+Tl5nUEqDhdNm07Pn51EQwWGF7QbnyWlq6PDnfifyN7Le761cd6ZA0tVEmqN9nswrila53Ylqu9j521ovEv/0p5Yq2TsBe8FpWqmxoxF8RCOrDbiVcOBWaBCkBeGgRmEdaDW4kUh3plNfy/JcDzjtrVjfNzdtWrdJPMqvM/ZuagldC/fa3No4Urtitmz4dlKPB1U02e7zVRumWRzIxA+i4Keokp4iFZbZIwiClGPxrqO9ZzoFK2FBDSvaQfp/EE3vOlEnr76Fx+AajSVKBpweUvOfcUz0vfoRbh7ieDTyF03PTV0P2r/NIdHS0nFCKpIMWNEgWHSgqyFmH5kP7i659F8mW6gnWjlU7olbjNalDVusvQ7TdHN9Ex6+PMRR0XvulBJ+BPn1NpEmYZzktx27g9s5jaNKG5hnIP0YCrX0N7OP53mRFUj+zlKcQFTUX3P7aZL8XDSYpPthIrOeyvnXcxgWUxQ5I5sG/X4elhNtIVV7SD5YSL9zG4NoW1Rl0h9k+zSvhcWkSn0WH9FTeL0FeuNvWO8Ue4OguyuLfsRRObOByujGN/STd/5E7IOwIMBghQZVgUBASRVkpmlfWE4ryFhH0EPS/gcl/yjqDi+qxJ+m/Ey0f+HGJun1qxuehwsmvdm1Y72vPbTfazS00I+MD+fXvc+XwbrX7L8BAAD//4C0Bmk7CwAA\"") packr.PackJSONBytes("migrations", "mysql/20180626224600_create_issued_certs.sql", "\"H4sIAAAAAAAA/5SR0UrDMBSG7/MUh92swxVSYYjuqtoMirUbXQsbIk1oDhrqupLGrX17aV21TkGEXIXv//nOObYNFzv1rIVBSEpyFzE3ZhC7twEDfwHhMga28dfxGriqqjeUaYbaVBwsAsBzbFIlORyEzl6Eti5ns0mXCZMgmLZEqVWRqVK8VmeUxxZuEsQwenwadWSmURiUqTAcpDBo1A4/qbFzfUVt6tjUAUpv2ueMuxjWpdJY/Tem8bDPUXIwqmhUYSznS4l+EOKY5thwMFib9mcV+Q9utIV7tgWrH31CJvN+a37osQ1wJet0aLUMf+xuaP1r/qT3Z08/xhTOKsnwsN7+WBAvWq5Oh/1eMyfvAQAA//+OXEmHBQIAAA==\"") packr.PackJSONBytes("migrations", "mysql/20180807223808_idx_revoked_expires_at.sql", "\"H4sIAAAAAAAA/9LVVdDOzUwvSixJVQgt4HL0CXENUghxdPJxVUjILC4uTU2JT04tKilOUHAJ8g9Q8PRzcY1QSMhMqYgvSi3Lz05NiU+tKMgsSi2OTyxJsObiQjbPJb88D5+Jji4uBAxU0EiAiiboJCCJa1pzAQIAAP//O0rcq7kAAAA=\"") packr.PackJSONBytes("migrations", "mysql/20180807224200_new_primary_key.sql", "\"H4sIAAAAAAAA/5TOzarCMBAF4H2e4izvRfsErmIzQrBNa0zArhKxQYr4Q1NR314qFrJ1Nwxz5nxZhtm5O/b7IcDeGC8MaRi+LAi+i/EeWncI/RA9A4SuatRallw3WFMzZwAXAnlV2FLBd62HVCY9AbemclLlmkpSBiupt2bKWSU3liCVoN2YfrpTeLnxy5//Tv8LxlKiuD4uvyM/u0Q5AVJoWvkOAAD//1KTCm8VAQAA\"") diff --git a/server/store/migrations/migrations_test.go b/server/store/migrations/migrations_test.go index 1283668..482450b 100644 --- a/server/store/migrations/migrations_test.go +++ b/server/store/migrations/migrations_test.go @@ -16,20 +16,22 @@ import ( _ "github.com/mattn/go-sqlite3" migrate "github.com/rubenv/sql-migrate" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestSQLiteMigrations(t *testing.T) { subdir := "sqlite3" db, err := sql.Open(subdir, ":memory:") - assert.NoError(t, err) - defer db.Close() + require.NoError(t, err, "Unable to open sqlite connection") runMigrations(t, db, subdir) + db.Close() } func TestMySQLMigrations(t *testing.T) { if os.Getenv("MYSQL_TEST") == "" { t.Skip("No MYSQL_TEST environment variable") } + r := require.New(t) subdir := "mysql" dsn := mysql.NewConfig() dsn.Net = "tcp" @@ -43,40 +45,45 @@ func TestMySQLMigrations(t *testing.T) { dsn.User = u.Username } db, err := sql.Open(subdir, dsn.FormatDSN()) - assert.NoError(t, err) + r.NoError(err, "Unable to open mysql connection") rnd := make([]byte, 4) rand.Read(rnd) suffix := fmt.Sprintf("_%x", string(rnd)) _, err = db.Exec("CREATE DATABASE migrations_test" + suffix) - assert.NoError(t, err) + r.NoError(err) _, err = db.Exec("USE migrations_test" + suffix) - assert.NoError(t, err) + r.NoError(err) runMigrations(t, db, subdir) db.Exec("DROP DATABASE IF EXISTS migrations_test" + suffix) db.Close() } func runMigrations(t *testing.T, db *sql.DB, directory string) { + a := assert.New(t) + r := require.New(t) m := &migrate.FileMigrationSource{ Dir: directory, } files, err := filepath.Glob(path.Join(directory, "*.sql")) // Verify that there is at least one migration to run - assert.NotEmpty(t, files) - assert.NoError(t, err) + r.NoError(err, "No migrations to run") + r.NotEmpty(files) // Verify that migrating up works n, err := migrate.Exec(db, directory, m, migrate.Up) - assert.Len(t, files, n) - assert.NoError(t, err) + if a.NoError(err) { + a.Len(files, n) + } // Verify that a subsequent run has no migrations n, err = migrate.Exec(db, directory, m, migrate.Up) - assert.Equal(t, 0, n) - assert.NoError(t, err) + if a.NoError(err) { + a.Equal(0, n) + } // Verify that reversing migrations works n, err = migrate.Exec(db, directory, m, migrate.Down) - assert.NoError(t, err) - assert.Len(t, files, n) + if a.NoError(err) { + a.Len(files, n) + } } // Test that all migration directories contain the same set of migrations files. diff --git a/server/store/sqldb.go b/server/store/sqldb.go index b5948b7..e95f53b 100644 --- a/server/store/sqldb.go +++ b/server/store/sqldb.go @@ -108,11 +108,6 @@ func autoMigrate(driver string, conn *sqlx.DB) error { return nil } -// rowScanner is implemented by sql.Row and sql.Rows -type rowScanner interface { - Scan(dest ...interface{}) error -} - // Get a single *CertRecord func (db *sqlStore) Get(id string) (*CertRecord, error) { if err := db.conn.Ping(); err != nil { @@ -161,6 +156,10 @@ func (db *sqlStore) Revoke(ids []string) error { return errors.Wrap(err, "unable to connect to database") } q, args, err := sqlx.In("UPDATE issued_certs SET revoked = 1 WHERE key_id IN (?)", ids) + if err != nil { + return err + } + q = db.conn.Rebind(q) _, err = db.conn.Query(q, args...) return err } diff --git a/server/store/string_slice.go b/server/store/string_slice.go index ac86360..a443cdd 100644 --- a/server/store/string_slice.go +++ b/server/store/string_slice.go @@ -28,7 +28,8 @@ func (s *StringSlice) Scan(value interface{}) error { return nil } var err error - if v, err := driver.String.ConvertValue(value); err == nil { + v, err := driver.String.ConvertValue(value) + if err == nil { if v, ok := v.([]byte); ok { err = json.Unmarshal(v, s) } diff --git a/server/web.go b/server/web.go index a32dd40..5677429 100644 --- a/server/web.go +++ b/server/web.go @@ -228,9 +228,12 @@ func listCertsJSONHandler(a *appContext, w http.ResponseWriter, r *http.Request) } includeExpired, _ := strconv.ParseBool(r.URL.Query().Get("all")) certs, err := certstore.List(includeExpired) + if err != nil { + return http.StatusInternalServerError, err + } j, err := json.Marshal(certs) if err != nil { - return http.StatusInternalServerError, errors.New(http.StatusText(http.StatusInternalServerError)) + return http.StatusInternalServerError, err } w.Write(j) return http.StatusOK, nil -- cgit v1.2.3