oneCRLDiffCCADB/main.go (109 lines of code) (raw):
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package main // import "github.com/mozilla/CCADB-Tools/oneCRLDiffCCADB"
import (
"encoding/json"
// "errors"
"fmt"
"github.com/mozilla/CCADB-Tools/oneCRLDiffCCADB/ccadb"
"github.com/mozilla/CCADB-Tools/oneCRLDiffCCADB/normalized"
"github.com/mozilla/CCADB-Tools/oneCRLDiffCCADB/oneCRL"
"net/http"
"os"
)
func build() ([]*normalized.Normalized, error) {
n := make([]*normalized.Normalized, 0)
c, err := ccadb.Retrieve()
if err != nil {
return n, err
}
o, err := oneCRL.Retrieve()
if err != nil {
return n, err
}
n = normalized.Join(c, o)
return n, nil
}
func inspect(norm []*normalized.Normalized) (Return, error) {
ret := NewReturn()
for _, n := range norm {
if n.AddedAndPresent() {
ret.AddedAndPresentInOneCRL = append(ret.AddedAndPresentInOneCRL, n)
} else if n.ExpiredAndPresent() {
ret.ExpiredAndPresentInOneCRL = append(ret.ExpiredAndPresentInOneCRL, n)
} else if n.ReadyAndPresent() {
ret.ReadyToAddAndPresentInOneCRL = append(ret.ReadyToAddAndPresentInOneCRL, n)
} else if n.AbsentAndPresent() {
ret.AbsentFromCCADBAndPresentInOneCRL = append(ret.AbsentFromCCADBAndPresentInOneCRL, n)
} else if n.AddedAndAbsent() {
ret.AddedAndAbsentFromOneCRL = append(ret.AddedAndAbsentFromOneCRL, n)
} else if n.ExpiredAndAbsent() {
ret.ExpiredAndAbsentFromOneCRL = append(ret.ExpiredAndAbsentFromOneCRL, n)
} else if n.ReadyAndAbsent() {
ret.ReadyToAddAndAbsentFromOneCRL = append(ret.ReadyToAddAndAbsentFromOneCRL, n)
} else if n.NoRevocationStatus() {
ret.NoRevocationStatus = append(ret.NoRevocationStatus, n)
} else if n.AbsentAndAbsent() {
// Logically dead code? Almost certainly, but...
ret.AbsentFromCCADBAndAbsentFromOneCRL = append(ret.AbsentFromCCADBAndAbsentFromOneCRL, n)
} else {
// return ret, errors.New("encountered a case that was unaccounted for during inspection")
}
}
return ret, nil
}
type Return struct {
// "Added to OneCRL" and present in OneCRL
AddedAndPresentInOneCRL []*normalized.Normalized
// "Cert Expired" and present in OneCRL
ExpiredAndPresentInOneCRL []*normalized.Normalized
// "Ready to Add" and present in OneCRL
ReadyToAddAndPresentInOneCRL []*normalized.Normalized
// No such record in the CCADB, however exists in OneCRL
AbsentFromCCADBAndPresentInOneCRL []*normalized.Normalized
// "Added to OneCRL" and not present in OneCRL
AddedAndAbsentFromOneCRL []*normalized.Normalized
// "Cert Expired" and not present in OneCRL
ExpiredAndAbsentFromOneCRL []*normalized.Normalized
// "Ready to Add" and not present in OneCRL
ReadyToAddAndAbsentFromOneCRL []*normalized.Normalized
// Not present in either. This is not really possible
// for this tool to know, however it is worth having
// for the sake of being explicit, I suppose.
AbsentFromCCADBAndAbsentFromOneCRL []*normalized.Normalized
// A record in the CCADB was found whose "OneCRL Status"
// is the empty string.
NoRevocationStatus []*normalized.Normalized
}
func NewReturn() Return {
return Return{
make([]*normalized.Normalized, 0),
make([]*normalized.Normalized, 0),
make([]*normalized.Normalized, 0),
make([]*normalized.Normalized, 0),
make([]*normalized.Normalized, 0),
make([]*normalized.Normalized, 0),
make([]*normalized.Normalized, 0),
make([]*normalized.Normalized, 0),
make([]*normalized.Normalized, 0),
}
}
func endpoint(w http.ResponseWriter, r *http.Request) {
built, err := build()
if err != nil {
w.WriteHeader(500)
w.Write([]byte(err.Error()))
return
}
ret, err := inspect(built)
if err != nil {
w.WriteHeader(500)
w.Write([]byte(err.Error()))
return
}
j, err := json.MarshalIndent(ret, "", " ")
if err != nil {
w.WriteHeader(500)
w.Write([]byte(err.Error()))
return
}
w.WriteHeader(200)
w.Write(j)
}
func main() {
http.HandleFunc("/", endpoint)
var port string
switch env := os.Getenv("PORT"); env {
case "":
port = ":8080"
default:
port = fmt.Sprintf(":%s", env)
}
err := http.ListenAndServe(port, nil)
if err != nil {
fmt.Fprint(os.Stderr, err)
}
}