Files
browserpass-native/response/response.go

66 lines
1.6 KiB
Go

package response
import (
"bytes"
"encoding/binary"
"encoding/json"
"os"
"github.com/browserpass/browserpass-native/errors"
"github.com/browserpass/browserpass-native/version"
log "github.com/sirupsen/logrus"
)
type okResponse struct {
Status string `json:"status"`
Version int `json:"version"`
Data interface{} `json:"data"`
}
type errorResponse struct {
Status string `json:"status"`
Code errors.Code `json:"code"`
Version int `json:"version"`
Params interface{} `json:"params"`
}
// SendError sends an error response to the browser extension in the predefined json format
func SendError(errorCode errors.Code, errorMsg string, extraParams *map[string]string) {
params := map[string]string{
"message": errorMsg,
}
if extraParams != nil {
for key, value := range *extraParams {
params[key] = value
}
}
send(&errorResponse{
Status: "error",
Code: errorCode,
Version: version.Code,
Params: params,
})
}
func send(data interface{}) {
switch data.(type) {
case *okResponse:
case *errorResponse:
break
default:
log.Fatalf("Only data of type OkResponse and ErrorResponse is allowed to be sent to the browser extension, attempted to send: %+v", data)
}
var bytesBuffer bytes.Buffer
if err := json.NewEncoder(&bytesBuffer).Encode(data); err != nil {
log.Fatal("Unable to encode data for sending: ", err)
}
if err := binary.Write(os.Stdout, binary.LittleEndian, uint32(bytesBuffer.Len())); err != nil {
log.Fatal("Unable to send the length of the response data: ", err)
}
if _, err := bytesBuffer.WriteTo(os.Stdout); err != nil {
log.Fatal("Unable to send the response data: ", err)
}
}