304 lines
11 KiB
Go
304 lines
11 KiB
Go
|
package serialize
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
|
||
|
groupRecord "go.mau.fi/libsignal/groups/state/record"
|
||
|
"go.mau.fi/libsignal/logger"
|
||
|
"go.mau.fi/libsignal/protocol"
|
||
|
"go.mau.fi/libsignal/state/record"
|
||
|
)
|
||
|
|
||
|
// NewJSONSerializer will return a serializer for all Signal objects that will
|
||
|
// be responsible for converting objects to and from JSON bytes.
|
||
|
func NewJSONSerializer() *Serializer {
|
||
|
serializer := NewSerializer()
|
||
|
|
||
|
serializer.SignalMessage = &JSONSignalMessageSerializer{}
|
||
|
serializer.PreKeySignalMessage = &JSONPreKeySignalMessageSerializer{}
|
||
|
serializer.SignedPreKeyRecord = &JSONSignedPreKeyRecordSerializer{}
|
||
|
serializer.PreKeyRecord = &JSONPreKeyRecordSerializer{}
|
||
|
serializer.State = &JSONStateSerializer{}
|
||
|
serializer.Session = &JSONSessionSerializer{}
|
||
|
serializer.SenderKeyMessage = &JSONSenderKeyMessageSerializer{}
|
||
|
serializer.SenderKeyDistributionMessage = &JSONSenderKeyDistributionMessageSerializer{}
|
||
|
serializer.SenderKeyRecord = &JSONSenderKeySessionSerializer{}
|
||
|
serializer.SenderKeyState = &JSONSenderKeyStateSerializer{}
|
||
|
|
||
|
return serializer
|
||
|
}
|
||
|
|
||
|
// JSONSignalMessageSerializer is a structure for serializing signal messages into
|
||
|
// and from JSON.
|
||
|
type JSONSignalMessageSerializer struct{}
|
||
|
|
||
|
// Serialize will take a signal message structure and convert it to JSON bytes.
|
||
|
func (j *JSONSignalMessageSerializer) Serialize(signalMessage *protocol.SignalMessageStructure) []byte {
|
||
|
serialized, err := json.Marshal(*signalMessage)
|
||
|
if err != nil {
|
||
|
logger.Error("Error serializing signal message: ", err)
|
||
|
}
|
||
|
// logger.Debug("Serialize result: ", string(serialized))
|
||
|
|
||
|
return serialized
|
||
|
}
|
||
|
|
||
|
// Deserialize will take in JSON bytes and return a signal message structure.
|
||
|
func (j *JSONSignalMessageSerializer) Deserialize(serialized []byte) (*protocol.SignalMessageStructure, error) {
|
||
|
var signalMessage protocol.SignalMessageStructure
|
||
|
err := json.Unmarshal(serialized, &signalMessage)
|
||
|
if err != nil {
|
||
|
logger.Error("Error deserializing signal message: ", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &signalMessage, nil
|
||
|
}
|
||
|
|
||
|
// JSONPreKeySignalMessageSerializer is a structure for serializing prekey signal messages
|
||
|
// into and from JSON.
|
||
|
type JSONPreKeySignalMessageSerializer struct{}
|
||
|
|
||
|
// Serialize will take a prekey signal message structure and convert it to JSON bytes.
|
||
|
func (j *JSONPreKeySignalMessageSerializer) Serialize(signalMessage *protocol.PreKeySignalMessageStructure) []byte {
|
||
|
serialized, err := json.Marshal(signalMessage)
|
||
|
if err != nil {
|
||
|
logger.Error("Error serializing prekey signal message: ", err)
|
||
|
}
|
||
|
// logger.Debug("Serialize result: ", string(serialized))
|
||
|
|
||
|
return serialized
|
||
|
}
|
||
|
|
||
|
// Deserialize will take in JSON bytes and return a prekey signal message structure.
|
||
|
func (j *JSONPreKeySignalMessageSerializer) Deserialize(serialized []byte) (*protocol.PreKeySignalMessageStructure, error) {
|
||
|
var preKeySignalMessage protocol.PreKeySignalMessageStructure
|
||
|
err := json.Unmarshal(serialized, &preKeySignalMessage)
|
||
|
if err != nil {
|
||
|
logger.Error("Error deserializing prekey signal message: ", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &preKeySignalMessage, nil
|
||
|
}
|
||
|
|
||
|
// JSONSignedPreKeyRecordSerializer is a structure for serializing signed prekey records
|
||
|
// into and from JSON.
|
||
|
type JSONSignedPreKeyRecordSerializer struct{}
|
||
|
|
||
|
// Serialize will take a signed prekey record structure and convert it to JSON bytes.
|
||
|
func (j *JSONSignedPreKeyRecordSerializer) Serialize(signedPreKey *record.SignedPreKeyStructure) []byte {
|
||
|
serialized, err := json.Marshal(signedPreKey)
|
||
|
if err != nil {
|
||
|
logger.Error("Error serializing signed prekey record: ", err)
|
||
|
}
|
||
|
// logger.Debug("Serialize result: ", string(serialized))
|
||
|
|
||
|
return serialized
|
||
|
}
|
||
|
|
||
|
// Deserialize will take in JSON bytes and return a signed prekey record structure.
|
||
|
func (j *JSONSignedPreKeyRecordSerializer) Deserialize(serialized []byte) (*record.SignedPreKeyStructure, error) {
|
||
|
var signedPreKeyStructure record.SignedPreKeyStructure
|
||
|
err := json.Unmarshal(serialized, &signedPreKeyStructure)
|
||
|
if err != nil {
|
||
|
logger.Error("Error deserializing signed prekey record: ", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &signedPreKeyStructure, nil
|
||
|
}
|
||
|
|
||
|
// JSONPreKeyRecordSerializer is a structure for serializing prekey records
|
||
|
// into and from JSON.
|
||
|
type JSONPreKeyRecordSerializer struct{}
|
||
|
|
||
|
// Serialize will take a prekey record structure and convert it to JSON bytes.
|
||
|
func (j *JSONPreKeyRecordSerializer) Serialize(preKey *record.PreKeyStructure) []byte {
|
||
|
serialized, err := json.Marshal(preKey)
|
||
|
if err != nil {
|
||
|
logger.Error("Error serializing prekey record: ", err)
|
||
|
}
|
||
|
// logger.Debug("Serialize result: ", string(serialized))
|
||
|
|
||
|
return serialized
|
||
|
}
|
||
|
|
||
|
// Deserialize will take in JSON bytes and return a prekey record structure.
|
||
|
func (j *JSONPreKeyRecordSerializer) Deserialize(serialized []byte) (*record.PreKeyStructure, error) {
|
||
|
var preKeyStructure record.PreKeyStructure
|
||
|
err := json.Unmarshal(serialized, &preKeyStructure)
|
||
|
if err != nil {
|
||
|
logger.Error("Error deserializing prekey record: ", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &preKeyStructure, nil
|
||
|
}
|
||
|
|
||
|
// JSONStateSerializer is a structure for serializing session states into
|
||
|
// and from JSON.
|
||
|
type JSONStateSerializer struct{}
|
||
|
|
||
|
// Serialize will take a session state structure and convert it to JSON bytes.
|
||
|
func (j *JSONStateSerializer) Serialize(state *record.StateStructure) []byte {
|
||
|
serialized, err := json.Marshal(state)
|
||
|
if err != nil {
|
||
|
logger.Error("Error serializing session state: ", err)
|
||
|
}
|
||
|
logger.Debug("Serialize result: ", string(serialized))
|
||
|
|
||
|
return serialized
|
||
|
}
|
||
|
|
||
|
// Deserialize will take in JSON bytes and return a session state structure.
|
||
|
func (j *JSONStateSerializer) Deserialize(serialized []byte) (*record.StateStructure, error) {
|
||
|
var stateStructure record.StateStructure
|
||
|
err := json.Unmarshal(serialized, &stateStructure)
|
||
|
if err != nil {
|
||
|
logger.Error("Error deserializing session state: ", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &stateStructure, nil
|
||
|
}
|
||
|
|
||
|
// JSONSessionSerializer is a structure for serializing session records into
|
||
|
// and from JSON.
|
||
|
type JSONSessionSerializer struct{}
|
||
|
|
||
|
// Serialize will take a session structure and convert it to JSON bytes.
|
||
|
func (j *JSONSessionSerializer) Serialize(session *record.SessionStructure) []byte {
|
||
|
serialized, err := json.Marshal(session)
|
||
|
if err != nil {
|
||
|
logger.Error("Error serializing session: ", err)
|
||
|
}
|
||
|
// logger.Debug("Serialize result: ", string(serialized))
|
||
|
|
||
|
return serialized
|
||
|
}
|
||
|
|
||
|
// Deserialize will take in JSON bytes and return a session structure, which can be
|
||
|
// used to create a new Session Record object.
|
||
|
func (j *JSONSessionSerializer) Deserialize(serialized []byte) (*record.SessionStructure, error) {
|
||
|
var sessionStructure record.SessionStructure
|
||
|
err := json.Unmarshal(serialized, &sessionStructure)
|
||
|
if err != nil {
|
||
|
logger.Error("Error deserializing session: ", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &sessionStructure, nil
|
||
|
}
|
||
|
|
||
|
// JSONSenderKeyDistributionMessageSerializer is a structure for serializing senderkey
|
||
|
// distribution records to and from JSON.
|
||
|
type JSONSenderKeyDistributionMessageSerializer struct{}
|
||
|
|
||
|
// Serialize will take a senderkey distribution message and convert it to JSON bytes.
|
||
|
func (j *JSONSenderKeyDistributionMessageSerializer) Serialize(message *protocol.SenderKeyDistributionMessageStructure) []byte {
|
||
|
serialized, err := json.Marshal(message)
|
||
|
if err != nil {
|
||
|
logger.Error("Error serializing senderkey distribution message: ", err)
|
||
|
}
|
||
|
// logger.Debug("Serialize result: ", string(serialized))
|
||
|
|
||
|
return serialized
|
||
|
}
|
||
|
|
||
|
// Deserialize will take in JSON bytes and return a message structure, which can be
|
||
|
// used to create a new SenderKey Distribution object.
|
||
|
func (j *JSONSenderKeyDistributionMessageSerializer) Deserialize(serialized []byte) (*protocol.SenderKeyDistributionMessageStructure, error) {
|
||
|
var msgStructure protocol.SenderKeyDistributionMessageStructure
|
||
|
err := json.Unmarshal(serialized, &msgStructure)
|
||
|
if err != nil {
|
||
|
logger.Error("Error deserializing senderkey distribution message: ", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &msgStructure, nil
|
||
|
}
|
||
|
|
||
|
// JSONSenderKeyMessageSerializer is a structure for serializing senderkey
|
||
|
// messages to and from JSON.
|
||
|
type JSONSenderKeyMessageSerializer struct{}
|
||
|
|
||
|
// Serialize will take a senderkey message and convert it to JSON bytes.
|
||
|
func (j *JSONSenderKeyMessageSerializer) Serialize(message *protocol.SenderKeyMessageStructure) []byte {
|
||
|
serialized, err := json.Marshal(message)
|
||
|
if err != nil {
|
||
|
logger.Error("Error serializing senderkey distribution message: ", err)
|
||
|
}
|
||
|
// logger.Debug("Serialize result: ", string(serialized))
|
||
|
|
||
|
return serialized
|
||
|
}
|
||
|
|
||
|
// Deserialize will take in JSON bytes and return a message structure, which can be
|
||
|
// used to create a new SenderKey message object.
|
||
|
func (j *JSONSenderKeyMessageSerializer) Deserialize(serialized []byte) (*protocol.SenderKeyMessageStructure, error) {
|
||
|
var msgStructure protocol.SenderKeyMessageStructure
|
||
|
err := json.Unmarshal(serialized, &msgStructure)
|
||
|
if err != nil {
|
||
|
logger.Error("Error deserializing senderkey message: ", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &msgStructure, nil
|
||
|
}
|
||
|
|
||
|
// JSONSenderKeyStateSerializer is a structure for serializing group session states into
|
||
|
// and from JSON.
|
||
|
type JSONSenderKeyStateSerializer struct{}
|
||
|
|
||
|
// Serialize will take a session state structure and convert it to JSON bytes.
|
||
|
func (j *JSONSenderKeyStateSerializer) Serialize(state *groupRecord.SenderKeyStateStructure) []byte {
|
||
|
serialized, err := json.Marshal(state)
|
||
|
if err != nil {
|
||
|
logger.Error("Error serializing session state: ", err)
|
||
|
}
|
||
|
// logger.Debug("Serialize result: ", string(serialized))
|
||
|
|
||
|
return serialized
|
||
|
}
|
||
|
|
||
|
// Deserialize will take in JSON bytes and return a session state structure.
|
||
|
func (j *JSONSenderKeyStateSerializer) Deserialize(serialized []byte) (*groupRecord.SenderKeyStateStructure, error) {
|
||
|
var stateStructure groupRecord.SenderKeyStateStructure
|
||
|
err := json.Unmarshal(serialized, &stateStructure)
|
||
|
if err != nil {
|
||
|
logger.Error("Error deserializing session state: ", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &stateStructure, nil
|
||
|
}
|
||
|
|
||
|
// JSONSenderKeySessionSerializer is a structure for serializing session records into
|
||
|
// and from JSON.
|
||
|
type JSONSenderKeySessionSerializer struct{}
|
||
|
|
||
|
// Serialize will take a session structure and convert it to JSON bytes.
|
||
|
func (j *JSONSenderKeySessionSerializer) Serialize(session *groupRecord.SenderKeyStructure) []byte {
|
||
|
serialized, err := json.Marshal(session)
|
||
|
if err != nil {
|
||
|
logger.Error("Error serializing session: ", err)
|
||
|
}
|
||
|
// logger.Debug("Serialize result: ", string(serialized))
|
||
|
|
||
|
return serialized
|
||
|
}
|
||
|
|
||
|
// Deserialize will take in JSON bytes and return a session structure, which can be
|
||
|
// used to create a new Session Record object.
|
||
|
func (j *JSONSenderKeySessionSerializer) Deserialize(serialized []byte) (*groupRecord.SenderKeyStructure, error) {
|
||
|
var sessionStructure groupRecord.SenderKeyStructure
|
||
|
err := json.Unmarshal(serialized, &sessionStructure)
|
||
|
if err != nil {
|
||
|
logger.Error("Error deserializing session: ", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &sessionStructure, nil
|
||
|
}
|