diff options
Diffstat (limited to 'handler.go')
| -rw-r--r-- | handler.go | 50 | 
1 files changed, 7 insertions, 43 deletions
| @@ -5,11 +5,9 @@ import (  	"fmt"  	"encoding/json" -	"io/ioutil"  	"net/http"  	"github.com/golang/glog" -	"github.com/google/certificate-transparency-go/tls"  	"github.com/google/trillian"  ) @@ -47,29 +45,23 @@ func (a appHandler) sendHTTPError(w http.ResponseWriter, statusCode int, err err  func addEntry(ctx context.Context, i *instance, w http.ResponseWriter, r *http.Request) (int, error) {  	glog.Info("in addEntry") -	var request AddEntryRequest -	if err := unpackRequest(r, &request); err != nil { +	request, err := NewAddEntryRequest(r) +	if err != nil {  		return http.StatusBadRequest, err -	} +	} // request can be decoded -	item, err := verifyAddEntryRequest(request) +	leaf, err := VerifyAddEntryRequest(request)  	if err != nil {  		return http.StatusBadRequest, err -	} -	glog.Infof("got item: %s", item) +	} // leaf is valid, e.g., signed by a trust anchor -	serializedItem, err := tls.Marshal(*item) -	if err != nil { -		return http.StatusInternalServerError, fmt.Errorf("tls marshal failed: %v", err) -	}  	trillianRequest := trillian.QueueLeafRequest{  		LogId: i.logID,  		Leaf: &trillian.LogLeaf{ -			LeafValue: serializedItem, +			LeafValue: leaf,  			//TODO: add appendix here w/ chain + signature  		},  	} -  	trillianResponse, err := i.client.QueueLeaf(ctx, &trillianRequest)  	if err != nil {  		return http.StatusInternalServerError, fmt.Errorf("backend QueueLeaf request failed: %v", err) @@ -78,40 +70,12 @@ func addEntry(ctx context.Context, i *instance, w http.ResponseWriter, r *http.R  		return http.StatusInternalServerError, fmt.Errorf("missing QueueLeaf response")  	}  	// TODO: check that we got gRPC OK as specified in Trillian's API doc +	glog.Infof("Queued leaf: %v", trillianResponse.QueuedLeaf.Leaf.LeafValue) -	queuedLeaf := trillianResponse.QueuedLeaf -	glog.Infof("Queued leaf: %v", queuedLeaf.Leaf.LeafValue)  	// TODO: respond with an SDI -  	return http.StatusOK, nil  } -// verifyAddEntryRequest -func verifyAddEntryRequest(r AddEntryRequest) (*StItem, error) { -	item, err := StItemFromB64(r.Item) -	if err != nil { -		return nil, fmt.Errorf("failed decoding StItem: %v", err) -	} -	if item.Format != StFormatChecksumV1 { -		return nil, fmt.Errorf("invalid StItem format: %s", item.Format) -	} -	// TODO: verify checksum length -	// TODO: verify r.Signature and r.Certificate -	return item, nil -} - -// unpackRequest tries to unpack a json-encoded HTTP POST request into `unpack` -func unpackRequest(r *http.Request, unpack interface{}) error { -	body, err := ioutil.ReadAll(r.Body) -	if err != nil { -		return fmt.Errorf("failed reading request body: %v", err) -	} -	if err := json.Unmarshal(body, &unpack); err != nil { -		return fmt.Errorf("failed parsing json body: %v", err) -	} -	return nil -} -  // getEntries provides a list of entries from the Trillian backend  func getEntries(ctx context.Context, i *instance, w http.ResponseWriter, r *http.Request) (int, error) {  	glog.Info("in getEntries") | 
