aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorNiall Sheridan <nsheridan@gmail.com>2018-08-08 11:24:22 +0100
committerNiall Sheridan <nsheridan@gmail.com>2018-08-08 12:49:47 +0100
commit12417f0dddf4be86aa5b9a4cb25bf48a4e301086 (patch)
tree280653d0ecefbbb22d9574221b64b079953a8c4b /server
parent60d005f8d174d21162cab2b029f74cfe2925acab (diff)
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 -
Diffstat (limited to 'server')
-rw-r--r--server/signer/signer_test.go3
-rw-r--r--server/store/a_store-packr.go2
-rw-r--r--server/store/migrations/migrations_test.go33
-rw-r--r--server/store/sqldb.go9
-rw-r--r--server/store/string_slice.go3
-rw-r--r--server/web.go5
6 files changed, 34 insertions, 21 deletions
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