66 lines
1.6 KiB
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)
|
|
}
|
|
}
|