certViewer/cmd/web/handlers.go (67 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 (
"crypto/x509"
"encoding/pem"
"github.com/mozilla/CCADB-Tools/certViewer/internal/validator"
"mime/multipart"
"net/http"
)
type certForm struct {
RootCert string
RootCertUpload *multipart.FileHeader
validator.Validator
}
// home handles the default endpoint GET request, "/certviewer"
func (app *application) home(w http.ResponseWriter, r *http.Request) {
data := app.newTemplateData(r)
data.Certificate = Certificate{
Serial: "",
}
data.Form = certForm{}
app.render(w, r, http.StatusOK, "home.tmpl", data)
}
// certPost handles the form POST request from the "/certviewer" endpoint
func (app *application) certPost(w http.ResponseWriter, r *http.Request) {
err := r.ParseMultipartForm(1 << 20) // 10MB
if err != nil {
app.clientError(w, http.StatusBadRequest)
return
}
form := certForm{
RootCert: r.PostFormValue("rootCert"),
}
_, header, _ := r.FormFile("rootCertUpload")
form.RootCertUpload = header
form.CheckField(validator.NoPEMs(form.RootCert, form.RootCertUpload), "rootCertUpload", "Please upload or paste the contents of a PEM file")
form.CheckField(validator.BothPEMs(form.RootCert, form.RootCertUpload), "rootCertUpload", "Please only submit a pasted PEM file OR upload a file")
var pemFile string
if form.RootCert != "" {
form.CheckField(validator.ValidPEM(form.RootCert), "rootCert", "Invalid certificate format. Certificate must be PEM-encoded")
pemFile = form.RootCert
} else if form.RootCertUpload != nil {
pemUploadFile := app.uploadSave(r)
pemContents := app.pemReader(pemUploadFile)
form.CheckField(validator.ValidPEM(pemContents), "rootCertUpload", "Invalid certificate format. Certificate must be PEM-encoded")
pemFile = pemContents
// remove the cert written to the file system
app.certCleanup(pemUploadFile)
}
if !form.Valid() {
data := app.newTemplateData(r)
data.Form = form
app.render(w, r, http.StatusUnprocessableEntity, "home.tmpl", data)
return
}
block, _ := pem.Decode([]byte(pemFile))
if block == nil {
app.clientError(w, http.StatusBadRequest)
return
}
certX509, err := x509.ParseCertificate(block.Bytes)
if err != nil {
app.clientError(w, http.StatusBadRequest)
return
}
certData := certInfo(certX509)
data := app.newTemplateData(r)
data.Certificate = certData
data.Form = form
app.render(w, r, http.StatusOK, "home.tmpl", data)
}