summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Stradling <rob@comodo.com>2017-02-24 15:23:44 +0000
committerRob Stradling <rob@comodo.com>2017-02-24 15:23:44 +0000
commit0d34f2dd958e26f6fedefd5c3ef8c8a10ee6877b (patch)
tree641a17a4782fb6c4d24f4a6ea83ea08d575783e5
parentabd0416387d8c8680b5293fa21e7e6d1f80b0a3d (diff)
downloadcrl_monitor-0d34f2dd958e26f6fedefd5c3ef8c8a10ee6877b.zip
crl_monitor-0d34f2dd958e26f6fedefd5c3ef8c8a10ee6877b.tar.gz
crl_monitor-0d34f2dd958e26f6fedefd5c3ef8c8a10ee6877b.tar.bz2
Store CRL sizes.
-rw-r--r--crl_monitor.go54
1 files changed, 40 insertions, 14 deletions
diff --git a/crl_monitor.go b/crl_monitor.go
index 343872a..f89227c 100644
--- a/crl_monitor.go
+++ b/crl_monitor.go
@@ -40,17 +40,21 @@ type Work struct {
transport http.Transport
http_client http.Client
upsert_statement *sql.Stmt
+ update_changed_crl_statement *sql.Stmt
}
type WorkItem struct {
+ work *Work
ca_id int32
crl_url string
+ crl_size sql.NullInt64
this_update time.Time
next_update time.Time
last_checked time.Time
issuer_cert []byte
error_message sql.NullString
crl_sha256 [sha256.Size]byte
+ has_crl_changed bool
}
func checkRedirectURL(req *http.Request, via []*http.Request) error {
@@ -72,7 +76,9 @@ func (w *Work) Init() {
// Work.Begin
// Do any DB stuff that needs to happen before a batch of work.
func (w *Work) Begin(db *sql.DB) {
- us, err := db.Prepare(`
+ var err error
+
+ w.upsert_statement, err = db.Prepare(`
INSERT INTO crl_revoked (
CA_ID, SERIAL_NUMBER, REASON_CODE,
REVOCATION_DATE, LAST_SEEN_CHECK_DATE
@@ -89,13 +95,26 @@ ON CONFLICT ON CONSTRAINT crlr_pk
`)
checkErr(err)
- w.upsert_statement = us
+ w.update_changed_crl_statement, err = db.Prepare(`
+UPDATE CRL
+ SET CRL_SHA256=$1,
+ THIS_UPDATE=$2::timestamp,
+ NEXT_UPDATE=$3::timestamp,
+ LAST_CHECKED=statement_timestamp(),
+ NEXT_CHECK_DUE=statement_timestamp() + interval '1 hour',
+ ERROR_MESSAGE=$4::text,
+ CRL_SIZE=$5
+ WHERE CA_ID=$6
+ AND DISTRIBUTION_POINT_URL=$7
+`)
+ checkErr(err)
}
// Work.End
// Do any DB stuff that needs to happen after a batch of work.
func (w *Work) End() {
w.upsert_statement.Close()
+ w.update_changed_crl_statement.Close()
}
// Work.Prepare()
@@ -133,8 +152,10 @@ func (wi *WorkItem) checkErr(err error) {
// WorkItem.Perform()
// Do the work for one item.
func (wi *WorkItem) Perform(db *sql.DB, w *Work) {
+ wi.work = w
wi.error_message.String = ""
wi.error_message.Valid = false
+ wi.has_crl_changed = false
// Retrieve the CRL
var err error
@@ -173,7 +194,12 @@ func (wi *WorkItem) Perform(db *sql.DB, w *Work) {
}
// Progress report
- log.Printf("Downloaded (%d bytes): %s", len(body), wi.crl_url)
+ wi.crl_size.Int64 = int64(len(body))
+ wi.crl_size.Valid = true
+ log.Printf("Downloaded (%d bytes): %s", wi.crl_size.Int64, wi.crl_url)
+
+ // Calculate SHA-256(CRL)
+ wi.crl_sha256 = sha256.Sum256(body)
// Parse the CRL
crl, err = x509.ParseCRL(body)
@@ -190,6 +216,8 @@ func (wi *WorkItem) Perform(db *sql.DB, w *Work) {
return
}
+ wi.has_crl_changed = true
+
// Parse the supplied issuer certificate
cert, err := x509.ParseCertificate(wi.issuer_cert)
checkErr(err)
@@ -201,9 +229,6 @@ func (wi *WorkItem) Perform(db *sql.DB, w *Work) {
// Show progress report
log.Printf("Verified: %s", wi.crl_url)
- // Calculate SHA-256(CRL)
- wi.crl_sha256 = sha256.Sum256(body)
-
// TODO: Check crl.HasExpired(time.Now) ?
// TODO: Set inactive if "latest" CRL is ancient?
// TODO: Deactivate if duplicate of another CDP?
@@ -259,19 +284,20 @@ func (wi *WorkItem) Perform(db *sql.DB, w *Work) {
func (w *Work) UpdateStatement() string {
return `
UPDATE crl
- SET CRL_SHA256=$1,
- THIS_UPDATE=$2::timestamp,
- NEXT_UPDATE=$3::timestamp,
- LAST_CHECKED=statement_timestamp(),
+ SET LAST_CHECKED=statement_timestamp(),
NEXT_CHECK_DUE=statement_timestamp() + interval '1 hour',
- ERROR_MESSAGE=$4::text
- WHERE CA_ID=$5
- AND DISTRIBUTION_POINT_URL=$6
+ ERROR_MESSAGE=$1::text
+ WHERE CA_ID=$2
+ AND DISTRIBUTION_POINT_URL=$3
`
}
// WorkItem.Update()
// Update the DB with the results of the work for this item.
func (wi *WorkItem) Update(update_statement *sql.Stmt) (sql.Result, error) {
- return update_statement.Exec(wi.crl_sha256[:], wi.this_update, wi.next_update, wi.error_message, wi.ca_id, wi.crl_url)
+ if wi.has_crl_changed {
+ return wi.work.update_changed_crl_statement.Exec(wi.crl_sha256[:], wi.this_update, wi.next_update, wi.error_message, wi.crl_size, wi.ca_id, wi.crl_url)
+ } else {
+ return update_statement.Exec(wi.error_message, wi.ca_id, wi.crl_url)
+ }
}