Update library
Co-authored-by: zero <108243503+0xzer@users.noreply.github.com>
This commit is contained in:
parent
922ffdcf6b
commit
1615e146b6
83 changed files with 10474 additions and 4434 deletions
|
@ -26,7 +26,7 @@ import (
|
|||
"maunium.net/go/mautrix/id"
|
||||
"maunium.net/go/mautrix/util/dbutil"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm"
|
||||
)
|
||||
|
||||
type UserQuery struct {
|
||||
|
@ -63,22 +63,13 @@ func (uq *UserQuery) GetByPhone(ctx context.Context, phone string) (*User, error
|
|||
return get[*User](uq, ctx, `SELECT rowid, mxid, phone, session, management_room, space_room, access_token FROM "user" WHERE phone=$1`, phone)
|
||||
}
|
||||
|
||||
type Session struct {
|
||||
WebAuthKey []byte `json:"web_auth_key"`
|
||||
AESKey []byte `json:"aes_key"`
|
||||
HMACKey []byte `json:"hmac_key"`
|
||||
|
||||
PhoneInfo *binary.Device `json:"phone_info"`
|
||||
BrowserInfo *binary.Device `json:"browser_info"`
|
||||
}
|
||||
|
||||
type User struct {
|
||||
db *Database
|
||||
|
||||
RowID int
|
||||
MXID id.UserID
|
||||
Phone string
|
||||
Session *Session
|
||||
Session *libgm.AuthData
|
||||
|
||||
ManagementRoom id.RoomID
|
||||
SpaceRoom id.RoomID
|
||||
|
@ -95,7 +86,7 @@ func (user *User) Scan(row dbutil.Scannable) (*User, error) {
|
|||
return nil, err
|
||||
}
|
||||
if session.String != "" {
|
||||
var sess Session
|
||||
var sess libgm.AuthData
|
||||
err = json.Unmarshal([]byte(session.String), &sess)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to parse session: %w", err)
|
||||
|
|
|
@ -2,10 +2,8 @@ package main
|
|||
|
||||
import (
|
||||
"bufio"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
|
@ -21,13 +19,6 @@ import (
|
|||
"go.mau.fi/mautrix-gmessages/libgm/events"
|
||||
)
|
||||
|
||||
type Session struct {
|
||||
*libgm.DevicePair
|
||||
*crypto.Cryptor
|
||||
*binary.WebAuthKey
|
||||
Cookies []*http.Cookie
|
||||
}
|
||||
|
||||
func must(err error) {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
|
@ -41,7 +32,7 @@ func mustReturn[T any](val T, err error) T {
|
|||
|
||||
var cli *libgm.Client
|
||||
var log zerolog.Logger
|
||||
var sess Session
|
||||
var sess libgm.AuthData
|
||||
|
||||
func main() {
|
||||
log = zerolog.New(zerolog.NewConsoleWriter(func(w *zerolog.ConsoleWriter) {
|
||||
|
@ -61,22 +52,9 @@ func main() {
|
|||
if sess.Cryptor == nil {
|
||||
sess.Cryptor = crypto.NewCryptor(nil, nil)
|
||||
}
|
||||
cli = libgm.NewClient(sess.DevicePair, sess.Cryptor, log, nil)
|
||||
if sess.Cookies != nil {
|
||||
cli.SetCookies(sess.Cookies)
|
||||
}
|
||||
cli = libgm.NewClient(&sess, log)
|
||||
cli.SetEventHandler(evtHandler)
|
||||
log.Debug().Msg(base64.StdEncoding.EncodeToString(sess.GetWebAuthKey()))
|
||||
if sess.DevicePair == nil {
|
||||
pairer := mustReturn(cli.NewPairer(nil, 20))
|
||||
registered := mustReturn(pairer.RegisterPhoneRelay())
|
||||
must(cli.Connect(registered.Field5.RpcKey))
|
||||
} else {
|
||||
//pairer := mustReturn(cli.NewPairer(nil, 20))
|
||||
//newKey := pairer.GetWebEncryptionKey(sess.GetWebAuthKey())
|
||||
//log.Debug().Msg(base64.StdEncoding.EncodeToString(newKey))
|
||||
must(cli.Connect(sess.GetWebAuthKey()))
|
||||
}
|
||||
must(cli.Connect())
|
||||
|
||||
c := make(chan os.Signal)
|
||||
input := make(chan string)
|
||||
|
@ -111,7 +89,6 @@ func main() {
|
|||
}
|
||||
|
||||
func saveSession() {
|
||||
sess.Cookies = cli.GetCookies()
|
||||
file := mustReturn(os.OpenFile("session.json", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600))
|
||||
must(json.NewEncoder(file).Encode(sess))
|
||||
_ = file.Close()
|
||||
|
@ -123,25 +100,22 @@ func evtHandler(rawEvt any) {
|
|||
log.Debug().Any("data", evt).Msg("Client is ready!")
|
||||
case *events.PairSuccessful:
|
||||
log.Debug().Any("data", evt).Msg("Pair successful")
|
||||
sess.DevicePair = &libgm.DevicePair{
|
||||
Mobile: evt.PairDeviceData.Mobile,
|
||||
Browser: evt.PairDeviceData.Browser,
|
||||
}
|
||||
sess.WebAuthKey = evt.PairDeviceData.WebAuthKeyData
|
||||
//kd := evt.Data.(*binary.AuthenticationContainer_KeyData)
|
||||
//sess.DevicePair = &pblite.DevicePair{
|
||||
// Mobile: kd.KeyData.Mobile,
|
||||
// Browser: kd.KeyData.Browser,
|
||||
//}
|
||||
//sess.TachyonAuthToken = evt.AuthMessage.TachyonAuthToken
|
||||
saveSession()
|
||||
log.Debug().Msg("Wrote session")
|
||||
case *binary.Event_MessageEvent:
|
||||
case *binary.Message:
|
||||
log.Debug().Any("data", evt).Msg("Message event")
|
||||
case *binary.Event_ConversationEvent:
|
||||
case *binary.Conversation:
|
||||
log.Debug().Any("data", evt).Msg("Conversation event")
|
||||
case *events.QR:
|
||||
qrterminal.GenerateHalfBlock(evt.URL, qrterminal.L, os.Stdout)
|
||||
case *events.BrowserActive:
|
||||
log.Debug().Any("data", evt).Msg("Browser active")
|
||||
case *events.Battery:
|
||||
log.Debug().Any("data", evt).Msg("Battery")
|
||||
case *events.DataConnection:
|
||||
log.Debug().Any("data", evt).Msg("Data connection")
|
||||
default:
|
||||
log.Debug().Any("data", evt).Msg("Unknown event")
|
||||
}
|
||||
|
|
1037
libgm/binary/authentication.pb.go
Normal file
1037
libgm/binary/authentication.pb.go
Normal file
File diff suppressed because it is too large
Load diff
|
@ -20,20 +20,165 @@ const (
|
|||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
type SendMessage struct {
|
||||
type BugleMessageType int32
|
||||
|
||||
const (
|
||||
BugleMessageType_UNKNOWN_BUGLE_MESSAGE_TYPE BugleMessageType = 0
|
||||
BugleMessageType_SMS BugleMessageType = 1
|
||||
BugleMessageType_MMS BugleMessageType = 2
|
||||
BugleMessageType_RCS BugleMessageType = 3
|
||||
BugleMessageType_CLOUD_SYNC BugleMessageType = 4
|
||||
BugleMessageType_IMDN_DELIVERED BugleMessageType = 5
|
||||
BugleMessageType_IMDN_DISPLAYED BugleMessageType = 6
|
||||
BugleMessageType_IMDN_FALLBACK BugleMessageType = 7
|
||||
BugleMessageType_RCS_GENERIC BugleMessageType = 8
|
||||
BugleMessageType_FTD BugleMessageType = 9
|
||||
BugleMessageType_FT_E2EE_LEGACY BugleMessageType = 10
|
||||
BugleMessageType_FT_E2EE_XML BugleMessageType = 11
|
||||
BugleMessageType_LIGHTER_MESSAGE BugleMessageType = 12
|
||||
BugleMessageType_RBM_SPAM_REPORT BugleMessageType = 13
|
||||
BugleMessageType_SATELLITE BugleMessageType = 14
|
||||
)
|
||||
|
||||
// Enum value maps for BugleMessageType.
|
||||
var (
|
||||
BugleMessageType_name = map[int32]string{
|
||||
0: "UNKNOWN_BUGLE_MESSAGE_TYPE",
|
||||
1: "SMS",
|
||||
2: "MMS",
|
||||
3: "RCS",
|
||||
4: "CLOUD_SYNC",
|
||||
5: "IMDN_DELIVERED",
|
||||
6: "IMDN_DISPLAYED",
|
||||
7: "IMDN_FALLBACK",
|
||||
8: "RCS_GENERIC",
|
||||
9: "FTD",
|
||||
10: "FT_E2EE_LEGACY",
|
||||
11: "FT_E2EE_XML",
|
||||
12: "LIGHTER_MESSAGE",
|
||||
13: "RBM_SPAM_REPORT",
|
||||
14: "SATELLITE",
|
||||
}
|
||||
BugleMessageType_value = map[string]int32{
|
||||
"UNKNOWN_BUGLE_MESSAGE_TYPE": 0,
|
||||
"SMS": 1,
|
||||
"MMS": 2,
|
||||
"RCS": 3,
|
||||
"CLOUD_SYNC": 4,
|
||||
"IMDN_DELIVERED": 5,
|
||||
"IMDN_DISPLAYED": 6,
|
||||
"IMDN_FALLBACK": 7,
|
||||
"RCS_GENERIC": 8,
|
||||
"FTD": 9,
|
||||
"FT_E2EE_LEGACY": 10,
|
||||
"FT_E2EE_XML": 11,
|
||||
"LIGHTER_MESSAGE": 12,
|
||||
"RBM_SPAM_REPORT": 13,
|
||||
"SATELLITE": 14,
|
||||
}
|
||||
)
|
||||
|
||||
func (x BugleMessageType) Enum() *BugleMessageType {
|
||||
p := new(BugleMessageType)
|
||||
*p = x
|
||||
return p
|
||||
}
|
||||
|
||||
func (x BugleMessageType) String() string {
|
||||
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
|
||||
}
|
||||
|
||||
func (BugleMessageType) Descriptor() protoreflect.EnumDescriptor {
|
||||
return file_client_proto_enumTypes[0].Descriptor()
|
||||
}
|
||||
|
||||
func (BugleMessageType) Type() protoreflect.EnumType {
|
||||
return &file_client_proto_enumTypes[0]
|
||||
}
|
||||
|
||||
func (x BugleMessageType) Number() protoreflect.EnumNumber {
|
||||
return protoreflect.EnumNumber(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use BugleMessageType.Descriptor instead.
|
||||
func (BugleMessageType) EnumDescriptor() ([]byte, []int) {
|
||||
return file_client_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
type BrowserTypes int32
|
||||
|
||||
const (
|
||||
BrowserTypes_UNKNOWN_BROWSER_TYPE BrowserTypes = 0
|
||||
BrowserTypes_OTHER BrowserTypes = 1
|
||||
BrowserTypes_CHROME BrowserTypes = 2
|
||||
BrowserTypes_FIREFOX BrowserTypes = 3
|
||||
BrowserTypes_SAFARI BrowserTypes = 4
|
||||
BrowserTypes_OPERA BrowserTypes = 5
|
||||
BrowserTypes_IE BrowserTypes = 6
|
||||
BrowserTypes_EDGE BrowserTypes = 7
|
||||
)
|
||||
|
||||
// Enum value maps for BrowserTypes.
|
||||
var (
|
||||
BrowserTypes_name = map[int32]string{
|
||||
0: "UNKNOWN_BROWSER_TYPE",
|
||||
1: "OTHER",
|
||||
2: "CHROME",
|
||||
3: "FIREFOX",
|
||||
4: "SAFARI",
|
||||
5: "OPERA",
|
||||
6: "IE",
|
||||
7: "EDGE",
|
||||
}
|
||||
BrowserTypes_value = map[string]int32{
|
||||
"UNKNOWN_BROWSER_TYPE": 0,
|
||||
"OTHER": 1,
|
||||
"CHROME": 2,
|
||||
"FIREFOX": 3,
|
||||
"SAFARI": 4,
|
||||
"OPERA": 5,
|
||||
"IE": 6,
|
||||
"EDGE": 7,
|
||||
}
|
||||
)
|
||||
|
||||
func (x BrowserTypes) Enum() *BrowserTypes {
|
||||
p := new(BrowserTypes)
|
||||
*p = x
|
||||
return p
|
||||
}
|
||||
|
||||
func (x BrowserTypes) String() string {
|
||||
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
|
||||
}
|
||||
|
||||
func (BrowserTypes) Descriptor() protoreflect.EnumDescriptor {
|
||||
return file_client_proto_enumTypes[1].Descriptor()
|
||||
}
|
||||
|
||||
func (BrowserTypes) Type() protoreflect.EnumType {
|
||||
return &file_client_proto_enumTypes[1]
|
||||
}
|
||||
|
||||
func (x BrowserTypes) Number() protoreflect.EnumNumber {
|
||||
return protoreflect.EnumNumber(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use BrowserTypes.Descriptor instead.
|
||||
func (BrowserTypes) EnumDescriptor() ([]byte, []int) {
|
||||
return file_client_proto_rawDescGZIP(), []int{1}
|
||||
}
|
||||
|
||||
type NotifyDittoActivityPayload struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
PairedDevice *Device `protobuf:"bytes,1,opt,name=pairedDevice,proto3" json:"pairedDevice,omitempty"`
|
||||
MessageData *MessageData `protobuf:"bytes,2,opt,name=messageData,proto3" json:"messageData,omitempty"`
|
||||
AuthData *AuthMessage `protobuf:"bytes,3,opt,name=authData,proto3" json:"authData,omitempty"`
|
||||
TTL int64 `protobuf:"varint,5,opt,name=TTL,proto3" json:"TTL,omitempty"`
|
||||
EmptyArr *EmptyArr `protobuf:"bytes,9,opt,name=emptyArr,proto3" json:"emptyArr,omitempty"`
|
||||
Success bool `protobuf:"varint,2,opt,name=success,proto3" json:"success,omitempty"`
|
||||
}
|
||||
|
||||
func (x *SendMessage) Reset() {
|
||||
*x = SendMessage{}
|
||||
func (x *NotifyDittoActivityPayload) Reset() {
|
||||
*x = NotifyDittoActivityPayload{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_client_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
|
@ -41,13 +186,13 @@ func (x *SendMessage) Reset() {
|
|||
}
|
||||
}
|
||||
|
||||
func (x *SendMessage) String() string {
|
||||
func (x *NotifyDittoActivityPayload) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*SendMessage) ProtoMessage() {}
|
||||
func (*NotifyDittoActivityPayload) ProtoMessage() {}
|
||||
|
||||
func (x *SendMessage) ProtoReflect() protoreflect.Message {
|
||||
func (x *NotifyDittoActivityPayload) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_client_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
|
@ -59,46 +204,206 @@ func (x *SendMessage) ProtoReflect() protoreflect.Message {
|
|||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use SendMessage.ProtoReflect.Descriptor instead.
|
||||
func (*SendMessage) Descriptor() ([]byte, []int) {
|
||||
// Deprecated: Use NotifyDittoActivityPayload.ProtoReflect.Descriptor instead.
|
||||
func (*NotifyDittoActivityPayload) Descriptor() ([]byte, []int) {
|
||||
return file_client_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *SendMessage) GetPairedDevice() *Device {
|
||||
func (x *NotifyDittoActivityPayload) GetSuccess() bool {
|
||||
if x != nil {
|
||||
return x.PairedDevice
|
||||
return x.Success
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type AckMessageResponse struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Container *AckContainer `protobuf:"bytes,1,opt,name=container,proto3" json:"container,omitempty"`
|
||||
}
|
||||
|
||||
func (x *AckMessageResponse) Reset() {
|
||||
*x = AckMessageResponse{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_client_proto_msgTypes[1]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *AckMessageResponse) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*AckMessageResponse) ProtoMessage() {}
|
||||
|
||||
func (x *AckMessageResponse) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_client_proto_msgTypes[1]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use AckMessageResponse.ProtoReflect.Descriptor instead.
|
||||
func (*AckMessageResponse) Descriptor() ([]byte, []int) {
|
||||
return file_client_proto_rawDescGZIP(), []int{1}
|
||||
}
|
||||
|
||||
func (x *AckMessageResponse) GetContainer() *AckContainer {
|
||||
if x != nil {
|
||||
return x.Container
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *SendMessage) GetMessageData() *MessageData {
|
||||
type AckContainer struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Data *AckData `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
|
||||
}
|
||||
|
||||
func (x *AckContainer) Reset() {
|
||||
*x = AckContainer{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_client_proto_msgTypes[2]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *AckContainer) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*AckContainer) ProtoMessage() {}
|
||||
|
||||
func (x *AckContainer) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_client_proto_msgTypes[2]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use AckContainer.ProtoReflect.Descriptor instead.
|
||||
func (*AckContainer) Descriptor() ([]byte, []int) {
|
||||
return file_client_proto_rawDescGZIP(), []int{2}
|
||||
}
|
||||
|
||||
func (x *AckContainer) GetData() *AckData {
|
||||
if x != nil {
|
||||
return x.MessageData
|
||||
return x.Data
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *SendMessage) GetAuthData() *AuthMessage {
|
||||
type AckData struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
AckAmount *AckAmount `protobuf:"bytes,4,opt,name=ackAmount,proto3" json:"ackAmount,omitempty"`
|
||||
}
|
||||
|
||||
func (x *AckData) Reset() {
|
||||
*x = AckData{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_client_proto_msgTypes[3]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *AckData) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*AckData) ProtoMessage() {}
|
||||
|
||||
func (x *AckData) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_client_proto_msgTypes[3]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use AckData.ProtoReflect.Descriptor instead.
|
||||
func (*AckData) Descriptor() ([]byte, []int) {
|
||||
return file_client_proto_rawDescGZIP(), []int{3}
|
||||
}
|
||||
|
||||
func (x *AckData) GetAckAmount() *AckAmount {
|
||||
if x != nil {
|
||||
return x.AuthData
|
||||
return x.AckAmount
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *SendMessage) GetTTL() int64 {
|
||||
type AckAmount struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Count int32 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`
|
||||
}
|
||||
|
||||
func (x *AckAmount) Reset() {
|
||||
*x = AckAmount{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_client_proto_msgTypes[4]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *AckAmount) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*AckAmount) ProtoMessage() {}
|
||||
|
||||
func (x *AckAmount) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_client_proto_msgTypes[4]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use AckAmount.ProtoReflect.Descriptor instead.
|
||||
func (*AckAmount) Descriptor() ([]byte, []int) {
|
||||
return file_client_proto_rawDescGZIP(), []int{4}
|
||||
}
|
||||
|
||||
func (x *AckAmount) GetCount() int32 {
|
||||
if x != nil {
|
||||
return x.TTL
|
||||
return x.Count
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *SendMessage) GetEmptyArr() *EmptyArr {
|
||||
if x != nil {
|
||||
return x.EmptyArr
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type AckMessagePayload struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
|
@ -112,7 +417,7 @@ type AckMessagePayload struct {
|
|||
func (x *AckMessagePayload) Reset() {
|
||||
*x = AckMessagePayload{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_client_proto_msgTypes[1]
|
||||
mi := &file_client_proto_msgTypes[5]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -125,7 +430,7 @@ func (x *AckMessagePayload) String() string {
|
|||
func (*AckMessagePayload) ProtoMessage() {}
|
||||
|
||||
func (x *AckMessagePayload) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_client_proto_msgTypes[1]
|
||||
mi := &file_client_proto_msgTypes[5]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -138,7 +443,7 @@ func (x *AckMessagePayload) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use AckMessagePayload.ProtoReflect.Descriptor instead.
|
||||
func (*AckMessagePayload) Descriptor() ([]byte, []int) {
|
||||
return file_client_proto_rawDescGZIP(), []int{1}
|
||||
return file_client_proto_rawDescGZIP(), []int{5}
|
||||
}
|
||||
|
||||
func (x *AckMessagePayload) GetAuthData() *AuthMessage {
|
||||
|
@ -174,7 +479,7 @@ type AckMessageData struct {
|
|||
func (x *AckMessageData) Reset() {
|
||||
*x = AckMessageData{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_client_proto_msgTypes[2]
|
||||
mi := &file_client_proto_msgTypes[6]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -187,7 +492,7 @@ func (x *AckMessageData) String() string {
|
|||
func (*AckMessageData) ProtoMessage() {}
|
||||
|
||||
func (x *AckMessageData) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_client_proto_msgTypes[2]
|
||||
mi := &file_client_proto_msgTypes[6]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -200,7 +505,7 @@ func (x *AckMessageData) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use AckMessageData.ProtoReflect.Descriptor instead.
|
||||
func (*AckMessageData) Descriptor() ([]byte, []int) {
|
||||
return file_client_proto_rawDescGZIP(), []int{2}
|
||||
return file_client_proto_rawDescGZIP(), []int{6}
|
||||
}
|
||||
|
||||
func (x *AckMessageData) GetRequestID() string {
|
||||
|
@ -229,7 +534,7 @@ type ImageMetaData struct {
|
|||
func (x *ImageMetaData) Reset() {
|
||||
*x = ImageMetaData{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_client_proto_msgTypes[3]
|
||||
mi := &file_client_proto_msgTypes[7]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -242,7 +547,7 @@ func (x *ImageMetaData) String() string {
|
|||
func (*ImageMetaData) ProtoMessage() {}
|
||||
|
||||
func (x *ImageMetaData) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_client_proto_msgTypes[3]
|
||||
mi := &file_client_proto_msgTypes[7]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -255,7 +560,7 @@ func (x *ImageMetaData) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use ImageMetaData.ProtoReflect.Descriptor instead.
|
||||
func (*ImageMetaData) Descriptor() ([]byte, []int) {
|
||||
return file_client_proto_rawDescGZIP(), []int{3}
|
||||
return file_client_proto_rawDescGZIP(), []int{7}
|
||||
}
|
||||
|
||||
func (x *ImageMetaData) GetImageID() string {
|
||||
|
@ -284,7 +589,7 @@ type UploadImagePayload struct {
|
|||
func (x *UploadImagePayload) Reset() {
|
||||
*x = UploadImagePayload{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_client_proto_msgTypes[4]
|
||||
mi := &file_client_proto_msgTypes[8]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -297,7 +602,7 @@ func (x *UploadImagePayload) String() string {
|
|||
func (*UploadImagePayload) ProtoMessage() {}
|
||||
|
||||
func (x *UploadImagePayload) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_client_proto_msgTypes[4]
|
||||
mi := &file_client_proto_msgTypes[8]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -310,7 +615,7 @@ func (x *UploadImagePayload) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use UploadImagePayload.ProtoReflect.Descriptor instead.
|
||||
func (*UploadImagePayload) Descriptor() ([]byte, []int) {
|
||||
return file_client_proto_rawDescGZIP(), []int{4}
|
||||
return file_client_proto_rawDescGZIP(), []int{8}
|
||||
}
|
||||
|
||||
func (x *UploadImagePayload) GetMetaData() *ImageMetaData {
|
||||
|
@ -338,7 +643,7 @@ type BugleBackendService struct {
|
|||
func (x *BugleBackendService) Reset() {
|
||||
*x = BugleBackendService{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_client_proto_msgTypes[5]
|
||||
mi := &file_client_proto_msgTypes[9]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -351,7 +656,7 @@ func (x *BugleBackendService) String() string {
|
|||
func (*BugleBackendService) ProtoMessage() {}
|
||||
|
||||
func (x *BugleBackendService) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_client_proto_msgTypes[5]
|
||||
mi := &file_client_proto_msgTypes[9]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -364,7 +669,7 @@ func (x *BugleBackendService) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use BugleBackendService.ProtoReflect.Descriptor instead.
|
||||
func (*BugleBackendService) Descriptor() ([]byte, []int) {
|
||||
return file_client_proto_rawDescGZIP(), []int{5}
|
||||
return file_client_proto_rawDescGZIP(), []int{9}
|
||||
}
|
||||
|
||||
func (x *BugleBackendService) GetData() *BugleCode {
|
||||
|
@ -385,7 +690,7 @@ type BugleCode struct {
|
|||
func (x *BugleCode) Reset() {
|
||||
*x = BugleCode{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_client_proto_msgTypes[6]
|
||||
mi := &file_client_proto_msgTypes[10]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -398,7 +703,7 @@ func (x *BugleCode) String() string {
|
|||
func (*BugleCode) ProtoMessage() {}
|
||||
|
||||
func (x *BugleCode) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_client_proto_msgTypes[6]
|
||||
mi := &file_client_proto_msgTypes[10]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -411,7 +716,7 @@ func (x *BugleCode) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use BugleCode.ProtoReflect.Descriptor instead.
|
||||
func (*BugleCode) Descriptor() ([]byte, []int) {
|
||||
return file_client_proto_rawDescGZIP(), []int{6}
|
||||
return file_client_proto_rawDescGZIP(), []int{10}
|
||||
}
|
||||
|
||||
func (x *BugleCode) GetType() int64 {
|
||||
|
@ -426,57 +731,83 @@ var File_client_proto protoreflect.FileDescriptor
|
|||
var file_client_proto_rawDesc = []byte{
|
||||
0x0a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06,
|
||||
0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x1a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73,
|
||||
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf1, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x4d,
|
||||
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x0c, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64,
|
||||
0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6d,
|
||||
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0c,
|
||||
0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x37, 0x0a, 0x0b,
|
||||
0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28,
|
||||
0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x4d, 0x65, 0x73,
|
||||
0x73, 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
|
||||
0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x31, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x68, 0x44, 0x61, 0x74,
|
||||
0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
|
||||
0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08,
|
||||
0x61, 0x75, 0x74, 0x68, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x54, 0x54, 0x4c, 0x18,
|
||||
0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x54, 0x54, 0x4c, 0x12, 0x2e, 0x0a, 0x08, 0x65, 0x6d,
|
||||
0x70, 0x74, 0x79, 0x41, 0x72, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d,
|
||||
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x41, 0x72, 0x72,
|
||||
0x52, 0x08, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x41, 0x72, 0x72, 0x22, 0x8e, 0x01, 0x0a, 0x11, 0x41,
|
||||
0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64,
|
||||
0x12, 0x31, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x68, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01,
|
||||
0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75,
|
||||
0x74, 0x68, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x44,
|
||||
0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x41, 0x72, 0x72, 0x18,
|
||||
0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73,
|
||||
0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x41, 0x72, 0x72, 0x52, 0x08, 0x65, 0x6d, 0x70, 0x74, 0x79,
|
||||
0x41, 0x72, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x43, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20,
|
||||
0x01, 0x28, 0x0c, 0x52, 0x06, 0x6e, 0x6f, 0x43, 0x6c, 0x75, 0x65, 0x22, 0x58, 0x0a, 0x0e, 0x41,
|
||||
0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1c, 0x0a,
|
||||
0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x44, 0x12, 0x28, 0x0a, 0x06, 0x64,
|
||||
0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6d, 0x65,
|
||||
0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06, 0x64,
|
||||
0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x47, 0x0a, 0x0d, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65,
|
||||
0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x49,
|
||||
0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x44,
|
||||
0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20,
|
||||
0x01, 0x28, 0x08, 0x52, 0x09, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x22, 0x7a,
|
||||
0x0a, 0x12, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x61, 0x79,
|
||||
0x6c, 0x6f, 0x61, 0x64, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61,
|
||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e,
|
||||
0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d,
|
||||
0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x31, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x68, 0x44,
|
||||
0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x73,
|
||||
0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
|
||||
0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x44, 0x61, 0x74, 0x61, 0x22, 0x3c, 0x0a, 0x13, 0x42, 0x75,
|
||||
0x67, 0x6c, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,
|
||||
0x65, 0x12, 0x25, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||
0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x75, 0x67, 0x6c, 0x65, 0x43, 0x6f,
|
||||
0x64, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x1f, 0x0a, 0x09, 0x42, 0x75, 0x67, 0x6c,
|
||||
0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20,
|
||||
0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x42, 0x0e, 0x5a, 0x0c, 0x2e, 0x2e, 0x2f,
|
||||
0x2e, 0x2e, 0x2f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
||||
0x33,
|
||||
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x36, 0x0a, 0x1a, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79,
|
||||
0x44, 0x69, 0x74, 0x74, 0x6f, 0x41, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x50, 0x61, 0x79,
|
||||
0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18,
|
||||
0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x48,
|
||||
0x0a, 0x12, 0x41, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70,
|
||||
0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65,
|
||||
0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74,
|
||||
0x2e, 0x41, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x63,
|
||||
0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x33, 0x0a, 0x0c, 0x41, 0x63, 0x6b, 0x43,
|
||||
0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61,
|
||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e,
|
||||
0x41, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x0a,
|
||||
0x07, 0x41, 0x63, 0x6b, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2f, 0x0a, 0x09, 0x61, 0x63, 0x6b, 0x41,
|
||||
0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c,
|
||||
0x69, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x09,
|
||||
0x61, 0x63, 0x6b, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x21, 0x0a, 0x09, 0x41, 0x63, 0x6b,
|
||||
0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18,
|
||||
0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x8e, 0x01, 0x0a,
|
||||
0x11, 0x41, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f,
|
||||
0x61, 0x64, 0x12, 0x31, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x68, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01,
|
||||
0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e,
|
||||
0x41, 0x75, 0x74, 0x68, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x08, 0x61, 0x75, 0x74,
|
||||
0x68, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x41, 0x72,
|
||||
0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
|
||||
0x65, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x41, 0x72, 0x72, 0x52, 0x08, 0x65, 0x6d, 0x70,
|
||||
0x74, 0x79, 0x41, 0x72, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x6f, 0x43, 0x6c, 0x75, 0x65, 0x18,
|
||||
0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x6e, 0x6f, 0x43, 0x6c, 0x75, 0x65, 0x22, 0x58, 0x0a,
|
||||
0x0e, 0x41, 0x63, 0x6b, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12,
|
||||
0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01,
|
||||
0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x44, 0x12, 0x28, 0x0a,
|
||||
0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e,
|
||||
0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52,
|
||||
0x06, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x22, 0x47, 0x0a, 0x0d, 0x49, 0x6d, 0x61, 0x67, 0x65,
|
||||
0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6d, 0x61, 0x67,
|
||||
0x65, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6d, 0x61, 0x67, 0x65,
|
||||
0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64, 0x18,
|
||||
0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64,
|
||||
0x22, 0x7a, 0x0a, 0x12, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x50,
|
||||
0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x31, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x44, 0x61,
|
||||
0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e,
|
||||
0x74, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x52,
|
||||
0x08, 0x6d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x31, 0x0a, 0x08, 0x61, 0x75, 0x74,
|
||||
0x68, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6d, 0x65,
|
||||
0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x4d, 0x65, 0x73, 0x73, 0x61,
|
||||
0x67, 0x65, 0x52, 0x08, 0x61, 0x75, 0x74, 0x68, 0x44, 0x61, 0x74, 0x61, 0x22, 0x3c, 0x0a, 0x13,
|
||||
0x42, 0x75, 0x67, 0x6c, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x53, 0x65, 0x72, 0x76,
|
||||
0x69, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28,
|
||||
0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x42, 0x75, 0x67, 0x6c, 0x65,
|
||||
0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x1f, 0x0a, 0x09, 0x42, 0x75,
|
||||
0x67, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,
|
||||
0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x2a, 0x90, 0x02, 0x0a, 0x10,
|
||||
0x42, 0x75, 0x67, 0x6c, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65,
|
||||
0x12, 0x1e, 0x0a, 0x1a, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x42, 0x55, 0x47, 0x4c,
|
||||
0x45, 0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00,
|
||||
0x12, 0x07, 0x0a, 0x03, 0x53, 0x4d, 0x53, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x4d, 0x53,
|
||||
0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x43, 0x53, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x43,
|
||||
0x4c, 0x4f, 0x55, 0x44, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x49,
|
||||
0x4d, 0x44, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, 0x45, 0x52, 0x45, 0x44, 0x10, 0x05, 0x12,
|
||||
0x12, 0x0a, 0x0e, 0x49, 0x4d, 0x44, 0x4e, 0x5f, 0x44, 0x49, 0x53, 0x50, 0x4c, 0x41, 0x59, 0x45,
|
||||
0x44, 0x10, 0x06, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x4d, 0x44, 0x4e, 0x5f, 0x46, 0x41, 0x4c, 0x4c,
|
||||
0x42, 0x41, 0x43, 0x4b, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x43, 0x53, 0x5f, 0x47, 0x45,
|
||||
0x4e, 0x45, 0x52, 0x49, 0x43, 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x54, 0x44, 0x10, 0x09,
|
||||
0x12, 0x12, 0x0a, 0x0e, 0x46, 0x54, 0x5f, 0x45, 0x32, 0x45, 0x45, 0x5f, 0x4c, 0x45, 0x47, 0x41,
|
||||
0x43, 0x59, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x54, 0x5f, 0x45, 0x32, 0x45, 0x45, 0x5f,
|
||||
0x58, 0x4d, 0x4c, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x49, 0x47, 0x48, 0x54, 0x45, 0x52,
|
||||
0x5f, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x10, 0x0c, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x42,
|
||||
0x4d, 0x5f, 0x53, 0x50, 0x41, 0x4d, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x52, 0x54, 0x10, 0x0d, 0x12,
|
||||
0x0d, 0x0a, 0x09, 0x53, 0x41, 0x54, 0x45, 0x4c, 0x4c, 0x49, 0x54, 0x45, 0x10, 0x0e, 0x2a, 0x75,
|
||||
0x0a, 0x0c, 0x42, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x18,
|
||||
0x0a, 0x14, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x42, 0x52, 0x4f, 0x57, 0x53, 0x45,
|
||||
0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x54, 0x48, 0x45,
|
||||
0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x48, 0x52, 0x4f, 0x4d, 0x45, 0x10, 0x02, 0x12,
|
||||
0x0b, 0x0a, 0x07, 0x46, 0x49, 0x52, 0x45, 0x46, 0x4f, 0x58, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06,
|
||||
0x53, 0x41, 0x46, 0x41, 0x52, 0x49, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x50, 0x45, 0x52,
|
||||
0x41, 0x10, 0x05, 0x12, 0x06, 0x0a, 0x02, 0x49, 0x45, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x45,
|
||||
0x44, 0x47, 0x45, 0x10, 0x07, 0x42, 0x0e, 0x5a, 0x0c, 0x2e, 0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x62,
|
||||
0x69, 0x6e, 0x61, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
|
@ -491,36 +822,41 @@ func file_client_proto_rawDescGZIP() []byte {
|
|||
return file_client_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_client_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
|
||||
var file_client_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
|
||||
var file_client_proto_msgTypes = make([]protoimpl.MessageInfo, 11)
|
||||
var file_client_proto_goTypes = []interface{}{
|
||||
(*SendMessage)(nil), // 0: client.SendMessage
|
||||
(*AckMessagePayload)(nil), // 1: client.AckMessagePayload
|
||||
(*AckMessageData)(nil), // 2: client.AckMessageData
|
||||
(*ImageMetaData)(nil), // 3: client.ImageMetaData
|
||||
(*UploadImagePayload)(nil), // 4: client.UploadImagePayload
|
||||
(*BugleBackendService)(nil), // 5: client.BugleBackendService
|
||||
(*BugleCode)(nil), // 6: client.BugleCode
|
||||
(*Device)(nil), // 7: messages.Device
|
||||
(*MessageData)(nil), // 8: messages.MessageData
|
||||
(*AuthMessage)(nil), // 9: messages.AuthMessage
|
||||
(*EmptyArr)(nil), // 10: messages.EmptyArr
|
||||
(BugleMessageType)(0), // 0: client.BugleMessageType
|
||||
(BrowserTypes)(0), // 1: client.BrowserTypes
|
||||
(*NotifyDittoActivityPayload)(nil), // 2: client.NotifyDittoActivityPayload
|
||||
(*AckMessageResponse)(nil), // 3: client.AckMessageResponse
|
||||
(*AckContainer)(nil), // 4: client.AckContainer
|
||||
(*AckData)(nil), // 5: client.AckData
|
||||
(*AckAmount)(nil), // 6: client.AckAmount
|
||||
(*AckMessagePayload)(nil), // 7: client.AckMessagePayload
|
||||
(*AckMessageData)(nil), // 8: client.AckMessageData
|
||||
(*ImageMetaData)(nil), // 9: client.ImageMetaData
|
||||
(*UploadImagePayload)(nil), // 10: client.UploadImagePayload
|
||||
(*BugleBackendService)(nil), // 11: client.BugleBackendService
|
||||
(*BugleCode)(nil), // 12: client.BugleCode
|
||||
(*AuthMessage)(nil), // 13: messages.AuthMessage
|
||||
(*EmptyArr)(nil), // 14: messages.EmptyArr
|
||||
(*Device)(nil), // 15: messages.Device
|
||||
}
|
||||
var file_client_proto_depIdxs = []int32{
|
||||
7, // 0: client.SendMessage.pairedDevice:type_name -> messages.Device
|
||||
8, // 1: client.SendMessage.messageData:type_name -> messages.MessageData
|
||||
9, // 2: client.SendMessage.authData:type_name -> messages.AuthMessage
|
||||
10, // 3: client.SendMessage.emptyArr:type_name -> messages.EmptyArr
|
||||
9, // 4: client.AckMessagePayload.authData:type_name -> messages.AuthMessage
|
||||
10, // 5: client.AckMessagePayload.emptyArr:type_name -> messages.EmptyArr
|
||||
7, // 6: client.AckMessageData.device:type_name -> messages.Device
|
||||
3, // 7: client.UploadImagePayload.metaData:type_name -> client.ImageMetaData
|
||||
9, // 8: client.UploadImagePayload.authData:type_name -> messages.AuthMessage
|
||||
6, // 9: client.BugleBackendService.data:type_name -> client.BugleCode
|
||||
10, // [10:10] is the sub-list for method output_type
|
||||
10, // [10:10] is the sub-list for method input_type
|
||||
10, // [10:10] is the sub-list for extension type_name
|
||||
10, // [10:10] is the sub-list for extension extendee
|
||||
0, // [0:10] is the sub-list for field type_name
|
||||
4, // 0: client.AckMessageResponse.container:type_name -> client.AckContainer
|
||||
5, // 1: client.AckContainer.data:type_name -> client.AckData
|
||||
6, // 2: client.AckData.ackAmount:type_name -> client.AckAmount
|
||||
13, // 3: client.AckMessagePayload.authData:type_name -> messages.AuthMessage
|
||||
14, // 4: client.AckMessagePayload.emptyArr:type_name -> messages.EmptyArr
|
||||
15, // 5: client.AckMessageData.device:type_name -> messages.Device
|
||||
9, // 6: client.UploadImagePayload.metaData:type_name -> client.ImageMetaData
|
||||
13, // 7: client.UploadImagePayload.authData:type_name -> messages.AuthMessage
|
||||
12, // 8: client.BugleBackendService.data:type_name -> client.BugleCode
|
||||
9, // [9:9] is the sub-list for method output_type
|
||||
9, // [9:9] is the sub-list for method input_type
|
||||
9, // [9:9] is the sub-list for extension type_name
|
||||
9, // [9:9] is the sub-list for extension extendee
|
||||
0, // [0:9] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_client_proto_init() }
|
||||
|
@ -531,7 +867,7 @@ func file_client_proto_init() {
|
|||
file_messages_proto_init()
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_client_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*SendMessage); i {
|
||||
switch v := v.(*NotifyDittoActivityPayload); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -543,7 +879,7 @@ func file_client_proto_init() {
|
|||
}
|
||||
}
|
||||
file_client_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*AckMessagePayload); i {
|
||||
switch v := v.(*AckMessageResponse); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -555,7 +891,7 @@ func file_client_proto_init() {
|
|||
}
|
||||
}
|
||||
file_client_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*AckMessageData); i {
|
||||
switch v := v.(*AckContainer); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -567,7 +903,7 @@ func file_client_proto_init() {
|
|||
}
|
||||
}
|
||||
file_client_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*ImageMetaData); i {
|
||||
switch v := v.(*AckData); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -579,7 +915,7 @@ func file_client_proto_init() {
|
|||
}
|
||||
}
|
||||
file_client_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*UploadImagePayload); i {
|
||||
switch v := v.(*AckAmount); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -591,7 +927,7 @@ func file_client_proto_init() {
|
|||
}
|
||||
}
|
||||
file_client_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*BugleBackendService); i {
|
||||
switch v := v.(*AckMessagePayload); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -603,6 +939,54 @@ func file_client_proto_init() {
|
|||
}
|
||||
}
|
||||
file_client_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*AckMessageData); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_client_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*ImageMetaData); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_client_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*UploadImagePayload); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_client_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*BugleBackendService); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_client_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*BugleCode); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
|
@ -620,13 +1004,14 @@ func file_client_proto_init() {
|
|||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_client_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 7,
|
||||
NumEnums: 2,
|
||||
NumMessages: 11,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_client_proto_goTypes,
|
||||
DependencyIndexes: file_client_proto_depIdxs,
|
||||
EnumInfos: file_client_proto_enumTypes,
|
||||
MessageInfos: file_client_proto_msgTypes,
|
||||
}.Build()
|
||||
File_client_proto = out.File
|
||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,767 +0,0 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.30.0
|
||||
// protoc v3.21.12
|
||||
// source: pairing.proto
|
||||
|
||||
package binary
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
type BrowserDetails struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
UserAgent string `protobuf:"bytes,1,opt,name=userAgent,proto3" json:"userAgent,omitempty"`
|
||||
SomeInt int32 `protobuf:"varint,2,opt,name=someInt,proto3" json:"someInt,omitempty"`
|
||||
Os string `protobuf:"bytes,3,opt,name=os,proto3" json:"os,omitempty"`
|
||||
SomeBool bool `protobuf:"varint,6,opt,name=someBool,proto3" json:"someBool,omitempty"`
|
||||
}
|
||||
|
||||
func (x *BrowserDetails) Reset() {
|
||||
*x = BrowserDetails{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_pairing_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *BrowserDetails) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*BrowserDetails) ProtoMessage() {}
|
||||
|
||||
func (x *BrowserDetails) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_pairing_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use BrowserDetails.ProtoReflect.Descriptor instead.
|
||||
func (*BrowserDetails) Descriptor() ([]byte, []int) {
|
||||
return file_pairing_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *BrowserDetails) GetUserAgent() string {
|
||||
if x != nil {
|
||||
return x.UserAgent
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *BrowserDetails) GetSomeInt() int32 {
|
||||
if x != nil {
|
||||
return x.SomeInt
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *BrowserDetails) GetOs() string {
|
||||
if x != nil {
|
||||
return x.Os
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *BrowserDetails) GetSomeBool() bool {
|
||||
if x != nil {
|
||||
return x.SomeBool
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type PhoneRelayBody struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"`
|
||||
Bugle string `protobuf:"bytes,3,opt,name=bugle,proto3" json:"bugle,omitempty"`
|
||||
RpcKey []byte `protobuf:"bytes,6,opt,name=rpcKey,proto3" json:"rpcKey,omitempty"`
|
||||
Date *Date `protobuf:"bytes,7,opt,name=date,proto3" json:"date,omitempty"`
|
||||
}
|
||||
|
||||
func (x *PhoneRelayBody) Reset() {
|
||||
*x = PhoneRelayBody{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_pairing_proto_msgTypes[1]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *PhoneRelayBody) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*PhoneRelayBody) ProtoMessage() {}
|
||||
|
||||
func (x *PhoneRelayBody) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_pairing_proto_msgTypes[1]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use PhoneRelayBody.ProtoReflect.Descriptor instead.
|
||||
func (*PhoneRelayBody) Descriptor() ([]byte, []int) {
|
||||
return file_pairing_proto_rawDescGZIP(), []int{1}
|
||||
}
|
||||
|
||||
func (x *PhoneRelayBody) GetID() string {
|
||||
if x != nil {
|
||||
return x.ID
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *PhoneRelayBody) GetBugle() string {
|
||||
if x != nil {
|
||||
return x.Bugle
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *PhoneRelayBody) GetRpcKey() []byte {
|
||||
if x != nil {
|
||||
return x.RpcKey
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *PhoneRelayBody) GetDate() *Date {
|
||||
if x != nil {
|
||||
return x.Date
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type ECDSAKeys struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
ProtoVersion int64 `protobuf:"varint,1,opt,name=protoVersion,proto3" json:"protoVersion,omitempty"` // idk?
|
||||
EncryptedKeys []byte `protobuf:"bytes,2,opt,name=encryptedKeys,proto3" json:"encryptedKeys,omitempty"`
|
||||
}
|
||||
|
||||
func (x *ECDSAKeys) Reset() {
|
||||
*x = ECDSAKeys{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_pairing_proto_msgTypes[2]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *ECDSAKeys) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*ECDSAKeys) ProtoMessage() {}
|
||||
|
||||
func (x *ECDSAKeys) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_pairing_proto_msgTypes[2]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use ECDSAKeys.ProtoReflect.Descriptor instead.
|
||||
func (*ECDSAKeys) Descriptor() ([]byte, []int) {
|
||||
return file_pairing_proto_rawDescGZIP(), []int{2}
|
||||
}
|
||||
|
||||
func (x *ECDSAKeys) GetProtoVersion() int64 {
|
||||
if x != nil {
|
||||
return x.ProtoVersion
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *ECDSAKeys) GetEncryptedKeys() []byte {
|
||||
if x != nil {
|
||||
return x.EncryptedKeys
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type PairDeviceData struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Mobile *Device `protobuf:"bytes,1,opt,name=mobile,proto3" json:"mobile,omitempty"`
|
||||
EcdsaKeys *ECDSAKeys `protobuf:"bytes,6,opt,name=ecdsaKeys,proto3" json:"ecdsaKeys,omitempty"`
|
||||
WebAuthKeyData *WebAuthKey `protobuf:"bytes,2,opt,name=webAuthKeyData,proto3" json:"webAuthKeyData,omitempty"`
|
||||
Browser *Device `protobuf:"bytes,3,opt,name=browser,proto3" json:"browser,omitempty"`
|
||||
}
|
||||
|
||||
func (x *PairDeviceData) Reset() {
|
||||
*x = PairDeviceData{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_pairing_proto_msgTypes[3]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *PairDeviceData) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*PairDeviceData) ProtoMessage() {}
|
||||
|
||||
func (x *PairDeviceData) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_pairing_proto_msgTypes[3]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use PairDeviceData.ProtoReflect.Descriptor instead.
|
||||
func (*PairDeviceData) Descriptor() ([]byte, []int) {
|
||||
return file_pairing_proto_rawDescGZIP(), []int{3}
|
||||
}
|
||||
|
||||
func (x *PairDeviceData) GetMobile() *Device {
|
||||
if x != nil {
|
||||
return x.Mobile
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *PairDeviceData) GetEcdsaKeys() *ECDSAKeys {
|
||||
if x != nil {
|
||||
return x.EcdsaKeys
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *PairDeviceData) GetWebAuthKeyData() *WebAuthKey {
|
||||
if x != nil {
|
||||
return x.WebAuthKeyData
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *PairDeviceData) GetBrowser() *Device {
|
||||
if x != nil {
|
||||
return x.Browser
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type UnpairDeviceData struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Browser *Device `protobuf:"bytes,1,opt,name=browser,proto3" json:"browser,omitempty"`
|
||||
}
|
||||
|
||||
func (x *UnpairDeviceData) Reset() {
|
||||
*x = UnpairDeviceData{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_pairing_proto_msgTypes[4]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *UnpairDeviceData) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*UnpairDeviceData) ProtoMessage() {}
|
||||
|
||||
func (x *UnpairDeviceData) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_pairing_proto_msgTypes[4]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use UnpairDeviceData.ProtoReflect.Descriptor instead.
|
||||
func (*UnpairDeviceData) Descriptor() ([]byte, []int) {
|
||||
return file_pairing_proto_rawDescGZIP(), []int{4}
|
||||
}
|
||||
|
||||
func (x *UnpairDeviceData) GetBrowser() *Device {
|
||||
if x != nil {
|
||||
return x.Browser
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type WebAuthKey struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
WebAuthKey []byte `protobuf:"bytes,1,opt,name=webAuthKey,proto3" json:"webAuthKey,omitempty"`
|
||||
ValidFor int64 `protobuf:"varint,2,opt,name=validFor,proto3" json:"validFor,omitempty"`
|
||||
}
|
||||
|
||||
func (x *WebAuthKey) Reset() {
|
||||
*x = WebAuthKey{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_pairing_proto_msgTypes[5]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *WebAuthKey) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*WebAuthKey) ProtoMessage() {}
|
||||
|
||||
func (x *WebAuthKey) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_pairing_proto_msgTypes[5]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use WebAuthKey.ProtoReflect.Descriptor instead.
|
||||
func (*WebAuthKey) Descriptor() ([]byte, []int) {
|
||||
return file_pairing_proto_rawDescGZIP(), []int{5}
|
||||
}
|
||||
|
||||
func (x *WebAuthKey) GetWebAuthKey() []byte {
|
||||
if x != nil {
|
||||
return x.WebAuthKey
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *WebAuthKey) GetValidFor() int64 {
|
||||
if x != nil {
|
||||
return x.ValidFor
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type Container struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
PhoneRelay *PhoneRelayBody `protobuf:"bytes,1,opt,name=PhoneRelay,proto3" json:"PhoneRelay,omitempty"`
|
||||
BrowserDetails *BrowserDetails `protobuf:"bytes,3,opt,name=browserDetails,proto3" json:"browserDetails,omitempty"`
|
||||
PairDeviceData *PairDeviceData `protobuf:"bytes,4,opt,name=pairDeviceData,proto3" json:"pairDeviceData,omitempty"`
|
||||
UnpairDeviceData *UnpairDeviceData `protobuf:"bytes,5,opt,name=unpairDeviceData,proto3" json:"unpairDeviceData,omitempty"`
|
||||
}
|
||||
|
||||
func (x *Container) Reset() {
|
||||
*x = Container{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_pairing_proto_msgTypes[6]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *Container) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*Container) ProtoMessage() {}
|
||||
|
||||
func (x *Container) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_pairing_proto_msgTypes[6]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use Container.ProtoReflect.Descriptor instead.
|
||||
func (*Container) Descriptor() ([]byte, []int) {
|
||||
return file_pairing_proto_rawDescGZIP(), []int{6}
|
||||
}
|
||||
|
||||
func (x *Container) GetPhoneRelay() *PhoneRelayBody {
|
||||
if x != nil {
|
||||
return x.PhoneRelay
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *Container) GetBrowserDetails() *BrowserDetails {
|
||||
if x != nil {
|
||||
return x.BrowserDetails
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *Container) GetPairDeviceData() *PairDeviceData {
|
||||
if x != nil {
|
||||
return x.PairDeviceData
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *Container) GetUnpairDeviceData() *UnpairDeviceData {
|
||||
if x != nil {
|
||||
return x.UnpairDeviceData
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type UrlData struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
PairingKey []byte `protobuf:"bytes,1,opt,name=pairingKey,proto3" json:"pairingKey,omitempty"`
|
||||
AESCTR256Key []byte `protobuf:"bytes,2,opt,name=AESCTR256Key,proto3" json:"AESCTR256Key,omitempty"`
|
||||
SHA256Key []byte `protobuf:"bytes,3,opt,name=SHA256Key,proto3" json:"SHA256Key,omitempty"`
|
||||
}
|
||||
|
||||
func (x *UrlData) Reset() {
|
||||
*x = UrlData{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_pairing_proto_msgTypes[7]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *UrlData) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*UrlData) ProtoMessage() {}
|
||||
|
||||
func (x *UrlData) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_pairing_proto_msgTypes[7]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use UrlData.ProtoReflect.Descriptor instead.
|
||||
func (*UrlData) Descriptor() ([]byte, []int) {
|
||||
return file_pairing_proto_rawDescGZIP(), []int{7}
|
||||
}
|
||||
|
||||
func (x *UrlData) GetPairingKey() []byte {
|
||||
if x != nil {
|
||||
return x.PairingKey
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *UrlData) GetAESCTR256Key() []byte {
|
||||
if x != nil {
|
||||
return x.AESCTR256Key
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *UrlData) GetSHA256Key() []byte {
|
||||
if x != nil {
|
||||
return x.SHA256Key
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var File_pairing_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_pairing_proto_rawDesc = []byte{
|
||||
0x0a, 0x0d, 0x70, 0x61, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
|
||||
0x07, 0x70, 0x61, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x1a, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
|
||||
0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x74, 0x0a, 0x0e, 0x42, 0x72, 0x6f, 0x77,
|
||||
0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73,
|
||||
0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x75,
|
||||
0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6f, 0x6d, 0x65,
|
||||
0x49, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x6f, 0x6d, 0x65, 0x49,
|
||||
0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02,
|
||||
0x6f, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6f, 0x6d, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x18, 0x06,
|
||||
0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x73, 0x6f, 0x6d, 0x65, 0x42, 0x6f, 0x6f, 0x6c, 0x22, 0x72,
|
||||
0x0a, 0x0e, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x6f, 0x64, 0x79,
|
||||
0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44,
|
||||
0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x67, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x05, 0x62, 0x75, 0x67, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x70, 0x63, 0x4b, 0x65, 0x79,
|
||||
0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x22,
|
||||
0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6d,
|
||||
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x65, 0x52, 0x04, 0x64, 0x61,
|
||||
0x74, 0x65, 0x22, 0x55, 0x0a, 0x09, 0x45, 0x43, 0x44, 0x53, 0x41, 0x4b, 0x65, 0x79, 0x73, 0x12,
|
||||
0x22, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18,
|
||||
0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x56, 0x65, 0x72, 0x73,
|
||||
0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x65, 0x64,
|
||||
0x4b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x65, 0x6e, 0x63, 0x72,
|
||||
0x79, 0x70, 0x74, 0x65, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x22, 0xd5, 0x01, 0x0a, 0x0e, 0x50, 0x61,
|
||||
0x69, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x06,
|
||||
0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6d,
|
||||
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x06,
|
||||
0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x65, 0x63, 0x64, 0x73, 0x61, 0x4b,
|
||||
0x65, 0x79, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x61, 0x69, 0x72,
|
||||
0x69, 0x6e, 0x67, 0x2e, 0x45, 0x43, 0x44, 0x53, 0x41, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x09, 0x65,
|
||||
0x63, 0x64, 0x73, 0x61, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x3b, 0x0a, 0x0e, 0x77, 0x65, 0x62, 0x41,
|
||||
0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
|
||||
0x32, 0x13, 0x2e, 0x70, 0x61, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x57, 0x65, 0x62, 0x41, 0x75,
|
||||
0x74, 0x68, 0x4b, 0x65, 0x79, 0x52, 0x0e, 0x77, 0x65, 0x62, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65,
|
||||
0x79, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72,
|
||||
0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
|
||||
0x73, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65,
|
||||
0x72, 0x22, 0x3e, 0x0a, 0x10, 0x55, 0x6e, 0x70, 0x61, 0x69, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63,
|
||||
0x65, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72,
|
||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
|
||||
0x73, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65,
|
||||
0x72, 0x22, 0x48, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x12,
|
||||
0x1e, 0x0a, 0x0a, 0x77, 0x65, 0x62, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20,
|
||||
0x01, 0x28, 0x0c, 0x52, 0x0a, 0x77, 0x65, 0x62, 0x41, 0x75, 0x74, 0x68, 0x4b, 0x65, 0x79, 0x12,
|
||||
0x1a, 0x0a, 0x08, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x46, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,
|
||||
0x03, 0x52, 0x08, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x46, 0x6f, 0x72, 0x22, 0x8d, 0x02, 0x0a, 0x09,
|
||||
0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0a, 0x50, 0x68, 0x6f,
|
||||
0x6e, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
|
||||
0x70, 0x61, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x6c,
|
||||
0x61, 0x79, 0x42, 0x6f, 0x64, 0x79, 0x52, 0x0a, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x6c,
|
||||
0x61, 0x79, 0x12, 0x3f, 0x0a, 0x0e, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74,
|
||||
0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x61, 0x69,
|
||||
0x72, 0x69, 0x6e, 0x67, 0x2e, 0x42, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61,
|
||||
0x69, 0x6c, 0x73, 0x52, 0x0e, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x44, 0x65, 0x74, 0x61,
|
||||
0x69, 0x6c, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x70, 0x61, 0x69, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63,
|
||||
0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x61,
|
||||
0x69, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
|
||||
0x44, 0x61, 0x74, 0x61, 0x52, 0x0e, 0x70, 0x61, 0x69, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
|
||||
0x44, 0x61, 0x74, 0x61, 0x12, 0x45, 0x0a, 0x10, 0x75, 0x6e, 0x70, 0x61, 0x69, 0x72, 0x44, 0x65,
|
||||
0x76, 0x69, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
|
||||
0x2e, 0x70, 0x61, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x6e, 0x70, 0x61, 0x69, 0x72, 0x44,
|
||||
0x65, 0x76, 0x69, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x10, 0x75, 0x6e, 0x70, 0x61, 0x69,
|
||||
0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x44, 0x61, 0x74, 0x61, 0x22, 0x6b, 0x0a, 0x07, 0x55,
|
||||
0x72, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x69, 0x72, 0x69, 0x6e,
|
||||
0x67, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x70, 0x61, 0x69, 0x72,
|
||||
0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x45, 0x53, 0x43, 0x54, 0x52,
|
||||
0x32, 0x35, 0x36, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x41, 0x45,
|
||||
0x53, 0x43, 0x54, 0x52, 0x32, 0x35, 0x36, 0x4b, 0x65, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x48,
|
||||
0x41, 0x32, 0x35, 0x36, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x53,
|
||||
0x48, 0x41, 0x32, 0x35, 0x36, 0x4b, 0x65, 0x79, 0x42, 0x0e, 0x5a, 0x0c, 0x2e, 0x2e, 0x2f, 0x2e,
|
||||
0x2e, 0x2f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_pairing_proto_rawDescOnce sync.Once
|
||||
file_pairing_proto_rawDescData = file_pairing_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_pairing_proto_rawDescGZIP() []byte {
|
||||
file_pairing_proto_rawDescOnce.Do(func() {
|
||||
file_pairing_proto_rawDescData = protoimpl.X.CompressGZIP(file_pairing_proto_rawDescData)
|
||||
})
|
||||
return file_pairing_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_pairing_proto_msgTypes = make([]protoimpl.MessageInfo, 8)
|
||||
var file_pairing_proto_goTypes = []interface{}{
|
||||
(*BrowserDetails)(nil), // 0: pairing.BrowserDetails
|
||||
(*PhoneRelayBody)(nil), // 1: pairing.PhoneRelayBody
|
||||
(*ECDSAKeys)(nil), // 2: pairing.ECDSAKeys
|
||||
(*PairDeviceData)(nil), // 3: pairing.PairDeviceData
|
||||
(*UnpairDeviceData)(nil), // 4: pairing.UnpairDeviceData
|
||||
(*WebAuthKey)(nil), // 5: pairing.WebAuthKey
|
||||
(*Container)(nil), // 6: pairing.Container
|
||||
(*UrlData)(nil), // 7: pairing.UrlData
|
||||
(*Date)(nil), // 8: messages.Date
|
||||
(*Device)(nil), // 9: messages.Device
|
||||
}
|
||||
var file_pairing_proto_depIdxs = []int32{
|
||||
8, // 0: pairing.PhoneRelayBody.date:type_name -> messages.Date
|
||||
9, // 1: pairing.PairDeviceData.mobile:type_name -> messages.Device
|
||||
2, // 2: pairing.PairDeviceData.ecdsaKeys:type_name -> pairing.ECDSAKeys
|
||||
5, // 3: pairing.PairDeviceData.webAuthKeyData:type_name -> pairing.WebAuthKey
|
||||
9, // 4: pairing.PairDeviceData.browser:type_name -> messages.Device
|
||||
9, // 5: pairing.UnpairDeviceData.browser:type_name -> messages.Device
|
||||
1, // 6: pairing.Container.PhoneRelay:type_name -> pairing.PhoneRelayBody
|
||||
0, // 7: pairing.Container.browserDetails:type_name -> pairing.BrowserDetails
|
||||
3, // 8: pairing.Container.pairDeviceData:type_name -> pairing.PairDeviceData
|
||||
4, // 9: pairing.Container.unpairDeviceData:type_name -> pairing.UnpairDeviceData
|
||||
10, // [10:10] is the sub-list for method output_type
|
||||
10, // [10:10] is the sub-list for method input_type
|
||||
10, // [10:10] is the sub-list for extension type_name
|
||||
10, // [10:10] is the sub-list for extension extendee
|
||||
0, // [0:10] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_pairing_proto_init() }
|
||||
func file_pairing_proto_init() {
|
||||
if File_pairing_proto != nil {
|
||||
return
|
||||
}
|
||||
file_messages_proto_init()
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_pairing_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*BrowserDetails); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_pairing_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*PhoneRelayBody); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_pairing_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*ECDSAKeys); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_pairing_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*PairDeviceData); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_pairing_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*UnpairDeviceData); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_pairing_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*WebAuthKey); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_pairing_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*Container); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_pairing_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*UrlData); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_pairing_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 8,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_pairing_proto_goTypes,
|
||||
DependencyIndexes: file_pairing_proto_depIdxs,
|
||||
MessageInfos: file_pairing_proto_msgTypes,
|
||||
}.Build()
|
||||
File_pairing_proto = out.File
|
||||
file_pairing_proto_rawDesc = nil
|
||||
file_pairing_proto_goTypes = nil
|
||||
file_pairing_proto_depIdxs = nil
|
||||
}
|
73
libgm/binary/raw/authentication.proto
Normal file
73
libgm/binary/raw/authentication.proto
Normal file
|
@ -0,0 +1,73 @@
|
|||
syntax = "proto3";
|
||||
package authentication;
|
||||
|
||||
option go_package = "../../binary";
|
||||
|
||||
import "messages.proto";
|
||||
import "client.proto";
|
||||
|
||||
message BrowserDetails {
|
||||
string userAgent = 1;
|
||||
client.BrowserTypes browserType = 2;
|
||||
string os = 3;
|
||||
bool someBool = 6;
|
||||
}
|
||||
|
||||
message AuthenticationContainer {
|
||||
AuthenticationMessage authMessage = 1;
|
||||
BrowserDetails browserDetails = 3;
|
||||
|
||||
oneof data {
|
||||
KeyData keyData = 4;
|
||||
CurrentDeviceData deviceData = 5;
|
||||
}
|
||||
}
|
||||
|
||||
message AuthenticationMessage {
|
||||
string requestID = 1;
|
||||
string network = 3;
|
||||
bytes tachyonAuthToken = 6;
|
||||
messages.ConfigVersion configVersion = 7;
|
||||
}
|
||||
|
||||
message ECDSAKeys {
|
||||
int64 field1 = 1; // idk?
|
||||
bytes encryptedKeys = 2;
|
||||
}
|
||||
|
||||
message KeyData {
|
||||
messages.Device mobile = 1;
|
||||
ECDSAKeys ecdsaKeys = 6;
|
||||
WebAuthKey webAuthKeyData = 2;
|
||||
messages.Device browser = 3;
|
||||
}
|
||||
|
||||
message WebAuthKey {
|
||||
bytes webAuthKey = 1;
|
||||
int64 validFor = 2;
|
||||
}
|
||||
|
||||
message CurrentDeviceData {
|
||||
messages.Device browser = 1;
|
||||
}
|
||||
|
||||
message UrlData {
|
||||
bytes pairingKey = 1;
|
||||
bytes AESKey = 2;
|
||||
bytes HMACKey = 3;
|
||||
}
|
||||
|
||||
message TokenData {
|
||||
bytes tachyonAuthToken = 1;
|
||||
int64 TTL = 2;
|
||||
}
|
||||
|
||||
message PairedData {
|
||||
messages.Device mobile = 1;
|
||||
TokenData tokenData = 2;
|
||||
messages.Device browser = 3;
|
||||
}
|
||||
|
||||
message RevokePairData {
|
||||
messages.Device revokedDevice = 1;
|
||||
}
|
|
@ -5,12 +5,21 @@ option go_package = "../../binary";
|
|||
|
||||
import "messages.proto";
|
||||
|
||||
message SendMessage {
|
||||
messages.Device pairedDevice = 1;
|
||||
messages.MessageData messageData = 2;
|
||||
messages.AuthMessage authData = 3;
|
||||
int64 TTL = 5;
|
||||
messages.EmptyArr emptyArr = 9;
|
||||
message NotifyDittoActivityPayload {
|
||||
bool success = 2;
|
||||
}
|
||||
|
||||
message AckMessageResponse {
|
||||
AckContainer container = 1;
|
||||
}
|
||||
message AckContainer {
|
||||
AckData data = 1;
|
||||
}
|
||||
message AckData {
|
||||
AckAmount ackAmount = 4;
|
||||
}
|
||||
message AckAmount {
|
||||
int32 count = 1;
|
||||
}
|
||||
|
||||
message AckMessagePayload {
|
||||
|
@ -41,3 +50,32 @@ message BugleBackendService {
|
|||
message BugleCode {
|
||||
int64 type = 2;
|
||||
}
|
||||
|
||||
enum BugleMessageType {
|
||||
UNKNOWN_BUGLE_MESSAGE_TYPE = 0;
|
||||
SMS = 1;
|
||||
MMS = 2;
|
||||
RCS = 3;
|
||||
CLOUD_SYNC = 4;
|
||||
IMDN_DELIVERED = 5;
|
||||
IMDN_DISPLAYED = 6;
|
||||
IMDN_FALLBACK = 7;
|
||||
RCS_GENERIC = 8;
|
||||
FTD = 9;
|
||||
FT_E2EE_LEGACY = 10;
|
||||
FT_E2EE_XML = 11;
|
||||
LIGHTER_MESSAGE = 12;
|
||||
RBM_SPAM_REPORT = 13;
|
||||
SATELLITE = 14;
|
||||
}
|
||||
|
||||
enum BrowserTypes {
|
||||
UNKNOWN_BROWSER_TYPE = 0;
|
||||
OTHER = 1;
|
||||
CHROME = 2;
|
||||
FIREFOX = 3;
|
||||
SAFARI = 4;
|
||||
OPERA = 5;
|
||||
IE = 6;
|
||||
EDGE = 7;
|
||||
}
|
||||
|
|
|
@ -3,17 +3,56 @@ package conversations;
|
|||
|
||||
option go_package = "../../binary";
|
||||
|
||||
import "reactions.proto";
|
||||
|
||||
message ResendMessagePayload {
|
||||
string messageID = 2;
|
||||
}
|
||||
|
||||
message ConversationTypePayload {
|
||||
string conversationID = 2;
|
||||
}
|
||||
|
||||
message UpdateConversationPayload {
|
||||
UpdateConversationData data = 1;
|
||||
ConversationActionStatus action = 2;
|
||||
string conversationID = 3;
|
||||
ConversationAction5 action5 = 5;
|
||||
}
|
||||
|
||||
message ConversationAction5 {
|
||||
bool field2 = 2;
|
||||
}
|
||||
|
||||
message UpdateConversationData {
|
||||
string conversationID = 1;
|
||||
oneof data {
|
||||
ConversationStatus status = 12;
|
||||
ConversationMuteStatus mute = 7;
|
||||
}
|
||||
}
|
||||
|
||||
message DeleteMessagePayload {
|
||||
string messageID = 2;
|
||||
}
|
||||
|
||||
message SendMessagePayload {
|
||||
string conversationID = 2;
|
||||
MessagePayload messagePayload = 3;
|
||||
string tmpID = 5;
|
||||
bool isReply = 6; // not sure
|
||||
ReplyPayload reply = 8;
|
||||
}
|
||||
|
||||
message ReplyPayload {
|
||||
string messageID = 1;
|
||||
}
|
||||
|
||||
message MessagePayload {
|
||||
string tmpID = 1;
|
||||
MessagePayloadContent messagePayloadContent = 6;
|
||||
string conversationID = 7;
|
||||
string selfParticipantID = 9; // might be participantId
|
||||
string selfParticipantID = 9; // might be participantID
|
||||
repeated MessageInfo messageInfo = 10;
|
||||
string tmpID2 = 12;
|
||||
}
|
||||
|
@ -42,65 +81,57 @@ message ListCoversationsPayload {
|
|||
int64 field4 = 4; // no idea what this is , but only value ive seen is 1
|
||||
}
|
||||
|
||||
message FetchMessagesResponse {
|
||||
repeated Message messages = 2;
|
||||
bytes someBytes = 3;
|
||||
int64 totalMessages = 4;
|
||||
Cursor cursor = 5;
|
||||
}
|
||||
|
||||
message Cursor {
|
||||
string someStr = 1;
|
||||
int64 nextCursor = 2;
|
||||
}
|
||||
|
||||
enum MessageType {
|
||||
UNKNOWN = 0;
|
||||
TEXT = 1;
|
||||
IMAGE = 2;
|
||||
VIDEO = 3;
|
||||
AUDIO = 4;
|
||||
ATTACHMENT = 5;
|
||||
LOCATION = 6;
|
||||
RICH_CARD = 7;
|
||||
VCARD = 8;
|
||||
MMS_NEEDS_DOWNLOAD = 9;
|
||||
REPLY = 10;
|
||||
}
|
||||
|
||||
message Message {
|
||||
string messageID = 1;
|
||||
IsFromMe from = 3;
|
||||
MsgType msgType = 3;
|
||||
MessageStatus messageStatus = 4;
|
||||
int64 timestamp = 5;
|
||||
int64 timestamp = 5; // check this
|
||||
string conversationID = 7;
|
||||
string participantID = 9;
|
||||
repeated MessageInfo messageInfo = 10;
|
||||
MessageType type = 11;
|
||||
string tmpId = 12;
|
||||
int64 type = 11;
|
||||
string tmpID = 12;
|
||||
int64 someInt = 16;
|
||||
repeated reactions.ReactionResponse reactions = 19;
|
||||
|
||||
}
|
||||
|
||||
message ReplyMessage {
|
||||
string messageID = 1;
|
||||
string conversationID = 2; // might be participantID
|
||||
ReplyMessageData replyMessageData = 3;
|
||||
}
|
||||
|
||||
message ReplyMessageData {
|
||||
|
||||
}
|
||||
|
||||
message MessageInfo {
|
||||
string orderInternal = 1;
|
||||
string actionMessageID = 1;
|
||||
oneof data {
|
||||
MessageContent messageContent = 2;
|
||||
ImageContent imageContent = 3;
|
||||
MediaContent mediaContent = 3;
|
||||
}
|
||||
}
|
||||
|
||||
message ImageContent {
|
||||
int64 someNumber = 1;
|
||||
string imageID = 2;
|
||||
string imageName = 4;
|
||||
message MediaContent {
|
||||
MediaFormats format = 1;
|
||||
string mediaID = 2;
|
||||
string mediaName = 4;
|
||||
int64 size = 5;
|
||||
ImagePixels pixels = 6;
|
||||
bytes imageData = 7;
|
||||
string imageID2 = 9;
|
||||
Pixels pixels = 6;
|
||||
bytes mediaData = 7;
|
||||
string mediaID2 = 9;
|
||||
bytes decryptionKey = 11;
|
||||
bytes decryptionKey2 = 12; // same value as decryptionkey?
|
||||
}
|
||||
|
||||
message ImagePixels {
|
||||
message Pixels {
|
||||
int64 width = 1;
|
||||
int64 height = 2;
|
||||
}
|
||||
|
@ -109,30 +140,16 @@ message MessageContent {
|
|||
string content = 1;
|
||||
}
|
||||
|
||||
message IsFromMe {
|
||||
bool fromMe = 1;
|
||||
}
|
||||
|
||||
enum MsgStatusCode {
|
||||
UNKNOWN_STATUS = 0;
|
||||
SENT = 1;
|
||||
SENDING = 5;
|
||||
READ = 11;
|
||||
message MsgType {
|
||||
int64 type = 1;
|
||||
}
|
||||
|
||||
message MessageStatus {
|
||||
/*
|
||||
// MMS / SMS
|
||||
UNKNOWN_STATUS = 0;
|
||||
SENDING = 5;
|
||||
SENT = 1;
|
||||
|
||||
// RCS
|
||||
READ|SEEN = 11;
|
||||
*/
|
||||
MsgStatusCode code = 2;
|
||||
MessageStatusType status = 2;
|
||||
int64 subCode = 3;
|
||||
string errMsg = 4;
|
||||
string msgStatus = 5;
|
||||
string statusText = 5;
|
||||
int64 thirdCode = 6;
|
||||
}
|
||||
|
||||
message Conversations {
|
||||
|
@ -143,57 +160,201 @@ message Conversation {
|
|||
string conversationID = 1;
|
||||
string name = 2;
|
||||
LatestMessage latestMessage = 4;
|
||||
int64 timestampMS = 5;
|
||||
int64 timestampMs = 5;
|
||||
|
||||
bool isGroupChat = 10; // not certain
|
||||
string selfParticipantID = 11;
|
||||
/*
|
||||
1 = unarchived
|
||||
2 = archived
|
||||
3 = deleted
|
||||
*/
|
||||
|
||||
//bool bool1 = 13;
|
||||
int64 status = 12;
|
||||
string hashHex = 15;
|
||||
string messageID = 17;
|
||||
ConvUpdateTypes status = 12;
|
||||
string avatarHexColor = 15;
|
||||
string latestMessageID = 17;
|
||||
repeated Participant participants = 20;
|
||||
repeated string otherParticipants = 21; // participant ids excluding me
|
||||
int64 type = 22;
|
||||
bool subType = 24;
|
||||
bool thirdType = 29;
|
||||
}
|
||||
|
||||
message Participant {
|
||||
UserIdentifier id = 1;
|
||||
SmallInfo ID = 1;
|
||||
string firstName = 2;
|
||||
string fullName = 3;
|
||||
string color = 5;
|
||||
string avatarHexColor = 5;
|
||||
bool isMe = 6;
|
||||
Muted muted = 7;
|
||||
//bool bool2 = 8;
|
||||
int64 someInt = 8;
|
||||
string avatarID = 10;
|
||||
// bool bool3 = 11;
|
||||
int64 bs = 14;
|
||||
string formattedNumber = 15;
|
||||
int64 someInt1 = 19;
|
||||
int64 someInt2 = 20;
|
||||
}
|
||||
|
||||
message UserIdentifier {
|
||||
message SmallInfo {
|
||||
int64 type = 1;
|
||||
string number = 2;
|
||||
string participantID = 3;
|
||||
}
|
||||
|
||||
message LatestMessage {
|
||||
string content = 1;
|
||||
bool fromMe = 2; // isMe?
|
||||
string displayContent = 1;
|
||||
int64 fromMe = 2; // isMe?
|
||||
|
||||
string displayName = 4;
|
||||
//Unknown unknown = 5;
|
||||
LatestMessageStatus latestMessageStatus = 5;
|
||||
}
|
||||
|
||||
message Unknown {
|
||||
int64 field1 = 1;
|
||||
int64 field2 = 2;
|
||||
message LatestMessageStatus {
|
||||
int64 status2 = 1;
|
||||
MessageStatusType status = 2;
|
||||
}
|
||||
|
||||
message Muted {
|
||||
bool isMuted = 1;
|
||||
}
|
||||
|
||||
enum MessageStatusType {
|
||||
STATUS_UNKNOWN = 0;
|
||||
OUTGOING_COMPLETE = 1;
|
||||
OUTGOING_DELIVERED = 2;
|
||||
OUTGOING_DISPLAYED = 11;
|
||||
OUTGOING_DRAFT = 3;
|
||||
OUTGOING_SEND_AFTER_PROCESSING = 10;
|
||||
OUTGOING_YET_TO_SEND = 4;
|
||||
OUTGOING_SENDING = 5;
|
||||
OUTGOING_RESENDING = 6;
|
||||
OUTGOING_AWAITING_RETRY = 7;
|
||||
OUTGOING_FAILED_GENERIC = 8;
|
||||
OUTGOING_FAILED_EMERGENCY_NUMBER = 9;
|
||||
OUTGOING_CANCELED = 12;
|
||||
OUTGOING_FAILED_TOO_LARGE = 13;
|
||||
OUTGOING_NOT_DELIVERED_YET = 14;
|
||||
OUTGOING_REVOCATION_PENDING = 15;
|
||||
OUTGOING_SCHEDULED = 16;
|
||||
OUTGOING_FAILED_RECIPIENT_LOST_RCS = 17;
|
||||
OUTGOING_FAILED_NO_RETRY_NO_FALLBACK = 18;
|
||||
OUTGOING_FAILED_RECIPIENT_DID_NOT_DECRYPT = 19;
|
||||
OUTGOING_VALIDATING = 20;
|
||||
OUTGOING_FAILED_RECIPIENT_LOST_ENCRYPTION = 21;
|
||||
OUTGOING_FAILED_RECIPIENT_DID_NOT_DECRYPT_NO_MORE_RETRY = 22;
|
||||
INCOMING_COMPLETE = 100;
|
||||
INCOMING_YET_TO_MANUAL_DOWNLOAD = 101;
|
||||
INCOMING_RETRYING_MANUAL_DOWNLOAD = 102;
|
||||
INCOMING_MANUAL_DOWNLOADING = 103;
|
||||
INCOMING_RETRYING_AUTO_DOWNLOAD = 104;
|
||||
INCOMING_AUTO_DOWNLOADING = 105;
|
||||
INCOMING_DOWNLOAD_FAILED = 106;
|
||||
INCOMING_EXPIRED_OR_NOT_AVAILABLE = 107;
|
||||
INCOMING_DELIVERED = 108;
|
||||
INCOMING_DISPLAYED = 109;
|
||||
INCOMING_DOWNLOAD_CANCELED = 110;
|
||||
INCOMING_DOWNLOAD_FAILED_TOO_LARGE = 111;
|
||||
INCOMING_DOWNLOAD_FAILED_SIM_HAS_NO_DATA = 112;
|
||||
INCOMING_FAILED_TO_DECRYPT = 113;
|
||||
INCOMING_DECRYPTION_ABORTED = 114;
|
||||
/*
|
||||
TOMBSTONE_PARTICIPANT_JOINED = BasePaymentResult.ERROR_REQUEST_FAILED;
|
||||
TOMBSTONE_PARTICIPANT_LEFT = BasePaymentResult.ERROR_REQUEST_TIMEOUT;
|
||||
TOMBSTONE_SELF_LEFT = BasePaymentResult.ERROR_REQUEST_CONNECTION_FAILED;
|
||||
TOMBSTONE_RCS_GROUP_CREATED = BasePaymentResult.ERROR_BOT_DOMAIN_NOT_WHITELISTED;
|
||||
*/
|
||||
TOMBSTONE_MMS_GROUP_CREATED = 204;
|
||||
TOMBSTONE_SMS_BROADCAST_CREATED = 205;
|
||||
TOMBSTONE_ONE_ON_ONE_SMS_CREATED = 206;
|
||||
TOMBSTONE_ONE_ON_ONE_RCS_CREATED = 207;
|
||||
TOMBSTONE_SWITCH_TO_GROUP_MMS = 208;
|
||||
TOMBSTONE_SWITCH_TO_BROADCAST_SMS = 209;
|
||||
TOMBSTONE_SHOW_LINK_PREVIEWS = 210;
|
||||
TOMBSTONE_GROUP_RENAMED_LOCAL = 211;
|
||||
TOMBSTONE_VERIFIED_SMS_APPLICABLE = 212;
|
||||
TOMBSTONE_ENCRYPTED_ONE_ON_ONE_RCS_CREATED = 213;
|
||||
TOMBSTONE_PROTOCOL_SWITCH_TO_TEXT = 214;
|
||||
TOMBSTONE_PROTOCOL_SWITCH_TO_RCS = 215;
|
||||
TOMBSTONE_PROTOCOL_SWITCH_TO_ENCRYPTED_RCS = 216;
|
||||
TOMBSTONE_GROUP_RENAMED_GLOBAL = 217;
|
||||
TOMBSTONE_GROUP_NAME_CLEARED_GLOBAL = 218;
|
||||
TOMBSTONE_PROTOCOL_SWITCH_TO_ENCRYPTED_RCS_INFO = 219;
|
||||
TOMBSTONE_SELF_REMOVED_FROM_GROUP = 220;
|
||||
MESSAGE_STATUS_TOMBSTONE_PARTICIPANT_REMOVED_FROM_GROUP = 221;
|
||||
MESSAGE_STATUS_TOMBSTONE_SMS_NORM_PARTICIPANT_UPGRADED = 222;
|
||||
MESSAGE_STATUS_TOMBSTONE_RCS_NORM_PARTICIPANT_UPGRADED = 223;
|
||||
MESSAGE_STATUS_TOMBSTONE_ENCRYPTED_RCS_NORM_PARTICIPANT_UPGRADED = 224;
|
||||
MESSAGE_STATUS_TOMBSTONE_ENCRYPTED_GROUP_PARTICIPANT_JOINED = 225;
|
||||
MESSAGE_STATUS_TOMBSTONE_ENCRYPTED_GROUP_PARTICIPANT_JOINED_INFO = 226;
|
||||
MESSAGE_STATUS_TOMBSTONE_ENCRYPTED_GROUP_PARTICIPANT_LEFT = 227;
|
||||
MESSAGE_STATUS_TOMBSTONE_ENCRYPTED_GROUP_SELF_LEFT = 228;
|
||||
MESSAGE_STATUS_TOMBSTONE_ENCRYPTED_GROUP_CREATED = 229;
|
||||
MESSAGE_STATUS_TOMBSTONE_SELF_REMOVED_FROM_ENCRYPTED_GROUP = 230;
|
||||
MESSAGE_STATUS_TOMBSTONE_PARTICIPANT_REMOVED_FROM_ENCRYPTED_GROUP = 231;
|
||||
MESSAGE_STATUS_TOMBSTONE_SUGGESTION_SHORTCUT_STAR_TOOLSTONE = 232;
|
||||
MESSAGE_STATUS_TOMBSTONE_GROUP_PROTOCOL_SWITCH_RCS_TO_E2EE = 233;
|
||||
MESSAGE_STATUS_TOMBSTONE_GROUP_PROTOCOL_SWITCH_E2EE_TO_RCS = 234;
|
||||
MESSAGE_STATUS_TOMBSTONE_PROTOCOL_SWITCH_TEXT_TO_E2EE = 235;
|
||||
MESSAGE_STATUS_TOMBSTONE_PROTOCOL_SWITCH_E2EE_TO_TEXT = 236;
|
||||
MESSAGE_STATUS_TOMBSTONE_PROTOCOL_SWITCH_RCS_TO_E2EE = 237;
|
||||
MESSAGE_STATUS_TOMBSTONE_PROTOCOL_SWITCH_E2EE_TO_RCS = 238;
|
||||
MESSAGE_STATUS_TOMBSTONE_SATELLITE_EDUCATION = 239;
|
||||
MESSAGE_DELETED = 300;
|
||||
}
|
||||
|
||||
enum ConversationStatus {
|
||||
UNKNOWN_STATUS = 0;
|
||||
UNARCHIVE = 1;
|
||||
ARCHIVE = 2;
|
||||
DELETE = 3;
|
||||
}
|
||||
|
||||
enum ConversationActionStatus {
|
||||
UNKNOWN_ACTION_STATUS = 0;
|
||||
UNBLOCK = 2;
|
||||
BLOCK = 7;
|
||||
BLOCK_AND_REPORT = 8;
|
||||
}
|
||||
|
||||
enum ConversationMuteStatus {
|
||||
UNMUTE = 0;
|
||||
MUTE = 1;
|
||||
}
|
||||
|
||||
enum ConvUpdateTypes {
|
||||
UNKNOWN_CONVTYPE = 0;
|
||||
UNARCHIVED = 1;
|
||||
ARCHIVED = 2;
|
||||
DELETED = 3;
|
||||
BLOCKED_AND_REPORTED = 5;
|
||||
BLOCKED = 6;
|
||||
}
|
||||
|
||||
enum MediaFormats {
|
||||
UNSPECIFIED_TYPE = 0;
|
||||
IMAGE_JPEG = 1;
|
||||
IMAGE_JPG = 2;
|
||||
IMAGE_PNG = 3;
|
||||
IMAGE_GIF = 4;
|
||||
IMAGE_WBMP = 5;
|
||||
IMAGE_X_MS_BMP = 6;
|
||||
IMAGE_UNSPECIFIED = 7;
|
||||
VIDEO_MP4 = 8;
|
||||
VIDEO_3G2 = 9;
|
||||
VIDEO_3GPP = 10;
|
||||
VIDEO_WEBM = 11;
|
||||
VIDEO_MKV = 12;
|
||||
VIDEO_UNSPECIFIED = 13;
|
||||
AUDIO_AAC = 14;
|
||||
AUDIO_AMR = 15;
|
||||
AUDIO_MP3 = 16;
|
||||
AUDIO_MPEG = 17;
|
||||
AUDIO_MPG = 18;
|
||||
AUDIO_MP4 = 19;
|
||||
AUDIO_MP4_LATM = 20;
|
||||
AUDIO_3GPP = 21;
|
||||
AUDIO_OGG = 22;
|
||||
AUDIO_UNSPECIFIED = 23;
|
||||
TEXT_VCARD = 24;
|
||||
APP_PDF = 28;
|
||||
APP_TXT = 29;
|
||||
APP_HTML = 30;
|
||||
AUDIO_OGG2 = 31;
|
||||
APP_SMIL = 32;
|
||||
}
|
||||
|
|
|
@ -4,26 +4,32 @@ package events;
|
|||
option go_package = "../../binary";
|
||||
|
||||
import "conversations.proto";
|
||||
import "authentication.proto";
|
||||
import "settings.proto";
|
||||
|
||||
|
||||
/*
|
||||
Cases
|
||||
2 = CONVERSATION
|
||||
3 = MESSAGE
|
||||
5 = PHONE SETTINGS
|
||||
|
||||
6 = Cases
|
||||
2 = updated session
|
||||
8 = INACTIVE_LACK_OF_ACTIVITY
|
||||
7 = BROWSER_INACTIVE_FROM_TIMEOUT
|
||||
6|5 = user_alert:battery
|
||||
3|4 = user_alert:data_connection
|
||||
10 = OBSERVER_REGISTERED
|
||||
ConversationEvent = 2
|
||||
MessageEvent = 3
|
||||
TypingEvent = 4
|
||||
SettingsEvent = 5
|
||||
UserAlertEvent = 6
|
||||
BrowserPresenceCheckEvent = 7
|
||||
ParticipantsEvent = 8
|
||||
ConversationTypeEvent = 9
|
||||
FavoriteStickersEvent = 10
|
||||
RecentStickerEvent = 11
|
||||
CloudStoreInfoEvent = 12
|
||||
BlobForAttachmentProgressUpdate = 13
|
||||
*/
|
||||
|
||||
message Event {
|
||||
message UpdateEvents {
|
||||
oneof event {
|
||||
ConversationEvent conversationEvent = 2;
|
||||
MessageEvent messageEvent = 3;
|
||||
TypingEvent typingEvent = 4;
|
||||
settings.Settings settingsEvent = 5;
|
||||
UserAlertEvent userAlertEvent = 6;
|
||||
}
|
||||
}
|
||||
|
@ -32,25 +38,78 @@ message ConversationEvent {
|
|||
conversations.Conversation data = 2;
|
||||
}
|
||||
|
||||
message TypingEvent {
|
||||
TypingData data = 2;
|
||||
}
|
||||
|
||||
message MessageEvent {
|
||||
conversations.Message data = 2;
|
||||
}
|
||||
|
||||
message UserAlertEvent {
|
||||
/*
|
||||
2 = BROWSER_ACTIVE (new session created in other browser)
|
||||
|
||||
1 = ?
|
||||
|
||||
8 = INACTIVE_LACK_OF_ACTIVITY
|
||||
|
||||
7 = INACTIVE_TIMEOUT
|
||||
|
||||
5|6 = BATTERY (tf?)
|
||||
|
||||
3|4 = DATA_CONNECTION (tf?)
|
||||
|
||||
10 = OBSERVER_REGISTERED (tf?)
|
||||
*/
|
||||
int64 alertType = 2;
|
||||
AlertType alertType = 2;
|
||||
}
|
||||
|
||||
message TypingData {
|
||||
string conversationID = 1;
|
||||
User user = 2;
|
||||
TypingTypes type = 3;
|
||||
}
|
||||
|
||||
message User {
|
||||
int64 field1 = 1;
|
||||
string number = 2;
|
||||
}
|
||||
|
||||
message PairEvents {
|
||||
oneof event {
|
||||
authentication.PairedData paired = 4;
|
||||
authentication.RevokePairData revoked = 5;
|
||||
}
|
||||
}
|
||||
|
||||
enum AlertType {
|
||||
ALERT_TYPE_UNKNOWN = 0;
|
||||
BROWSER_INACTIVE = 1; // Emitted whenever browser connection becomes inactive
|
||||
BROWSER_ACTIVE = 2; // Emitted whenever a new browser session is created
|
||||
MOBILE_DATA_CONNECTION = 3; // Emitted when the paired device connects to data
|
||||
MOBILE_WIFI_CONNECTION = 4; // Emitted when the paired device connects to wifi
|
||||
MOBILE_BATTERY_LOW = 5; // Emitted if the paired device reaches low battery
|
||||
MOBILE_BATTERY_RESTORED = 6; // Emitted if the paired device has restored battery enough to not be considered low
|
||||
BROWSER_INACTIVE_FROM_TIMEOUT = 7; // Emitted whenever browser connection becomes inactive due to timeout
|
||||
BROWSER_INACTIVE_FROM_INACTIVITY = 8; // Emitted whenever browser connection becomes inactive due to inactivity
|
||||
RCS_CONNECTION = 9; // Emitted whenever RCS connection has been established successfully
|
||||
OBSERVER_REGISTERED = 10; // Unknown
|
||||
MOBILE_DATABASE_SYNCING = 11; // Emitted whenever the paired device is attempting to sync db
|
||||
MOBILE_DATABASE_SYNC_COMPLETE = 12; // Emitted whenever the paired device has completed the db sync
|
||||
MOBILE_DATABASE_SYNC_STARTED = 13; // Emitted whenever the paired device has begun syncing the db
|
||||
MOBILE_DATABASE_PARTIAL_SYNC_COMPLETED = 14; // Emitted whenever the paired device has successfully synced a chunk of the db
|
||||
MOBILE_DATABASE_PARTIAL_SYNC_STARTED = 15; // Emitted whenever the paired device has begun syncing a chunk of the db
|
||||
CONTACTS_REFRESH_STARTED = 16; // Emitted whenever the paired device has begun refreshing contacts
|
||||
CONTACTS_REFRESH_COMPLETED = 17; // Emitted whenever the paired device has successfully refreshed contacts
|
||||
}
|
||||
|
||||
enum GRPCStatus {
|
||||
OK = 0;
|
||||
CANCELLED = 1;
|
||||
UNKNOWN = 2;
|
||||
INVALID_ARGUMENT = 3;
|
||||
DEADLINE_EXCEEDED = 4;
|
||||
NOT_FOUND = 5;
|
||||
ALREADY_EXISTS = 6;
|
||||
PERMISSION_DENIED = 7;
|
||||
RESOURCE_EXHAUSTED = 8;
|
||||
FAILED_PRECONDITION = 9;
|
||||
ABORTED = 10;
|
||||
OUT_OF_RANGE = 11;
|
||||
UNIMPLEMENTED = 12;
|
||||
INTERNAL = 13;
|
||||
UNAVAILABLE = 14;
|
||||
DATA_LOSS = 15;
|
||||
UNAUTHENTICATED = 16;
|
||||
}
|
||||
|
||||
enum TypingTypes {
|
||||
STOPPED_TYPING = 0;
|
||||
STARTED_TYPING = 1;
|
||||
}
|
||||
|
|
|
@ -3,42 +3,128 @@ package messages;
|
|||
|
||||
option go_package = "../../binary";
|
||||
|
||||
message EncodedPayload {
|
||||
string requestID = 1;
|
||||
int64 opcode = 2;
|
||||
bytes encryptedData = 5;
|
||||
string sessionID = 6;
|
||||
message RegisterRefreshPayload {
|
||||
AuthMessage messageAuth = 1;
|
||||
Device currBrowserDevice = 2;
|
||||
int64 unixTimestamp = 3;
|
||||
string signature = 4;
|
||||
EmptyRefreshArr emptyRefreshArr = 13;
|
||||
int32 messageType = 16;
|
||||
}
|
||||
|
||||
message EncodedResponse {
|
||||
string requestID = 1;
|
||||
//int64 msg = 2;
|
||||
int64 unixNano = 3;
|
||||
int64 opcode = 4;
|
||||
//bytes keyData = 5;
|
||||
bool sub = 6;
|
||||
int64 third = 7;
|
||||
bytes encryptedData = 8;
|
||||
bool field9 = 9;
|
||||
message EmptyRefreshArr {
|
||||
EmptyEmptyArr emptyArr = 9;
|
||||
}
|
||||
|
||||
message MessageData {
|
||||
string requestID = 1;
|
||||
int64 routingOpCode = 2;
|
||||
string ts1 = 3;
|
||||
int64 field5 = 5;
|
||||
string ts2 = 6;
|
||||
string someString = 7;
|
||||
message EmptyEmptyArr {
|
||||
|
||||
}
|
||||
|
||||
message InternalMessage {
|
||||
bytes unknown1 = 1;
|
||||
InternalMessageData data = 2;
|
||||
}
|
||||
|
||||
message InternalMessageData {
|
||||
string responseID = 1;
|
||||
BugleRoute bugleRoute = 2;
|
||||
string startExecute = 3;
|
||||
//bytes unknown4 = 4;
|
||||
MessageType messageType = 5;
|
||||
string finishExecute = 6;
|
||||
string millisecondsTaken = 7;
|
||||
Device mobile = 8;
|
||||
Device browser = 9;
|
||||
string encodedData = 12;
|
||||
string encodedRequestID = 17;
|
||||
MsgTypeArr msgTypeArr = 23;
|
||||
//bytes unknown5 = 10;
|
||||
//bytes unknown6 = 11;
|
||||
bytes protobufData = 12;
|
||||
//bytes unknown7 = 13;
|
||||
//bytes unknown8 = 14;
|
||||
//bytes unknown9 = 15;
|
||||
//bytes unknown10 = 16;
|
||||
string signatureID = 17;
|
||||
//bytes unknown11 = 18;
|
||||
//bytes unknown12 = 19;
|
||||
//bytes unknown13 = 20;
|
||||
string timestamp = 21;
|
||||
}
|
||||
|
||||
message MsgTypeArr {
|
||||
message InternalRequestData {
|
||||
string sessionID = 1;
|
||||
int64 timestamp = 3;
|
||||
ActionType action = 4;
|
||||
bool bool1 = 6;
|
||||
bool bool2 = 7;
|
||||
bytes encryptedData = 8;
|
||||
bool bool3 = 9;
|
||||
}
|
||||
|
||||
message SendMessage {
|
||||
Device mobile = 1;
|
||||
SendMessageData messageData = 2;
|
||||
SendMessageAuth messageAuth = 3;
|
||||
//bytes unknown1 = 4;
|
||||
int64 TTL = 5; // might be something related to config
|
||||
//bytes unknown2 = 6;
|
||||
//bytes unknown3 = 7;
|
||||
//bytes unknown4 = 8;
|
||||
EmptyArr emptyArr = 9;
|
||||
}
|
||||
|
||||
message SendMessageAuth {
|
||||
string requestID = 1;
|
||||
//bytes unknown1 = 2;
|
||||
//bytes unknown2 = 3;
|
||||
//bytes unknown3 = 4;
|
||||
//bytes unknown4 = 5;
|
||||
bytes tachyonAuthToken = 6;
|
||||
ConfigVersion configVersion = 7;
|
||||
}
|
||||
|
||||
message SendMessageInternal {
|
||||
string requestID = 1;
|
||||
ActionType action = 2;
|
||||
bytes encryptedProtoData = 5;
|
||||
string sessionID = 6;
|
||||
}
|
||||
/*
|
||||
requestID = 1
|
||||
|
||||
encodedData = {
|
||||
requestID = 1 ^same
|
||||
|
||||
sessionID = 6
|
||||
}
|
||||
*/
|
||||
message SendMessageData {
|
||||
string requestID = 1;
|
||||
BugleRoute bugleRoute = 2;
|
||||
//bytes unknown1 = 3;
|
||||
//bytes unknown2 = 4;
|
||||
//bytes unknown3 = 5;
|
||||
//bytes unknown4 = 6;
|
||||
//bytes unknown5 = 7;
|
||||
//bytes unknown6 = 8;
|
||||
//bytes unknown7 = 9;
|
||||
//bytes unknown8 = 10;
|
||||
//bytes unknown9 = 11;
|
||||
bytes protobufData = 12;
|
||||
//bytes unknown10 = 13;
|
||||
//bytes unknown11 = 14;
|
||||
//bytes unknown12 = 15;
|
||||
//bytes unknown13 = 16;
|
||||
//bytes unknown14 = 17;
|
||||
//bytes unknown15 = 18;
|
||||
//bytes unknown16 = 19;
|
||||
//bytes unknown17 = 20;
|
||||
//bytes unknown18 = 21;
|
||||
//bytes unknown19 = 22;
|
||||
MessageTypeData messageTypeData = 23;
|
||||
}
|
||||
|
||||
message MessageTypeData {
|
||||
EmptyArr emptyArr = 1;
|
||||
int64 msgType = 2;
|
||||
MessageType messageType = 2;
|
||||
}
|
||||
|
||||
message EmptyArr {
|
||||
|
@ -47,8 +133,8 @@ message EmptyArr {
|
|||
|
||||
message AuthMessage {
|
||||
string requestID = 1;
|
||||
bytes rpcKey = 6;
|
||||
Date date = 7;
|
||||
bytes tachyonAuthToken = 6;
|
||||
ConfigVersion configVersion = 7;
|
||||
}
|
||||
|
||||
message ReceiveMessagesRequest {
|
||||
|
@ -66,21 +152,54 @@ message BaseData {
|
|||
EmptyArr emptyArr = 6;
|
||||
}
|
||||
|
||||
message RPCResponse {
|
||||
bytes unknown = 1;
|
||||
MessageData data = 2;
|
||||
}
|
||||
|
||||
message Device {
|
||||
int64 userID = 1;
|
||||
string registrationID = 2;
|
||||
string sourceID = 2;
|
||||
string network = 3;
|
||||
}
|
||||
|
||||
message Date {
|
||||
int64 year = 3;
|
||||
int64 seq1 = 4;
|
||||
int64 seq2 = 5;
|
||||
int64 seq3 = 7;
|
||||
int64 seq4 = 9;
|
||||
enum BugleRoute {
|
||||
UNKNOWN_BUGLE_ROUTE = 0;
|
||||
DataEvent = 19;
|
||||
PairEvent = 14;
|
||||
}
|
||||
/*
|
||||
enum EventType {
|
||||
UNKNOWN_EVENT_TYPE = 0;
|
||||
ONE = 1;
|
||||
TWO = 2;
|
||||
THREE = 3;
|
||||
FOUR = 4;
|
||||
FIVE = 5;
|
||||
SIXTEEN = 16;
|
||||
}
|
||||
*/
|
||||
|
||||
message ConfigVersion {
|
||||
int32 V1 = 3;
|
||||
int32 V2 = 4;
|
||||
int32 V3 = 5;
|
||||
int32 V4 = 7;
|
||||
int32 V5 = 9;
|
||||
}
|
||||
|
||||
enum ActionType {
|
||||
UNKNOWN_ACTION_TYPE = 0;
|
||||
LIST_CONVERSATIONS = 1;
|
||||
LIST_MESSAGES = 2;
|
||||
SEND_MESSAGE = 3;
|
||||
LIST_CONVERSATIONS_SYNC = 1111;
|
||||
GET_UPDATES = 16;
|
||||
GET_CONVERSATION_TYPE = 21;
|
||||
NOTIFY_DITTO_ACTIVITY = 22;
|
||||
DELETE_MESSAGE = 23;
|
||||
RESEND_MESSAGE = 25;
|
||||
IS_BUGLE_DEFAULT = 31;
|
||||
SEND_REACTION = 38;
|
||||
}
|
||||
|
||||
enum MessageType {
|
||||
UNKNOWN_MESSAGE_TYPE = 0;
|
||||
BUGLE_MESSAGE = 2;
|
||||
BUGLE_ANNOTATION = 16;
|
||||
}
|
||||
|
|
|
@ -1,54 +0,0 @@
|
|||
syntax = "proto3";
|
||||
package pairing;
|
||||
|
||||
option go_package = "../../binary";
|
||||
|
||||
import "messages.proto";
|
||||
|
||||
message BrowserDetails {
|
||||
string userAgent = 1;
|
||||
int32 someInt = 2;
|
||||
string os = 3;
|
||||
bool someBool = 6;
|
||||
}
|
||||
|
||||
message PhoneRelayBody {
|
||||
string ID = 1;
|
||||
string bugle = 3;
|
||||
bytes rpcKey = 6;
|
||||
messages.Date date = 7;
|
||||
}
|
||||
|
||||
message ECDSAKeys {
|
||||
int64 protoVersion = 1; // idk?
|
||||
bytes encryptedKeys = 2;
|
||||
}
|
||||
|
||||
message PairDeviceData {
|
||||
messages.Device mobile = 1;
|
||||
ECDSAKeys ecdsaKeys = 6;
|
||||
WebAuthKey webAuthKeyData = 2;
|
||||
messages.Device browser = 3;
|
||||
}
|
||||
|
||||
message UnpairDeviceData {
|
||||
messages.Device browser = 1;
|
||||
}
|
||||
|
||||
message WebAuthKey {
|
||||
bytes webAuthKey = 1;
|
||||
int64 validFor = 2;
|
||||
}
|
||||
|
||||
message Container {
|
||||
PhoneRelayBody PhoneRelay = 1;
|
||||
BrowserDetails browserDetails = 3;
|
||||
PairDeviceData pairDeviceData = 4;
|
||||
UnpairDeviceData unpairDeviceData = 5;
|
||||
}
|
||||
|
||||
message UrlData {
|
||||
bytes pairingKey = 1;
|
||||
bytes AESCTR256Key = 2;
|
||||
bytes SHA256Key = 3;
|
||||
}
|
56
libgm/binary/raw/reactions.proto
Normal file
56
libgm/binary/raw/reactions.proto
Normal file
|
@ -0,0 +1,56 @@
|
|||
syntax = "proto3";
|
||||
package reactions;
|
||||
|
||||
option go_package = "../../binary";
|
||||
|
||||
enum Reaction {
|
||||
UNSPECIFIED = 0;
|
||||
ADD = 1;
|
||||
REMOVE = 2;
|
||||
SWITCH = 3;
|
||||
}
|
||||
|
||||
message SendReactionPayload {
|
||||
string messageID = 1;
|
||||
ReactionData reactionData = 2;
|
||||
Reaction action = 3;
|
||||
}
|
||||
|
||||
message SendReactionResponse {
|
||||
bool success = 1;
|
||||
}
|
||||
|
||||
message ReactionData {
|
||||
bytes emojiUnicode = 1;
|
||||
int64 emojiType = 2;
|
||||
}
|
||||
|
||||
message ReactionResponse {
|
||||
ReactionData data = 1;
|
||||
repeated string reactorParticipantsID = 2; // participants reacted with this emoji
|
||||
}
|
||||
|
||||
message EmojiMeta {
|
||||
repeated EmojiMetaData emojiMetaData = 1;
|
||||
}
|
||||
|
||||
message EmojiMetaData {
|
||||
bytes emojiUnicode = 1;
|
||||
repeated string names = 2;
|
||||
}
|
||||
|
||||
enum Emojis {
|
||||
REACTION_TYPE_UNSPECIFIED = 0;
|
||||
LIKE = 1;
|
||||
LOVE = 2;
|
||||
LAUGH = 3;
|
||||
SURPRISED = 4;
|
||||
SAD = 5;
|
||||
ANGRY = 6;
|
||||
DISLIKE = 7;
|
||||
CUSTOM = 8;
|
||||
QUESTIONING = 9;
|
||||
CRYING_FACE = 10;
|
||||
POUTING_FACE = 11;
|
||||
RED_HEART = 12;
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
syntax = "proto3";
|
||||
package registerPhoneRelay;
|
||||
|
||||
option go_package = "../../binary";
|
||||
|
||||
message RegisterPhoneRelayResponse {
|
||||
Message1 field1 = 1;
|
||||
Message2 field2 = 2;
|
||||
bytes pairingKey = 3;
|
||||
int64 field4 = 4;
|
||||
Message3 field5 = 5;
|
||||
bytes field6 = 6;
|
||||
}
|
||||
|
||||
message Message1 {
|
||||
int64 pubKey = 2;
|
||||
}
|
||||
|
||||
message Message2 {
|
||||
int64 field1 = 1;
|
||||
bytes field2 = 2;
|
||||
string field3 = 3;
|
||||
}
|
||||
|
||||
message Message3 {
|
||||
bytes rpcKey = 1;
|
||||
int64 field2 = 2;
|
||||
}
|
||||
|
||||
message RefreshPhoneRelayResponse {
|
||||
Message1 field1 = 1;
|
||||
bytes pairKey = 2;
|
||||
int64 validFor = 3;
|
||||
}
|
||||
|
||||
message WebEncryptionKeyResponse {
|
||||
Message1 curve = 1;
|
||||
bytes key = 2;
|
||||
}
|
|
@ -3,17 +3,95 @@ package responses;
|
|||
|
||||
option go_package = "../../binary";
|
||||
|
||||
import "settings.proto";
|
||||
import "events.proto";
|
||||
import "messages.proto";
|
||||
import "conversations.proto";
|
||||
|
||||
message PrepareNewSession {
|
||||
message RegisterRefreshResponse {
|
||||
RefreshAuthData tokenData = 2;
|
||||
}
|
||||
|
||||
message RefreshAuthData {
|
||||
bytes tachyonAuthToken = 1;
|
||||
string validFor = 2;
|
||||
}
|
||||
|
||||
message FetchMessagesResponse {
|
||||
repeated conversations.Message messages = 2;
|
||||
bytes someBytes = 3;
|
||||
int64 totalMessages = 4;
|
||||
conversations.Cursor cursor = 5;
|
||||
}
|
||||
|
||||
message DeleteMessageResponse {
|
||||
bool success = 2;
|
||||
}
|
||||
|
||||
message UpdateConversationResponse {
|
||||
bool success = 1;
|
||||
/*
|
||||
3 {
|
||||
1 {
|
||||
1 {
|
||||
3: "11"
|
||||
}
|
||||
13: 2
|
||||
}
|
||||
3: 1
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
message GetConversationTypeResponse {
|
||||
string conversationID = 2;
|
||||
int32 type = 3;
|
||||
bool bool1 = 5;
|
||||
int32 number2 = 6;
|
||||
}
|
||||
|
||||
message NotifyDittoActivityResponse {}
|
||||
|
||||
message IsBugleDefaultResponse {
|
||||
bool success = 1;
|
||||
}
|
||||
|
||||
message NewSession {
|
||||
settings.Settings settings = 5;
|
||||
message GetUpdatesResponse {
|
||||
events.UserAlertEvent data = 6;
|
||||
}
|
||||
|
||||
message SendMessageResponse {
|
||||
conversations.MessageType type = 3;
|
||||
int64 type = 3;
|
||||
}
|
||||
|
||||
message RefreshPhoneRelayResponse {
|
||||
CoordinateMessage coordinates = 1;
|
||||
bytes pairKey = 2;
|
||||
int64 validFor = 3;
|
||||
}
|
||||
|
||||
message WebEncryptionKeyResponse {
|
||||
CoordinateMessage coordinates = 1;
|
||||
bytes key = 2;
|
||||
}
|
||||
|
||||
message RegisterPhoneRelayResponse {
|
||||
CoordinateMessage coordinates = 1;
|
||||
messages.Device browser = 2;
|
||||
bytes pairingKey = 3;
|
||||
int64 validFor = 4;
|
||||
AuthKeyData authKeyData = 5;
|
||||
string responseID = 6;
|
||||
}
|
||||
|
||||
message CoordinateMessage {
|
||||
int64 coord1 = 2;
|
||||
}
|
||||
|
||||
message AuthKeyData {
|
||||
bytes tachyonAuthToken = 1;
|
||||
int64 validFor = 2;
|
||||
}
|
||||
|
||||
enum ConversationType {
|
||||
UNKNOWN_CONVERSATION_TYPE = 0;
|
||||
}
|
||||
|
|
|
@ -6,9 +6,9 @@ option go_package = "../../binary";
|
|||
|
||||
message Settings {
|
||||
Data data = 2;
|
||||
OpCodeData opCodeData = 3;
|
||||
BooleanFields boolFields = 4;
|
||||
string version = 5;
|
||||
SomeData opCodeData = 3;
|
||||
RCSSettings rcsSettings = 4;
|
||||
string bugleVersion = 5;
|
||||
bool bool1 = 7;
|
||||
BooleanFields2 boolFields2 = 8;
|
||||
string emptyString = 9;
|
||||
|
@ -16,12 +16,16 @@ message Settings {
|
|||
}
|
||||
|
||||
message Data { // i think its simdata? no clue
|
||||
BoolMsg boolMsg = 3;
|
||||
RCSChats rcsChats = 3;
|
||||
SimData simData = 5;
|
||||
bool bool1 = 6;
|
||||
NoClue noClue = 7;
|
||||
}
|
||||
|
||||
message RCSChats {
|
||||
bool enabled = 1;
|
||||
}
|
||||
|
||||
message BoolMsg {
|
||||
bool bool1 = 1;
|
||||
}
|
||||
|
@ -43,15 +47,18 @@ message NoClue { // just a guess lol
|
|||
string count = 1;
|
||||
}
|
||||
|
||||
message OpCodeData {
|
||||
message SomeData {
|
||||
bool field7 = 7;
|
||||
bool field12 = 12;
|
||||
repeated bytes someEmojis = 15;
|
||||
string jsonData = 16;
|
||||
string someString = 17;
|
||||
}
|
||||
|
||||
message BooleanFields {
|
||||
bool bool1 = 1;
|
||||
bool bool2 = 2;
|
||||
bool bool3 = 3;
|
||||
message RCSSettings {
|
||||
bool isEnabled = 1;
|
||||
bool sendReadReceipts = 2;
|
||||
bool showTypingIndicators = 3;
|
||||
bool bool4 = 4;
|
||||
}
|
||||
|
||||
|
|
670
libgm/binary/reactions.pb.go
Normal file
670
libgm/binary/reactions.pb.go
Normal file
|
@ -0,0 +1,670 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.30.0
|
||||
// protoc v3.21.12
|
||||
// source: reactions.proto
|
||||
|
||||
package binary
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
type Reaction int32
|
||||
|
||||
const (
|
||||
Reaction_UNSPECIFIED Reaction = 0
|
||||
Reaction_ADD Reaction = 1
|
||||
Reaction_REMOVE Reaction = 2
|
||||
Reaction_SWITCH Reaction = 3
|
||||
)
|
||||
|
||||
// Enum value maps for Reaction.
|
||||
var (
|
||||
Reaction_name = map[int32]string{
|
||||
0: "UNSPECIFIED",
|
||||
1: "ADD",
|
||||
2: "REMOVE",
|
||||
3: "SWITCH",
|
||||
}
|
||||
Reaction_value = map[string]int32{
|
||||
"UNSPECIFIED": 0,
|
||||
"ADD": 1,
|
||||
"REMOVE": 2,
|
||||
"SWITCH": 3,
|
||||
}
|
||||
)
|
||||
|
||||
func (x Reaction) Enum() *Reaction {
|
||||
p := new(Reaction)
|
||||
*p = x
|
||||
return p
|
||||
}
|
||||
|
||||
func (x Reaction) String() string {
|
||||
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
|
||||
}
|
||||
|
||||
func (Reaction) Descriptor() protoreflect.EnumDescriptor {
|
||||
return file_reactions_proto_enumTypes[0].Descriptor()
|
||||
}
|
||||
|
||||
func (Reaction) Type() protoreflect.EnumType {
|
||||
return &file_reactions_proto_enumTypes[0]
|
||||
}
|
||||
|
||||
func (x Reaction) Number() protoreflect.EnumNumber {
|
||||
return protoreflect.EnumNumber(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use Reaction.Descriptor instead.
|
||||
func (Reaction) EnumDescriptor() ([]byte, []int) {
|
||||
return file_reactions_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
type Emojis int32
|
||||
|
||||
const (
|
||||
Emojis_REACTION_TYPE_UNSPECIFIED Emojis = 0
|
||||
Emojis_LIKE Emojis = 1
|
||||
Emojis_LOVE Emojis = 2
|
||||
Emojis_LAUGH Emojis = 3
|
||||
Emojis_SURPRISED Emojis = 4
|
||||
Emojis_SAD Emojis = 5
|
||||
Emojis_ANGRY Emojis = 6
|
||||
Emojis_DISLIKE Emojis = 7
|
||||
Emojis_CUSTOM Emojis = 8
|
||||
Emojis_QUESTIONING Emojis = 9
|
||||
Emojis_CRYING_FACE Emojis = 10
|
||||
Emojis_POUTING_FACE Emojis = 11
|
||||
Emojis_RED_HEART Emojis = 12
|
||||
)
|
||||
|
||||
// Enum value maps for Emojis.
|
||||
var (
|
||||
Emojis_name = map[int32]string{
|
||||
0: "REACTION_TYPE_UNSPECIFIED",
|
||||
1: "LIKE",
|
||||
2: "LOVE",
|
||||
3: "LAUGH",
|
||||
4: "SURPRISED",
|
||||
5: "SAD",
|
||||
6: "ANGRY",
|
||||
7: "DISLIKE",
|
||||
8: "CUSTOM",
|
||||
9: "QUESTIONING",
|
||||
10: "CRYING_FACE",
|
||||
11: "POUTING_FACE",
|
||||
12: "RED_HEART",
|
||||
}
|
||||
Emojis_value = map[string]int32{
|
||||
"REACTION_TYPE_UNSPECIFIED": 0,
|
||||
"LIKE": 1,
|
||||
"LOVE": 2,
|
||||
"LAUGH": 3,
|
||||
"SURPRISED": 4,
|
||||
"SAD": 5,
|
||||
"ANGRY": 6,
|
||||
"DISLIKE": 7,
|
||||
"CUSTOM": 8,
|
||||
"QUESTIONING": 9,
|
||||
"CRYING_FACE": 10,
|
||||
"POUTING_FACE": 11,
|
||||
"RED_HEART": 12,
|
||||
}
|
||||
)
|
||||
|
||||
func (x Emojis) Enum() *Emojis {
|
||||
p := new(Emojis)
|
||||
*p = x
|
||||
return p
|
||||
}
|
||||
|
||||
func (x Emojis) String() string {
|
||||
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
|
||||
}
|
||||
|
||||
func (Emojis) Descriptor() protoreflect.EnumDescriptor {
|
||||
return file_reactions_proto_enumTypes[1].Descriptor()
|
||||
}
|
||||
|
||||
func (Emojis) Type() protoreflect.EnumType {
|
||||
return &file_reactions_proto_enumTypes[1]
|
||||
}
|
||||
|
||||
func (x Emojis) Number() protoreflect.EnumNumber {
|
||||
return protoreflect.EnumNumber(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use Emojis.Descriptor instead.
|
||||
func (Emojis) EnumDescriptor() ([]byte, []int) {
|
||||
return file_reactions_proto_rawDescGZIP(), []int{1}
|
||||
}
|
||||
|
||||
type SendReactionPayload struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
MessageID string `protobuf:"bytes,1,opt,name=messageID,proto3" json:"messageID,omitempty"`
|
||||
ReactionData *ReactionData `protobuf:"bytes,2,opt,name=reactionData,proto3" json:"reactionData,omitempty"`
|
||||
Action Reaction `protobuf:"varint,3,opt,name=action,proto3,enum=reactions.Reaction" json:"action,omitempty"`
|
||||
}
|
||||
|
||||
func (x *SendReactionPayload) Reset() {
|
||||
*x = SendReactionPayload{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_reactions_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *SendReactionPayload) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*SendReactionPayload) ProtoMessage() {}
|
||||
|
||||
func (x *SendReactionPayload) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_reactions_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use SendReactionPayload.ProtoReflect.Descriptor instead.
|
||||
func (*SendReactionPayload) Descriptor() ([]byte, []int) {
|
||||
return file_reactions_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *SendReactionPayload) GetMessageID() string {
|
||||
if x != nil {
|
||||
return x.MessageID
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (x *SendReactionPayload) GetReactionData() *ReactionData {
|
||||
if x != nil {
|
||||
return x.ReactionData
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *SendReactionPayload) GetAction() Reaction {
|
||||
if x != nil {
|
||||
return x.Action
|
||||
}
|
||||
return Reaction_UNSPECIFIED
|
||||
}
|
||||
|
||||
type SendReactionResponse struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
|
||||
}
|
||||
|
||||
func (x *SendReactionResponse) Reset() {
|
||||
*x = SendReactionResponse{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_reactions_proto_msgTypes[1]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *SendReactionResponse) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*SendReactionResponse) ProtoMessage() {}
|
||||
|
||||
func (x *SendReactionResponse) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_reactions_proto_msgTypes[1]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use SendReactionResponse.ProtoReflect.Descriptor instead.
|
||||
func (*SendReactionResponse) Descriptor() ([]byte, []int) {
|
||||
return file_reactions_proto_rawDescGZIP(), []int{1}
|
||||
}
|
||||
|
||||
func (x *SendReactionResponse) GetSuccess() bool {
|
||||
if x != nil {
|
||||
return x.Success
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type ReactionData struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
EmojiUnicode []byte `protobuf:"bytes,1,opt,name=emojiUnicode,proto3" json:"emojiUnicode,omitempty"`
|
||||
EmojiType int64 `protobuf:"varint,2,opt,name=emojiType,proto3" json:"emojiType,omitempty"`
|
||||
}
|
||||
|
||||
func (x *ReactionData) Reset() {
|
||||
*x = ReactionData{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_reactions_proto_msgTypes[2]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *ReactionData) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*ReactionData) ProtoMessage() {}
|
||||
|
||||
func (x *ReactionData) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_reactions_proto_msgTypes[2]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use ReactionData.ProtoReflect.Descriptor instead.
|
||||
func (*ReactionData) Descriptor() ([]byte, []int) {
|
||||
return file_reactions_proto_rawDescGZIP(), []int{2}
|
||||
}
|
||||
|
||||
func (x *ReactionData) GetEmojiUnicode() []byte {
|
||||
if x != nil {
|
||||
return x.EmojiUnicode
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *ReactionData) GetEmojiType() int64 {
|
||||
if x != nil {
|
||||
return x.EmojiType
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type ReactionResponse struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Data *ReactionData `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"`
|
||||
ReactorParticipantsID []string `protobuf:"bytes,2,rep,name=reactorParticipantsID,proto3" json:"reactorParticipantsID,omitempty"` // participants reacted with this emoji
|
||||
}
|
||||
|
||||
func (x *ReactionResponse) Reset() {
|
||||
*x = ReactionResponse{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_reactions_proto_msgTypes[3]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *ReactionResponse) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*ReactionResponse) ProtoMessage() {}
|
||||
|
||||
func (x *ReactionResponse) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_reactions_proto_msgTypes[3]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use ReactionResponse.ProtoReflect.Descriptor instead.
|
||||
func (*ReactionResponse) Descriptor() ([]byte, []int) {
|
||||
return file_reactions_proto_rawDescGZIP(), []int{3}
|
||||
}
|
||||
|
||||
func (x *ReactionResponse) GetData() *ReactionData {
|
||||
if x != nil {
|
||||
return x.Data
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *ReactionResponse) GetReactorParticipantsID() []string {
|
||||
if x != nil {
|
||||
return x.ReactorParticipantsID
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type EmojiMeta struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
EmojiMetaData []*EmojiMetaData `protobuf:"bytes,1,rep,name=emojiMetaData,proto3" json:"emojiMetaData,omitempty"`
|
||||
}
|
||||
|
||||
func (x *EmojiMeta) Reset() {
|
||||
*x = EmojiMeta{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_reactions_proto_msgTypes[4]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *EmojiMeta) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*EmojiMeta) ProtoMessage() {}
|
||||
|
||||
func (x *EmojiMeta) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_reactions_proto_msgTypes[4]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use EmojiMeta.ProtoReflect.Descriptor instead.
|
||||
func (*EmojiMeta) Descriptor() ([]byte, []int) {
|
||||
return file_reactions_proto_rawDescGZIP(), []int{4}
|
||||
}
|
||||
|
||||
func (x *EmojiMeta) GetEmojiMetaData() []*EmojiMetaData {
|
||||
if x != nil {
|
||||
return x.EmojiMetaData
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type EmojiMetaData struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
EmojiUnicode []byte `protobuf:"bytes,1,opt,name=emojiUnicode,proto3" json:"emojiUnicode,omitempty"`
|
||||
Names []string `protobuf:"bytes,2,rep,name=names,proto3" json:"names,omitempty"`
|
||||
}
|
||||
|
||||
func (x *EmojiMetaData) Reset() {
|
||||
*x = EmojiMetaData{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_reactions_proto_msgTypes[5]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *EmojiMetaData) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*EmojiMetaData) ProtoMessage() {}
|
||||
|
||||
func (x *EmojiMetaData) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_reactions_proto_msgTypes[5]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use EmojiMetaData.ProtoReflect.Descriptor instead.
|
||||
func (*EmojiMetaData) Descriptor() ([]byte, []int) {
|
||||
return file_reactions_proto_rawDescGZIP(), []int{5}
|
||||
}
|
||||
|
||||
func (x *EmojiMetaData) GetEmojiUnicode() []byte {
|
||||
if x != nil {
|
||||
return x.EmojiUnicode
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *EmojiMetaData) GetNames() []string {
|
||||
if x != nil {
|
||||
return x.Names
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var File_reactions_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_reactions_proto_rawDesc = []byte{
|
||||
0x0a, 0x0f, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74,
|
||||
0x6f, 0x12, 0x09, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x9d, 0x01, 0x0a,
|
||||
0x13, 0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x79,
|
||||
0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49,
|
||||
0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
|
||||
0x49, 0x44, 0x12, 0x3b, 0x0a, 0x0c, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61,
|
||||
0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x65, 0x61, 0x63, 0x74,
|
||||
0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74,
|
||||
0x61, 0x52, 0x0c, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12,
|
||||
0x2b, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32,
|
||||
0x13, 0x2e, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x61, 0x63,
|
||||
0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x30, 0x0a, 0x14,
|
||||
0x53, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70,
|
||||
0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18,
|
||||
0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x50,
|
||||
0x0a, 0x0c, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22,
|
||||
0x0a, 0x0c, 0x65, 0x6d, 0x6f, 0x6a, 0x69, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01,
|
||||
0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x65, 0x6d, 0x6f, 0x6a, 0x69, 0x55, 0x6e, 0x69, 0x63, 0x6f,
|
||||
0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6d, 0x6f, 0x6a, 0x69, 0x54, 0x79, 0x70, 0x65, 0x18,
|
||||
0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x6d, 0x6f, 0x6a, 0x69, 0x54, 0x79, 0x70, 0x65,
|
||||
0x22, 0x75, 0x0a, 0x10, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70,
|
||||
0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01,
|
||||
0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52,
|
||||
0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74,
|
||||
0x61, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74,
|
||||
0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x49, 0x44, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09,
|
||||
0x52, 0x15, 0x72, 0x65, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69,
|
||||
0x70, 0x61, 0x6e, 0x74, 0x73, 0x49, 0x44, 0x22, 0x4b, 0x0a, 0x09, 0x45, 0x6d, 0x6f, 0x6a, 0x69,
|
||||
0x4d, 0x65, 0x74, 0x61, 0x12, 0x3e, 0x0a, 0x0d, 0x65, 0x6d, 0x6f, 0x6a, 0x69, 0x4d, 0x65, 0x74,
|
||||
0x61, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x65,
|
||||
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6d, 0x6f, 0x6a, 0x69, 0x4d, 0x65, 0x74,
|
||||
0x61, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x65, 0x6d, 0x6f, 0x6a, 0x69, 0x4d, 0x65, 0x74, 0x61,
|
||||
0x44, 0x61, 0x74, 0x61, 0x22, 0x49, 0x0a, 0x0d, 0x45, 0x6d, 0x6f, 0x6a, 0x69, 0x4d, 0x65, 0x74,
|
||||
0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x65, 0x6d, 0x6f, 0x6a, 0x69, 0x55, 0x6e,
|
||||
0x69, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x65, 0x6d, 0x6f,
|
||||
0x6a, 0x69, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d,
|
||||
0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2a,
|
||||
0x3c, 0x0a, 0x08, 0x52, 0x65, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0f, 0x0a, 0x0b, 0x55,
|
||||
0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03,
|
||||
0x41, 0x44, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10,
|
||||
0x02, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x57, 0x49, 0x54, 0x43, 0x48, 0x10, 0x03, 0x2a, 0xc5, 0x01,
|
||||
0x0a, 0x06, 0x45, 0x6d, 0x6f, 0x6a, 0x69, 0x73, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x41, 0x43,
|
||||
0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
|
||||
0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x4b, 0x45, 0x10,
|
||||
0x01, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x4f, 0x56, 0x45, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x4c,
|
||||
0x41, 0x55, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x52, 0x50, 0x52, 0x49,
|
||||
0x53, 0x45, 0x44, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x53, 0x41, 0x44, 0x10, 0x05, 0x12, 0x09,
|
||||
0x0a, 0x05, 0x41, 0x4e, 0x47, 0x52, 0x59, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x49, 0x53,
|
||||
0x4c, 0x49, 0x4b, 0x45, 0x10, 0x07, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d,
|
||||
0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x51, 0x55, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x49, 0x4e,
|
||||
0x47, 0x10, 0x09, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x52, 0x59, 0x49, 0x4e, 0x47, 0x5f, 0x46, 0x41,
|
||||
0x43, 0x45, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x4f, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x5f,
|
||||
0x46, 0x41, 0x43, 0x45, 0x10, 0x0b, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x45, 0x44, 0x5f, 0x48, 0x45,
|
||||
0x41, 0x52, 0x54, 0x10, 0x0c, 0x42, 0x0e, 0x5a, 0x0c, 0x2e, 0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x62,
|
||||
0x69, 0x6e, 0x61, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_reactions_proto_rawDescOnce sync.Once
|
||||
file_reactions_proto_rawDescData = file_reactions_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_reactions_proto_rawDescGZIP() []byte {
|
||||
file_reactions_proto_rawDescOnce.Do(func() {
|
||||
file_reactions_proto_rawDescData = protoimpl.X.CompressGZIP(file_reactions_proto_rawDescData)
|
||||
})
|
||||
return file_reactions_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_reactions_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
|
||||
var file_reactions_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
|
||||
var file_reactions_proto_goTypes = []interface{}{
|
||||
(Reaction)(0), // 0: reactions.Reaction
|
||||
(Emojis)(0), // 1: reactions.Emojis
|
||||
(*SendReactionPayload)(nil), // 2: reactions.SendReactionPayload
|
||||
(*SendReactionResponse)(nil), // 3: reactions.SendReactionResponse
|
||||
(*ReactionData)(nil), // 4: reactions.ReactionData
|
||||
(*ReactionResponse)(nil), // 5: reactions.ReactionResponse
|
||||
(*EmojiMeta)(nil), // 6: reactions.EmojiMeta
|
||||
(*EmojiMetaData)(nil), // 7: reactions.EmojiMetaData
|
||||
}
|
||||
var file_reactions_proto_depIdxs = []int32{
|
||||
4, // 0: reactions.SendReactionPayload.reactionData:type_name -> reactions.ReactionData
|
||||
0, // 1: reactions.SendReactionPayload.action:type_name -> reactions.Reaction
|
||||
4, // 2: reactions.ReactionResponse.data:type_name -> reactions.ReactionData
|
||||
7, // 3: reactions.EmojiMeta.emojiMetaData:type_name -> reactions.EmojiMetaData
|
||||
4, // [4:4] is the sub-list for method output_type
|
||||
4, // [4:4] is the sub-list for method input_type
|
||||
4, // [4:4] is the sub-list for extension type_name
|
||||
4, // [4:4] is the sub-list for extension extendee
|
||||
0, // [0:4] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_reactions_proto_init() }
|
||||
func file_reactions_proto_init() {
|
||||
if File_reactions_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_reactions_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*SendReactionPayload); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_reactions_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*SendReactionResponse); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_reactions_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*ReactionData); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_reactions_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*ReactionResponse); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_reactions_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*EmojiMeta); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_reactions_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*EmojiMetaData); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_reactions_proto_rawDesc,
|
||||
NumEnums: 2,
|
||||
NumMessages: 6,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_reactions_proto_goTypes,
|
||||
DependencyIndexes: file_reactions_proto_depIdxs,
|
||||
EnumInfos: file_reactions_proto_enumTypes,
|
||||
MessageInfos: file_reactions_proto_msgTypes,
|
||||
}.Build()
|
||||
File_reactions_proto = out.File
|
||||
file_reactions_proto_rawDesc = nil
|
||||
file_reactions_proto_goTypes = nil
|
||||
file_reactions_proto_depIdxs = nil
|
||||
}
|
|
@ -1,576 +0,0 @@
|
|||
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||
// versions:
|
||||
// protoc-gen-go v1.30.0
|
||||
// protoc v3.21.12
|
||||
// source: relay.proto
|
||||
|
||||
package binary
|
||||
|
||||
import (
|
||||
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||
reflect "reflect"
|
||||
sync "sync"
|
||||
)
|
||||
|
||||
const (
|
||||
// Verify that this generated code is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||
)
|
||||
|
||||
type RegisterPhoneRelayResponse struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Field1 *Message1 `protobuf:"bytes,1,opt,name=field1,proto3" json:"field1,omitempty"`
|
||||
Field2 *Message2 `protobuf:"bytes,2,opt,name=field2,proto3" json:"field2,omitempty"`
|
||||
PairingKey []byte `protobuf:"bytes,3,opt,name=pairingKey,proto3" json:"pairingKey,omitempty"`
|
||||
Field4 int64 `protobuf:"varint,4,opt,name=field4,proto3" json:"field4,omitempty"`
|
||||
Field5 *Message3 `protobuf:"bytes,5,opt,name=field5,proto3" json:"field5,omitempty"`
|
||||
Field6 []byte `protobuf:"bytes,6,opt,name=field6,proto3" json:"field6,omitempty"`
|
||||
}
|
||||
|
||||
func (x *RegisterPhoneRelayResponse) Reset() {
|
||||
*x = RegisterPhoneRelayResponse{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_relay_proto_msgTypes[0]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *RegisterPhoneRelayResponse) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*RegisterPhoneRelayResponse) ProtoMessage() {}
|
||||
|
||||
func (x *RegisterPhoneRelayResponse) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_relay_proto_msgTypes[0]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use RegisterPhoneRelayResponse.ProtoReflect.Descriptor instead.
|
||||
func (*RegisterPhoneRelayResponse) Descriptor() ([]byte, []int) {
|
||||
return file_relay_proto_rawDescGZIP(), []int{0}
|
||||
}
|
||||
|
||||
func (x *RegisterPhoneRelayResponse) GetField1() *Message1 {
|
||||
if x != nil {
|
||||
return x.Field1
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *RegisterPhoneRelayResponse) GetField2() *Message2 {
|
||||
if x != nil {
|
||||
return x.Field2
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *RegisterPhoneRelayResponse) GetPairingKey() []byte {
|
||||
if x != nil {
|
||||
return x.PairingKey
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *RegisterPhoneRelayResponse) GetField4() int64 {
|
||||
if x != nil {
|
||||
return x.Field4
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *RegisterPhoneRelayResponse) GetField5() *Message3 {
|
||||
if x != nil {
|
||||
return x.Field5
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *RegisterPhoneRelayResponse) GetField6() []byte {
|
||||
if x != nil {
|
||||
return x.Field6
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type Message1 struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
PubKey int64 `protobuf:"varint,2,opt,name=pubKey,proto3" json:"pubKey,omitempty"`
|
||||
}
|
||||
|
||||
func (x *Message1) Reset() {
|
||||
*x = Message1{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_relay_proto_msgTypes[1]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *Message1) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*Message1) ProtoMessage() {}
|
||||
|
||||
func (x *Message1) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_relay_proto_msgTypes[1]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use Message1.ProtoReflect.Descriptor instead.
|
||||
func (*Message1) Descriptor() ([]byte, []int) {
|
||||
return file_relay_proto_rawDescGZIP(), []int{1}
|
||||
}
|
||||
|
||||
func (x *Message1) GetPubKey() int64 {
|
||||
if x != nil {
|
||||
return x.PubKey
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type Message2 struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Field1 int64 `protobuf:"varint,1,opt,name=field1,proto3" json:"field1,omitempty"`
|
||||
Field2 []byte `protobuf:"bytes,2,opt,name=field2,proto3" json:"field2,omitempty"`
|
||||
Field3 string `protobuf:"bytes,3,opt,name=field3,proto3" json:"field3,omitempty"`
|
||||
}
|
||||
|
||||
func (x *Message2) Reset() {
|
||||
*x = Message2{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_relay_proto_msgTypes[2]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *Message2) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*Message2) ProtoMessage() {}
|
||||
|
||||
func (x *Message2) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_relay_proto_msgTypes[2]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use Message2.ProtoReflect.Descriptor instead.
|
||||
func (*Message2) Descriptor() ([]byte, []int) {
|
||||
return file_relay_proto_rawDescGZIP(), []int{2}
|
||||
}
|
||||
|
||||
func (x *Message2) GetField1() int64 {
|
||||
if x != nil {
|
||||
return x.Field1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func (x *Message2) GetField2() []byte {
|
||||
if x != nil {
|
||||
return x.Field2
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *Message2) GetField3() string {
|
||||
if x != nil {
|
||||
return x.Field3
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type Message3 struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
RpcKey []byte `protobuf:"bytes,1,opt,name=rpcKey,proto3" json:"rpcKey,omitempty"`
|
||||
Field2 int64 `protobuf:"varint,2,opt,name=field2,proto3" json:"field2,omitempty"`
|
||||
}
|
||||
|
||||
func (x *Message3) Reset() {
|
||||
*x = Message3{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_relay_proto_msgTypes[3]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *Message3) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*Message3) ProtoMessage() {}
|
||||
|
||||
func (x *Message3) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_relay_proto_msgTypes[3]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use Message3.ProtoReflect.Descriptor instead.
|
||||
func (*Message3) Descriptor() ([]byte, []int) {
|
||||
return file_relay_proto_rawDescGZIP(), []int{3}
|
||||
}
|
||||
|
||||
func (x *Message3) GetRpcKey() []byte {
|
||||
if x != nil {
|
||||
return x.RpcKey
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *Message3) GetField2() int64 {
|
||||
if x != nil {
|
||||
return x.Field2
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type RefreshPhoneRelayResponse struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Field1 *Message1 `protobuf:"bytes,1,opt,name=field1,proto3" json:"field1,omitempty"`
|
||||
PairKey []byte `protobuf:"bytes,2,opt,name=pairKey,proto3" json:"pairKey,omitempty"`
|
||||
ValidFor int64 `protobuf:"varint,3,opt,name=validFor,proto3" json:"validFor,omitempty"`
|
||||
}
|
||||
|
||||
func (x *RefreshPhoneRelayResponse) Reset() {
|
||||
*x = RefreshPhoneRelayResponse{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_relay_proto_msgTypes[4]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *RefreshPhoneRelayResponse) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*RefreshPhoneRelayResponse) ProtoMessage() {}
|
||||
|
||||
func (x *RefreshPhoneRelayResponse) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_relay_proto_msgTypes[4]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use RefreshPhoneRelayResponse.ProtoReflect.Descriptor instead.
|
||||
func (*RefreshPhoneRelayResponse) Descriptor() ([]byte, []int) {
|
||||
return file_relay_proto_rawDescGZIP(), []int{4}
|
||||
}
|
||||
|
||||
func (x *RefreshPhoneRelayResponse) GetField1() *Message1 {
|
||||
if x != nil {
|
||||
return x.Field1
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *RefreshPhoneRelayResponse) GetPairKey() []byte {
|
||||
if x != nil {
|
||||
return x.PairKey
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *RefreshPhoneRelayResponse) GetValidFor() int64 {
|
||||
if x != nil {
|
||||
return x.ValidFor
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
type WebEncryptionKeyResponse struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Curve *Message1 `protobuf:"bytes,1,opt,name=curve,proto3" json:"curve,omitempty"`
|
||||
Key []byte `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"`
|
||||
}
|
||||
|
||||
func (x *WebEncryptionKeyResponse) Reset() {
|
||||
*x = WebEncryptionKeyResponse{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_relay_proto_msgTypes[5]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *WebEncryptionKeyResponse) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*WebEncryptionKeyResponse) ProtoMessage() {}
|
||||
|
||||
func (x *WebEncryptionKeyResponse) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_relay_proto_msgTypes[5]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use WebEncryptionKeyResponse.ProtoReflect.Descriptor instead.
|
||||
func (*WebEncryptionKeyResponse) Descriptor() ([]byte, []int) {
|
||||
return file_relay_proto_rawDescGZIP(), []int{5}
|
||||
}
|
||||
|
||||
func (x *WebEncryptionKeyResponse) GetCurve() *Message1 {
|
||||
if x != nil {
|
||||
return x.Curve
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *WebEncryptionKeyResponse) GetKey() []byte {
|
||||
if x != nil {
|
||||
return x.Key
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var File_relay_proto protoreflect.FileDescriptor
|
||||
|
||||
var file_relay_proto_rawDesc = []byte{
|
||||
0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x61, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x72,
|
||||
0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x6c, 0x61,
|
||||
0x79, 0x22, 0x8e, 0x02, 0x0a, 0x1a, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x50, 0x68,
|
||||
0x6f, 0x6e, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
|
||||
0x12, 0x34, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
|
||||
0x32, 0x1c, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65,
|
||||
0x52, 0x65, 0x6c, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x31, 0x52, 0x06,
|
||||
0x66, 0x69, 0x65, 0x6c, 0x64, 0x31, 0x12, 0x34, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x32,
|
||||
0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65,
|
||||
0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x73,
|
||||
0x61, 0x67, 0x65, 0x32, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x32, 0x12, 0x1e, 0x0a, 0x0a,
|
||||
0x70, 0x61, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c,
|
||||
0x52, 0x0a, 0x70, 0x61, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06,
|
||||
0x66, 0x69, 0x65, 0x6c, 0x64, 0x34, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x66, 0x69,
|
||||
0x65, 0x6c, 0x64, 0x34, 0x12, 0x34, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x35, 0x18, 0x05,
|
||||
0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x50,
|
||||
0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
|
||||
0x65, 0x33, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x35, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69,
|
||||
0x65, 0x6c, 0x64, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c,
|
||||
0x64, 0x36, 0x22, 0x22, 0x0a, 0x08, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x31, 0x12, 0x16,
|
||||
0x0a, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06,
|
||||
0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x22, 0x52, 0x0a, 0x08, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
|
||||
0x65, 0x32, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x31, 0x18, 0x01, 0x20, 0x01,
|
||||
0x28, 0x03, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x31, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69,
|
||||
0x65, 0x6c, 0x64, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c,
|
||||
0x64, 0x32, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x33, 0x18, 0x03, 0x20, 0x01,
|
||||
0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x33, 0x22, 0x3a, 0x0a, 0x08, 0x4d, 0x65,
|
||||
0x73, 0x73, 0x61, 0x67, 0x65, 0x33, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x70, 0x63, 0x4b, 0x65, 0x79,
|
||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x72, 0x70, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x16,
|
||||
0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06,
|
||||
0x66, 0x69, 0x65, 0x6c, 0x64, 0x32, 0x22, 0x87, 0x01, 0x0a, 0x19, 0x52, 0x65, 0x66, 0x72, 0x65,
|
||||
0x73, 0x68, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x52, 0x65, 0x73, 0x70,
|
||||
0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x31, 0x18, 0x01,
|
||||
0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x50,
|
||||
0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x79, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
|
||||
0x65, 0x31, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x31, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61,
|
||||
0x69, 0x72, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x69,
|
||||
0x72, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x46, 0x6f, 0x72,
|
||||
0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x46, 0x6f, 0x72,
|
||||
0x22, 0x60, 0x0a, 0x18, 0x57, 0x65, 0x62, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f,
|
||||
0x6e, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x05,
|
||||
0x63, 0x75, 0x72, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x65,
|
||||
0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x50, 0x68, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x79,
|
||||
0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x31, 0x52, 0x05, 0x63, 0x75, 0x72, 0x76, 0x65,
|
||||
0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x6b,
|
||||
0x65, 0x79, 0x42, 0x0e, 0x5a, 0x0c, 0x2e, 0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x62, 0x69, 0x6e, 0x61,
|
||||
0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
file_relay_proto_rawDescOnce sync.Once
|
||||
file_relay_proto_rawDescData = file_relay_proto_rawDesc
|
||||
)
|
||||
|
||||
func file_relay_proto_rawDescGZIP() []byte {
|
||||
file_relay_proto_rawDescOnce.Do(func() {
|
||||
file_relay_proto_rawDescData = protoimpl.X.CompressGZIP(file_relay_proto_rawDescData)
|
||||
})
|
||||
return file_relay_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_relay_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
|
||||
var file_relay_proto_goTypes = []interface{}{
|
||||
(*RegisterPhoneRelayResponse)(nil), // 0: registerPhoneRelay.RegisterPhoneRelayResponse
|
||||
(*Message1)(nil), // 1: registerPhoneRelay.Message1
|
||||
(*Message2)(nil), // 2: registerPhoneRelay.Message2
|
||||
(*Message3)(nil), // 3: registerPhoneRelay.Message3
|
||||
(*RefreshPhoneRelayResponse)(nil), // 4: registerPhoneRelay.RefreshPhoneRelayResponse
|
||||
(*WebEncryptionKeyResponse)(nil), // 5: registerPhoneRelay.WebEncryptionKeyResponse
|
||||
}
|
||||
var file_relay_proto_depIdxs = []int32{
|
||||
1, // 0: registerPhoneRelay.RegisterPhoneRelayResponse.field1:type_name -> registerPhoneRelay.Message1
|
||||
2, // 1: registerPhoneRelay.RegisterPhoneRelayResponse.field2:type_name -> registerPhoneRelay.Message2
|
||||
3, // 2: registerPhoneRelay.RegisterPhoneRelayResponse.field5:type_name -> registerPhoneRelay.Message3
|
||||
1, // 3: registerPhoneRelay.RefreshPhoneRelayResponse.field1:type_name -> registerPhoneRelay.Message1
|
||||
1, // 4: registerPhoneRelay.WebEncryptionKeyResponse.curve:type_name -> registerPhoneRelay.Message1
|
||||
5, // [5:5] is the sub-list for method output_type
|
||||
5, // [5:5] is the sub-list for method input_type
|
||||
5, // [5:5] is the sub-list for extension type_name
|
||||
5, // [5:5] is the sub-list for extension extendee
|
||||
0, // [0:5] is the sub-list for field type_name
|
||||
}
|
||||
|
||||
func init() { file_relay_proto_init() }
|
||||
func file_relay_proto_init() {
|
||||
if File_relay_proto != nil {
|
||||
return
|
||||
}
|
||||
if !protoimpl.UnsafeEnabled {
|
||||
file_relay_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*RegisterPhoneRelayResponse); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_relay_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*Message1); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_relay_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*Message2); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_relay_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*Message3); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_relay_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*RefreshPhoneRelayResponse); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_relay_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*WebEncryptionKeyResponse); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
type x struct{}
|
||||
out := protoimpl.TypeBuilder{
|
||||
File: protoimpl.DescBuilder{
|
||||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_relay_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 6,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
GoTypes: file_relay_proto_goTypes,
|
||||
DependencyIndexes: file_relay_proto_depIdxs,
|
||||
MessageInfos: file_relay_proto_msgTypes,
|
||||
}.Build()
|
||||
File_relay_proto = out.File
|
||||
file_relay_proto_rawDesc = nil
|
||||
file_relay_proto_goTypes = nil
|
||||
file_relay_proto_depIdxs = nil
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -26,9 +26,9 @@ type Settings struct {
|
|||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Data *Data `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
|
||||
OpCodeData *OpCodeData `protobuf:"bytes,3,opt,name=opCodeData,proto3" json:"opCodeData,omitempty"`
|
||||
BoolFields *BooleanFields `protobuf:"bytes,4,opt,name=boolFields,proto3" json:"boolFields,omitempty"`
|
||||
Version string `protobuf:"bytes,5,opt,name=version,proto3" json:"version,omitempty"`
|
||||
OpCodeData *SomeData `protobuf:"bytes,3,opt,name=opCodeData,proto3" json:"opCodeData,omitempty"`
|
||||
RcsSettings *RCSSettings `protobuf:"bytes,4,opt,name=rcsSettings,proto3" json:"rcsSettings,omitempty"`
|
||||
BugleVersion string `protobuf:"bytes,5,opt,name=bugleVersion,proto3" json:"bugleVersion,omitempty"`
|
||||
Bool1 bool `protobuf:"varint,7,opt,name=bool1,proto3" json:"bool1,omitempty"`
|
||||
BoolFields2 *BooleanFields2 `protobuf:"bytes,8,opt,name=boolFields2,proto3" json:"boolFields2,omitempty"`
|
||||
EmptyString string `protobuf:"bytes,9,opt,name=emptyString,proto3" json:"emptyString,omitempty"`
|
||||
|
@ -74,23 +74,23 @@ func (x *Settings) GetData() *Data {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (x *Settings) GetOpCodeData() *OpCodeData {
|
||||
func (x *Settings) GetOpCodeData() *SomeData {
|
||||
if x != nil {
|
||||
return x.OpCodeData
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *Settings) GetBoolFields() *BooleanFields {
|
||||
func (x *Settings) GetRcsSettings() *RCSSettings {
|
||||
if x != nil {
|
||||
return x.BoolFields
|
||||
return x.RcsSettings
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *Settings) GetVersion() string {
|
||||
func (x *Settings) GetBugleVersion() string {
|
||||
if x != nil {
|
||||
return x.Version
|
||||
return x.BugleVersion
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
@ -128,7 +128,7 @@ type Data struct {
|
|||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
BoolMsg *BoolMsg `protobuf:"bytes,3,opt,name=boolMsg,proto3" json:"boolMsg,omitempty"`
|
||||
RcsChats *RCSChats `protobuf:"bytes,3,opt,name=rcsChats,proto3" json:"rcsChats,omitempty"`
|
||||
SimData *SimData `protobuf:"bytes,5,opt,name=simData,proto3" json:"simData,omitempty"`
|
||||
Bool1 bool `protobuf:"varint,6,opt,name=bool1,proto3" json:"bool1,omitempty"`
|
||||
NoClue *NoClue `protobuf:"bytes,7,opt,name=noClue,proto3" json:"noClue,omitempty"`
|
||||
|
@ -166,9 +166,9 @@ func (*Data) Descriptor() ([]byte, []int) {
|
|||
return file_settings_proto_rawDescGZIP(), []int{1}
|
||||
}
|
||||
|
||||
func (x *Data) GetBoolMsg() *BoolMsg {
|
||||
func (x *Data) GetRcsChats() *RCSChats {
|
||||
if x != nil {
|
||||
return x.BoolMsg
|
||||
return x.RcsChats
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -194,6 +194,53 @@ func (x *Data) GetNoClue() *NoClue {
|
|||
return nil
|
||||
}
|
||||
|
||||
type RCSChats struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"`
|
||||
}
|
||||
|
||||
func (x *RCSChats) Reset() {
|
||||
*x = RCSChats{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_settings_proto_msgTypes[2]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *RCSChats) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*RCSChats) ProtoMessage() {}
|
||||
|
||||
func (x *RCSChats) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_settings_proto_msgTypes[2]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
return ms
|
||||
}
|
||||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use RCSChats.ProtoReflect.Descriptor instead.
|
||||
func (*RCSChats) Descriptor() ([]byte, []int) {
|
||||
return file_settings_proto_rawDescGZIP(), []int{2}
|
||||
}
|
||||
|
||||
func (x *RCSChats) GetEnabled() bool {
|
||||
if x != nil {
|
||||
return x.Enabled
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
type BoolMsg struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
|
@ -205,7 +252,7 @@ type BoolMsg struct {
|
|||
func (x *BoolMsg) Reset() {
|
||||
*x = BoolMsg{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_settings_proto_msgTypes[2]
|
||||
mi := &file_settings_proto_msgTypes[3]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -218,7 +265,7 @@ func (x *BoolMsg) String() string {
|
|||
func (*BoolMsg) ProtoMessage() {}
|
||||
|
||||
func (x *BoolMsg) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_settings_proto_msgTypes[2]
|
||||
mi := &file_settings_proto_msgTypes[3]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -231,7 +278,7 @@ func (x *BoolMsg) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use BoolMsg.ProtoReflect.Descriptor instead.
|
||||
func (*BoolMsg) Descriptor() ([]byte, []int) {
|
||||
return file_settings_proto_rawDescGZIP(), []int{2}
|
||||
return file_settings_proto_rawDescGZIP(), []int{3}
|
||||
}
|
||||
|
||||
func (x *BoolMsg) GetBool1() bool {
|
||||
|
@ -256,7 +303,7 @@ type SimData struct {
|
|||
func (x *SimData) Reset() {
|
||||
*x = SimData{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_settings_proto_msgTypes[3]
|
||||
mi := &file_settings_proto_msgTypes[4]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -269,7 +316,7 @@ func (x *SimData) String() string {
|
|||
func (*SimData) ProtoMessage() {}
|
||||
|
||||
func (x *SimData) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_settings_proto_msgTypes[3]
|
||||
mi := &file_settings_proto_msgTypes[4]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -282,7 +329,7 @@ func (x *SimData) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use SimData.ProtoReflect.Descriptor instead.
|
||||
func (*SimData) Descriptor() ([]byte, []int) {
|
||||
return file_settings_proto_rawDescGZIP(), []int{3}
|
||||
return file_settings_proto_rawDescGZIP(), []int{4}
|
||||
}
|
||||
|
||||
func (x *SimData) GetUnknownMessage() *UnknownMessage {
|
||||
|
@ -332,7 +379,7 @@ type UnknownMessage struct {
|
|||
func (x *UnknownMessage) Reset() {
|
||||
*x = UnknownMessage{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_settings_proto_msgTypes[4]
|
||||
mi := &file_settings_proto_msgTypes[5]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -345,7 +392,7 @@ func (x *UnknownMessage) String() string {
|
|||
func (*UnknownMessage) ProtoMessage() {}
|
||||
|
||||
func (x *UnknownMessage) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_settings_proto_msgTypes[4]
|
||||
mi := &file_settings_proto_msgTypes[5]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -358,7 +405,7 @@ func (x *UnknownMessage) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use UnknownMessage.ProtoReflect.Descriptor instead.
|
||||
func (*UnknownMessage) Descriptor() ([]byte, []int) {
|
||||
return file_settings_proto_rawDescGZIP(), []int{4}
|
||||
return file_settings_proto_rawDescGZIP(), []int{5}
|
||||
}
|
||||
|
||||
func (x *UnknownMessage) GetInt1() int64 {
|
||||
|
@ -386,7 +433,7 @@ type NoClue struct {
|
|||
func (x *NoClue) Reset() {
|
||||
*x = NoClue{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_settings_proto_msgTypes[5]
|
||||
mi := &file_settings_proto_msgTypes[6]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -399,7 +446,7 @@ func (x *NoClue) String() string {
|
|||
func (*NoClue) ProtoMessage() {}
|
||||
|
||||
func (x *NoClue) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_settings_proto_msgTypes[5]
|
||||
mi := &file_settings_proto_msgTypes[6]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -412,7 +459,7 @@ func (x *NoClue) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use NoClue.ProtoReflect.Descriptor instead.
|
||||
func (*NoClue) Descriptor() ([]byte, []int) {
|
||||
return file_settings_proto_rawDescGZIP(), []int{5}
|
||||
return file_settings_proto_rawDescGZIP(), []int{6}
|
||||
}
|
||||
|
||||
func (x *NoClue) GetCount() string {
|
||||
|
@ -422,32 +469,35 @@ func (x *NoClue) GetCount() string {
|
|||
return ""
|
||||
}
|
||||
|
||||
type OpCodeData struct {
|
||||
type SomeData struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Field7 bool `protobuf:"varint,7,opt,name=field7,proto3" json:"field7,omitempty"`
|
||||
Field12 bool `protobuf:"varint,12,opt,name=field12,proto3" json:"field12,omitempty"`
|
||||
SomeEmojis [][]byte `protobuf:"bytes,15,rep,name=someEmojis,proto3" json:"someEmojis,omitempty"`
|
||||
JsonData string `protobuf:"bytes,16,opt,name=jsonData,proto3" json:"jsonData,omitempty"`
|
||||
SomeString string `protobuf:"bytes,17,opt,name=someString,proto3" json:"someString,omitempty"`
|
||||
}
|
||||
|
||||
func (x *OpCodeData) Reset() {
|
||||
*x = OpCodeData{}
|
||||
func (x *SomeData) Reset() {
|
||||
*x = SomeData{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_settings_proto_msgTypes[6]
|
||||
mi := &file_settings_proto_msgTypes[7]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *OpCodeData) String() string {
|
||||
func (x *SomeData) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*OpCodeData) ProtoMessage() {}
|
||||
func (*SomeData) ProtoMessage() {}
|
||||
|
||||
func (x *OpCodeData) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_settings_proto_msgTypes[6]
|
||||
func (x *SomeData) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_settings_proto_msgTypes[7]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -458,53 +508,74 @@ func (x *OpCodeData) ProtoReflect() protoreflect.Message {
|
|||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use OpCodeData.ProtoReflect.Descriptor instead.
|
||||
func (*OpCodeData) Descriptor() ([]byte, []int) {
|
||||
return file_settings_proto_rawDescGZIP(), []int{6}
|
||||
// Deprecated: Use SomeData.ProtoReflect.Descriptor instead.
|
||||
func (*SomeData) Descriptor() ([]byte, []int) {
|
||||
return file_settings_proto_rawDescGZIP(), []int{7}
|
||||
}
|
||||
|
||||
func (x *OpCodeData) GetField7() bool {
|
||||
func (x *SomeData) GetField7() bool {
|
||||
if x != nil {
|
||||
return x.Field7
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *OpCodeData) GetJsonData() string {
|
||||
func (x *SomeData) GetField12() bool {
|
||||
if x != nil {
|
||||
return x.Field12
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *SomeData) GetSomeEmojis() [][]byte {
|
||||
if x != nil {
|
||||
return x.SomeEmojis
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (x *SomeData) GetJsonData() string {
|
||||
if x != nil {
|
||||
return x.JsonData
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type BooleanFields struct {
|
||||
func (x *SomeData) GetSomeString() string {
|
||||
if x != nil {
|
||||
return x.SomeString
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
type RCSSettings struct {
|
||||
state protoimpl.MessageState
|
||||
sizeCache protoimpl.SizeCache
|
||||
unknownFields protoimpl.UnknownFields
|
||||
|
||||
Bool1 bool `protobuf:"varint,1,opt,name=bool1,proto3" json:"bool1,omitempty"`
|
||||
Bool2 bool `protobuf:"varint,2,opt,name=bool2,proto3" json:"bool2,omitempty"`
|
||||
Bool3 bool `protobuf:"varint,3,opt,name=bool3,proto3" json:"bool3,omitempty"`
|
||||
IsEnabled bool `protobuf:"varint,1,opt,name=isEnabled,proto3" json:"isEnabled,omitempty"`
|
||||
SendReadReceipts bool `protobuf:"varint,2,opt,name=sendReadReceipts,proto3" json:"sendReadReceipts,omitempty"`
|
||||
ShowTypingIndicators bool `protobuf:"varint,3,opt,name=showTypingIndicators,proto3" json:"showTypingIndicators,omitempty"`
|
||||
Bool4 bool `protobuf:"varint,4,opt,name=bool4,proto3" json:"bool4,omitempty"`
|
||||
}
|
||||
|
||||
func (x *BooleanFields) Reset() {
|
||||
*x = BooleanFields{}
|
||||
func (x *RCSSettings) Reset() {
|
||||
*x = RCSSettings{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_settings_proto_msgTypes[7]
|
||||
mi := &file_settings_proto_msgTypes[8]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
}
|
||||
|
||||
func (x *BooleanFields) String() string {
|
||||
func (x *RCSSettings) String() string {
|
||||
return protoimpl.X.MessageStringOf(x)
|
||||
}
|
||||
|
||||
func (*BooleanFields) ProtoMessage() {}
|
||||
func (*RCSSettings) ProtoMessage() {}
|
||||
|
||||
func (x *BooleanFields) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_settings_proto_msgTypes[7]
|
||||
func (x *RCSSettings) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_settings_proto_msgTypes[8]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -515,33 +586,33 @@ func (x *BooleanFields) ProtoReflect() protoreflect.Message {
|
|||
return mi.MessageOf(x)
|
||||
}
|
||||
|
||||
// Deprecated: Use BooleanFields.ProtoReflect.Descriptor instead.
|
||||
func (*BooleanFields) Descriptor() ([]byte, []int) {
|
||||
return file_settings_proto_rawDescGZIP(), []int{7}
|
||||
// Deprecated: Use RCSSettings.ProtoReflect.Descriptor instead.
|
||||
func (*RCSSettings) Descriptor() ([]byte, []int) {
|
||||
return file_settings_proto_rawDescGZIP(), []int{8}
|
||||
}
|
||||
|
||||
func (x *BooleanFields) GetBool1() bool {
|
||||
func (x *RCSSettings) GetIsEnabled() bool {
|
||||
if x != nil {
|
||||
return x.Bool1
|
||||
return x.IsEnabled
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *BooleanFields) GetBool2() bool {
|
||||
func (x *RCSSettings) GetSendReadReceipts() bool {
|
||||
if x != nil {
|
||||
return x.Bool2
|
||||
return x.SendReadReceipts
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *BooleanFields) GetBool3() bool {
|
||||
func (x *RCSSettings) GetShowTypingIndicators() bool {
|
||||
if x != nil {
|
||||
return x.Bool3
|
||||
return x.ShowTypingIndicators
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (x *BooleanFields) GetBool4() bool {
|
||||
func (x *RCSSettings) GetBool4() bool {
|
||||
if x != nil {
|
||||
return x.Bool4
|
||||
}
|
||||
|
@ -563,7 +634,7 @@ type BooleanFields2 struct {
|
|||
func (x *BooleanFields2) Reset() {
|
||||
*x = BooleanFields2{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_settings_proto_msgTypes[8]
|
||||
mi := &file_settings_proto_msgTypes[9]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -576,7 +647,7 @@ func (x *BooleanFields2) String() string {
|
|||
func (*BooleanFields2) ProtoMessage() {}
|
||||
|
||||
func (x *BooleanFields2) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_settings_proto_msgTypes[8]
|
||||
mi := &file_settings_proto_msgTypes[9]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -589,7 +660,7 @@ func (x *BooleanFields2) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use BooleanFields2.ProtoReflect.Descriptor instead.
|
||||
func (*BooleanFields2) Descriptor() ([]byte, []int) {
|
||||
return file_settings_proto_rawDescGZIP(), []int{8}
|
||||
return file_settings_proto_rawDescGZIP(), []int{9}
|
||||
}
|
||||
|
||||
func (x *BooleanFields2) GetBool1() bool {
|
||||
|
@ -645,7 +716,7 @@ type BooleanFields3 struct {
|
|||
func (x *BooleanFields3) Reset() {
|
||||
*x = BooleanFields3{}
|
||||
if protoimpl.UnsafeEnabled {
|
||||
mi := &file_settings_proto_msgTypes[9]
|
||||
mi := &file_settings_proto_msgTypes[10]
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
ms.StoreMessageInfo(mi)
|
||||
}
|
||||
|
@ -658,7 +729,7 @@ func (x *BooleanFields3) String() string {
|
|||
func (*BooleanFields3) ProtoMessage() {}
|
||||
|
||||
func (x *BooleanFields3) ProtoReflect() protoreflect.Message {
|
||||
mi := &file_settings_proto_msgTypes[9]
|
||||
mi := &file_settings_proto_msgTypes[10]
|
||||
if protoimpl.UnsafeEnabled && x != nil {
|
||||
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||
if ms.LoadMessageInfo() == nil {
|
||||
|
@ -671,7 +742,7 @@ func (x *BooleanFields3) ProtoReflect() protoreflect.Message {
|
|||
|
||||
// Deprecated: Use BooleanFields3.ProtoReflect.Descriptor instead.
|
||||
func (*BooleanFields3) Descriptor() ([]byte, []int) {
|
||||
return file_settings_proto_rawDescGZIP(), []int{9}
|
||||
return file_settings_proto_rawDescGZIP(), []int{10}
|
||||
}
|
||||
|
||||
func (x *BooleanFields3) GetBool1() bool {
|
||||
|
@ -734,94 +805,107 @@ var File_settings_proto protoreflect.FileDescriptor
|
|||
|
||||
var file_settings_proto_rawDesc = []byte{
|
||||
0x0a, 0x0e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
||||
0x12, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xe7, 0x02, 0x0a, 0x08, 0x53,
|
||||
0x12, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xef, 0x02, 0x0a, 0x08, 0x53,
|
||||
0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18,
|
||||
0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73,
|
||||
0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x34, 0x0a, 0x0a, 0x6f,
|
||||
0x2e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x32, 0x0a, 0x0a, 0x6f,
|
||||
0x70, 0x43, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||
0x14, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x4f, 0x70, 0x43, 0x6f, 0x64,
|
||||
0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x0a, 0x6f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x74,
|
||||
0x61, 0x12, 0x37, 0x0a, 0x0a, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18,
|
||||
0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73,
|
||||
0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x52, 0x0a,
|
||||
0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65,
|
||||
0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72,
|
||||
0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x18, 0x07, 0x20,
|
||||
0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x12, 0x3a, 0x0a, 0x0b, 0x62, 0x6f,
|
||||
0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x32, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32,
|
||||
0x18, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x65,
|
||||
0x61, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x32, 0x52, 0x0b, 0x62, 0x6f, 0x6f, 0x6c, 0x46,
|
||||
0x69, 0x65, 0x6c, 0x64, 0x73, 0x32, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x53,
|
||||
0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6d, 0x70,
|
||||
0x74, 0x79, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x3a, 0x0a, 0x0b, 0x62, 0x6f, 0x6f, 0x6c,
|
||||
0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x33, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,
|
||||
0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e,
|
||||
0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x33, 0x52, 0x0b, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65,
|
||||
0x6c, 0x64, 0x73, 0x33, 0x22, 0xa0, 0x01, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a,
|
||||
0x07, 0x62, 0x6f, 0x6f, 0x6c, 0x4d, 0x73, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11,
|
||||
0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x4d, 0x73,
|
||||
0x67, 0x52, 0x07, 0x62, 0x6f, 0x6f, 0x6c, 0x4d, 0x73, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x73, 0x69,
|
||||
0x6d, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x65,
|
||||
0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x53, 0x69, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07,
|
||||
0x73, 0x69, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31,
|
||||
0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x12, 0x28, 0x0a,
|
||||
0x06, 0x6e, 0x6f, 0x43, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e,
|
||||
0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x4e, 0x6f, 0x43, 0x6c, 0x75, 0x65, 0x52,
|
||||
0x06, 0x6e, 0x6f, 0x43, 0x6c, 0x75, 0x65, 0x22, 0x1f, 0x0a, 0x07, 0x42, 0x6f, 0x6f, 0x6c, 0x4d,
|
||||
0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||
0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x22, 0xb1, 0x01, 0x0a, 0x07, 0x53, 0x69, 0x6d,
|
||||
0x44, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0e, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x4d,
|
||||
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x73,
|
||||
0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x4d,
|
||||
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0e, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x4d,
|
||||
0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x18,
|
||||
0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x12, 0x20, 0x0a, 0x0b,
|
||||
0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
|
||||
0x09, 0x52, 0x0b, 0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18,
|
||||
0x0a, 0x07, 0x68, 0x65, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x07, 0x68, 0x65, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x74, 0x31,
|
||||
0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x69, 0x6e, 0x74, 0x31, 0x22, 0x38, 0x0a, 0x0e,
|
||||
0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12,
|
||||
0x0a, 0x04, 0x69, 0x6e, 0x74, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x69, 0x6e,
|
||||
0x74, 0x31, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x74, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,
|
||||
0x52, 0x04, 0x69, 0x6e, 0x74, 0x32, 0x22, 0x1e, 0x0a, 0x06, 0x4e, 0x6f, 0x43, 0x6c, 0x75, 0x65,
|
||||
0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||
0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x40, 0x0a, 0x0a, 0x4f, 0x70, 0x43, 0x6f, 0x64, 0x65,
|
||||
0x12, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x53, 0x6f, 0x6d, 0x65, 0x44,
|
||||
0x61, 0x74, 0x61, 0x52, 0x0a, 0x6f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x44, 0x61, 0x74, 0x61, 0x12,
|
||||
0x37, 0x0a, 0x0b, 0x72, 0x63, 0x73, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04,
|
||||
0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e,
|
||||
0x52, 0x43, 0x53, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0b, 0x72, 0x63, 0x73,
|
||||
0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x62, 0x75, 0x67, 0x6c,
|
||||
0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
|
||||
0x62, 0x75, 0x67, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05,
|
||||
0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f,
|
||||
0x6c, 0x31, 0x12, 0x3a, 0x0a, 0x0b, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73,
|
||||
0x32, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e,
|
||||
0x67, 0x73, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73,
|
||||
0x32, 0x52, 0x0b, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x32, 0x12, 0x20,
|
||||
0x0a, 0x0b, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20,
|
||||
0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67,
|
||||
0x12, 0x3a, 0x0a, 0x0b, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x33, 0x18,
|
||||
0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73,
|
||||
0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x33, 0x52,
|
||||
0x0b, 0x62, 0x6f, 0x6f, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x33, 0x22, 0xa3, 0x01, 0x0a,
|
||||
0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x72, 0x63, 0x73, 0x43, 0x68, 0x61, 0x74,
|
||||
0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e,
|
||||
0x67, 0x73, 0x2e, 0x52, 0x43, 0x53, 0x43, 0x68, 0x61, 0x74, 0x73, 0x52, 0x08, 0x72, 0x63, 0x73,
|
||||
0x43, 0x68, 0x61, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x73, 0x69, 0x6d, 0x44, 0x61, 0x74, 0x61,
|
||||
0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67,
|
||||
0x73, 0x2e, 0x53, 0x69, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x73, 0x69, 0x6d, 0x44, 0x61,
|
||||
0x74, 0x61, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x18, 0x06, 0x20, 0x01, 0x28,
|
||||
0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x12, 0x28, 0x0a, 0x06, 0x6e, 0x6f, 0x43, 0x6c,
|
||||
0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69,
|
||||
0x6e, 0x67, 0x73, 0x2e, 0x4e, 0x6f, 0x43, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x6e, 0x6f, 0x43, 0x6c,
|
||||
0x75, 0x65, 0x22, 0x24, 0x0a, 0x08, 0x52, 0x43, 0x53, 0x43, 0x68, 0x61, 0x74, 0x73, 0x12, 0x18,
|
||||
0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52,
|
||||
0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x1f, 0x0a, 0x07, 0x42, 0x6f, 0x6f, 0x6c,
|
||||
0x4d, 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x18, 0x01, 0x20, 0x01,
|
||||
0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x22, 0xb1, 0x01, 0x0a, 0x07, 0x53, 0x69,
|
||||
0x6d, 0x44, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x0e, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e,
|
||||
0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e,
|
||||
0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e,
|
||||
0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x0e, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e,
|
||||
0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31,
|
||||
0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x12, 0x20, 0x0a,
|
||||
0x0b, 0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01,
|
||||
0x28, 0x09, 0x52, 0x0b, 0x63, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12,
|
||||
0x18, 0x0a, 0x07, 0x68, 0x65, 0x78, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x07, 0x68, 0x65, 0x78, 0x48, 0x61, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x74,
|
||||
0x31, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x69, 0x6e, 0x74, 0x31, 0x22, 0x38, 0x0a,
|
||||
0x0e, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12,
|
||||
0x12, 0x0a, 0x04, 0x69, 0x6e, 0x74, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x69,
|
||||
0x6e, 0x74, 0x31, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x74, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28,
|
||||
0x03, 0x52, 0x04, 0x69, 0x6e, 0x74, 0x32, 0x22, 0x1e, 0x0a, 0x06, 0x4e, 0x6f, 0x43, 0x6c, 0x75,
|
||||
0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
|
||||
0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x08, 0x53, 0x6f, 0x6d, 0x65,
|
||||
0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x37, 0x18, 0x07,
|
||||
0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x37, 0x12, 0x1a, 0x0a, 0x08,
|
||||
0x6a, 0x73, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08,
|
||||
0x6a, 0x73, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x22, 0x67, 0x0a, 0x0d, 0x42, 0x6f, 0x6f, 0x6c,
|
||||
0x65, 0x61, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f,
|
||||
0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x37, 0x12, 0x18, 0x0a, 0x07,
|
||||
0x66, 0x69, 0x65, 0x6c, 0x64, 0x31, 0x32, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x66,
|
||||
0x69, 0x65, 0x6c, 0x64, 0x31, 0x32, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, 0x6d, 0x65, 0x45, 0x6d,
|
||||
0x6f, 0x6a, 0x69, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0a, 0x73, 0x6f, 0x6d, 0x65,
|
||||
0x45, 0x6d, 0x6f, 0x6a, 0x69, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6a, 0x73, 0x6f, 0x6e, 0x44, 0x61,
|
||||
0x74, 0x61, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6a, 0x73, 0x6f, 0x6e, 0x44, 0x61,
|
||||
0x74, 0x61, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x6f, 0x6d, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67,
|
||||
0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x6d, 0x65, 0x53, 0x74, 0x72, 0x69,
|
||||
0x6e, 0x67, 0x22, 0xa1, 0x01, 0x0a, 0x0b, 0x52, 0x43, 0x53, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e,
|
||||
0x67, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18,
|
||||
0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64,
|
||||
0x12, 0x2a, 0x0a, 0x10, 0x73, 0x65, 0x6e, 0x64, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x63, 0x65,
|
||||
0x69, 0x70, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x65, 0x6e, 0x64,
|
||||
0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x14,
|
||||
0x73, 0x68, 0x6f, 0x77, 0x54, 0x79, 0x70, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61,
|
||||
0x74, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x73, 0x68, 0x6f, 0x77,
|
||||
0x54, 0x79, 0x70, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x61, 0x74, 0x6f, 0x72, 0x73,
|
||||
0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x34, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52,
|
||||
0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x34, 0x22, 0xb0, 0x01, 0x0a, 0x0e, 0x42, 0x6f, 0x6f, 0x6c, 0x65,
|
||||
0x61, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f,
|
||||
0x6c, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x12,
|
||||
0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05,
|
||||
0x62, 0x6f, 0x6f, 0x6c, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x33, 0x18, 0x03,
|
||||
0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x33, 0x12, 0x14, 0x0a, 0x05, 0x62,
|
||||
0x6f, 0x6f, 0x6c, 0x34, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c,
|
||||
0x34, 0x22, 0xb0, 0x01, 0x0a, 0x0e, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x46, 0x69, 0x65,
|
||||
0x6c, 0x64, 0x73, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x18, 0x01, 0x20,
|
||||
0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f,
|
||||
0x6f, 0x6c, 0x32, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x32,
|
||||
0x12, 0x2d, 0x0a, 0x08, 0x62, 0x6f, 0x6f, 0x6c, 0x4d, 0x73, 0x67, 0x31, 0x18, 0x03, 0x20, 0x01,
|
||||
0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x42, 0x6f,
|
||||
0x6f, 0x6c, 0x4d, 0x73, 0x67, 0x52, 0x08, 0x62, 0x6f, 0x6f, 0x6c, 0x4d, 0x73, 0x67, 0x31, 0x12,
|
||||
0x2d, 0x0a, 0x08, 0x62, 0x6f, 0x6f, 0x6c, 0x4d, 0x73, 0x67, 0x32, 0x18, 0x05, 0x20, 0x01, 0x28,
|
||||
0x0b, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x42, 0x6f, 0x6f,
|
||||
0x6c, 0x4d, 0x73, 0x67, 0x52, 0x08, 0x62, 0x6f, 0x6f, 0x6c, 0x4d, 0x73, 0x67, 0x32, 0x12, 0x14,
|
||||
0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x33, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62,
|
||||
0x6f, 0x6f, 0x6c, 0x33, 0x22, 0xc0, 0x01, 0x0a, 0x0e, 0x42, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e,
|
||||
0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x33, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31,
|
||||
0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x12, 0x14, 0x0a,
|
||||
0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x33, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f,
|
||||
0x6f, 0x6c, 0x33, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x34, 0x18, 0x04, 0x20, 0x01,
|
||||
0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x34, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f,
|
||||
0x6c, 0x35, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x35, 0x12,
|
||||
0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05,
|
||||
0x62, 0x6f, 0x6f, 0x6c, 0x36, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x37, 0x18, 0x07,
|
||||
0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x37, 0x12, 0x14, 0x0a, 0x05, 0x62,
|
||||
0x6f, 0x6f, 0x6c, 0x38, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c,
|
||||
0x38, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x39, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08,
|
||||
0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x39, 0x42, 0x0e, 0x5a, 0x0c, 0x2e, 0x2e, 0x2f, 0x2e, 0x2e,
|
||||
0x2f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||
0x62, 0x6f, 0x6f, 0x6c, 0x32, 0x12, 0x2d, 0x0a, 0x08, 0x62, 0x6f, 0x6f, 0x6c, 0x4d, 0x73, 0x67,
|
||||
0x31, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e,
|
||||
0x67, 0x73, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x4d, 0x73, 0x67, 0x52, 0x08, 0x62, 0x6f, 0x6f, 0x6c,
|
||||
0x4d, 0x73, 0x67, 0x31, 0x12, 0x2d, 0x0a, 0x08, 0x62, 0x6f, 0x6f, 0x6c, 0x4d, 0x73, 0x67, 0x32,
|
||||
0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67,
|
||||
0x73, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x4d, 0x73, 0x67, 0x52, 0x08, 0x62, 0x6f, 0x6f, 0x6c, 0x4d,
|
||||
0x73, 0x67, 0x32, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x33, 0x18, 0x06, 0x20, 0x01,
|
||||
0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x33, 0x22, 0xc0, 0x01, 0x0a, 0x0e, 0x42, 0x6f,
|
||||
0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x33, 0x12, 0x14, 0x0a, 0x05,
|
||||
0x62, 0x6f, 0x6f, 0x6c, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f,
|
||||
0x6c, 0x31, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x33, 0x18, 0x03, 0x20, 0x01, 0x28,
|
||||
0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x33, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c,
|
||||
0x34, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x34, 0x12, 0x14,
|
||||
0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x35, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62,
|
||||
0x6f, 0x6f, 0x6c, 0x35, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x36, 0x18, 0x06, 0x20,
|
||||
0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x36, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f,
|
||||
0x6f, 0x6c, 0x37, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x37,
|
||||
0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x38, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52,
|
||||
0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x38, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x39, 0x18,
|
||||
0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x6c, 0x39, 0x42, 0x0e, 0x5a, 0x0c,
|
||||
0x2e, 0x2e, 0x2f, 0x2e, 0x2e, 0x2f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72,
|
||||
0x6f, 0x74, 0x6f, 0x33,
|
||||
}
|
||||
|
||||
var (
|
||||
|
@ -836,31 +920,32 @@ func file_settings_proto_rawDescGZIP() []byte {
|
|||
return file_settings_proto_rawDescData
|
||||
}
|
||||
|
||||
var file_settings_proto_msgTypes = make([]protoimpl.MessageInfo, 10)
|
||||
var file_settings_proto_msgTypes = make([]protoimpl.MessageInfo, 11)
|
||||
var file_settings_proto_goTypes = []interface{}{
|
||||
(*Settings)(nil), // 0: settings.Settings
|
||||
(*Data)(nil), // 1: settings.Data
|
||||
(*BoolMsg)(nil), // 2: settings.BoolMsg
|
||||
(*SimData)(nil), // 3: settings.SimData
|
||||
(*UnknownMessage)(nil), // 4: settings.UnknownMessage
|
||||
(*NoClue)(nil), // 5: settings.NoClue
|
||||
(*OpCodeData)(nil), // 6: settings.OpCodeData
|
||||
(*BooleanFields)(nil), // 7: settings.BooleanFields
|
||||
(*BooleanFields2)(nil), // 8: settings.BooleanFields2
|
||||
(*BooleanFields3)(nil), // 9: settings.BooleanFields3
|
||||
(*RCSChats)(nil), // 2: settings.RCSChats
|
||||
(*BoolMsg)(nil), // 3: settings.BoolMsg
|
||||
(*SimData)(nil), // 4: settings.SimData
|
||||
(*UnknownMessage)(nil), // 5: settings.UnknownMessage
|
||||
(*NoClue)(nil), // 6: settings.NoClue
|
||||
(*SomeData)(nil), // 7: settings.SomeData
|
||||
(*RCSSettings)(nil), // 8: settings.RCSSettings
|
||||
(*BooleanFields2)(nil), // 9: settings.BooleanFields2
|
||||
(*BooleanFields3)(nil), // 10: settings.BooleanFields3
|
||||
}
|
||||
var file_settings_proto_depIdxs = []int32{
|
||||
1, // 0: settings.Settings.data:type_name -> settings.Data
|
||||
6, // 1: settings.Settings.opCodeData:type_name -> settings.OpCodeData
|
||||
7, // 2: settings.Settings.boolFields:type_name -> settings.BooleanFields
|
||||
8, // 3: settings.Settings.boolFields2:type_name -> settings.BooleanFields2
|
||||
9, // 4: settings.Settings.boolFields3:type_name -> settings.BooleanFields3
|
||||
2, // 5: settings.Data.boolMsg:type_name -> settings.BoolMsg
|
||||
3, // 6: settings.Data.simData:type_name -> settings.SimData
|
||||
5, // 7: settings.Data.noClue:type_name -> settings.NoClue
|
||||
4, // 8: settings.SimData.unknownMessage:type_name -> settings.UnknownMessage
|
||||
2, // 9: settings.BooleanFields2.boolMsg1:type_name -> settings.BoolMsg
|
||||
2, // 10: settings.BooleanFields2.boolMsg2:type_name -> settings.BoolMsg
|
||||
7, // 1: settings.Settings.opCodeData:type_name -> settings.SomeData
|
||||
8, // 2: settings.Settings.rcsSettings:type_name -> settings.RCSSettings
|
||||
9, // 3: settings.Settings.boolFields2:type_name -> settings.BooleanFields2
|
||||
10, // 4: settings.Settings.boolFields3:type_name -> settings.BooleanFields3
|
||||
2, // 5: settings.Data.rcsChats:type_name -> settings.RCSChats
|
||||
4, // 6: settings.Data.simData:type_name -> settings.SimData
|
||||
6, // 7: settings.Data.noClue:type_name -> settings.NoClue
|
||||
5, // 8: settings.SimData.unknownMessage:type_name -> settings.UnknownMessage
|
||||
3, // 9: settings.BooleanFields2.boolMsg1:type_name -> settings.BoolMsg
|
||||
3, // 10: settings.BooleanFields2.boolMsg2:type_name -> settings.BoolMsg
|
||||
11, // [11:11] is the sub-list for method output_type
|
||||
11, // [11:11] is the sub-list for method input_type
|
||||
11, // [11:11] is the sub-list for extension type_name
|
||||
|
@ -899,7 +984,7 @@ func file_settings_proto_init() {
|
|||
}
|
||||
}
|
||||
file_settings_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*BoolMsg); i {
|
||||
switch v := v.(*RCSChats); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -911,7 +996,7 @@ func file_settings_proto_init() {
|
|||
}
|
||||
}
|
||||
file_settings_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*SimData); i {
|
||||
switch v := v.(*BoolMsg); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -923,7 +1008,7 @@ func file_settings_proto_init() {
|
|||
}
|
||||
}
|
||||
file_settings_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*UnknownMessage); i {
|
||||
switch v := v.(*SimData); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -935,7 +1020,7 @@ func file_settings_proto_init() {
|
|||
}
|
||||
}
|
||||
file_settings_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*NoClue); i {
|
||||
switch v := v.(*UnknownMessage); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -947,7 +1032,7 @@ func file_settings_proto_init() {
|
|||
}
|
||||
}
|
||||
file_settings_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*OpCodeData); i {
|
||||
switch v := v.(*NoClue); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -959,7 +1044,7 @@ func file_settings_proto_init() {
|
|||
}
|
||||
}
|
||||
file_settings_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*BooleanFields); i {
|
||||
switch v := v.(*SomeData); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -971,7 +1056,7 @@ func file_settings_proto_init() {
|
|||
}
|
||||
}
|
||||
file_settings_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*BooleanFields2); i {
|
||||
switch v := v.(*RCSSettings); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
|
@ -983,6 +1068,18 @@ func file_settings_proto_init() {
|
|||
}
|
||||
}
|
||||
file_settings_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*BooleanFields2); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
case 1:
|
||||
return &v.sizeCache
|
||||
case 2:
|
||||
return &v.unknownFields
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
file_settings_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
|
||||
switch v := v.(*BooleanFields3); i {
|
||||
case 0:
|
||||
return &v.state
|
||||
|
@ -1001,7 +1098,7 @@ func file_settings_proto_init() {
|
|||
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||
RawDescriptor: file_settings_proto_rawDesc,
|
||||
NumEnums: 0,
|
||||
NumMessages: 10,
|
||||
NumMessages: 11,
|
||||
NumExtensions: 0,
|
||||
NumServices: 0,
|
||||
},
|
||||
|
|
|
@ -1,12 +0,0 @@
|
|||
package libgm
|
||||
|
||||
import "go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
|
||||
func (c *Client) handleBugleOpCode(bugleData *binary.BugleBackendService) {
|
||||
switch bugleData.Data.Type {
|
||||
case 2:
|
||||
c.Logger.Info().Any("type", bugleData.Data.Type).Msg("Updated sessionId to " + c.sessionHandler.sessionID + " due to BROWSER_ACTIVE alert")
|
||||
case 6:
|
||||
c.Logger.Info().Any("type", bugleData.Data.Type).Msg("USER_ALERT:BATTERY") // tf ?
|
||||
}
|
||||
}
|
373
libgm/client.go
373
libgm/client.go
|
@ -2,23 +2,33 @@ package libgm
|
|||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/http/cookiejar"
|
||||
"net/url"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/rs/zerolog"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/crypto"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/events"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/payload"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/util"
|
||||
)
|
||||
|
||||
type DevicePair struct {
|
||||
Mobile *binary.Device
|
||||
Browser *binary.Device
|
||||
type AuthData struct {
|
||||
TachyonAuthToken []byte `json:"tachyon_token,omitempty"`
|
||||
TTL int64 `json:"ttl,omitempty"`
|
||||
AuthenticatedAt *time.Time `json:"authenticated_at,omitempty"`
|
||||
DevicePair *pblite.DevicePair `json:"device_pair,omitempty"`
|
||||
Cryptor *crypto.Cryptor `json:"crypto,omitempty"`
|
||||
WebEncryptionKey []byte `json:"web_encryption_key,omitempty"`
|
||||
JWK *crypto.JWK `json:"jwk,omitempty"`
|
||||
}
|
||||
type Proxy func(*http.Request) (*url.URL, error)
|
||||
type EventHandler func(evt interface{})
|
||||
|
@ -26,67 +36,47 @@ type Client struct {
|
|||
Logger zerolog.Logger
|
||||
Conversations *Conversations
|
||||
Session *Session
|
||||
Messages *Messages
|
||||
rpc *RPC
|
||||
devicePair *DevicePair
|
||||
pairer *Pairer
|
||||
cryptor *crypto.Cryptor
|
||||
imageCryptor *crypto.ImageCryptor
|
||||
evHandler EventHandler
|
||||
sessionHandler *SessionHandler
|
||||
instructions *Instructions
|
||||
|
||||
rpcKey []byte
|
||||
ttl int64
|
||||
imageCryptor *crypto.ImageCryptor
|
||||
authData *AuthData
|
||||
|
||||
proxy Proxy
|
||||
http *http.Client
|
||||
}
|
||||
|
||||
func NewClient(devicePair *DevicePair, cryptor *crypto.Cryptor, logger zerolog.Logger, proxy *string) *Client {
|
||||
func NewClient(authData *AuthData, logger zerolog.Logger) *Client {
|
||||
sessionHandler := &SessionHandler{
|
||||
requests: make(map[string]map[int64]*ResponseChan),
|
||||
requests: make(map[string]map[binary.ActionType]*ResponseChan),
|
||||
responseTimeout: time.Duration(5000) * time.Millisecond,
|
||||
}
|
||||
if cryptor == nil {
|
||||
cryptor = crypto.NewCryptor(nil, nil)
|
||||
if authData == nil {
|
||||
authData = &AuthData{}
|
||||
}
|
||||
if authData.Cryptor == nil {
|
||||
authData.Cryptor = crypto.NewCryptor(nil, nil)
|
||||
}
|
||||
jar, _ := cookiejar.New(nil)
|
||||
cli := &Client{
|
||||
authData: authData,
|
||||
Logger: logger,
|
||||
devicePair: devicePair,
|
||||
sessionHandler: sessionHandler,
|
||||
cryptor: cryptor,
|
||||
imageCryptor: &crypto.ImageCryptor{},
|
||||
http: &http.Client{
|
||||
Jar: jar,
|
||||
},
|
||||
sessionHandler: sessionHandler,
|
||||
http: &http.Client{},
|
||||
}
|
||||
sessionHandler.client = cli
|
||||
cli.instructions = NewInstructions(cli.cryptor)
|
||||
if proxy != nil {
|
||||
cli.SetProxy(*proxy)
|
||||
}
|
||||
rpc := &RPC{client: cli, http: &http.Client{Transport: &http.Transport{Proxy: cli.proxy}}}
|
||||
cli.rpc = rpc
|
||||
cli.Logger.Debug().Any("data", cryptor).Msg("Cryptor")
|
||||
cli.Logger.Debug().Any("data", cli.authData.Cryptor).Msg("Cryptor")
|
||||
cli.setApiMethods()
|
||||
cli.FetchConfigVersion()
|
||||
return cli
|
||||
}
|
||||
|
||||
var baseURL, _ = url.Parse("https://messages.google.com/")
|
||||
|
||||
func (c *Client) GetCookies() []*http.Cookie {
|
||||
return c.http.Jar.Cookies(baseURL)
|
||||
}
|
||||
|
||||
func (c *Client) SetCookies(cookies []*http.Cookie) {
|
||||
c.http.Jar.SetCookies(baseURL, cookies)
|
||||
}
|
||||
|
||||
func (c *Client) SetEventHandler(eventHandler EventHandler) {
|
||||
if eventHandler == nil {
|
||||
eventHandler = func(_ interface{}) {}
|
||||
}
|
||||
c.evHandler = eventHandler
|
||||
}
|
||||
|
||||
|
@ -104,41 +94,65 @@ func (c *Client) SetProxy(proxy string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func (c *Client) Connect(rpcKey []byte) error {
|
||||
rpcPayload, receiveMesageSessionID, err := payload.ReceiveMessages(rpcKey)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return err
|
||||
}
|
||||
c.rpc.rpcSessionID = receiveMesageSessionID
|
||||
c.rpcKey = rpcKey
|
||||
go c.rpc.ListenReceiveMessages(rpcPayload)
|
||||
c.Logger.Debug().Any("rpcKey", rpcKey).Msg("Successfully connected to server")
|
||||
if c.devicePair != nil {
|
||||
sendInitialDataErr := c.rpc.sendInitialData()
|
||||
if sendInitialDataErr != nil {
|
||||
panic(sendInitialDataErr)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
func (c *Client) Connect() error {
|
||||
if c.authData.TachyonAuthToken != nil {
|
||||
|
||||
func (c *Client) Reconnect(rpcKey []byte) error {
|
||||
c.rpc.CloseConnection()
|
||||
for c.rpc.conn != nil {
|
||||
time.Sleep(time.Millisecond * 100)
|
||||
hasExpired, authenticatedAtSeconds := c.hasTachyonTokenExpired()
|
||||
if hasExpired {
|
||||
c.Logger.Error().Any("expired", hasExpired).Any("secondsSince", authenticatedAtSeconds).Msg("TachyonToken has expired! attempting to refresh")
|
||||
refreshErr := c.refreshAuthToken()
|
||||
if refreshErr != nil {
|
||||
log.Fatal(refreshErr)
|
||||
}
|
||||
err := c.Connect(rpcKey)
|
||||
}
|
||||
c.Logger.Info().Any("secondsSince", authenticatedAtSeconds).Any("token", c.authData.TachyonAuthToken).Msg("TachyonToken has not expired, attempting to connect...")
|
||||
|
||||
webEncryptionKeyResponse, webEncryptionKeyErr := c.GetWebEncryptionKey()
|
||||
if webEncryptionKeyErr != nil {
|
||||
c.Logger.Err(webEncryptionKeyErr).Any("response", webEncryptionKeyResponse).Msg("GetWebEncryptionKey request failed")
|
||||
return webEncryptionKeyErr
|
||||
}
|
||||
c.updateWebEncryptionKey(webEncryptionKeyResponse.GetKey())
|
||||
rpcPayload, receiveMessageSessionId, err := payload.ReceiveMessages(c.authData.TachyonAuthToken)
|
||||
if err != nil {
|
||||
c.Logger.Err(err).Any("rpcKey", rpcKey).Msg("Failed to reconnect")
|
||||
log.Fatal(err)
|
||||
return err
|
||||
}
|
||||
c.Logger.Debug().Any("rpcKey", rpcKey).Msg("Successfully reconnected to server")
|
||||
sendInitialDataErr := c.rpc.sendInitialData()
|
||||
if sendInitialDataErr != nil {
|
||||
panic(sendInitialDataErr)
|
||||
c.rpc.rpcSessionId = receiveMessageSessionId
|
||||
go c.rpc.ListenReceiveMessages(rpcPayload)
|
||||
c.sessionHandler.startAckInterval()
|
||||
|
||||
bugleRes, bugleErr := c.Session.IsBugleDefault()
|
||||
if bugleErr != nil {
|
||||
log.Fatal(bugleErr)
|
||||
}
|
||||
c.Logger.Info().Any("isBugle", bugleRes.Success).Msg("IsBugleDefault")
|
||||
sessionErr := c.Session.SetActiveSession()
|
||||
if sessionErr != nil {
|
||||
log.Fatal(sessionErr)
|
||||
}
|
||||
//c.Logger.Debug().Any("tachyonAuthToken", c.authData.TachyonAuthToken).Msg("Successfully connected to server")
|
||||
return nil
|
||||
} else {
|
||||
pairer, err := c.NewPairer(nil, 20)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
c.pairer = pairer
|
||||
registered, err2 := c.pairer.RegisterPhoneRelay()
|
||||
if err2 != nil {
|
||||
return err2
|
||||
}
|
||||
c.authData.TachyonAuthToken = registered.AuthKeyData.TachyonAuthToken
|
||||
rpcPayload, receiveMessageSessionId, err := payload.ReceiveMessages(c.authData.TachyonAuthToken)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
return err
|
||||
}
|
||||
c.rpc.rpcSessionId = receiveMessageSessionId
|
||||
go c.rpc.ListenReceiveMessages(rpcPayload)
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) Disconnect() {
|
||||
|
@ -151,7 +165,34 @@ func (c *Client) IsConnected() bool {
|
|||
}
|
||||
|
||||
func (c *Client) IsLoggedIn() bool {
|
||||
return c.devicePair != nil
|
||||
return c.authData != nil && c.authData.DevicePair != nil
|
||||
}
|
||||
|
||||
func (c *Client) hasTachyonTokenExpired() (bool, string) {
|
||||
if c.authData.TachyonAuthToken == nil || c.authData.AuthenticatedAt == nil {
|
||||
return true, ""
|
||||
} else {
|
||||
duration := time.Since(*c.authData.AuthenticatedAt)
|
||||
seconds := fmt.Sprintf("%.3f", duration.Seconds())
|
||||
if duration.Microseconds() > 86400000000 {
|
||||
return true, seconds
|
||||
}
|
||||
return false, seconds
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) Reconnect() error {
|
||||
c.rpc.CloseConnection()
|
||||
for c.rpc.conn != nil {
|
||||
time.Sleep(time.Millisecond * 100)
|
||||
}
|
||||
err := c.Connect()
|
||||
if err != nil {
|
||||
c.Logger.Err(err).Any("tachyonAuthToken", c.authData.TachyonAuthToken).Msg("Failed to reconnect")
|
||||
return err
|
||||
}
|
||||
c.Logger.Debug().Any("tachyonAuthToken", c.authData.TachyonAuthToken).Msg("Successfully reconnected to server")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Client) triggerEvent(evt interface{}) {
|
||||
|
@ -161,63 +202,39 @@ func (c *Client) triggerEvent(evt interface{}) {
|
|||
}
|
||||
|
||||
func (c *Client) setApiMethods() {
|
||||
c.Conversations = &Conversations{
|
||||
client: c,
|
||||
openConversation: openConversation{
|
||||
client: c,
|
||||
},
|
||||
fetchConversationMessages: fetchConversationMessages{
|
||||
client: c,
|
||||
},
|
||||
}
|
||||
c.Session = &Session{
|
||||
client: c,
|
||||
prepareNewSession: prepareNewSession{
|
||||
client: c,
|
||||
},
|
||||
newSession: newSession{
|
||||
client: c,
|
||||
},
|
||||
}
|
||||
c.Conversations = &Conversations{client: c}
|
||||
c.Session = &Session{client: c}
|
||||
c.Messages = &Messages{client: c}
|
||||
}
|
||||
|
||||
func (c *Client) decryptImages(messages *binary.FetchMessagesResponse) error {
|
||||
func (c *Client) decryptMedias(messages *binary.FetchMessagesResponse) error {
|
||||
for _, msg := range messages.Messages {
|
||||
switch msg.GetType() {
|
||||
case *binary.MessageType_IMAGE.Enum():
|
||||
for _, details := range msg.GetMessageInfo() {
|
||||
switch data := details.GetData().(type) {
|
||||
case *binary.MessageInfo_ImageContent:
|
||||
decryptedImageData, err := c.decryptImageData(data.ImageContent.ImageID, data.ImageContent.DecryptionKey)
|
||||
case *binary.MessageInfo_MediaContent:
|
||||
decryptedMediaData, err := c.decryptMediaData(data.MediaContent.MediaID, data.MediaContent.DecryptionKey)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
log.Fatal(err)
|
||||
return err
|
||||
}
|
||||
data.ImageContent.ImageData = decryptedImageData
|
||||
}
|
||||
data.MediaContent.MediaData = decryptedMediaData
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Client) decryptImageData(imageId string, key []byte) ([]byte, error) {
|
||||
func (c *Client) decryptMediaData(mediaId string, key []byte) ([]byte, error) {
|
||||
reqId := util.RandomUUIDv4()
|
||||
download_metadata := &binary.UploadImagePayload{
|
||||
MetaData: &binary.ImageMetaData{
|
||||
ImageID: imageId,
|
||||
ImageID: mediaId,
|
||||
Encrypted: true,
|
||||
},
|
||||
AuthData: &binary.AuthMessage{
|
||||
RequestID: reqId,
|
||||
RpcKey: c.rpcKey,
|
||||
Date: &binary.Date{
|
||||
Year: 2023,
|
||||
Seq1: 6,
|
||||
Seq2: 22,
|
||||
Seq3: 4,
|
||||
Seq4: 6,
|
||||
},
|
||||
TachyonAuthToken: c.authData.TachyonAuthToken,
|
||||
ConfigVersion: payload.ConfigMessage,
|
||||
},
|
||||
}
|
||||
download_metadata_bytes, err2 := binary.EncodeProtoMessage(download_metadata)
|
||||
|
@ -244,8 +261,154 @@ func (c *Client) decryptImageData(imageId string, key []byte) ([]byte, error) {
|
|||
c.imageCryptor.UpdateDecryptionKey(key)
|
||||
decryptedImageBytes, decryptionErr := c.imageCryptor.DecryptData(encryptedBuffImg)
|
||||
if decryptionErr != nil {
|
||||
c.Logger.Err(err).Msg("Image decryption failed")
|
||||
log.Println("Error:", decryptionErr)
|
||||
return nil, decryptionErr
|
||||
}
|
||||
return decryptedImageBytes, nil
|
||||
}
|
||||
|
||||
func (c *Client) FetchConfigVersion() {
|
||||
req, bErr := http.NewRequest("GET", util.CONFIG_URL, nil)
|
||||
if bErr != nil {
|
||||
log.Fatal(bErr)
|
||||
}
|
||||
|
||||
configRes, requestErr := c.http.Do(req)
|
||||
if requestErr != nil {
|
||||
log.Fatal(requestErr)
|
||||
}
|
||||
|
||||
responseBody, readErr := io.ReadAll(configRes.Body)
|
||||
if readErr != nil {
|
||||
log.Fatal(readErr)
|
||||
}
|
||||
|
||||
version, parseErr := util.ParseConfigVersion(responseBody)
|
||||
if parseErr != nil {
|
||||
log.Fatal(parseErr)
|
||||
}
|
||||
|
||||
currVersion := payload.ConfigMessage
|
||||
if version.V1 != currVersion.V1 || version.V2 != currVersion.V2 || version.V3 != currVersion.V3 {
|
||||
toLog := c.diffVersionFormat(currVersion, version)
|
||||
c.Logger.Info().Any("version", toLog).Msg("There's a new version available!")
|
||||
} else {
|
||||
c.Logger.Info().Any("version", currVersion).Msg("You are running on the latest version.")
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) diffVersionFormat(curr *binary.ConfigVersion, latest *binary.ConfigVersion) string {
|
||||
return fmt.Sprintf("%d.%d.%d -> %d.%d.%d", curr.V1, curr.V2, curr.V3, latest.V1, latest.V2, latest.V3)
|
||||
}
|
||||
|
||||
func (c *Client) updateWebEncryptionKey(key []byte) {
|
||||
c.Logger.Debug().Any("key", key).Msg("Updated WebEncryptionKey")
|
||||
c.authData.WebEncryptionKey = key
|
||||
}
|
||||
|
||||
func (c *Client) updateJWK(jwk *crypto.JWK) {
|
||||
c.Logger.Debug().Any("jwk", jwk).Msg("Updated JWK")
|
||||
c.authData.JWK = jwk
|
||||
}
|
||||
|
||||
func (c *Client) updateTachyonAuthToken(t []byte) {
|
||||
authenticatedAt := util.TimestampNow()
|
||||
c.authData.TachyonAuthToken = t
|
||||
c.authData.AuthenticatedAt = &authenticatedAt
|
||||
c.Logger.Debug().Any("authenticatedAt", authenticatedAt).Any("tachyonAuthToken", t).Msg("Updated TachyonAuthToken")
|
||||
}
|
||||
|
||||
func (c *Client) updateTTL(ttl int64) {
|
||||
c.authData.TTL = ttl
|
||||
c.Logger.Debug().Any("ttl", ttl).Msg("Updated TTL")
|
||||
}
|
||||
|
||||
func (c *Client) updateDevicePair(devicePair *pblite.DevicePair) {
|
||||
c.authData.DevicePair = devicePair
|
||||
c.Logger.Debug().Any("devicePair", devicePair).Msg("Updated DevicePair")
|
||||
}
|
||||
|
||||
func (c *Client) SaveAuthSession(path string) error {
|
||||
toSaveJson, jsonErr := json.Marshal(c.authData)
|
||||
if jsonErr != nil {
|
||||
return jsonErr
|
||||
}
|
||||
writeErr := os.WriteFile(path, toSaveJson, os.ModePerm)
|
||||
return writeErr
|
||||
}
|
||||
|
||||
func LoadAuthSession(path string) (*AuthData, error) {
|
||||
jsonData, readErr := os.ReadFile(path)
|
||||
if readErr != nil {
|
||||
return nil, readErr
|
||||
}
|
||||
|
||||
sessionData := &AuthData{}
|
||||
marshalErr := json.Unmarshal(jsonData, sessionData)
|
||||
if marshalErr != nil {
|
||||
return nil, marshalErr
|
||||
}
|
||||
|
||||
return sessionData, nil
|
||||
}
|
||||
|
||||
func (c *Client) refreshAuthToken() error {
|
||||
|
||||
jwk := c.authData.JWK
|
||||
requestId := util.RandomUUIDv4()
|
||||
timestamp := time.Now().UnixMilli() * 1000
|
||||
|
||||
sig, sigErr := jwk.SignRequest(requestId, int64(timestamp))
|
||||
if sigErr != nil {
|
||||
return sigErr
|
||||
}
|
||||
|
||||
payloadMessage, messageErr := payload.RegisterRefresh(sig, requestId, int64(timestamp), c.authData.DevicePair.Browser, c.authData.TachyonAuthToken)
|
||||
if messageErr != nil {
|
||||
return messageErr
|
||||
}
|
||||
|
||||
c.Logger.Info().Any("payload", string(payloadMessage)).Msg("Attempting to refresh auth token")
|
||||
|
||||
refreshResponse, requestErr := c.rpc.sendMessageRequest(util.REGISTER_REFRESH, payloadMessage)
|
||||
if requestErr != nil {
|
||||
return requestErr
|
||||
}
|
||||
|
||||
if refreshResponse.StatusCode == 401 {
|
||||
return fmt.Errorf("failed to refresh auth token: unauthorized (try reauthenticating through qr code)")
|
||||
}
|
||||
|
||||
if refreshResponse.StatusCode == 400 {
|
||||
return fmt.Errorf("failed to refresh auth token: signature failed")
|
||||
}
|
||||
responseBody, readErr := io.ReadAll(refreshResponse.Body)
|
||||
if readErr != nil {
|
||||
return readErr
|
||||
}
|
||||
|
||||
var deserialized []interface{}
|
||||
|
||||
marshalErr := json.Unmarshal(responseBody, &deserialized)
|
||||
if marshalErr != nil {
|
||||
return marshalErr
|
||||
}
|
||||
|
||||
resp := &binary.RegisterRefreshResponse{}
|
||||
|
||||
deserializeErr := pblite.Deserialize(deserialized, resp.ProtoReflect())
|
||||
if deserializeErr != nil {
|
||||
return deserializeErr
|
||||
}
|
||||
|
||||
token := resp.GetTokenData().GetTachyonAuthToken()
|
||||
if token == nil {
|
||||
return fmt.Errorf("failed to refresh auth token: something happened")
|
||||
}
|
||||
|
||||
c.Logger.Error().Any("expiry", resp.GetTokenData().GetValidFor()).Msg("TACHYON TOKEN VALID FOR")
|
||||
|
||||
c.updateTachyonAuthToken(token)
|
||||
c.triggerEvent(events.NewAuthTokenRefreshed(token))
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -1,33 +0,0 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/util"
|
||||
)
|
||||
|
||||
func (c *Client) processSessionResponse(prepareSession []*Response, newSession []*Response) (*util.SessionResponse, error) {
|
||||
prepDecoded, prepDecodeErr := prepareSession[0].decryptData()
|
||||
if prepDecodeErr != nil {
|
||||
return nil, prepDecodeErr
|
||||
}
|
||||
|
||||
sessDecoded, sessDecodeErr := newSession[0].decryptData()
|
||||
if sessDecodeErr != nil {
|
||||
return nil, sessDecodeErr
|
||||
}
|
||||
|
||||
sess := sessDecoded.(*binary.NewSession)
|
||||
prep := prepDecoded.(*binary.PrepareNewSession)
|
||||
return &util.SessionResponse{
|
||||
Success: prep.Success,
|
||||
Settings: sess.Settings,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (c *Client) processFetchMessagesResponse(fetchMessagesRes []*Response, openConversationRes []*Response, setActiveConversationRes []*Response) (*binary.FetchMessagesResponse, error) {
|
||||
messagesDecoded, messagesDecodeErr := fetchMessagesRes[0].decryptData()
|
||||
if messagesDecodeErr != nil {
|
||||
return nil, messagesDecodeErr
|
||||
}
|
||||
return messagesDecoded.(*binary.FetchMessagesResponse), nil
|
||||
}
|
95
libgm/conversation_builder.go
Normal file
95
libgm/conversation_builder.go
Normal file
|
@ -0,0 +1,95 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
"google.golang.org/protobuf/proto"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
)
|
||||
|
||||
type ConversationBuilderError struct {
|
||||
errMsg string
|
||||
}
|
||||
|
||||
func (cbe *ConversationBuilderError) Error() string {
|
||||
return fmt.Sprintf("Failed to build conversation builder: %s", cbe.errMsg)
|
||||
}
|
||||
|
||||
type ConversationBuilder struct {
|
||||
conversationId string
|
||||
|
||||
actionStatus binary.ConversationActionStatus
|
||||
status binary.ConversationStatus
|
||||
muteStatus *binary.ConversationMuteStatus
|
||||
}
|
||||
|
||||
func (cb *ConversationBuilder) SetConversationId(conversationId string) *ConversationBuilder {
|
||||
cb.conversationId = conversationId
|
||||
return cb
|
||||
}
|
||||
|
||||
// For block, unblock, block & report
|
||||
func (cb *ConversationBuilder) SetConversationActionStatus(actionStatus binary.ConversationActionStatus) *ConversationBuilder {
|
||||
cb.actionStatus = actionStatus
|
||||
return cb
|
||||
}
|
||||
|
||||
// For archive, unarchive, delete
|
||||
func (cb *ConversationBuilder) SetConversationStatus(status binary.ConversationStatus) *ConversationBuilder {
|
||||
cb.status = status
|
||||
return cb
|
||||
}
|
||||
|
||||
func (cb *ConversationBuilder) SetMuteStatus(muteStatus *binary.ConversationMuteStatus) *ConversationBuilder {
|
||||
cb.muteStatus = muteStatus
|
||||
return cb
|
||||
}
|
||||
|
||||
func (cb *ConversationBuilder) Build(protoMessage proto.Message) (proto.Message, error) {
|
||||
if cb.conversationId == "" {
|
||||
return nil, &ConversationBuilderError{errMsg: "conversationID can not be empty"}
|
||||
}
|
||||
|
||||
switch protoMessage.(type) {
|
||||
case *binary.UpdateConversationPayload:
|
||||
payload, failedBuild := cb.buildUpdateConversationPayload()
|
||||
if failedBuild != nil {
|
||||
return nil, failedBuild
|
||||
}
|
||||
return payload, nil
|
||||
default:
|
||||
log.Fatal("Invalid protoMessage conversation builder type")
|
||||
}
|
||||
return nil, &ConversationBuilderError{errMsg: "failed to build for unknown reasons"}
|
||||
}
|
||||
|
||||
func (cb *ConversationBuilder) buildUpdateConversationPayload() (*binary.UpdateConversationPayload, error) {
|
||||
if cb.actionStatus == 0 && cb.status == 0 && cb.muteStatus == nil {
|
||||
return nil, &ConversationBuilderError{errMsg: "actionStatus, status & muteStatus can not be empty when updating conversation, set atleast 1"}
|
||||
}
|
||||
|
||||
payload := &binary.UpdateConversationPayload{}
|
||||
|
||||
if cb.actionStatus != 0 {
|
||||
payload.Action = cb.actionStatus
|
||||
payload.Action5 = &binary.ConversationAction5{
|
||||
Field2: true,
|
||||
}
|
||||
payload.ConversationID = cb.conversationId
|
||||
} else if cb.status != 0 || cb.muteStatus != nil {
|
||||
payload.Data = &binary.UpdateConversationData{ConversationID: cb.conversationId}
|
||||
if cb.muteStatus != nil {
|
||||
payload.Data.Data = &binary.UpdateConversationData_Mute{Mute: *cb.muteStatus}
|
||||
} else if cb.status != 0 {
|
||||
payload.Data.Data = &binary.UpdateConversationData_Status{Status: cb.status}
|
||||
}
|
||||
}
|
||||
|
||||
return payload, nil
|
||||
}
|
||||
|
||||
func (c *Client) NewConversationBuilder() *ConversationBuilder {
|
||||
return &ConversationBuilder{}
|
||||
}
|
11
libgm/conversation_handler.go
Normal file
11
libgm/conversation_handler.go
Normal file
|
@ -0,0 +1,11 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
)
|
||||
|
||||
func (c *Client) handleConversationEvent(res *pblite.Response, data *binary.Conversation) {
|
||||
c.triggerEvent(data)
|
||||
}
|
|
@ -9,192 +9,116 @@ import (
|
|||
type Conversations struct {
|
||||
client *Client
|
||||
|
||||
watching string // current open conversation
|
||||
|
||||
openConversation openConversation
|
||||
fetchConversationMessages fetchConversationMessages
|
||||
synced bool
|
||||
}
|
||||
|
||||
// default is 25 count
|
||||
func (c *Conversations) List(count int64) (*binary.Conversations, error) {
|
||||
encryptedProtoPayload := &binary.ListCoversationsPayload{Count: count, Field4: 1}
|
||||
instruction, _ := c.client.instructions.GetInstruction(LIST_CONVERSATIONS)
|
||||
sentRequestID, _ := c.client.createAndSendRequest(instruction.Opcode, c.client.ttl, false, encryptedProtoPayload.ProtoReflect())
|
||||
payload := &binary.ListCoversationsPayload{Count: count, Field4: 1}
|
||||
var actionType binary.ActionType
|
||||
|
||||
responses, err := c.client.sessionHandler.WaitForResponse(sentRequestID, instruction.Opcode)
|
||||
if !c.synced {
|
||||
actionType = binary.ActionType_LIST_CONVERSATIONS_SYNC
|
||||
c.synced = true
|
||||
} else {
|
||||
actionType = binary.ActionType_LIST_CONVERSATIONS
|
||||
}
|
||||
|
||||
sentRequestId, sendErr := c.client.sessionHandler.completeSendMessage(actionType, true, payload)
|
||||
if sendErr != nil {
|
||||
return nil, sendErr
|
||||
}
|
||||
|
||||
response, err := c.client.sessionHandler.WaitForResponse(sentRequestId, actionType)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
decryptedProto, decryptErr := responses[0].decryptData()
|
||||
|
||||
res, ok := response.Data.Decrypted.(*binary.Conversations)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("failed to assert response into Conversations")
|
||||
}
|
||||
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (c *Conversations) GetType(conversationId string) (*binary.GetConversationTypeResponse, error) {
|
||||
payload := &binary.ConversationTypePayload{ConversationID: conversationId}
|
||||
actionType := binary.ActionType_GET_CONVERSATION_TYPE
|
||||
|
||||
sentRequestId, sendErr := c.client.sessionHandler.completeSendMessage(actionType, true, payload)
|
||||
if sendErr != nil {
|
||||
return nil, sendErr
|
||||
}
|
||||
|
||||
response, err := c.client.sessionHandler.WaitForResponse(sentRequestId, actionType)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
res, ok := response.Data.Decrypted.(*binary.GetConversationTypeResponse)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("failed to assert response into GetConversationTypeResponse")
|
||||
}
|
||||
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (c *Conversations) FetchMessages(conversationId string, count int64, cursor *binary.Cursor) (*binary.FetchMessagesResponse, error) {
|
||||
payload := &binary.FetchConversationMessagesPayload{ConversationID: conversationId, Count: count}
|
||||
if cursor != nil {
|
||||
payload.Cursor = cursor
|
||||
}
|
||||
|
||||
actionType := binary.ActionType_LIST_MESSAGES
|
||||
|
||||
sentRequestId, sendErr := c.client.sessionHandler.completeSendMessage(actionType, true, payload)
|
||||
if sendErr != nil {
|
||||
return nil, sendErr
|
||||
}
|
||||
|
||||
response, err := c.client.sessionHandler.WaitForResponse(sentRequestId, actionType)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
res, ok := response.Data.Decrypted.(*binary.FetchMessagesResponse)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("failed to assert response into FetchMessagesResponse")
|
||||
}
|
||||
|
||||
decryptErr := c.client.decryptMedias(res)
|
||||
if decryptErr != nil {
|
||||
return nil, decryptErr
|
||||
}
|
||||
|
||||
if decryptedData, ok := decryptedProto.(*binary.Conversations); ok {
|
||||
return decryptedData, nil
|
||||
} else {
|
||||
return nil, fmt.Errorf("failed to assert decryptedProto into type Conversations")
|
||||
}
|
||||
c.client.Logger.Debug().Any("messageData", res).Msg("fetchmessages")
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (c *Conversations) SendMessage(messageBuilder *MessageBuilder, selfParticipantID string) (*binary.SendMessageResponse, error) {
|
||||
hasSelfParticipantId := messageBuilder.GetSelfParticipantID()
|
||||
if hasSelfParticipantId == "" {
|
||||
messageBuilder.SetSelfParticipantID(selfParticipantID)
|
||||
}
|
||||
|
||||
encryptedProtoPayload, failedToBuild := messageBuilder.Build()
|
||||
func (c *Conversations) SendMessage(messageBuilder *MessageBuilder) (*binary.SendMessageResponse, error) {
|
||||
payload, failedToBuild := messageBuilder.Build()
|
||||
if failedToBuild != nil {
|
||||
panic(failedToBuild)
|
||||
return nil, failedToBuild
|
||||
}
|
||||
|
||||
instruction, _ := c.client.instructions.GetInstruction(SEND_TEXT_MESSAGE)
|
||||
c.client.Logger.Debug().Any("payload", encryptedProtoPayload).Msg("SendMessage Payload")
|
||||
sentRequestID, _ := c.client.createAndSendRequest(instruction.Opcode, c.client.ttl, false, encryptedProtoPayload.ProtoReflect())
|
||||
actionType := binary.ActionType_SEND_MESSAGE
|
||||
|
||||
responses, err := c.client.sessionHandler.WaitForResponse(sentRequestID, instruction.Opcode)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return nil, err
|
||||
sentRequestId, sendErr := c.client.sessionHandler.completeSendMessage(actionType, true, payload)
|
||||
if sendErr != nil {
|
||||
return nil, sendErr
|
||||
}
|
||||
|
||||
decryptedProto, decryptErr := responses[0].decryptData()
|
||||
if decryptErr != nil {
|
||||
return nil, decryptErr
|
||||
}
|
||||
|
||||
if decryptedData, ok := decryptedProto.(*binary.SendMessageResponse); ok {
|
||||
return decryptedData, nil
|
||||
} else {
|
||||
return nil, fmt.Errorf("failed to assert decryptedProto into type SendMessageResponse")
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Conversations) FetchMessages(convId string, count int64, cursor *binary.Cursor) (*binary.FetchMessagesResponse, error) {
|
||||
|
||||
var openConversationRes []*Response
|
||||
var openConversationErr error
|
||||
if c.watching != convId {
|
||||
openConversationRes, openConversationErr = c.openConversation.Execute(convId)
|
||||
if openConversationErr != nil {
|
||||
return nil, openConversationErr
|
||||
}
|
||||
c.watching = convId
|
||||
}
|
||||
|
||||
fetchMessagesRes, fetchMessagesErr := c.fetchConversationMessages.Execute(convId, count, cursor)
|
||||
if fetchMessagesErr != nil {
|
||||
return nil, fetchMessagesErr
|
||||
}
|
||||
|
||||
fetchedMessagesResponse, processFail := c.client.processFetchMessagesResponse(fetchMessagesRes, openConversationRes, nil)
|
||||
if processFail != nil {
|
||||
return nil, processFail
|
||||
}
|
||||
|
||||
return fetchedMessagesResponse, nil
|
||||
}
|
||||
|
||||
type fetchConversationMessages struct {
|
||||
client *Client
|
||||
}
|
||||
|
||||
func (f *fetchConversationMessages) Execute(convId string, count int64, cursor *binary.Cursor) ([]*Response, error) {
|
||||
encryptedProtoPayload := &binary.FetchConversationMessagesPayload{ConversationID: convId, Count: count, Cursor: cursor}
|
||||
instruction, _ := f.client.instructions.GetInstruction(FETCH_MESSAGES_CONVERSATION)
|
||||
sentRequestID, _ := f.client.createAndSendRequest(instruction.Opcode, f.client.ttl, false, encryptedProtoPayload.ProtoReflect())
|
||||
|
||||
responses, err := f.client.sessionHandler.WaitForResponse(sentRequestID, instruction.Opcode)
|
||||
response, err := c.client.sessionHandler.WaitForResponse(sentRequestId, actionType)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return responses, nil
|
||||
res, ok := response.Data.Decrypted.(*binary.SendMessageResponse)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("failed to assert response into SendMessageResponse")
|
||||
}
|
||||
|
||||
c.client.Logger.Debug().Any("res", res).Msg("sent message!")
|
||||
return res, nil
|
||||
}
|
||||
|
||||
type openConversation struct {
|
||||
client *Client
|
||||
}
|
||||
|
||||
func (o *openConversation) Execute(convId string) ([]*Response, error) {
|
||||
encryptedProtoPayload := &binary.OpenConversationPayload{ConversationID: convId}
|
||||
instruction, _ := o.client.instructions.GetInstruction(OPEN_CONVERSATION)
|
||||
sentRequestID, _ := o.client.createAndSendRequest(instruction.Opcode, o.client.ttl, false, encryptedProtoPayload.ProtoReflect())
|
||||
|
||||
responses, err := o.client.sessionHandler.WaitForResponse(sentRequestID, instruction.Opcode)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Rest of the processing...
|
||||
|
||||
return responses, nil
|
||||
}
|
||||
|
||||
/*
|
||||
func (c *Conversations) SendMessage(conversationID string, content string, participantCount string) (*binary.SendMessageResponse, error) {
|
||||
encryptedProtoPayload := payload.NewSendConversationTextMessage(conversationID, content, participantCount)
|
||||
sentRequestID, _ := c.client.createAndSendRequest(3, c.client.ttl, false, encryptedProtoPayload.ProtoReflect())
|
||||
c.client.Logger.Debug().Any("requestId", sentRequestID).Msg("Sent sendmessage request.")
|
||||
response, responseErr := c.client.sessionHandler.WaitForResponse(sentRequestID, 3)
|
||||
if responseErr != nil {
|
||||
c.client.Logger.Err(responseErr).Msg("SendMessage channel response error")
|
||||
return nil, responseErr
|
||||
} else {
|
||||
decryptedProto, decryptErr := response.decryptData()
|
||||
if decryptErr != nil {
|
||||
return nil, decryptErr
|
||||
}
|
||||
|
||||
if decryptedData, ok := decryptedProto.(*binary.SendMessageResponse); ok {
|
||||
return decryptedData, nil
|
||||
} else {
|
||||
return nil, fmt.Errorf("failed to assert decryptedProto into type SendMessageResponse")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Conversations) PrepareOpen() (interface{}, error) {
|
||||
encryptedProtoPayload := &binary.PrepareOpenConversationPayload{Field2:1}
|
||||
sentRequestID, _ := c.client.createAndSendRequest(22, c.client.ttl, false, encryptedProtoPayload.ProtoReflect())
|
||||
c.client.Logger.Debug().Any("requestId", sentRequestID).Msg("Sent PrepareOpenConversation request.")
|
||||
response, responseErr := c.client.sessionHandler.WaitForResponse(sentRequestID, 22)
|
||||
if responseErr != nil {
|
||||
c.client.Logger.Err(responseErr).Msg("PrepareOpenConversation channel response error")
|
||||
return nil, responseErr
|
||||
} else {
|
||||
c.client.Logger.Info().Any("response", response).Msg("PrepareOpenConversation response data")
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (c *Conversations) Open(conversationID string) (interface{}, error) {
|
||||
encryptedProtoPayload := &binary.OpenConversationPayload{ConversationID:conversationID}
|
||||
sentRequestID, _ := c.client.createAndSendRequest(21, c.client.ttl, false, encryptedProtoPayload.ProtoReflect())
|
||||
c.client.Logger.Debug().Any("requestId", sentRequestID).Msg("Sent OpenConversation request.")
|
||||
response, responseErr := c.client.sessionHandler.WaitForResponse(sentRequestID, 21)
|
||||
if responseErr != nil {
|
||||
c.client.Logger.Err(responseErr).Msg("OpenConversation channel response error")
|
||||
return nil, responseErr
|
||||
} else {
|
||||
c.client.Logger.Info().Any("response", response).Msg("OpenConversation response data")
|
||||
}
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (c *Conversations) FetchMessages(conversationID string, count int64) (*binary.FetchMessagesResponse, error) {
|
||||
encryptedProtoPayload := &binary.FetchConversationMessagesPayload{ConversationID:conversationID,Count:count}
|
||||
sentRequestID, _ := c.client.createAndSendRequest(2, c.client.ttl, false, encryptedProtoPayload.ProtoReflect())
|
||||
c.client.Logger.Debug().Any("requestId", sentRequestID).Msg("Sent FetchMessages request.")
|
||||
response, responseErr := c.client.sessionHandler.WaitForResponse(sentRequestID, 2)
|
||||
if responseErr != nil {
|
||||
c.client.Logger.Err(responseErr).Msg("FetchMessages channel response error")
|
||||
return nil, responseErr
|
||||
} else {
|
||||
decryptedMessages, decryptedErr := c.client.newMessagesResponse(response)
|
||||
if decryptedErr != nil {
|
||||
return nil, decryptedErr
|
||||
}
|
||||
return decryptedMessages, nil
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
|
|
@ -18,7 +18,33 @@ type JWK struct {
|
|||
Y string `json:"y"`
|
||||
Ext bool `json:"ext"`
|
||||
KeyOps []string `json:"key_ops"`
|
||||
PrivateBytes []byte `json:"privateBytes,omitempty"`
|
||||
PrivateBytes []byte `json:"private_bytes,omitempty"`
|
||||
}
|
||||
|
||||
func (t *JWK) GetPrivateKey() (*ecdsa.PrivateKey, error) {
|
||||
curve := elliptic.P256()
|
||||
xBytes, err := base64.RawURLEncoding.DecodeString(t.X)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
yBytes, err := base64.RawURLEncoding.DecodeString(t.Y)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
dBytes, err := base64.RawURLEncoding.DecodeString(t.D)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
priv := &ecdsa.PrivateKey{
|
||||
PublicKey: ecdsa.PublicKey{
|
||||
Curve: curve,
|
||||
X: new(big.Int).SetBytes(xBytes),
|
||||
Y: new(big.Int).SetBytes(yBytes),
|
||||
},
|
||||
D: new(big.Int).SetBytes(dBytes),
|
||||
}
|
||||
return priv, nil
|
||||
}
|
||||
|
||||
// Returns a byte slice containing the JWK and an error if the generation or export failed.
|
||||
|
|
|
@ -9,27 +9,27 @@ import (
|
|||
"errors"
|
||||
"io"
|
||||
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
"google.golang.org/protobuf/proto"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
)
|
||||
|
||||
type Cryptor struct {
|
||||
AESCTR256Key []byte
|
||||
SHA256Key []byte
|
||||
AESKey []byte `json:"aes_key"`
|
||||
HMACKey []byte `json:"hmac_key"`
|
||||
}
|
||||
|
||||
func NewCryptor(aesKey []byte, shaKey []byte) *Cryptor {
|
||||
if aesKey != nil && shaKey != nil {
|
||||
func NewCryptor(aesKey []byte, hmacKey []byte) *Cryptor {
|
||||
if aesKey != nil && hmacKey != nil {
|
||||
return &Cryptor{
|
||||
AESCTR256Key: aesKey,
|
||||
SHA256Key: shaKey,
|
||||
AESKey: aesKey,
|
||||
HMACKey: hmacKey,
|
||||
}
|
||||
}
|
||||
aesKey, shaKey = GenerateKeys()
|
||||
aesKey, hmacKey = GenerateKeys()
|
||||
return &Cryptor{
|
||||
AESCTR256Key: aesKey,
|
||||
SHA256Key: shaKey,
|
||||
AESKey: aesKey,
|
||||
HMACKey: hmacKey,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -39,7 +39,7 @@ func (c *Cryptor) Encrypt(plaintext []byte) ([]byte, error) {
|
|||
return nil, err
|
||||
}
|
||||
|
||||
block, err := aes.NewCipher(c.AESCTR256Key)
|
||||
block, err := aes.NewCipher(c.AESKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ func (c *Cryptor) Encrypt(plaintext []byte) ([]byte, error) {
|
|||
|
||||
ciphertext = append(ciphertext, iv...)
|
||||
|
||||
mac := hmac.New(sha256.New, c.SHA256Key)
|
||||
mac := hmac.New(sha256.New, c.HMACKey)
|
||||
mac.Write(ciphertext)
|
||||
hmac := mac.Sum(nil)
|
||||
|
||||
|
@ -67,7 +67,7 @@ func (c *Cryptor) Decrypt(encryptedData []byte) ([]byte, error) {
|
|||
hmacSignature := encryptedData[len(encryptedData)-32:]
|
||||
encryptedDataWithoutHMAC := encryptedData[:len(encryptedData)-32]
|
||||
|
||||
mac := hmac.New(sha256.New, c.SHA256Key)
|
||||
mac := hmac.New(sha256.New, c.HMACKey)
|
||||
mac.Write(encryptedDataWithoutHMAC)
|
||||
expectedHMAC := mac.Sum(nil)
|
||||
|
||||
|
@ -78,7 +78,7 @@ func (c *Cryptor) Decrypt(encryptedData []byte) ([]byte, error) {
|
|||
iv := encryptedDataWithoutHMAC[len(encryptedDataWithoutHMAC)-16:]
|
||||
encryptedDataWithoutHMAC = encryptedDataWithoutHMAC[:len(encryptedDataWithoutHMAC)-16]
|
||||
|
||||
block, err := aes.NewCipher(c.AESCTR256Key)
|
||||
block, err := aes.NewCipher(c.AESKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -88,7 +88,7 @@ func (c *Cryptor) Decrypt(encryptedData []byte) ([]byte, error) {
|
|||
return encryptedDataWithoutHMAC, nil
|
||||
}
|
||||
|
||||
func (c *Cryptor) DecryptAndDecodeData(encryptedData []byte, message protoreflect.ProtoMessage) error {
|
||||
func (c *Cryptor) DecryptAndDecodeData(encryptedData []byte, message proto.Message) error {
|
||||
decryptedData, err := c.Decrypt(encryptedData)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -99,3 +99,17 @@ func (c *Cryptor) DecryptAndDecodeData(encryptedData []byte, message protoreflec
|
|||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Cryptor) EncodeAndEncryptData(message proto.Message) ([]byte, error) {
|
||||
encodedData, encodeErr := binary.EncodeProtoMessage(message)
|
||||
if encodeErr != nil {
|
||||
return nil, encodeErr
|
||||
}
|
||||
|
||||
encryptedData, encryptErr := c.Encrypt(encodedData)
|
||||
if encryptErr != nil {
|
||||
return nil, encryptErr
|
||||
}
|
||||
|
||||
return encryptedData, nil
|
||||
}
|
||||
|
|
|
@ -19,16 +19,3 @@ func DecodeAndEncodeB64(data string, msg proto.Message) error {
|
|||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func DecodeEncodedResponse(data string) (*binary.EncodedResponse, error) {
|
||||
decodedBytes, err := base64.StdEncoding.DecodeString(data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
decodedData := &binary.EncodedResponse{}
|
||||
err = binary.DecodeProtoMessage(decodedBytes, decodedData)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return decodedData, nil
|
||||
}
|
||||
|
|
|
@ -11,6 +11,22 @@ import (
|
|||
var SequenceOne = []int{1, 2, 840, 10045, 2, 1}
|
||||
var SequenceTwo = []int{1, 2, 840, 10045, 3, 1, 7}
|
||||
|
||||
func EncodeBNA(a []byte) []byte {
|
||||
b := 0
|
||||
for b < len(a) && a[b] == 0 {
|
||||
b++
|
||||
}
|
||||
|
||||
c := 0
|
||||
if b < len(a) && (a[b]&128) == 128 {
|
||||
c = 1
|
||||
}
|
||||
|
||||
d := make([]byte, len(a)-b+c)
|
||||
copy(d[c:], a[b:])
|
||||
return d
|
||||
}
|
||||
|
||||
func EncodeValues(a *[]byte, b []int) {
|
||||
*a = append(*a, 6)
|
||||
idx := len(*a)
|
||||
|
|
52
libgm/crypto/signer.go
Normal file
52
libgm/crypto/signer.go
Normal file
|
@ -0,0 +1,52 @@
|
|||
package crypto
|
||||
|
||||
import (
|
||||
"crypto/ecdsa"
|
||||
"crypto/rand"
|
||||
"crypto/sha256"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func (t *JWK) SignRequest(requestId string, timestamp int64) (string, error) {
|
||||
signBytes := []byte(fmt.Sprintf("%s:%d", requestId, timestamp))
|
||||
|
||||
privKey, privErr := t.GetPrivateKey()
|
||||
if privErr != nil {
|
||||
return "", privErr
|
||||
}
|
||||
|
||||
signature, sigErr := t.sign(privKey, signBytes)
|
||||
if sigErr != nil {
|
||||
return "", sigErr
|
||||
}
|
||||
encodedSignature := base64.StdEncoding.EncodeToString(signature)
|
||||
return encodedSignature, nil
|
||||
}
|
||||
|
||||
func (t *JWK) sign(key *ecdsa.PrivateKey, msg []byte) ([]byte, error) {
|
||||
hash := sha256.Sum256(msg)
|
||||
r, s, err := ecdsa.Sign(rand.Reader, key, hash[:])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
rBytes := r.Bytes()
|
||||
sBytes := s.Bytes()
|
||||
|
||||
rBytes = EncodeBNA(rBytes)
|
||||
sBytes = EncodeBNA(sBytes)
|
||||
|
||||
sigLen := len(rBytes) + len(sBytes) + 6 // 2 bytes for each sequence tag and 2 bytes for each length field
|
||||
sig := make([]byte, sigLen)
|
||||
sig[0] = 48
|
||||
sig[1] = byte(sigLen - 2)
|
||||
sig[2] = 2
|
||||
sig[3] = byte(len(rBytes))
|
||||
copy(sig[4:], rBytes)
|
||||
sig[4+len(rBytes)] = 2
|
||||
sig[5+len(rBytes)] = byte(len(sBytes))
|
||||
copy(sig[6+len(rBytes):], sBytes)
|
||||
|
||||
return sig, nil
|
||||
}
|
|
@ -1,33 +1,58 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"google.golang.org/protobuf/proto"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
)
|
||||
|
||||
func (c *Client) handleEventOpCode(response *Response) {
|
||||
c.Logger.Debug().Any("res", response).Msg("got event response?")
|
||||
eventData := &binary.Event{}
|
||||
data, decryptedErr := c.cryptor.Decrypt(response.Data.EncryptedData)
|
||||
if decryptedErr != nil {
|
||||
panic(decryptedErr)
|
||||
var skipCount int32
|
||||
|
||||
func (r *RPC) HandleRPCMsg(msgArr []interface{}) {
|
||||
response, decodeErr := pblite.DecodeAndDecryptInternalMessage(msgArr, r.client.authData.Cryptor)
|
||||
if decodeErr != nil {
|
||||
r.client.Logger.Error().Err(fmt.Errorf("failed to deserialize response %s", msgArr)).Msg("rpc deserialize msg err")
|
||||
return
|
||||
}
|
||||
c.Logger.Debug().Str("protobuf_data", base64.StdEncoding.EncodeToString(data)).Msg("decrypted data")
|
||||
err := proto.Unmarshal(data, eventData)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
//r.client.Logger.Debug().Any("byteLength", len(data)).Any("unmarshaled", response).Any("raw", string(data)).Msg("RPC Msg")
|
||||
if response == nil {
|
||||
r.client.Logger.Error().Err(fmt.Errorf("response data was nil %s", msgArr)).Msg("rpc msg data err")
|
||||
return
|
||||
}
|
||||
switch evt := eventData.Event.(type) {
|
||||
case *binary.Event_MessageEvent:
|
||||
c.handleMessageEvent(response, evt)
|
||||
case *binary.Event_ConversationEvent:
|
||||
c.handleConversationEvent(response, evt)
|
||||
case *binary.Event_UserAlertEvent:
|
||||
c.handleUserAlertEvent(response, evt)
|
||||
//r.client.Logger.Debug().Any("response", response).Msg("decrypted & decoded response")
|
||||
_, waitingForResponse := r.client.sessionHandler.requests[response.Data.RequestId]
|
||||
|
||||
//r.client.Logger.Info().Any("raw", msgArr).Msg("Got msg")
|
||||
//r.client.Logger.Debug().Any("waiting", waitingForResponse).Msg("got request! waiting?")
|
||||
r.client.sessionHandler.addResponseAck(response.ResponseId)
|
||||
if waitingForResponse {
|
||||
r.client.sessionHandler.respondToRequestChannel(response)
|
||||
} else {
|
||||
switch response.BugleRoute {
|
||||
case binary.BugleRoute_PairEvent:
|
||||
r.client.handlePairingEvent(response)
|
||||
case binary.BugleRoute_DataEvent:
|
||||
if skipCount > 0 {
|
||||
skipCount--
|
||||
r.client.Logger.Info().Any("action", response.Data.Action).Any("toSkip", skipCount).Msg("Skipped DataEvent")
|
||||
return
|
||||
}
|
||||
r.client.handleUpdatesEvent(response)
|
||||
default:
|
||||
c.Logger.Debug().Any("res", response).Msg("unknown event")
|
||||
r.client.Logger.Debug().Any("res", response).Msg("Got unknown bugleroute")
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (r *RPC) tryUnmarshalJSON(jsonData []byte, msgArr *[]interface{}) error {
|
||||
err := json.Unmarshal(jsonData, &msgArr)
|
||||
return err
|
||||
}
|
||||
|
||||
func (r *RPC) HandleByLength(data []byte) {
|
||||
r.client.Logger.Debug().Any("byteLength", len(data)).Any("corrupt raw", string(data)).Msg("RPC Corrupt json")
|
||||
}
|
||||
|
|
|
@ -9,5 +9,5 @@ type QR struct {
|
|||
}
|
||||
|
||||
type PairSuccessful struct {
|
||||
*binary.Container
|
||||
*binary.PairedData
|
||||
}
|
||||
|
|
|
@ -3,16 +3,28 @@ package events
|
|||
import (
|
||||
"net/http"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/util"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
)
|
||||
|
||||
type ClientReady struct {
|
||||
Session *util.SessionResponse
|
||||
SessionId string
|
||||
Conversations []*binary.Conversation
|
||||
}
|
||||
|
||||
func NewClientReady(session *util.SessionResponse) *ClientReady {
|
||||
func NewClientReady(sessionId string, conversationList *binary.Conversations) *ClientReady {
|
||||
return &ClientReady{
|
||||
Session: session,
|
||||
SessionId: sessionId,
|
||||
Conversations: conversationList.Conversations,
|
||||
}
|
||||
}
|
||||
|
||||
type AuthTokenRefreshed struct {
|
||||
Token []byte
|
||||
}
|
||||
|
||||
func NewAuthTokenRefreshed(token []byte) *AuthTokenRefreshed {
|
||||
return &AuthTokenRefreshed{
|
||||
Token: token,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
21
libgm/events/settings.go
Normal file
21
libgm/events/settings.go
Normal file
|
@ -0,0 +1,21 @@
|
|||
package events
|
||||
|
||||
import "go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
|
||||
type SettingEvent interface {
|
||||
GetSettings() *binary.Settings
|
||||
}
|
||||
|
||||
type SETTINGS_UPDATED struct {
|
||||
Settings *binary.Settings
|
||||
}
|
||||
|
||||
func (su *SETTINGS_UPDATED) GetSettings() *binary.Settings {
|
||||
return su.Settings
|
||||
}
|
||||
|
||||
func NewSettingsUpdated(settings *binary.Settings) SettingEvent {
|
||||
return &SETTINGS_UPDATED{
|
||||
Settings: settings,
|
||||
}
|
||||
}
|
50
libgm/events/typing.go
Normal file
50
libgm/events/typing.go
Normal file
|
@ -0,0 +1,50 @@
|
|||
package events
|
||||
|
||||
import "go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
|
||||
type TypingEvent interface {
|
||||
GetConversation() string
|
||||
}
|
||||
|
||||
type User struct {
|
||||
Field1 int64
|
||||
Number string
|
||||
}
|
||||
|
||||
type STARTED_TYPING struct {
|
||||
ConversationId string
|
||||
User User
|
||||
}
|
||||
|
||||
func (t *STARTED_TYPING) GetConversation() string {
|
||||
return t.ConversationId
|
||||
}
|
||||
|
||||
func NewStartedTyping(data *binary.TypingData) TypingEvent {
|
||||
return &STARTED_TYPING{
|
||||
ConversationId: data.ConversationID,
|
||||
User: User{
|
||||
Field1: data.User.Field1,
|
||||
Number: data.User.Number,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type STOPPED_TYPING struct {
|
||||
ConversationId string
|
||||
User User
|
||||
}
|
||||
|
||||
func (t *STOPPED_TYPING) GetConversation() string {
|
||||
return t.ConversationId
|
||||
}
|
||||
|
||||
func NewStoppedTyping(data *binary.TypingData) TypingEvent {
|
||||
return &STOPPED_TYPING{
|
||||
ConversationId: data.ConversationID,
|
||||
User: User{
|
||||
Field1: data.User.Field1,
|
||||
Number: data.User.Number,
|
||||
},
|
||||
}
|
||||
}
|
|
@ -1,23 +1,35 @@
|
|||
package events
|
||||
|
||||
type BrowserActive struct {
|
||||
SessionID string
|
||||
SessionId string
|
||||
}
|
||||
|
||||
func NewBrowserActive(sessionID string) *BrowserActive {
|
||||
func NewBrowserActive(sessionId string) *BrowserActive {
|
||||
return &BrowserActive{
|
||||
SessionID: sessionID,
|
||||
SessionId: sessionId,
|
||||
}
|
||||
}
|
||||
|
||||
type Battery struct{}
|
||||
type MOBILE_BATTERY_RESTORED struct{}
|
||||
|
||||
func NewBattery() *Battery {
|
||||
return &Battery{}
|
||||
func NewMobileBatteryRestored() *MOBILE_BATTERY_RESTORED {
|
||||
return &MOBILE_BATTERY_RESTORED{}
|
||||
}
|
||||
|
||||
type DataConnection struct{}
|
||||
type MOBILE_BATTERY_LOW struct{}
|
||||
|
||||
func NewDataConnection() *DataConnection {
|
||||
return &DataConnection{}
|
||||
func NewMobileBatteryLow() *MOBILE_BATTERY_LOW {
|
||||
return &MOBILE_BATTERY_LOW{}
|
||||
}
|
||||
|
||||
type MOBILE_DATA_CONNECTION struct{}
|
||||
|
||||
func NewMobileDataConnection() *MOBILE_DATA_CONNECTION {
|
||||
return &MOBILE_DATA_CONNECTION{}
|
||||
}
|
||||
|
||||
type MOBILE_WIFI_CONNECTION struct{}
|
||||
|
||||
func NewMobileWifiConnection() *MOBILE_WIFI_CONNECTION {
|
||||
return &MOBILE_WIFI_CONNECTION{}
|
||||
}
|
||||
|
|
|
@ -1,9 +0,0 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
)
|
||||
|
||||
func (c *Client) handleConversationEvent(response *Response, evtData *binary.Event_ConversationEvent) {
|
||||
c.triggerEvent(evtData)
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
)
|
||||
|
||||
func (c *Client) handleMessageEvent(response *Response, evtData *binary.Event_MessageEvent) {
|
||||
c.triggerEvent(evtData)
|
||||
}
|
|
@ -1,23 +0,0 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/events"
|
||||
)
|
||||
|
||||
func (c *Client) handleUserAlertEvent(response *Response, evtData *binary.Event_UserAlertEvent) {
|
||||
switch evtData.UserAlertEvent.AlertType {
|
||||
case 2:
|
||||
browserActive := events.NewBrowserActive(response.Data.RequestID)
|
||||
c.triggerEvent(browserActive)
|
||||
return
|
||||
case 5, 6:
|
||||
batteryEvt := events.NewBattery()
|
||||
c.triggerEvent(batteryEvt)
|
||||
return
|
||||
case 3, 4:
|
||||
dataConnectionEvt := events.NewDataConnection()
|
||||
c.triggerEvent(dataConnectionEvt)
|
||||
return
|
||||
}
|
||||
}
|
|
@ -1,78 +0,0 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"google.golang.org/protobuf/proto"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/crypto"
|
||||
)
|
||||
|
||||
const (
|
||||
ROUTING_OPCODE = 19
|
||||
MSG_TYPE_TWO = 2
|
||||
MSG_TYPE_SIXTEEN = 16
|
||||
|
||||
/*
|
||||
Session
|
||||
*/
|
||||
PREPARE_NEW_SESSION_OPCODE = 31
|
||||
NEW_SESSION_OPCODE = 16
|
||||
|
||||
/*
|
||||
Conversation
|
||||
*/
|
||||
LIST_CONVERSATIONS = 1
|
||||
SET_ACTIVE_CONVERSATION = 22
|
||||
OPEN_CONVERSATION = 21
|
||||
FETCH_MESSAGES_CONVERSATION = 2
|
||||
SEND_TEXT_MESSAGE = 3
|
||||
)
|
||||
|
||||
type Instruction struct {
|
||||
cryptor *crypto.Cryptor
|
||||
RoutingOpCode int64
|
||||
Opcode int64
|
||||
MsgType int64
|
||||
EncryptedData []byte
|
||||
DecryptedProtoMessage proto.Message
|
||||
ExpectedResponses int64 // count expected responses
|
||||
ProcessResponses func(responses []*Response) (interface{}, error) // function that decodes & decrypts the slice into appropriate response
|
||||
}
|
||||
|
||||
func (c *Client) EncryptPayloadData(message protoreflect.Message) ([]byte, error) {
|
||||
protoBytes, err1 := binary.EncodeProtoMessage(message.Interface())
|
||||
if err1 != nil {
|
||||
return nil, err1
|
||||
}
|
||||
encryptedBytes, err := c.cryptor.Encrypt(protoBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return encryptedBytes, nil
|
||||
}
|
||||
|
||||
type Instructions struct {
|
||||
data map[int64]*Instruction
|
||||
}
|
||||
|
||||
func NewInstructions(cryptor *crypto.Cryptor) *Instructions {
|
||||
return &Instructions{
|
||||
data: map[int64]*Instruction{
|
||||
PREPARE_NEW_SESSION_OPCODE: {cryptor, ROUTING_OPCODE, PREPARE_NEW_SESSION_OPCODE, MSG_TYPE_TWO, nil, &binary.PrepareNewSession{}, 1, nil},
|
||||
NEW_SESSION_OPCODE: {cryptor, ROUTING_OPCODE, NEW_SESSION_OPCODE, MSG_TYPE_TWO, nil, &binary.NewSession{}, 2, nil}, // create new session
|
||||
LIST_CONVERSATIONS: {cryptor, ROUTING_OPCODE, LIST_CONVERSATIONS, MSG_TYPE_SIXTEEN, nil, &binary.Conversations{}, 1, nil}, // list conversations
|
||||
|
||||
//22: {cryptor,19,22,2,nil,nil}, // SET ACTIVE SESSION WINDOW
|
||||
OPEN_CONVERSATION: {cryptor, ROUTING_OPCODE, OPEN_CONVERSATION, MSG_TYPE_TWO, nil, nil, 2, nil}, // open conversation
|
||||
FETCH_MESSAGES_CONVERSATION: {cryptor, ROUTING_OPCODE, FETCH_MESSAGES_CONVERSATION, MSG_TYPE_TWO, nil, &binary.FetchMessagesResponse{}, 1, nil}, // fetch messages in convo
|
||||
SEND_TEXT_MESSAGE: {cryptor, ROUTING_OPCODE, SEND_TEXT_MESSAGE, MSG_TYPE_TWO, nil, &binary.SendMessageResponse{}, 1, nil},
|
||||
//3: {cryptor,19,3,2,nil,&binary.SendMessageResponse{}}, // send text message
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (i *Instructions) GetInstruction(key int64) (*Instruction, bool) {
|
||||
instruction, ok := i.data[key]
|
||||
return instruction, ok
|
||||
}
|
|
@ -4,11 +4,13 @@ import (
|
|||
"bytes"
|
||||
"errors"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/crypto"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/payload"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/util"
|
||||
)
|
||||
|
||||
|
@ -38,6 +40,7 @@ func (c *Client) FinalizeUploadMedia(upload *StartGoogleUpload) (*MediaUpload, e
|
|||
imageType := upload.Image.GetImageType()
|
||||
encryptedImageSize := strconv.Itoa(len(upload.EncryptedMediaBytes))
|
||||
|
||||
log.Println("EncryptedImageSize:", encryptedImageSize)
|
||||
finalizeUploadHeaders := util.NewMediaUploadHeaders(encryptedImageSize, "upload, finalize", "0", imageType.Format, "")
|
||||
req, reqErr := http.NewRequest("POST", upload.UploadURL, bytes.NewBuffer(upload.EncryptedMediaBytes))
|
||||
if reqErr != nil {
|
||||
|
@ -48,7 +51,7 @@ func (c *Client) FinalizeUploadMedia(upload *StartGoogleUpload) (*MediaUpload, e
|
|||
|
||||
res, resErr := c.http.Do(req)
|
||||
if resErr != nil {
|
||||
panic(resErr)
|
||||
log.Fatal(resErr)
|
||||
}
|
||||
|
||||
statusCode := res.StatusCode
|
||||
|
@ -65,7 +68,7 @@ func (c *Client) FinalizeUploadMedia(upload *StartGoogleUpload) (*MediaUpload, e
|
|||
}
|
||||
|
||||
uploadStatus := rHeaders.Get("x-goog-upload-status")
|
||||
c.Logger.Debug().Str("upload_status", uploadStatus).Msg("Upload status")
|
||||
log.Println("Upload Status: ", uploadStatus)
|
||||
|
||||
mediaIDs := &binary.UploadMediaResponse{}
|
||||
err3 = crypto.DecodeAndEncodeB64(string(googleResponse), mediaIDs)
|
||||
|
@ -103,7 +106,7 @@ func (c *Client) StartUploadMedia(image *Image) (*StartGoogleUpload, error) {
|
|||
|
||||
res, resErr := c.http.Do(req)
|
||||
if resErr != nil {
|
||||
panic(resErr)
|
||||
log.Fatal(resErr)
|
||||
}
|
||||
|
||||
statusCode := res.StatusCode
|
||||
|
@ -132,21 +135,15 @@ func (c *Client) StartUploadMedia(image *Image) (*StartGoogleUpload, error) {
|
|||
}
|
||||
|
||||
func (c *Client) buildStartUploadPayload() (string, error) {
|
||||
requestId := util.RandomUUIDv4()
|
||||
requestID := util.RandomUUIDv4()
|
||||
protoData := &binary.StartMediaUploadPayload{
|
||||
ImageType: 1,
|
||||
AuthData: &binary.AuthMessage{
|
||||
RequestID: requestId,
|
||||
RpcKey: c.rpcKey,
|
||||
Date: &binary.Date{
|
||||
Year: 2023,
|
||||
Seq1: 6,
|
||||
Seq2: 22,
|
||||
Seq3: 4,
|
||||
Seq4: 6,
|
||||
RequestID: requestID,
|
||||
TachyonAuthToken: c.authData.TachyonAuthToken,
|
||||
ConfigVersion: payload.ConfigMessage,
|
||||
},
|
||||
},
|
||||
Mobile: c.devicePair.Mobile,
|
||||
Mobile: c.authData.DevicePair.Mobile,
|
||||
}
|
||||
|
||||
protoDataEncoded, protoEncodeErr := crypto.EncodeProtoB64(protoData)
|
||||
|
|
|
@ -21,12 +21,13 @@ type MessageBuilder struct {
|
|||
tmpID string
|
||||
selfParticipantID string
|
||||
|
||||
replyToMessageID string
|
||||
|
||||
images []*MediaUpload
|
||||
|
||||
err error
|
||||
}
|
||||
|
||||
// Add this method to retrieve the stored error
|
||||
func (mb *MessageBuilder) Err() error {
|
||||
return mb.err
|
||||
}
|
||||
|
@ -39,32 +40,38 @@ func (mb *MessageBuilder) GetContent() string {
|
|||
return mb.content
|
||||
}
|
||||
|
||||
func (mb *MessageBuilder) GetConversationID() string {
|
||||
return mb.conversationID
|
||||
}
|
||||
|
||||
func (mb *MessageBuilder) GetSelfParticipantID() string {
|
||||
return mb.selfParticipantID
|
||||
}
|
||||
|
||||
func (mb *MessageBuilder) GetTmpID() string {
|
||||
return mb.tmpID
|
||||
}
|
||||
|
||||
func (mb *MessageBuilder) SetContent(content string) *MessageBuilder {
|
||||
mb.content = content
|
||||
return mb
|
||||
}
|
||||
|
||||
func (mb *MessageBuilder) GetConversationID() string {
|
||||
return mb.conversationID
|
||||
}
|
||||
|
||||
func (mb *MessageBuilder) SetConversationID(conversationId string) *MessageBuilder {
|
||||
mb.conversationID = conversationId
|
||||
return mb
|
||||
}
|
||||
|
||||
func (mb *MessageBuilder) GetSelfParticipantID() string {
|
||||
return mb.selfParticipantID
|
||||
}
|
||||
|
||||
// sendmessage function will set this automatically but if u want to set it yourself feel free
|
||||
func (mb *MessageBuilder) SetSelfParticipantID(participantId string) *MessageBuilder {
|
||||
mb.selfParticipantID = participantId
|
||||
return mb
|
||||
}
|
||||
|
||||
func (mb *MessageBuilder) GetTmpID() string {
|
||||
return mb.tmpID
|
||||
// messageID of the message to reply to
|
||||
func (mb *MessageBuilder) SetReplyMessage(messageId string) *MessageBuilder {
|
||||
mb.replyToMessageID = messageId
|
||||
return mb
|
||||
}
|
||||
|
||||
// sendmessage function will set this automatically but if u want to set it yourself feel free
|
||||
|
@ -107,10 +114,10 @@ func (c *Client) NewMessageBuilder() *MessageBuilder {
|
|||
|
||||
func (mb *MessageBuilder) newSendConversationMessage() *binary.SendMessagePayload {
|
||||
|
||||
convID := mb.GetConversationID()
|
||||
convId := mb.GetConversationID()
|
||||
content := mb.GetContent()
|
||||
selfParticipantID := mb.GetSelfParticipantID()
|
||||
tmpID := mb.GetTmpID()
|
||||
selfParticipantId := mb.GetSelfParticipantID()
|
||||
tmpId := mb.GetTmpID()
|
||||
|
||||
messageInfo := make([]*binary.MessageInfo, 0)
|
||||
messageInfo = append(messageInfo, &binary.MessageInfo{Data: &binary.MessageInfo_MessageContent{
|
||||
|
@ -122,16 +129,17 @@ func (mb *MessageBuilder) newSendConversationMessage() *binary.SendMessagePayloa
|
|||
mb.appendImagesPayload(&messageInfo)
|
||||
|
||||
sendMsgPayload := &binary.SendMessagePayload{
|
||||
ConversationID: convID,
|
||||
ConversationID: convId,
|
||||
MessagePayload: &binary.MessagePayload{
|
||||
TmpID: tmpID,
|
||||
ConversationID: convID,
|
||||
SelfParticipantID: selfParticipantID,
|
||||
TmpID: tmpId,
|
||||
ConversationID: convId,
|
||||
SelfParticipantID: selfParticipantId,
|
||||
MessageInfo: messageInfo,
|
||||
TmpID2: tmpID,
|
||||
TmpID2: tmpId,
|
||||
},
|
||||
TmpID: tmpID,
|
||||
TmpID: tmpId,
|
||||
}
|
||||
|
||||
if len(content) > 0 {
|
||||
sendMsgPayload.MessagePayload.MessagePayloadContent = &binary.MessagePayloadContent{
|
||||
MessageContent: &binary.MessageContent{
|
||||
|
@ -139,6 +147,12 @@ func (mb *MessageBuilder) newSendConversationMessage() *binary.SendMessagePayloa
|
|||
},
|
||||
}
|
||||
}
|
||||
|
||||
if mb.replyToMessageID != "" {
|
||||
sendMsgPayload.IsReply = true
|
||||
sendMsgPayload.Reply = &binary.ReplyPayload{MessageID: mb.replyToMessageID}
|
||||
}
|
||||
|
||||
mb.client.Logger.Debug().Any("sendMsgPayload", sendMsgPayload).Msg("sendMessagePayload")
|
||||
|
||||
return sendMsgPayload
|
||||
|
@ -157,16 +171,16 @@ func (mb *MessageBuilder) appendImagesPayload(messageInfo *[]*binary.MessageInfo
|
|||
|
||||
func (mb *MessageBuilder) newImageContent(media *MediaUpload) *binary.MessageInfo {
|
||||
imageMessage := &binary.MessageInfo{
|
||||
Data: &binary.MessageInfo_ImageContent{
|
||||
ImageContent: &binary.ImageContent{
|
||||
SomeNumber: media.Image.GetImageType().Type,
|
||||
ImageID: media.MediaID,
|
||||
ImageName: media.Image.GetImageName(),
|
||||
Data: &binary.MessageInfo_MediaContent{
|
||||
MediaContent: &binary.MediaContent{
|
||||
Format: binary.MediaFormats(media.Image.GetImageType().Type),
|
||||
MediaID: media.MediaID,
|
||||
MediaName: media.Image.GetImageName(),
|
||||
Size: media.Image.GetImageSize(),
|
||||
DecryptionKey: media.Image.GetImageCryptor().GetKey(),
|
||||
},
|
||||
},
|
||||
}
|
||||
mb.client.Logger.Debug().Any("imageMessage", imageMessage).Msg("New Image Content")
|
||||
mb.client.Logger.Debug().Any("imageMessage", imageMessage).Msg("New Media Content")
|
||||
return imageMessage
|
||||
}
|
||||
|
|
10
libgm/message_handler.go
Normal file
10
libgm/message_handler.go
Normal file
|
@ -0,0 +1,10 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
)
|
||||
|
||||
func (c *Client) handleMessageEvent(res *pblite.Response, data *binary.Message) {
|
||||
c.triggerEvent(data)
|
||||
}
|
61
libgm/messages.go
Normal file
61
libgm/messages.go
Normal file
|
@ -0,0 +1,61 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
)
|
||||
|
||||
type Messages struct {
|
||||
client *Client
|
||||
}
|
||||
|
||||
func (m *Messages) React(reactionBuilder *ReactionBuilder) (*binary.SendReactionResponse, error) {
|
||||
payload, buildErr := reactionBuilder.Build()
|
||||
if buildErr != nil {
|
||||
return nil, buildErr
|
||||
}
|
||||
|
||||
actionType := binary.ActionType_SEND_REACTION
|
||||
|
||||
sentRequestId, sendErr := m.client.sessionHandler.completeSendMessage(actionType, true, payload)
|
||||
if sendErr != nil {
|
||||
return nil, sendErr
|
||||
}
|
||||
|
||||
response, err := m.client.sessionHandler.WaitForResponse(sentRequestId, actionType)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
res, ok := response.Data.Decrypted.(*binary.SendReactionResponse)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("failed to assert response into SendReactionResponse")
|
||||
}
|
||||
|
||||
m.client.Logger.Debug().Any("res", res).Msg("sent reaction!")
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (m *Messages) Delete(messageId string) (*binary.DeleteMessageResponse, error) {
|
||||
payload := &binary.DeleteMessagePayload{MessageID: messageId}
|
||||
actionType := binary.ActionType_DELETE_MESSAGE
|
||||
|
||||
sentRequestId, sendErr := m.client.sessionHandler.completeSendMessage(actionType, true, payload)
|
||||
if sendErr != nil {
|
||||
return nil, sendErr
|
||||
}
|
||||
|
||||
response, err := m.client.sessionHandler.WaitForResponse(sentRequestId, actionType)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
res, ok := response.Data.Decrypted.(*binary.DeleteMessageResponse)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("failed to assert response into DeleteMessageResponse")
|
||||
}
|
||||
|
||||
m.client.Logger.Debug().Any("res", res).Msg("deleted message!")
|
||||
return res, nil
|
||||
}
|
14
libgm/metadata/emojis.go
Normal file
14
libgm/metadata/emojis.go
Normal file
|
@ -0,0 +1,14 @@
|
|||
package metadata
|
||||
|
||||
var Emojis = map[string]int64{
|
||||
"\U0001F44D": 1, // 👍
|
||||
"\U0001F60D": 2, // 😍
|
||||
"\U0001F602": 3, // 😂
|
||||
"\U0001F62E": 4, // 😮
|
||||
"\U0001F625": 5, // 😥
|
||||
"\U0001F622": 10, // 😢
|
||||
"\U0001F620": 6, // 😠
|
||||
"\U0001F621": 11, // 😡
|
||||
"\U0001F44E": 7, // 👎
|
||||
"\U00002764": 12, // ❤️
|
||||
}
|
|
@ -1,71 +0,0 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
)
|
||||
|
||||
func (r *RPC) HandleRPCMsg(msgArr []interface{}) {
|
||||
/*
|
||||
if data[0] == 44 { // ','
|
||||
data = data[1:]
|
||||
}
|
||||
|
||||
var msgArr []interface{}
|
||||
err := r.tryUnmarshalJSON(data, &msgArr)
|
||||
if err != nil {
|
||||
r.client.Logger.Error().Err(fmt.Errorf("got invalid json string %s", string(data))).Msg("rpc msg err")
|
||||
r.HandleByLength(data)
|
||||
return
|
||||
}
|
||||
*/
|
||||
response := &binary.RPCResponse{}
|
||||
deserializeErr := pblite.Deserialize(msgArr, response.ProtoReflect())
|
||||
if deserializeErr != nil {
|
||||
r.client.Logger.Error().Err(deserializeErr).Msg("meow")
|
||||
r.client.Logger.Error().Err(fmt.Errorf("failed to deserialize response %s", msgArr)).Msg("rpc deserialize msg err")
|
||||
return
|
||||
}
|
||||
//r.client.Logger.Debug().Any("byteLength", len(data)).Any("unmarshaled", response).Any("raw", string(data)).Msg("RPC Msg")
|
||||
if response.Data == nil {
|
||||
r.client.Logger.Error().Err(fmt.Errorf("Response data was nil %s", msgArr)).Msg("rpc msg data err")
|
||||
return
|
||||
}
|
||||
if response.Data.RoutingOpCode == 19 {
|
||||
parsedResponse, failedParse := r.client.sessionHandler.NewResponse(response)
|
||||
if failedParse != nil {
|
||||
panic(failedParse)
|
||||
}
|
||||
//hasBody := parsedResponse.Data.EncryptedData == nil
|
||||
//r.client.Logger.Info().Any("msgData", parsedResponse).Msg("Got event!")
|
||||
r.client.sessionHandler.addResponseAck(parsedResponse.ResponseID)
|
||||
_, waitingForResponse := r.client.sessionHandler.requests[parsedResponse.Data.RequestID]
|
||||
//log.Println(fmt.Sprintf("%v %v %v %v %v %v %v", parsedResponse.RoutingOpCode, parsedResponse.Data.Opcode, parsedResponse.Data.Sub, parsedResponse.Data.Third, parsedResponse.Data.Field9, hasBody, waitingForResponse))
|
||||
//r.client.Logger.Debug().Any("waitingForResponse?", waitingForResponse).Msg("Got rpc response from server")
|
||||
if parsedResponse.Data.Opcode == 16 || waitingForResponse {
|
||||
if waitingForResponse {
|
||||
r.client.sessionHandler.respondToRequestChannel(parsedResponse)
|
||||
return
|
||||
}
|
||||
if parsedResponse.Data.Opcode == 16 {
|
||||
r.client.handleEventOpCode(parsedResponse)
|
||||
}
|
||||
} else {
|
||||
|
||||
}
|
||||
} else {
|
||||
r.client.handleSeperateOpCode(response.Data)
|
||||
}
|
||||
}
|
||||
|
||||
func (r *RPC) tryUnmarshalJSON(jsonData []byte, msgArr *[]interface{}) error {
|
||||
err := json.Unmarshal(jsonData, &msgArr)
|
||||
return err
|
||||
}
|
||||
|
||||
func (r *RPC) HandleByLength(data []byte) {
|
||||
r.client.Logger.Debug().Any("byteLength", len(data)).Any("corrupt raw", string(data)).Msg("RPC Corrupt json")
|
||||
}
|
|
@ -1,47 +0,0 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"encoding/base64"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
)
|
||||
|
||||
func (c *Client) handleSeperateOpCode(msgData *binary.MessageData) {
|
||||
decodedBytes, err := base64.StdEncoding.DecodeString(msgData.EncodedData)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
switch msgData.RoutingOpCode {
|
||||
case 14: // paired successful
|
||||
decodedData := &binary.Container{}
|
||||
err = binary.DecodeProtoMessage(decodedBytes, decodedData)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if decodedData.UnpairDeviceData != nil {
|
||||
c.Logger.Warn().Any("data", decodedData).Msg("Unpaired?")
|
||||
return
|
||||
}
|
||||
// TODO unpairing
|
||||
c.Logger.Debug().Any("data", decodedData).Msg("Paired device decoded data")
|
||||
if c.pairer != nil {
|
||||
c.pairer.pairCallback(decodedData)
|
||||
} else {
|
||||
c.Logger.Warn().Msg("No pairer to receive callback")
|
||||
}
|
||||
default:
|
||||
decodedData := &binary.EncodedResponse{}
|
||||
err = binary.DecodeProtoMessage(decodedBytes, decodedData)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if (decodedData.Sub && decodedData.Third != 0) && decodedData.EncryptedData != nil {
|
||||
bugleData := &binary.BugleBackendService{}
|
||||
err = c.cryptor.DecryptAndDecodeData(decodedData.EncryptedData, bugleData)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
c.handleBugleOpCode(bugleData)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -26,6 +26,7 @@ func (c *Client) NewPairer(keyData *crypto.JWK, refreshQrCodeTime int) (*Pairer,
|
|||
if keyData == nil {
|
||||
var err error
|
||||
keyData, err = crypto.GenerateECDSA_P256_JWK()
|
||||
c.updateJWK(keyData)
|
||||
if err != nil {
|
||||
c.Logger.Error().Any("data", keyData).Msg(err.Error())
|
||||
return nil, err
|
||||
|
@ -46,7 +47,7 @@ func (p *Pairer) RegisterPhoneRelay() (*binary.RegisterPhoneRelayResponse, error
|
|||
p.client.Logger.Err(err)
|
||||
return &binary.RegisterPhoneRelayResponse{}, err
|
||||
}
|
||||
//p.client.Logger.Debug().Any("keyByteLength", len(jsonPayload.EcdsaKeysContainer.EcdsaKeys.EncryptedKeys)).Any("json", jsonPayload).Any("base64", body).Msg("RegisterPhoneRelay Payload")
|
||||
//p.client.Logger.Debug().Any("keyByteLength", len(jsonPayload.GetPairDeviceData().EcdsaKeys.EncryptedKeys)).Any("json", jsonPayload).Any("base64", body).Msg("RegisterPhoneRelay Payload")
|
||||
relayResponse, reqErr := p.client.MakeRelayRequest(util.REGISTER_PHONE_RELAY, body)
|
||||
if reqErr != nil {
|
||||
p.client.Logger.Err(reqErr)
|
||||
|
@ -63,6 +64,7 @@ func (p *Pairer) RegisterPhoneRelay() (*binary.RegisterPhoneRelayResponse, error
|
|||
return nil, err3
|
||||
}
|
||||
p.pairingKey = res.GetPairingKey()
|
||||
p.client.Logger.Debug().Any("response", res).Msg("Registerphonerelay response")
|
||||
url, qrErr := p.GenerateQRCodeData()
|
||||
if qrErr != nil {
|
||||
return nil, qrErr
|
||||
|
@ -86,12 +88,12 @@ func (p *Pairer) startRefreshRelayTask() {
|
|||
}
|
||||
|
||||
func (p *Pairer) RefreshPhoneRelay() {
|
||||
body, _, err := payload.RefreshPhoneRelay(p.client.rpcKey)
|
||||
body, _, err := payload.RefreshPhoneRelay(p.client.authData.TachyonAuthToken)
|
||||
if err != nil {
|
||||
p.client.Logger.Err(err).Msg("refresh phone relay err")
|
||||
return
|
||||
}
|
||||
//p.client.Logger.Debug().Any("keyByteLength", len(jsonPayload.PhoneRelay.RpcKey)).Any("json", jsonPayload).Any("base64", body).Msg("RefreshPhoneRelay Payload")
|
||||
//p.client.Logger.Debug().Any("keyByteLength", len(jsonPayload.PhoneRelay.tachyonAuthToken)).Any("json", jsonPayload).Any("base64", body).Msg("RefreshPhoneRelay Payload")
|
||||
relayResponse, reqErr := p.client.MakeRelayRequest(util.REFRESH_PHONE_RELAY, body)
|
||||
if reqErr != nil {
|
||||
p.client.Logger.Err(reqErr).Msg("refresh phone relay err")
|
||||
|
@ -116,46 +118,36 @@ func (p *Pairer) RefreshPhoneRelay() {
|
|||
p.client.triggerEvent(&events.QR{URL: url})
|
||||
}
|
||||
|
||||
func (p *Pairer) GetWebEncryptionKey(oldKey []byte) []byte {
|
||||
body, _, err2 := payload.GetWebEncryptionKey(oldKey)
|
||||
if err2 != nil {
|
||||
p.client.Logger.Err(err2).Msg("web encryption key err")
|
||||
return nil
|
||||
func (c *Client) GetWebEncryptionKey() (*binary.WebEncryptionKeyResponse, error) {
|
||||
body, rawData, err1 := payload.GetWebEncryptionKey(c.authData.TachyonAuthToken)
|
||||
if err1 != nil {
|
||||
c.Logger.Err(err1).Msg("web encryption key err")
|
||||
return nil, err1
|
||||
}
|
||||
//p.client.Logger.Debug().Any("keyByteLength", len(rawData.PhoneRelay.RpcKey)).Any("json", rawData).Any("base64", body).Msg("GetWebEncryptionKey Payload")
|
||||
webKeyResponse, reqErr := p.client.MakeRelayRequest(util.GET_WEB_ENCRYPTION_KEY, body)
|
||||
c.Logger.Debug().Any("keyByteLength", len(rawData.AuthMessage.TachyonAuthToken)).Any("json", rawData).Any("base64", body).Msg("GetWebEncryptionKey Payload")
|
||||
webKeyResponse, reqErr := c.MakeRelayRequest(util.GET_WEB_ENCRYPTION_KEY, body)
|
||||
if reqErr != nil {
|
||||
p.client.Logger.Err(reqErr).Msg("Web encryption key request err")
|
||||
c.Logger.Err(reqErr).Msg("Web encryption key request err")
|
||||
return nil, reqErr
|
||||
}
|
||||
responseBody, err2 := io.ReadAll(webKeyResponse.Body)
|
||||
defer webKeyResponse.Body.Close()
|
||||
if err2 != nil {
|
||||
p.client.Logger.Err(err2).Msg("Web encryption key read response err")
|
||||
return nil
|
||||
c.Logger.Err(err2).Msg("Web encryption key read response err")
|
||||
return nil, err2
|
||||
}
|
||||
//p.client.Logger.Debug().Any("responseLength", len(responseBody)).Any("raw", responseBody).Msg("Response Body Length")
|
||||
parsedResponse := &binary.WebEncryptionKeyResponse{}
|
||||
err2 = binary.DecodeProtoMessage(responseBody, parsedResponse)
|
||||
if err2 != nil {
|
||||
p.client.Logger.Err(err2).Msg("Parse webkeyresponse into proto struct error")
|
||||
c.Logger.Err(err2).Msg("Parse webkeyresponse into proto struct error")
|
||||
return nil, err2
|
||||
}
|
||||
p.client.Logger.Debug().Any("parsedResponse", parsedResponse).Msg("WebEncryptionKeyResponse")
|
||||
if p.ticker != nil {
|
||||
p.client.Logger.Info().Msg("Reconnecting")
|
||||
p.ticker.Stop()
|
||||
reconnectErr := p.client.Reconnect(p.client.rpc.webAuthKey)
|
||||
if reconnectErr != nil {
|
||||
panic(reconnectErr)
|
||||
c.Logger.Debug().Any("webenckeyresponse", parsedResponse).Msg("Web encryption key")
|
||||
if c.pairer != nil {
|
||||
if c.pairer.ticker != nil {
|
||||
c.pairer.ticker.Stop()
|
||||
}
|
||||
}
|
||||
return parsedResponse.GetKey()
|
||||
}
|
||||
|
||||
func (p *Pairer) pairCallback(pairData *binary.Container) {
|
||||
p.client.rpc.webAuthKey = pairData.PairDeviceData.WebAuthKeyData.WebAuthKey
|
||||
p.client.ttl = pairData.PairDeviceData.WebAuthKeyData.ValidFor
|
||||
p.client.devicePair = &DevicePair{Mobile: pairData.PairDeviceData.Mobile, Browser: pairData.PairDeviceData.Browser}
|
||||
p.client.pairer.GetWebEncryptionKey(p.client.rpc.webAuthKey)
|
||||
p.client.triggerEvent(&events.PairSuccessful{Container: pairData})
|
||||
p.client.pairer = nil
|
||||
return parsedResponse, nil
|
||||
}
|
||||
|
|
62
libgm/pairing_handler.go
Normal file
62
libgm/pairing_handler.go
Normal file
|
@ -0,0 +1,62 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/events"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
)
|
||||
|
||||
func (c *Client) handlePairingEvent(response *pblite.Response) {
|
||||
pairEventData, ok := response.Data.Decrypted.(*binary.PairEvents)
|
||||
|
||||
if !ok {
|
||||
c.Logger.Error().Any("pairEventData", pairEventData).Msg("failed to assert response into PairEvents")
|
||||
return
|
||||
}
|
||||
|
||||
switch evt := pairEventData.Event.(type) {
|
||||
case *binary.PairEvents_Paired:
|
||||
callbackErr := c.pairCallback(evt.Paired)
|
||||
if callbackErr != nil {
|
||||
log.Fatal(callbackErr)
|
||||
}
|
||||
case *binary.PairEvents_Revoked:
|
||||
c.Logger.Debug().Any("data", evt).Msg("Revoked Device")
|
||||
default:
|
||||
c.Logger.Debug().Any("response", response).Any("evt", evt).Msg("Invalid PairEvents type")
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) NewDevicePair(mobile, browser *binary.Device) *pblite.DevicePair {
|
||||
return &pblite.DevicePair{
|
||||
Mobile: mobile,
|
||||
Browser: browser,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) pairCallback(data *binary.PairedData) error {
|
||||
|
||||
tokenData := data.GetTokenData()
|
||||
c.updateTachyonAuthToken(tokenData.GetTachyonAuthToken())
|
||||
c.updateTTL(tokenData.GetTTL())
|
||||
|
||||
devicePair := c.NewDevicePair(data.Mobile, data.Browser)
|
||||
c.updateDevicePair(devicePair)
|
||||
|
||||
webEncryptionKeyResponse, webErr := c.GetWebEncryptionKey()
|
||||
if webErr != nil {
|
||||
return webErr
|
||||
}
|
||||
c.updateWebEncryptionKey(webEncryptionKeyResponse.GetKey())
|
||||
|
||||
c.triggerEvent(&events.PairSuccessful{data})
|
||||
|
||||
reconnectErr := c.Reconnect()
|
||||
if reconnectErr != nil {
|
||||
return reconnectErr
|
||||
}
|
||||
return nil
|
||||
}
|
22
libgm/payload/config.go
Normal file
22
libgm/payload/config.go
Normal file
|
@ -0,0 +1,22 @@
|
|||
package payload
|
||||
|
||||
import (
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/util"
|
||||
)
|
||||
|
||||
// 202306220406
|
||||
var ConfigMessage = &binary.ConfigVersion{
|
||||
V1: 2023,
|
||||
V2: 7,
|
||||
V3: 3,
|
||||
V4: 4,
|
||||
V5: 6,
|
||||
}
|
||||
var Network = "Bugle"
|
||||
var BrowserDetailsMessage = &binary.BrowserDetails{
|
||||
UserAgent: util.USER_AGENT,
|
||||
BrowserType: util.BROWSER_TYPE,
|
||||
Os: util.OS,
|
||||
SomeBool: true,
|
||||
}
|
|
@ -5,19 +5,13 @@ import (
|
|||
"go.mau.fi/mautrix-gmessages/libgm/util"
|
||||
)
|
||||
|
||||
func GetWebEncryptionKey(WebPairKey []byte) ([]byte, *binary.Container, error) {
|
||||
func GetWebEncryptionKey(WebPairKey []byte) ([]byte, *binary.AuthenticationContainer, error) {
|
||||
id := util.RandomUUIDv4()
|
||||
payload := &binary.Container{
|
||||
PhoneRelay: &binary.PhoneRelayBody{
|
||||
ID: id,
|
||||
RpcKey: WebPairKey,
|
||||
Date: &binary.Date{
|
||||
Year: 2023,
|
||||
Seq1: 6,
|
||||
Seq2: 22,
|
||||
Seq3: 4,
|
||||
Seq4: 6,
|
||||
},
|
||||
payload := &binary.AuthenticationContainer{
|
||||
AuthMessage: &binary.AuthenticationMessage{
|
||||
RequestID: id,
|
||||
TachyonAuthToken: WebPairKey,
|
||||
ConfigVersion: ConfigMessage,
|
||||
},
|
||||
}
|
||||
encodedPayload, err2 := binary.EncodeProtoMessage(payload)
|
||||
|
|
|
@ -13,14 +13,8 @@ func ReceiveMessages(rpcKey []byte) ([]byte, string, error) {
|
|||
payload := &binary.ReceiveMessagesRequest{
|
||||
Auth: &binary.AuthMessage{
|
||||
RequestID: uuid.New().String(),
|
||||
RpcKey: rpcKey,
|
||||
Date: &binary.Date{
|
||||
Year: 2023,
|
||||
Seq1: 6,
|
||||
Seq2: 22,
|
||||
Seq3: 4,
|
||||
Seq4: 6,
|
||||
},
|
||||
TachyonAuthToken: rpcKey,
|
||||
ConfigVersion: ConfigMessage,
|
||||
},
|
||||
Unknown: &binary.ReceiveMessagesRequest_UnknownEmptyObject2{
|
||||
Unknown: &binary.ReceiveMessagesRequest_UnknownEmptyObject1{},
|
||||
|
|
|
@ -5,19 +5,13 @@ import (
|
|||
"go.mau.fi/mautrix-gmessages/libgm/util"
|
||||
)
|
||||
|
||||
func RefreshPhoneRelay(rpcKey []byte) ([]byte, *binary.Container, error) {
|
||||
payload := &binary.Container{
|
||||
PhoneRelay: &binary.PhoneRelayBody{
|
||||
ID: util.RandomUUIDv4(),
|
||||
Bugle: "Bugle",
|
||||
RpcKey: rpcKey,
|
||||
Date: &binary.Date{
|
||||
Year: 2023,
|
||||
Seq1: 6,
|
||||
Seq2: 22,
|
||||
Seq3: 4,
|
||||
Seq4: 6,
|
||||
},
|
||||
func RefreshPhoneRelay(rpcKey []byte) ([]byte, *binary.AuthenticationContainer, error) {
|
||||
payload := &binary.AuthenticationContainer{
|
||||
AuthMessage: &binary.AuthenticationMessage{
|
||||
RequestID: util.RandomUUIDv4(),
|
||||
Network: Network,
|
||||
TachyonAuthToken: rpcKey,
|
||||
ConfigVersion: ConfigMessage,
|
||||
},
|
||||
}
|
||||
encodedPayload, err2 := binary.EncodeProtoMessage(payload)
|
||||
|
|
|
@ -6,16 +6,46 @@ import (
|
|||
"go.mau.fi/mautrix-gmessages/libgm/util"
|
||||
)
|
||||
|
||||
func RegisterPhoneRelay(jwk *crypto.JWK) ([]byte, *binary.Container, error) {
|
||||
func RegisterPhoneRelay(jwk *crypto.JWK) ([]byte, *binary.AuthenticationContainer, error) {
|
||||
id := util.RandomUUIDv4()
|
||||
|
||||
encryptedKeys, encryptErr := uncompressKey(jwk)
|
||||
if encryptErr != nil {
|
||||
return nil, nil, encryptErr
|
||||
}
|
||||
|
||||
payloadData := &binary.AuthenticationContainer{
|
||||
AuthMessage: &binary.AuthenticationMessage{
|
||||
RequestID: id,
|
||||
Network: Network,
|
||||
ConfigVersion: ConfigMessage,
|
||||
},
|
||||
BrowserDetails: BrowserDetailsMessage,
|
||||
Data: &binary.AuthenticationContainer_KeyData{
|
||||
KeyData: &binary.KeyData{
|
||||
EcdsaKeys: &binary.ECDSAKeys{
|
||||
Field1: 2,
|
||||
EncryptedKeys: encryptedKeys,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
encoded, err4 := binary.EncodeProtoMessage(payloadData)
|
||||
if err4 != nil {
|
||||
return nil, payloadData, err4
|
||||
}
|
||||
return encoded, payloadData, nil
|
||||
}
|
||||
|
||||
func uncompressKey(jwk *crypto.JWK) ([]byte, error) {
|
||||
decodedPrivateKey, err2 := jwk.PrivKeyB64Bytes()
|
||||
if err2 != nil {
|
||||
return nil, nil, err2
|
||||
return nil, err2
|
||||
}
|
||||
jwk.PrivateBytes = decodedPrivateKey
|
||||
uncompressedPublicKey, err3 := jwk.UncompressPubKey()
|
||||
if err3 != nil {
|
||||
return nil, nil, err3
|
||||
return nil, err3
|
||||
}
|
||||
var emptyByteArray []byte
|
||||
crypto.EncodeValues(&emptyByteArray, crypto.SequenceOne)
|
||||
|
@ -27,37 +57,7 @@ func RegisterPhoneRelay(jwk *crypto.JWK) ([]byte, *binary.Container, error) {
|
|||
copiedByteArray = crypto.HelperAppendBytes(copiedByteArray, value)
|
||||
}
|
||||
|
||||
var emptyByteArray2 []byte
|
||||
emptyByteArray2 = crypto.AppendBytes(emptyByteArray2, copiedByteArray[0:])
|
||||
|
||||
payloadData := &binary.Container{
|
||||
PhoneRelay: &binary.PhoneRelayBody{
|
||||
ID: id,
|
||||
Bugle: "Bugle",
|
||||
Date: &binary.Date{
|
||||
Year: 2023,
|
||||
Seq1: 6,
|
||||
Seq2: 22,
|
||||
Seq3: 4,
|
||||
Seq4: 6,
|
||||
},
|
||||
},
|
||||
BrowserDetails: &binary.BrowserDetails{
|
||||
UserAgent: util.UserAgent,
|
||||
SomeInt: 2,
|
||||
SomeBool: true,
|
||||
Os: util.OS,
|
||||
},
|
||||
PairDeviceData: &binary.PairDeviceData{
|
||||
EcdsaKeys: &binary.ECDSAKeys{
|
||||
ProtoVersion: 2,
|
||||
EncryptedKeys: emptyByteArray2,
|
||||
},
|
||||
},
|
||||
}
|
||||
encoded, err4 := binary.EncodeProtoMessage(payloadData)
|
||||
if err4 != nil {
|
||||
return nil, payloadData, err4
|
||||
}
|
||||
return encoded, payloadData, nil
|
||||
var encryptedKeys []byte
|
||||
encryptedKeys = crypto.AppendBytes(encryptedKeys, copiedByteArray[0:])
|
||||
return encryptedKeys, nil
|
||||
}
|
||||
|
|
35
libgm/payload/registerRefresh.go
Normal file
35
libgm/payload/registerRefresh.go
Normal file
|
@ -0,0 +1,35 @@
|
|||
package payload
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
)
|
||||
|
||||
func RegisterRefresh(sig string, requestId string, timestamp int64, browser *binary.Device, tachyonAuthToken []byte) ([]byte, error) {
|
||||
payload := &binary.RegisterRefreshPayload{
|
||||
MessageAuth: &binary.AuthMessage{
|
||||
RequestID: requestId,
|
||||
TachyonAuthToken: tachyonAuthToken,
|
||||
ConfigVersion: ConfigMessage,
|
||||
},
|
||||
CurrBrowserDevice: browser,
|
||||
UnixTimestamp: timestamp,
|
||||
Signature: sig,
|
||||
EmptyRefreshArr: &binary.EmptyRefreshArr{EmptyArr: &binary.EmptyEmptyArr{}},
|
||||
MessageType: 2, // hmm
|
||||
}
|
||||
|
||||
serialized, serializeErr := pblite.Serialize(payload.ProtoReflect())
|
||||
if serializeErr != nil {
|
||||
return nil, serializeErr
|
||||
}
|
||||
|
||||
jsonMessage, marshalErr := json.Marshal(serialized)
|
||||
if marshalErr != nil {
|
||||
return nil, marshalErr
|
||||
}
|
||||
|
||||
return jsonMessage, nil
|
||||
}
|
|
@ -1,42 +1,128 @@
|
|||
package payload
|
||||
|
||||
import "go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
func NewMessageData(requestID string, encodedStr string, routingOpCode int64, msgType int64) *binary.MessageData {
|
||||
return &binary.MessageData{
|
||||
RequestID: requestID,
|
||||
RoutingOpCode: routingOpCode,
|
||||
EncodedData: encodedStr,
|
||||
MsgTypeArr: &binary.MsgTypeArr{
|
||||
"google.golang.org/protobuf/proto"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/crypto"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/routes"
|
||||
)
|
||||
|
||||
type SendMessageBuilder struct {
|
||||
message *binary.SendMessage
|
||||
b64Message *binary.SendMessageInternal
|
||||
|
||||
err error
|
||||
}
|
||||
|
||||
func (sm *SendMessageBuilder) Err() error {
|
||||
return sm.err
|
||||
}
|
||||
|
||||
func NewSendMessageBuilder(tachyonAuthToken []byte, pairedDevice *binary.Device, requestId string, sessionId string) *SendMessageBuilder {
|
||||
return &SendMessageBuilder{
|
||||
message: &binary.SendMessage{
|
||||
Mobile: pairedDevice,
|
||||
MessageData: &binary.SendMessageData{
|
||||
RequestID: requestId,
|
||||
},
|
||||
MessageAuth: &binary.SendMessageAuth{
|
||||
RequestID: requestId,
|
||||
TachyonAuthToken: tachyonAuthToken,
|
||||
ConfigVersion: ConfigMessage,
|
||||
},
|
||||
EmptyArr: &binary.EmptyArr{},
|
||||
MsgType: msgType,
|
||||
},
|
||||
b64Message: &binary.SendMessageInternal{
|
||||
RequestID: requestId,
|
||||
SessionID: sessionId,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func NewEncodedPayload(requestId string, opCode int64, encryptedData []byte, sessionID string) *binary.EncodedPayload {
|
||||
return &binary.EncodedPayload{
|
||||
RequestID: requestId,
|
||||
Opcode: opCode,
|
||||
EncryptedData: encryptedData,
|
||||
SessionID: sessionID,
|
||||
}
|
||||
func (sm *SendMessageBuilder) SetPairedDevice(device *binary.Device) *SendMessageBuilder {
|
||||
sm.message.Mobile = device
|
||||
return sm
|
||||
}
|
||||
|
||||
func NewAuthData(requestId string, rpcKey []byte, date *binary.Date) *binary.AuthMessage {
|
||||
return &binary.AuthMessage{
|
||||
RequestID: requestId,
|
||||
RpcKey: rpcKey,
|
||||
Date: date,
|
||||
}
|
||||
func (sm *SendMessageBuilder) setBugleRoute(bugleRoute binary.BugleRoute) *SendMessageBuilder {
|
||||
sm.message.MessageData.BugleRoute = bugleRoute
|
||||
return sm
|
||||
}
|
||||
|
||||
func NewSendMessage(pairedDevice *binary.Device, messageData *binary.MessageData, authData *binary.AuthMessage, ttl int64) *binary.SendMessage {
|
||||
return &binary.SendMessage{
|
||||
PairedDevice: pairedDevice,
|
||||
MessageData: messageData,
|
||||
AuthData: authData,
|
||||
TTL: ttl,
|
||||
func (sm *SendMessageBuilder) SetRequestId(requestId string) *SendMessageBuilder {
|
||||
sm.message.MessageAuth.RequestID = requestId
|
||||
sm.message.MessageData.RequestID = requestId
|
||||
sm.b64Message.RequestID = requestId
|
||||
return sm
|
||||
}
|
||||
|
||||
func (sm *SendMessageBuilder) SetSessionId(sessionId string) *SendMessageBuilder {
|
||||
sm.b64Message.SessionID = sessionId
|
||||
return sm
|
||||
}
|
||||
|
||||
func (sm *SendMessageBuilder) SetRoute(actionType binary.ActionType) *SendMessageBuilder {
|
||||
action, ok := routes.Routes[actionType]
|
||||
if !ok {
|
||||
sm.err = fmt.Errorf("invalid action type")
|
||||
return sm
|
||||
}
|
||||
|
||||
sm.setBugleRoute(action.BugleRoute)
|
||||
sm.setMessageType(action.MessageType)
|
||||
sm.b64Message.Action = action.Action
|
||||
return sm
|
||||
}
|
||||
|
||||
func (sm *SendMessageBuilder) setMessageType(eventType binary.MessageType) *SendMessageBuilder {
|
||||
sm.message.MessageData.MessageTypeData = &binary.MessageTypeData{
|
||||
EmptyArr: &binary.EmptyArr{},
|
||||
MessageType: eventType,
|
||||
}
|
||||
return sm
|
||||
}
|
||||
|
||||
func (sm *SendMessageBuilder) SetTTL(ttl int64) *SendMessageBuilder {
|
||||
sm.message.TTL = ttl
|
||||
return sm
|
||||
}
|
||||
|
||||
func (sm *SendMessageBuilder) SetEncryptedProtoMessage(message proto.Message, cryptor *crypto.Cryptor) *SendMessageBuilder {
|
||||
encryptedBytes, encryptErr := cryptor.EncodeAndEncryptData(message)
|
||||
if encryptErr != nil {
|
||||
sm.err = encryptErr
|
||||
return sm
|
||||
}
|
||||
|
||||
sm.b64Message.EncryptedProtoData = encryptedBytes
|
||||
return sm
|
||||
}
|
||||
|
||||
func (sm *SendMessageBuilder) Build() ([]byte, error) {
|
||||
if sm.err != nil {
|
||||
return nil, sm.err
|
||||
}
|
||||
encodedMessage, err := proto.Marshal(sm.b64Message)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
sm.message.MessageData.ProtobufData = encodedMessage
|
||||
|
||||
messageProtoJSON, serializeErr := pblite.Serialize(sm.message.ProtoReflect())
|
||||
if serializeErr != nil {
|
||||
log.Fatal(serializeErr)
|
||||
return nil, serializeErr
|
||||
}
|
||||
|
||||
protoJSONBytes, marshalErr := json.Marshal(messageProtoJSON)
|
||||
if marshalErr != nil {
|
||||
return nil, marshalErr
|
||||
}
|
||||
return protoJSONBytes, nil
|
||||
}
|
||||
|
|
|
@ -44,6 +44,10 @@ func Deserialize(data []any, m protoreflect.Message) error {
|
|||
}
|
||||
|
||||
m.Set(fieldDescriptor, protoreflect.ValueOfBytes(bytes))
|
||||
case protoreflect.EnumKind:
|
||||
num, ok = val.(float64)
|
||||
expectedKind = "float64"
|
||||
m.Set(fieldDescriptor, protoreflect.ValueOfEnum(protoreflect.EnumNumber(int32(num))))
|
||||
case protoreflect.Int32Kind:
|
||||
num, ok = val.(float64)
|
||||
expectedKind = "float64"
|
124
libgm/pblite/internal.go
Normal file
124
libgm/pblite/internal.go
Normal file
|
@ -0,0 +1,124 @@
|
|||
package pblite
|
||||
|
||||
import (
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/crypto"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/routes"
|
||||
)
|
||||
|
||||
type DevicePair struct {
|
||||
Mobile *binary.Device `json:"mobile,omitempty"`
|
||||
Browser *binary.Device `json:"browser,omitempty"`
|
||||
}
|
||||
|
||||
type RequestData struct {
|
||||
RequestId string `json:"requestId,omitempty"`
|
||||
Timestamp int64 `json:"timestamp,omitempty"`
|
||||
Action binary.ActionType `json:"action,omitempty"`
|
||||
Bool1 bool `json:"bool1,omitempty"`
|
||||
Bool2 bool `json:"bool2,omitempty"`
|
||||
EncryptedData []byte `json:"requestData,omitempty"`
|
||||
Decrypted interface{} `json:"decrypted,omitempty"`
|
||||
Bool3 bool `json:"bool3,omitempty"`
|
||||
}
|
||||
|
||||
type Response struct {
|
||||
ResponseId string `json:"responseId,omitempty"`
|
||||
BugleRoute binary.BugleRoute `json:"bugleRoute,omitempty"`
|
||||
StartExecute string `json:"startExecute,omitempty"`
|
||||
MessageType binary.MessageType `json:"eventType,omitempty"`
|
||||
FinishExecute string `json:"finishExecute,omitempty"`
|
||||
MillisecondsTaken string `json:"millisecondsTaken,omitempty"`
|
||||
Devices *DevicePair `json:"devices,omitempty"`
|
||||
Data RequestData `json:"data,omitempty"`
|
||||
SignatureId string `json:"signatureId,omitempty"`
|
||||
Timestamp string `json:"timestamp"`
|
||||
}
|
||||
|
||||
func DecodeAndDecryptInternalMessage(data []interface{}, cryptor *crypto.Cryptor) (*Response, error) {
|
||||
internalMessage := &binary.InternalMessage{}
|
||||
deserializeErr := Deserialize(data, internalMessage.ProtoReflect())
|
||||
if deserializeErr != nil {
|
||||
return nil, deserializeErr
|
||||
}
|
||||
var resp *Response
|
||||
switch internalMessage.Data.BugleRoute {
|
||||
case binary.BugleRoute_PairEvent:
|
||||
decodedData := &binary.PairEvents{}
|
||||
decodeErr := binary.DecodeProtoMessage(internalMessage.Data.ProtobufData, decodedData)
|
||||
if decodeErr != nil {
|
||||
return nil, decodeErr
|
||||
}
|
||||
resp = newResponseFromPairEvent(internalMessage.GetData(), decodedData)
|
||||
case binary.BugleRoute_DataEvent:
|
||||
internalRequestData := &binary.InternalRequestData{}
|
||||
decodeErr := binary.DecodeProtoMessage(internalMessage.Data.ProtobufData, internalRequestData)
|
||||
if decodeErr != nil {
|
||||
return nil, decodeErr
|
||||
}
|
||||
if internalRequestData.EncryptedData != nil {
|
||||
var decryptedData = routes.Routes[internalRequestData.GetAction()].ResponseStruct.ProtoReflect().New().Interface()
|
||||
decryptErr := cryptor.DecryptAndDecodeData(internalRequestData.EncryptedData, decryptedData)
|
||||
if decryptErr != nil {
|
||||
return nil, decryptErr
|
||||
}
|
||||
resp = newResponseFromDataEvent(internalMessage.GetData(), internalRequestData, decryptedData)
|
||||
} else {
|
||||
resp = newResponseFromDataEvent(internalMessage.GetData(), internalRequestData, nil)
|
||||
}
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func newResponseFromPairEvent(internalMsg *binary.InternalMessageData, data *binary.PairEvents) *Response {
|
||||
resp := &Response{
|
||||
ResponseId: internalMsg.GetResponseID(),
|
||||
BugleRoute: internalMsg.GetBugleRoute(),
|
||||
StartExecute: internalMsg.GetStartExecute(),
|
||||
MessageType: internalMsg.GetMessageType(),
|
||||
FinishExecute: internalMsg.GetFinishExecute(),
|
||||
MillisecondsTaken: internalMsg.GetMillisecondsTaken(),
|
||||
Devices: &DevicePair{
|
||||
Mobile: internalMsg.GetMobile(),
|
||||
Browser: internalMsg.GetBrowser(),
|
||||
},
|
||||
Data: RequestData{
|
||||
Decrypted: data,
|
||||
},
|
||||
Timestamp: internalMsg.GetTimestamp(),
|
||||
SignatureId: internalMsg.GetSignatureID(),
|
||||
}
|
||||
|
||||
return resp
|
||||
}
|
||||
|
||||
func newResponseFromDataEvent(internalMsg *binary.InternalMessageData, internalRequestData *binary.InternalRequestData, decrypted protoreflect.ProtoMessage) *Response {
|
||||
resp := &Response{
|
||||
ResponseId: internalMsg.GetResponseID(),
|
||||
BugleRoute: internalMsg.GetBugleRoute(),
|
||||
StartExecute: internalMsg.GetStartExecute(),
|
||||
MessageType: internalMsg.GetMessageType(),
|
||||
FinishExecute: internalMsg.GetFinishExecute(),
|
||||
MillisecondsTaken: internalMsg.GetMillisecondsTaken(),
|
||||
Devices: &DevicePair{
|
||||
Mobile: internalMsg.GetMobile(),
|
||||
Browser: internalMsg.GetBrowser(),
|
||||
},
|
||||
Data: RequestData{
|
||||
RequestId: internalRequestData.GetSessionID(),
|
||||
Timestamp: internalRequestData.GetTimestamp(),
|
||||
Action: internalRequestData.GetAction(),
|
||||
Bool1: internalRequestData.GetBool1(),
|
||||
Bool2: internalRequestData.GetBool2(),
|
||||
EncryptedData: internalRequestData.GetEncryptedData(),
|
||||
Decrypted: decrypted,
|
||||
Bool3: internalRequestData.GetBool3(),
|
||||
},
|
||||
SignatureId: internalMsg.GetSignatureID(),
|
||||
Timestamp: internalMsg.GetTimestamp(),
|
||||
}
|
||||
|
||||
return resp
|
||||
}
|
|
@ -10,8 +10,8 @@ import (
|
|||
func (p *Pairer) GenerateQRCodeData() (string, error) {
|
||||
urlData := &binary.UrlData{
|
||||
PairingKey: p.pairingKey,
|
||||
AESCTR256Key: p.client.cryptor.AESCTR256Key,
|
||||
SHA256Key: p.client.cryptor.SHA256Key,
|
||||
AESKey: p.client.authData.Cryptor.AESKey,
|
||||
HMACKey: p.client.authData.Cryptor.HMACKey,
|
||||
}
|
||||
encodedUrlData, err := binary.EncodeProtoMessage(urlData)
|
||||
if err != nil {
|
||||
|
|
88
libgm/reaction_builder.go
Normal file
88
libgm/reaction_builder.go
Normal file
|
@ -0,0 +1,88 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/metadata"
|
||||
)
|
||||
|
||||
type ReactionBuilderError struct {
|
||||
errMsg string
|
||||
}
|
||||
|
||||
func (rbe *ReactionBuilderError) Error() string {
|
||||
return fmt.Sprintf("Failed to build reaction builder: %s", rbe.errMsg)
|
||||
}
|
||||
|
||||
type ReactionBuilder struct {
|
||||
messageID string
|
||||
emoji []byte
|
||||
action binary.Reaction
|
||||
|
||||
emojiType int64
|
||||
}
|
||||
|
||||
func (rb *ReactionBuilder) SetAction(action binary.Reaction) *ReactionBuilder {
|
||||
rb.action = action
|
||||
return rb
|
||||
}
|
||||
|
||||
/*
|
||||
Emoji is a unicode string like "\U0001F44D" or a string like "👍"
|
||||
*/
|
||||
func (rb *ReactionBuilder) SetEmoji(emoji string) *ReactionBuilder {
|
||||
emojiType, exists := metadata.Emojis[emoji]
|
||||
if exists {
|
||||
rb.emojiType = emojiType
|
||||
} else {
|
||||
rb.emojiType = 8
|
||||
}
|
||||
|
||||
rb.emoji = []byte(emoji)
|
||||
return rb
|
||||
}
|
||||
|
||||
func (rb *ReactionBuilder) SetMessageID(messageId string) *ReactionBuilder {
|
||||
rb.messageID = messageId
|
||||
return rb
|
||||
}
|
||||
|
||||
func (rb *ReactionBuilder) Build() (*binary.SendReactionPayload, error) {
|
||||
if rb.messageID == "" {
|
||||
return nil, &ReactionBuilderError{
|
||||
errMsg: "messageID can not be empty",
|
||||
}
|
||||
}
|
||||
|
||||
if rb.action == 0 {
|
||||
return nil, &ReactionBuilderError{
|
||||
errMsg: "action can not be empty",
|
||||
}
|
||||
}
|
||||
|
||||
if rb.emojiType == 0 {
|
||||
return nil, &ReactionBuilderError{
|
||||
errMsg: "failed to set emojiType",
|
||||
}
|
||||
}
|
||||
|
||||
if rb.emoji == nil {
|
||||
return nil, &ReactionBuilderError{
|
||||
errMsg: "failed to set emoji",
|
||||
}
|
||||
}
|
||||
|
||||
return &binary.SendReactionPayload{
|
||||
MessageID: rb.messageID,
|
||||
ReactionData: &binary.ReactionData{
|
||||
EmojiUnicode: rb.emoji,
|
||||
EmojiType: rb.emojiType,
|
||||
},
|
||||
Action: rb.action,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (c *Client) NewReactionBuilder() *ReactionBuilder {
|
||||
return &ReactionBuilder{}
|
||||
}
|
|
@ -1,16 +0,0 @@
|
|||
package libgm
|
||||
|
||||
import "go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
|
||||
func (c *Client) newMessagesResponse(responseData *Response) (*binary.FetchMessagesResponse, error) {
|
||||
messages := &binary.FetchMessagesResponse{}
|
||||
decryptErr := c.cryptor.DecryptAndDecodeData(responseData.Data.EncryptedData, messages)
|
||||
if decryptErr != nil {
|
||||
return nil, decryptErr
|
||||
}
|
||||
decryptErr = c.decryptImages(messages)
|
||||
if decryptErr != nil {
|
||||
return nil, decryptErr
|
||||
}
|
||||
return messages, nil
|
||||
}
|
|
@ -2,99 +2,99 @@ package libgm
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"sync"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/routes"
|
||||
)
|
||||
|
||||
type ResponseChan struct {
|
||||
responses []*Response
|
||||
receivedResponses int64
|
||||
response *pblite.Response
|
||||
wg sync.WaitGroup
|
||||
mu sync.Mutex
|
||||
}
|
||||
|
||||
func (s *SessionHandler) addRequestToChannel(requestId string, opCode int64) {
|
||||
instruction, notOk := s.client.instructions.GetInstruction(opCode)
|
||||
func (s *SessionHandler) addRequestToChannel(requestId string, actionType binary.ActionType) {
|
||||
_, notOk := routes.Routes[actionType]
|
||||
if !notOk {
|
||||
panic(notOk)
|
||||
log.Println("Missing action type: ", actionType)
|
||||
log.Fatal(notOk)
|
||||
}
|
||||
if msgMap, ok := s.requests[requestId]; ok {
|
||||
responseChan := &ResponseChan{
|
||||
responses: make([]*Response, 0, instruction.ExpectedResponses),
|
||||
receivedResponses: 0,
|
||||
response: &pblite.Response{},
|
||||
wg: sync.WaitGroup{},
|
||||
mu: sync.Mutex{},
|
||||
}
|
||||
msgMap[opCode] = responseChan
|
||||
responseChan.wg.Add(int(instruction.ExpectedResponses))
|
||||
responseChan.wg.Add(1)
|
||||
responseChan.mu.Lock()
|
||||
msgMap[actionType] = responseChan
|
||||
} else {
|
||||
s.requests[requestId] = make(map[int64]*ResponseChan)
|
||||
s.requests[requestId] = make(map[binary.ActionType]*ResponseChan)
|
||||
responseChan := &ResponseChan{
|
||||
responses: make([]*Response, 0, instruction.ExpectedResponses),
|
||||
receivedResponses: 0,
|
||||
response: &pblite.Response{},
|
||||
wg: sync.WaitGroup{},
|
||||
mu: sync.Mutex{},
|
||||
}
|
||||
s.requests[requestId][opCode] = responseChan
|
||||
responseChan.wg.Add(int(instruction.ExpectedResponses))
|
||||
responseChan.wg.Add(1)
|
||||
responseChan.mu.Lock()
|
||||
s.requests[requestId][actionType] = responseChan
|
||||
}
|
||||
}
|
||||
|
||||
func (s *SessionHandler) respondToRequestChannel(res *Response) {
|
||||
requestId := res.Data.RequestID
|
||||
func (s *SessionHandler) respondToRequestChannel(res *pblite.Response) {
|
||||
requestId := res.Data.RequestId
|
||||
reqChannel, ok := s.requests[requestId]
|
||||
actionType := res.Data.Action
|
||||
if !ok {
|
||||
s.client.Logger.Debug().Any("actionType", actionType).Any("requestId", requestId).Msg("Did not expect response for this requestId")
|
||||
return
|
||||
}
|
||||
opCodeResponseChan, ok2 := reqChannel[res.Data.Opcode]
|
||||
actionResponseChan, ok2 := reqChannel[actionType]
|
||||
if !ok2 {
|
||||
s.client.Logger.Debug().Any("actionType", actionType).Any("requestId", requestId).Msg("Did not expect response for this actionType")
|
||||
return
|
||||
}
|
||||
|
||||
opCodeResponseChan.mu.Lock()
|
||||
|
||||
opCodeResponseChan.responses = append(opCodeResponseChan.responses, res)
|
||||
|
||||
s.client.Logger.Debug().Any("opcode", res.Data.Opcode).Msg("Got response")
|
||||
|
||||
instruction, ok3 := s.client.instructions.GetInstruction(res.Data.Opcode)
|
||||
if opCodeResponseChan.receivedResponses >= instruction.ExpectedResponses {
|
||||
s.client.Logger.Debug().Any("opcode", res.Data.Opcode).Msg("Ignoring opcode")
|
||||
actionResponseChan.mu.Lock()
|
||||
actionResponseChan, ok2 = reqChannel[actionType]
|
||||
if !ok2 {
|
||||
s.client.Logger.Debug().Any("actionType", actionType).Any("requestId", requestId).Msg("Ignoring request for action...")
|
||||
return
|
||||
}
|
||||
opCodeResponseChan.receivedResponses++
|
||||
opCodeResponseChan.wg.Done()
|
||||
if !ok3 {
|
||||
panic(ok3)
|
||||
opCodeResponseChan.mu.Unlock()
|
||||
return
|
||||
}
|
||||
if opCodeResponseChan.receivedResponses >= instruction.ExpectedResponses {
|
||||
delete(reqChannel, res.Data.Opcode)
|
||||
s.client.Logger.Debug().Any("actionType", actionType).Any("requestId", requestId).Msg("responding to request")
|
||||
actionResponseChan.response = res
|
||||
actionResponseChan.wg.Done()
|
||||
|
||||
delete(reqChannel, actionType)
|
||||
if len(reqChannel) == 0 {
|
||||
delete(s.requests, requestId)
|
||||
}
|
||||
}
|
||||
|
||||
opCodeResponseChan.mu.Unlock()
|
||||
actionResponseChan.mu.Unlock()
|
||||
}
|
||||
|
||||
func (s *SessionHandler) WaitForResponse(requestId string, opCode int64) ([]*Response, error) {
|
||||
func (s *SessionHandler) WaitForResponse(requestId string, actionType binary.ActionType) (*pblite.Response, error) {
|
||||
requestResponses, ok := s.requests[requestId]
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("no response channel found for request ID: %s (opcode: %v)", requestId, opCode)
|
||||
}
|
||||
responseChan, ok2 := requestResponses[opCode]
|
||||
if !ok2 {
|
||||
return nil, fmt.Errorf("no response channel found for opCode: %v (requestId: %s)", opCode, requestId)
|
||||
return nil, fmt.Errorf("no response channel found for request ID: %s (actionType: %v)", requestId, actionType)
|
||||
}
|
||||
|
||||
routeInfo, notFound := routes.Routes[actionType]
|
||||
if !notFound {
|
||||
return nil, fmt.Errorf("no action exists for actionType: %v (requestId: %s)", actionType, requestId)
|
||||
}
|
||||
|
||||
responseChan, ok2 := requestResponses[routeInfo.Action]
|
||||
if !ok2 {
|
||||
return nil, fmt.Errorf("no response channel found for actionType: %v (requestId: %s)", routeInfo.Action, requestId)
|
||||
}
|
||||
|
||||
// Unlock so responses can be received
|
||||
responseChan.mu.Unlock()
|
||||
|
||||
// Wait for all responses to be received
|
||||
responseChan.wg.Wait()
|
||||
|
||||
return responseChan.responses, nil
|
||||
return responseChan.response, nil
|
||||
}
|
||||
|
|
30
libgm/routes/conversations.go
Normal file
30
libgm/routes/conversations.go
Normal file
|
@ -0,0 +1,30 @@
|
|||
package routes
|
||||
|
||||
import "go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
|
||||
var LIST_CONVERSATIONS_WITH_UPDATES = Route{
|
||||
Action: binary.ActionType_LIST_CONVERSATIONS,
|
||||
MessageType: binary.MessageType_BUGLE_ANNOTATION,
|
||||
BugleRoute: binary.BugleRoute_DataEvent,
|
||||
ResponseStruct: &binary.Conversations{},
|
||||
UseSessionID: false,
|
||||
UseTTL: true,
|
||||
}
|
||||
|
||||
var LIST_CONVERSATIONS = Route{
|
||||
Action: binary.ActionType_LIST_CONVERSATIONS,
|
||||
MessageType: binary.MessageType_BUGLE_MESSAGE,
|
||||
BugleRoute: binary.BugleRoute_DataEvent,
|
||||
ResponseStruct: &binary.Conversations{},
|
||||
UseSessionID: false,
|
||||
UseTTL: true,
|
||||
}
|
||||
|
||||
var GET_CONVERSATION_TYPE = Route{
|
||||
Action: binary.ActionType_GET_CONVERSATION_TYPE,
|
||||
MessageType: binary.MessageType_BUGLE_MESSAGE,
|
||||
BugleRoute: binary.BugleRoute_DataEvent,
|
||||
ResponseStruct: &binary.GetConversationTypeResponse{},
|
||||
UseSessionID: false,
|
||||
UseTTL: true,
|
||||
}
|
29
libgm/routes/mapped.go
Normal file
29
libgm/routes/mapped.go
Normal file
|
@ -0,0 +1,29 @@
|
|||
package routes
|
||||
|
||||
import (
|
||||
"google.golang.org/protobuf/proto"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
)
|
||||
|
||||
type Route struct {
|
||||
Action binary.ActionType
|
||||
MessageType binary.MessageType
|
||||
BugleRoute binary.BugleRoute
|
||||
ResponseStruct proto.Message
|
||||
UseSessionID bool
|
||||
UseTTL bool
|
||||
}
|
||||
|
||||
var Routes = map[binary.ActionType]Route{
|
||||
binary.ActionType_IS_BUGLE_DEFAULT: IS_BUGLE_DEFAULT,
|
||||
binary.ActionType_GET_UPDATES: GET_UPDATES,
|
||||
binary.ActionType_LIST_CONVERSATIONS: LIST_CONVERSATIONS,
|
||||
binary.ActionType_LIST_CONVERSATIONS_SYNC: LIST_CONVERSATIONS_WITH_UPDATES,
|
||||
binary.ActionType_NOTIFY_DITTO_ACTIVITY: NOTIFY_DITTO_ACTIVITY,
|
||||
binary.ActionType_GET_CONVERSATION_TYPE: GET_CONVERSATION_TYPE,
|
||||
binary.ActionType_LIST_MESSAGES: LIST_MESSAGES,
|
||||
binary.ActionType_SEND_MESSAGE: SEND_MESSAGE,
|
||||
binary.ActionType_SEND_REACTION: SEND_REACTION,
|
||||
binary.ActionType_DELETE_MESSAGE: DELETE_MESSAGE,
|
||||
}
|
39
libgm/routes/messages.go
Normal file
39
libgm/routes/messages.go
Normal file
|
@ -0,0 +1,39 @@
|
|||
package routes
|
||||
|
||||
import "go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
|
||||
var LIST_MESSAGES = Route{
|
||||
Action: binary.ActionType_LIST_MESSAGES,
|
||||
MessageType: binary.MessageType_BUGLE_MESSAGE,
|
||||
BugleRoute: binary.BugleRoute_DataEvent,
|
||||
ResponseStruct: &binary.FetchMessagesResponse{},
|
||||
UseSessionID: false,
|
||||
UseTTL: true,
|
||||
}
|
||||
|
||||
var SEND_MESSAGE = Route{
|
||||
Action: binary.ActionType_SEND_MESSAGE,
|
||||
MessageType: binary.MessageType_BUGLE_MESSAGE,
|
||||
BugleRoute: binary.BugleRoute_DataEvent,
|
||||
ResponseStruct: &binary.SendMessageResponse{},
|
||||
UseSessionID: false,
|
||||
UseTTL: true,
|
||||
}
|
||||
|
||||
var SEND_REACTION = Route{
|
||||
Action: binary.ActionType_SEND_REACTION,
|
||||
MessageType: binary.MessageType_BUGLE_MESSAGE,
|
||||
BugleRoute: binary.BugleRoute_DataEvent,
|
||||
ResponseStruct: &binary.SendReactionResponse{},
|
||||
UseSessionID: false,
|
||||
UseTTL: true,
|
||||
}
|
||||
|
||||
var DELETE_MESSAGE = Route{
|
||||
Action: binary.ActionType_DELETE_MESSAGE,
|
||||
MessageType: binary.MessageType_BUGLE_MESSAGE,
|
||||
BugleRoute: binary.BugleRoute_DataEvent,
|
||||
ResponseStruct: &binary.DeleteMessageResponse{},
|
||||
UseSessionID: false,
|
||||
UseTTL: true,
|
||||
}
|
30
libgm/routes/session.go
Normal file
30
libgm/routes/session.go
Normal file
|
@ -0,0 +1,30 @@
|
|||
package routes
|
||||
|
||||
import "go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
|
||||
var IS_BUGLE_DEFAULT = Route{
|
||||
Action: binary.ActionType_IS_BUGLE_DEFAULT,
|
||||
MessageType: binary.MessageType_BUGLE_MESSAGE,
|
||||
BugleRoute: binary.BugleRoute_DataEvent,
|
||||
ResponseStruct: &binary.IsBugleDefaultResponse{},
|
||||
UseSessionID: false,
|
||||
UseTTL: true,
|
||||
}
|
||||
|
||||
var GET_UPDATES = Route{
|
||||
Action: binary.ActionType_GET_UPDATES,
|
||||
MessageType: binary.MessageType_BUGLE_MESSAGE,
|
||||
BugleRoute: binary.BugleRoute_DataEvent,
|
||||
ResponseStruct: &binary.UpdateEvents{},
|
||||
UseSessionID: true,
|
||||
UseTTL: false,
|
||||
}
|
||||
|
||||
var NOTIFY_DITTO_ACTIVITY = Route{
|
||||
Action: binary.ActionType_NOTIFY_DITTO_ACTIVITY,
|
||||
MessageType: binary.MessageType_BUGLE_MESSAGE,
|
||||
BugleRoute: binary.BugleRoute_DataEvent,
|
||||
ResponseStruct: nil,
|
||||
UseSessionID: false,
|
||||
UseTTL: true,
|
||||
}
|
98
libgm/rpc.go
98
libgm/rpc.go
|
@ -3,14 +3,19 @@ package libgm
|
|||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/events"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/util"
|
||||
)
|
||||
|
||||
|
@ -18,8 +23,7 @@ type RPC struct {
|
|||
client *Client
|
||||
http *http.Client
|
||||
conn io.ReadCloser
|
||||
rpcSessionID string
|
||||
webAuthKey []byte
|
||||
rpcSessionId string
|
||||
listenID int
|
||||
}
|
||||
|
||||
|
@ -92,7 +96,11 @@ func (r *RPC) startReadingData(rc io.ReadCloser) {
|
|||
return
|
||||
}
|
||||
chunk := buf[:n]
|
||||
if n <= 25 {
|
||||
if n <= 25 { // this will catch the acknowledgement message unless you are required to ack 1000 messages for some reason
|
||||
isAck := r.isAcknowledgeMessage(chunk)
|
||||
if isAck {
|
||||
r.client.Logger.Info().Any("isAck", isAck).Msg("Got Ack Message")
|
||||
}
|
||||
isHeartBeat := r.isHeartBeat(chunk)
|
||||
if isHeartBeat {
|
||||
r.client.Logger.Info().Any("heartBeat", isHeartBeat).Msg("Got heartbeat message")
|
||||
|
@ -117,11 +125,46 @@ func (r *RPC) startReadingData(rc io.ReadCloser) {
|
|||
}
|
||||
|
||||
accumulatedData = []byte{}
|
||||
r.client.Logger.Info().Any("val", msgArr).Msg("MsgArr")
|
||||
//r.client.Logger.Info().Any("val", msgArr).Msg("MsgArr")
|
||||
go r.HandleRPCMsg(msgArr)
|
||||
}
|
||||
}
|
||||
|
||||
func (r *RPC) isAcknowledgeMessage(data []byte) bool {
|
||||
if data[0] == 44 {
|
||||
return false
|
||||
}
|
||||
if len(data) >= 3 && data[0] == 91 && data[1] == 91 && data[2] == 91 {
|
||||
parsed, parseErr := r.parseAckMessage(data)
|
||||
if parseErr != nil {
|
||||
log.Fatal(parseErr)
|
||||
}
|
||||
skipCount = parsed.Container.Data.GetAckAmount().Count
|
||||
r.client.Logger.Info().Any("count", skipCount).Msg("Messages To Skip")
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (r *RPC) parseAckMessage(data []byte) (*binary.AckMessageResponse, error) {
|
||||
data = append(data, 93)
|
||||
data = append(data, 93)
|
||||
|
||||
var msgArr []interface{}
|
||||
marshalErr := json.Unmarshal(data, &msgArr)
|
||||
if marshalErr != nil {
|
||||
return nil, marshalErr
|
||||
}
|
||||
|
||||
msg := &binary.AckMessageResponse{}
|
||||
deserializeErr := pblite.Deserialize(msgArr, msg.ProtoReflect())
|
||||
if deserializeErr != nil {
|
||||
return nil, deserializeErr
|
||||
}
|
||||
return msg, nil
|
||||
}
|
||||
|
||||
func (r *RPC) isStartRead(data []byte) bool {
|
||||
return string(data) == "[[[null,null,null,[]]"
|
||||
}
|
||||
|
@ -130,34 +173,8 @@ func (r *RPC) isHeartBeat(data []byte) bool {
|
|||
return string(data) == ",[null,null,[]]"
|
||||
}
|
||||
|
||||
/*
|
||||
func (r *RPC) startReadingData(rc io.ReadCloser) {
|
||||
defer rc.Close()
|
||||
reader := bufio.NewReader(rc)
|
||||
buf := make([]byte, 5242880)
|
||||
for {
|
||||
n, err := reader.Read(buf)
|
||||
if err != nil {
|
||||
if errors.Is(err, os.ErrClosed) {
|
||||
r.client.Logger.Err(err).Msg("Closed body from server")
|
||||
r.conn = nil
|
||||
return
|
||||
}
|
||||
r.client.Logger.Err(err).Msg("Stopped reading data from server")
|
||||
return
|
||||
}
|
||||
chunk := buf[:n]
|
||||
var msgArr []interface{}
|
||||
isComplete := r.tryUnmarshalJSON(chunk, &msgArr)
|
||||
r.client.Logger.Info().Any("val", chunk[0] == 44).Any("isComplete", string(chunk)).Msg("is Start?")
|
||||
go r.HandleRPCMsg(buf[:n])
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
func (r *RPC) CloseConnection() {
|
||||
if r.conn != nil {
|
||||
r.listenID++
|
||||
r.client.Logger.Debug().Msg("Attempting to connection...")
|
||||
r.conn.Close()
|
||||
r.conn = nil
|
||||
|
@ -167,30 +184,13 @@ func (r *RPC) CloseConnection() {
|
|||
func (r *RPC) sendMessageRequest(url string, payload []byte) (*http.Response, error) {
|
||||
req, err := http.NewRequest("POST", url, bytes.NewReader(payload))
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("Error creating request: %v", err))
|
||||
log.Fatalf("Error creating request: %v", err)
|
||||
}
|
||||
util.BuildRelayHeaders(req, "application/json+protobuf", "*/*")
|
||||
resp, reqErr := r.client.http.Do(req)
|
||||
//r.client.Logger.Info().Any("bodyLength", len(payload)).Any("url", url).Any("headers", resp.Request.Header).Msg("RPC Request Headers")
|
||||
if reqErr != nil {
|
||||
panic(fmt.Errorf("Error making request: %v", err))
|
||||
log.Fatalf("Error making request: %v", err)
|
||||
}
|
||||
return resp, reqErr
|
||||
}
|
||||
|
||||
func (r *RPC) sendInitialData() error {
|
||||
sessionResponse, err := r.client.Session.SetActiveSession()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, convErr := r.client.Conversations.List(25)
|
||||
if convErr != nil {
|
||||
return convErr
|
||||
}
|
||||
|
||||
evtData := events.NewClientReady(sessionResponse)
|
||||
r.client.triggerEvent(evtData)
|
||||
r.client.sessionHandler.startAckInterval()
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -1,65 +1,62 @@
|
|||
package libgm
|
||||
|
||||
import "go.mau.fi/mautrix-gmessages/libgm/util"
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
)
|
||||
|
||||
type Session struct {
|
||||
client *Client
|
||||
|
||||
prepareNewSession prepareNewSession
|
||||
newSession newSession
|
||||
}
|
||||
|
||||
func (s *Session) SetActiveSession() (*util.SessionResponse, error) {
|
||||
s.client.sessionHandler.ResetSessionID()
|
||||
// start receiving updates from mobile on this session
|
||||
func (s *Session) SetActiveSession() error {
|
||||
s.client.sessionHandler.ResetSessionId()
|
||||
|
||||
prepareResponses, prepareSessionErr := s.prepareNewSession.Execute()
|
||||
if prepareSessionErr != nil {
|
||||
return nil, prepareSessionErr
|
||||
actionType := binary.ActionType_GET_UPDATES
|
||||
_, sendErr := s.client.sessionHandler.completeSendMessage(actionType, false, nil)
|
||||
if sendErr != nil {
|
||||
return sendErr
|
||||
}
|
||||
|
||||
newSessionResponses, newSessionErr := s.newSession.Execute()
|
||||
if newSessionErr != nil {
|
||||
return nil, newSessionErr
|
||||
}
|
||||
|
||||
sessionResponse, processFail := s.client.processSessionResponse(prepareResponses, newSessionResponses)
|
||||
if processFail != nil {
|
||||
return nil, processFail
|
||||
}
|
||||
|
||||
return sessionResponse, nil
|
||||
return nil
|
||||
}
|
||||
|
||||
type prepareNewSession struct {
|
||||
client *Client
|
||||
}
|
||||
func (s *Session) IsBugleDefault() (*binary.IsBugleDefaultResponse, error) {
|
||||
s.client.sessionHandler.ResetSessionId()
|
||||
|
||||
func (p *prepareNewSession) Execute() ([]*Response, error) {
|
||||
instruction, _ := p.client.instructions.GetInstruction(PREPARE_NEW_SESSION_OPCODE)
|
||||
sentRequestID, _ := p.client.createAndSendRequest(instruction.Opcode, p.client.ttl, false, nil)
|
||||
actionType := binary.ActionType_IS_BUGLE_DEFAULT
|
||||
sentRequestId, sendErr := s.client.sessionHandler.completeSendMessage(actionType, true, nil)
|
||||
if sendErr != nil {
|
||||
return nil, sendErr
|
||||
}
|
||||
|
||||
responses, err := p.client.sessionHandler.WaitForResponse(sentRequestID, instruction.Opcode)
|
||||
response, err := s.client.sessionHandler.WaitForResponse(sentRequestId, actionType)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return responses, nil
|
||||
}
|
||||
|
||||
type newSession struct {
|
||||
client *Client
|
||||
}
|
||||
|
||||
func (n *newSession) Execute() ([]*Response, error) {
|
||||
instruction, _ := n.client.instructions.GetInstruction(NEW_SESSION_OPCODE)
|
||||
sentRequestID, _ := n.client.createAndSendRequest(instruction.Opcode, 0, true, nil)
|
||||
|
||||
responses, err := n.client.sessionHandler.WaitForResponse(sentRequestID, instruction.Opcode)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
res, ok := response.Data.Decrypted.(*binary.IsBugleDefaultResponse)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("failed to assert response into IsBugleDefaultResponse")
|
||||
}
|
||||
|
||||
// Rest of the processing...
|
||||
|
||||
return responses, nil
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (s *Session) NotifyDittoActivity() error {
|
||||
payload := &binary.NotifyDittoActivityPayload{Success: true}
|
||||
actionType := binary.ActionType_NOTIFY_DITTO_ACTIVITY
|
||||
|
||||
sentRequestId, sendErr := s.client.sessionHandler.completeSendMessage(actionType, true, payload)
|
||||
if sendErr != nil {
|
||||
return sendErr
|
||||
}
|
||||
|
||||
_, err := s.client.sessionHandler.WaitForResponse(sentRequestId, actionType)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -3,38 +3,41 @@ package libgm
|
|||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"golang.org/x/exp/slices"
|
||||
"google.golang.org/protobuf/proto"
|
||||
"google.golang.org/protobuf/reflect/protoreflect"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/crypto"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/payload"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/routes"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/util"
|
||||
)
|
||||
|
||||
/*
|
||||
type Response struct {
|
||||
client *Client
|
||||
ResponseID string
|
||||
ResponseId string
|
||||
RoutingOpCode int64
|
||||
Data *binary.EncodedResponse // base64 encoded (decode -> protomessage)
|
||||
|
||||
StartExecute string
|
||||
FinishExecute string
|
||||
DevicePair *DevicePair
|
||||
DevicePair *pblite.DevicePair
|
||||
}
|
||||
*/
|
||||
|
||||
type SessionHandler struct {
|
||||
client *Client
|
||||
requests map[string]map[int64]*ResponseChan
|
||||
requests map[string]map[binary.ActionType]*ResponseChan
|
||||
|
||||
ackMap []string
|
||||
ackTicker *time.Ticker
|
||||
|
||||
sessionID string
|
||||
sessionId string
|
||||
|
||||
responseTimeout time.Duration
|
||||
}
|
||||
|
@ -43,74 +46,63 @@ func (s *SessionHandler) SetResponseTimeout(milliSeconds int) {
|
|||
s.responseTimeout = time.Duration(milliSeconds) * time.Millisecond
|
||||
}
|
||||
|
||||
func (s *SessionHandler) ResetSessionID() {
|
||||
s.sessionID = util.RandomUUIDv4()
|
||||
func (s *SessionHandler) ResetSessionId() {
|
||||
s.sessionId = util.RandomUUIDv4()
|
||||
}
|
||||
|
||||
func (c *Client) createAndSendRequest(instructionId int64, ttl int64, newSession bool, encryptedProtoMessage protoreflect.Message) (string, error) {
|
||||
requestId := util.RandomUUIDv4()
|
||||
instruction, ok := c.instructions.GetInstruction(instructionId)
|
||||
if !ok {
|
||||
return "", fmt.Errorf("failed to get instruction: %v does not exist", instructionId)
|
||||
func (s *SessionHandler) completeSendMessage(actionType binary.ActionType, addToChannel bool, encryptedData proto.Message) (string, error) {
|
||||
requestId, payload, action, buildErr := s.buildMessage(actionType, encryptedData)
|
||||
if buildErr != nil {
|
||||
return "", buildErr
|
||||
}
|
||||
|
||||
if newSession {
|
||||
requestId = c.sessionHandler.sessionID
|
||||
if addToChannel {
|
||||
s.addRequestToChannel(requestId, action)
|
||||
}
|
||||
|
||||
var encryptedData []byte
|
||||
var encryptErr error
|
||||
if encryptedProtoMessage != nil {
|
||||
encryptedData, encryptErr = c.EncryptPayloadData(encryptedProtoMessage)
|
||||
if encryptErr != nil {
|
||||
return "", fmt.Errorf("failed to encrypt payload data for opcode: %v", instructionId)
|
||||
}
|
||||
c.Logger.Info().Any("encryptedData", encryptedData).Msg("Sending request with encrypted data")
|
||||
}
|
||||
|
||||
encodedData := payload.NewEncodedPayload(requestId, instruction.Opcode, encryptedData, c.sessionHandler.sessionID)
|
||||
encodedStr, encodeErr := crypto.EncodeProtoB64(encodedData)
|
||||
if encodeErr != nil {
|
||||
panic(fmt.Errorf("Failed to encode data: %w", encodeErr))
|
||||
}
|
||||
messageData := payload.NewMessageData(requestId, encodedStr, instruction.RoutingOpCode, instruction.MsgType)
|
||||
authMessage := payload.NewAuthData(requestId, c.rpcKey, &binary.Date{Year: 2023, Seq1: 6, Seq2: 22, Seq3: 4, Seq4: 6})
|
||||
sendMessage := payload.NewSendMessage(c.devicePair.Mobile, messageData, authMessage, ttl)
|
||||
|
||||
sentRequestID, reqErr := c.sessionHandler.completeSendMessage(encodedData.RequestID, instruction.Opcode, sendMessage)
|
||||
if reqErr != nil {
|
||||
return "", fmt.Errorf("failed to send message request for opcode: %v", instructionId)
|
||||
}
|
||||
return sentRequestID, nil
|
||||
}
|
||||
|
||||
func (s *SessionHandler) completeSendMessage(requestId string, opCode int64, msg *binary.SendMessage) (string, error) {
|
||||
jsonData, err := s.toJSON(msg.ProtoReflect())
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
//s.client.Logger.Debug().Any("payload", string(jsonData)).Msg("Sending message request")
|
||||
s.addRequestToChannel(requestId, opCode)
|
||||
_, reqErr := s.client.rpc.sendMessageRequest(util.SEND_MESSAGE, jsonData)
|
||||
_, reqErr := s.client.rpc.sendMessageRequest(util.SEND_MESSAGE, payload)
|
||||
if reqErr != nil {
|
||||
return "", reqErr
|
||||
}
|
||||
return requestId, nil
|
||||
}
|
||||
|
||||
func (s *SessionHandler) toJSON(message protoreflect.Message) ([]byte, error) {
|
||||
interfaceArr, err := pblite.Serialize(message)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
func (s *SessionHandler) buildMessage(actionType binary.ActionType, encryptedData proto.Message) (string, []byte, binary.ActionType, error) {
|
||||
var requestId string
|
||||
pairedDevice := s.client.authData.DevicePair.Mobile
|
||||
sessionId := s.client.sessionHandler.sessionId
|
||||
token := s.client.authData.TachyonAuthToken
|
||||
|
||||
routeInfo, ok := routes.Routes[actionType]
|
||||
if !ok {
|
||||
return "", nil, 0, fmt.Errorf("failed to build message: could not find route %d", actionType)
|
||||
}
|
||||
jsonData, jsonErr := json.Marshal(interfaceArr)
|
||||
if jsonErr != nil {
|
||||
return nil, jsonErr
|
||||
|
||||
if routeInfo.UseSessionID {
|
||||
requestId = s.sessionId
|
||||
} else {
|
||||
requestId = util.RandomUUIDv4()
|
||||
}
|
||||
return jsonData, nil
|
||||
|
||||
tmpMessage := payload.NewSendMessageBuilder(token, pairedDevice, requestId, sessionId).SetRoute(routeInfo.Action).SetSessionId(s.sessionId)
|
||||
|
||||
if encryptedData != nil {
|
||||
tmpMessage.SetEncryptedProtoMessage(encryptedData, s.client.authData.Cryptor)
|
||||
}
|
||||
|
||||
if routeInfo.UseTTL {
|
||||
tmpMessage.SetTTL(s.client.authData.TTL)
|
||||
}
|
||||
|
||||
message, buildErr := tmpMessage.Build()
|
||||
if buildErr != nil {
|
||||
return "", nil, 0, buildErr
|
||||
}
|
||||
|
||||
return requestId, message, routeInfo.Action, nil
|
||||
}
|
||||
|
||||
func (s *SessionHandler) addResponseAck(responseId string) {
|
||||
s.client.Logger.Debug().Any("responseId", responseId).Msg("Added to ack map")
|
||||
hasResponseId := slices.Contains(s.ackMap, responseId)
|
||||
if !hasResponseId {
|
||||
s.ackMap = append(s.ackMap, responseId)
|
||||
|
@ -138,22 +130,22 @@ func (s *SessionHandler) sendAckRequest() {
|
|||
ackMessagePayload := &binary.AckMessagePayload{
|
||||
AuthData: &binary.AuthMessage{
|
||||
RequestID: reqId,
|
||||
RpcKey: s.client.rpcKey,
|
||||
Date: &binary.Date{Year: 2023, Seq1: 6, Seq2: 22, Seq3: 4, Seq4: 6},
|
||||
TachyonAuthToken: s.client.authData.TachyonAuthToken,
|
||||
ConfigVersion: payload.ConfigMessage,
|
||||
},
|
||||
EmptyArr: &binary.EmptyArr{},
|
||||
NoClue: nil,
|
||||
}
|
||||
dataArray, err := pblite.Serialize(ackMessagePayload.ProtoReflect())
|
||||
if err != nil {
|
||||
panic(err)
|
||||
log.Fatal(err)
|
||||
}
|
||||
ackMessages := make([][]interface{}, 0)
|
||||
for _, reqId := range s.ackMap {
|
||||
ackMessageData := &binary.AckMessageData{RequestID: reqId, Device: s.client.devicePair.Browser}
|
||||
ackMessageData := &binary.AckMessageData{RequestID: reqId, Device: s.client.authData.DevicePair.Browser}
|
||||
ackMessageDataArr, err := pblite.Serialize(ackMessageData.ProtoReflect())
|
||||
if err != nil {
|
||||
panic(err)
|
||||
log.Fatal(err)
|
||||
}
|
||||
ackMessages = append(ackMessages, ackMessageDataArr)
|
||||
s.ackMap = util.RemoveFromSlice(s.ackMap, reqId)
|
||||
|
@ -161,55 +153,11 @@ func (s *SessionHandler) sendAckRequest() {
|
|||
dataArray = append(dataArray, ackMessages)
|
||||
jsonData, jsonErr := json.Marshal(dataArray)
|
||||
if jsonErr != nil {
|
||||
panic(err)
|
||||
log.Fatal(err)
|
||||
}
|
||||
_, err = s.client.rpc.sendMessageRequest(util.ACK_MESSAGES, jsonData)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
log.Fatal(err)
|
||||
}
|
||||
s.client.Logger.Debug().Msg("[ACK] Sent Request")
|
||||
}
|
||||
|
||||
func (s *SessionHandler) NewResponse(response *binary.RPCResponse) (*Response, error) {
|
||||
//s.client.Logger.Debug().Any("rpcResponse", response).Msg("Raw rpc response")
|
||||
decodedData, err := crypto.DecodeEncodedResponse(response.Data.EncodedData)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return nil, err
|
||||
}
|
||||
return &Response{
|
||||
client: s.client,
|
||||
ResponseID: response.Data.RequestID,
|
||||
RoutingOpCode: response.Data.RoutingOpCode,
|
||||
StartExecute: response.Data.Ts1,
|
||||
FinishExecute: response.Data.Ts2,
|
||||
DevicePair: &DevicePair{
|
||||
Mobile: response.Data.Mobile,
|
||||
Browser: response.Data.Browser,
|
||||
},
|
||||
Data: decodedData,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (r *Response) decryptData() (proto.Message, error) {
|
||||
if r.Data.EncryptedData != nil {
|
||||
instruction, ok := r.client.instructions.GetInstruction(r.Data.Opcode)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("failed to decrypt data for unknown opcode: %v", r.Data.Opcode)
|
||||
}
|
||||
decryptedBytes, errDecrypt := instruction.cryptor.Decrypt(r.Data.EncryptedData)
|
||||
if errDecrypt != nil {
|
||||
return nil, errDecrypt
|
||||
}
|
||||
//os.WriteFile("opcode_"+strconv.Itoa(int(instruction.Opcode))+".bin", decryptedBytes, os.ModePerm)
|
||||
|
||||
protoMessageData := instruction.DecryptedProtoMessage.ProtoReflect().Type().New().Interface()
|
||||
decodeProtoErr := binary.DecodeProtoMessage(decryptedBytes, protoMessageData)
|
||||
if decodeProtoErr != nil {
|
||||
return nil, decodeProtoErr
|
||||
}
|
||||
|
||||
return protoMessageData, nil
|
||||
}
|
||||
return nil, fmt.Errorf("no encrypted data to decrypt for requestID: %s", r.Data.RequestID)
|
||||
s.client.Logger.Debug().Any("payload", jsonData).Msg("[ACK] Sent Request")
|
||||
}
|
||||
|
|
13
libgm/settings_handler.go
Normal file
13
libgm/settings_handler.go
Normal file
|
@ -0,0 +1,13 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/events"
|
||||
)
|
||||
|
||||
func (c *Client) handleSettingsEvent(res *pblite.Response, data *binary.Settings) {
|
||||
evt := events.NewSettingsUpdated(data)
|
||||
c.triggerEvent(evt)
|
||||
}
|
26
libgm/typing_handler.go
Normal file
26
libgm/typing_handler.go
Normal file
|
@ -0,0 +1,26 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/events"
|
||||
)
|
||||
|
||||
func (c *Client) handleTypingEvent(res *pblite.Response, data *binary.TypingData) {
|
||||
typingType := data.Type
|
||||
|
||||
var evt events.TypingEvent
|
||||
switch typingType {
|
||||
case binary.TypingTypes_STARTED_TYPING:
|
||||
evt = events.NewStartedTyping(data)
|
||||
case binary.TypingTypes_STOPPED_TYPING:
|
||||
evt = events.NewStoppedTyping(data)
|
||||
default:
|
||||
c.Logger.Debug().Any("data", data).Msg("got unknown TypingData evt")
|
||||
}
|
||||
|
||||
if evt != nil {
|
||||
c.triggerEvent(evt)
|
||||
}
|
||||
}
|
40
libgm/updates_handler.go
Normal file
40
libgm/updates_handler.go
Normal file
|
@ -0,0 +1,40 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
)
|
||||
|
||||
func (c *Client) handleUpdatesEvent(res *pblite.Response) {
|
||||
switch res.Data.Action {
|
||||
case binary.ActionType_GET_UPDATES:
|
||||
data, ok := res.Data.Decrypted.(*binary.UpdateEvents)
|
||||
if !ok {
|
||||
c.Logger.Error().Any("res", res).Msg("failed to assert ActionType_GET_UPDATES event into UpdateEvents")
|
||||
return
|
||||
}
|
||||
|
||||
switch evt := data.Event.(type) {
|
||||
case *binary.UpdateEvents_UserAlertEvent:
|
||||
c.handleUserAlertEvent(res, evt.UserAlertEvent)
|
||||
|
||||
case *binary.UpdateEvents_SettingsEvent:
|
||||
c.handleSettingsEvent(res, evt.SettingsEvent)
|
||||
|
||||
case *binary.UpdateEvents_ConversationEvent:
|
||||
c.handleConversationEvent(res, evt.ConversationEvent.GetData())
|
||||
|
||||
case *binary.UpdateEvents_MessageEvent:
|
||||
c.handleMessageEvent(res, evt.MessageEvent.GetData())
|
||||
|
||||
case *binary.UpdateEvents_TypingEvent:
|
||||
c.handleTypingEvent(res, evt.TypingEvent.GetData())
|
||||
default:
|
||||
c.Logger.Debug().Any("evt", evt).Any("res", res).Msg("Got unknown event type")
|
||||
}
|
||||
|
||||
default:
|
||||
c.Logger.Error().Any("response", res).Msg("ignoring response.")
|
||||
}
|
||||
}
|
59
libgm/useralert_handler.go
Normal file
59
libgm/useralert_handler.go
Normal file
|
@ -0,0 +1,59 @@
|
|||
package libgm
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/pblite"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
"go.mau.fi/mautrix-gmessages/libgm/events"
|
||||
)
|
||||
|
||||
func (c *Client) handleUserAlertEvent(res *pblite.Response, data *binary.UserAlertEvent) {
|
||||
alertType := data.AlertType
|
||||
switch alertType {
|
||||
case binary.AlertType_BROWSER_ACTIVE:
|
||||
newSessionId := res.Data.RequestId
|
||||
c.Logger.Info().Any("sessionId", newSessionId).Msg("[NEW_BROWSER_ACTIVE] Opened new browser connection")
|
||||
if newSessionId != c.sessionHandler.sessionId {
|
||||
evt := events.NewBrowserActive(newSessionId)
|
||||
c.triggerEvent(evt)
|
||||
} else {
|
||||
c.Logger.Info().Any("sessionId", newSessionId).Msg("Client is ready!")
|
||||
conversations, convErr := c.Conversations.List(25)
|
||||
if convErr != nil {
|
||||
log.Fatal(convErr)
|
||||
}
|
||||
c.Logger.Debug().Any("conversations", conversations).Msg("got conversations")
|
||||
notifyErr := c.Session.NotifyDittoActivity()
|
||||
if notifyErr != nil {
|
||||
log.Fatal(notifyErr)
|
||||
}
|
||||
readyEvt := events.NewClientReady(newSessionId, conversations)
|
||||
c.triggerEvent(readyEvt)
|
||||
}
|
||||
|
||||
case binary.AlertType_MOBILE_BATTERY_LOW:
|
||||
c.Logger.Info().Msg("[MOBILE_BATTERY_LOW] Mobile device is on low battery")
|
||||
evt := events.NewMobileBatteryLow()
|
||||
c.triggerEvent(evt)
|
||||
|
||||
case binary.AlertType_MOBILE_BATTERY_RESTORED:
|
||||
c.Logger.Info().Msg("[MOBILE_BATTERY_RESTORED] Mobile device has restored enough battery!")
|
||||
evt := events.NewMobileBatteryRestored()
|
||||
c.triggerEvent(evt)
|
||||
|
||||
case binary.AlertType_MOBILE_DATA_CONNECTION:
|
||||
c.Logger.Info().Msg("[MOBILE_DATA_CONNECTION] Mobile device is now using data connection")
|
||||
evt := events.NewMobileDataConnection()
|
||||
c.triggerEvent(evt)
|
||||
|
||||
case binary.AlertType_MOBILE_WIFI_CONNECTION:
|
||||
c.Logger.Info().Msg("[MOBILE_WIFI_CONNECTION] Mobile device is now using wifi connection")
|
||||
evt := events.NewMobileWifiConnection()
|
||||
c.triggerEvent(evt)
|
||||
|
||||
default:
|
||||
c.Logger.Info().Any("data", data).Any("res", res).Msg("Got unknown alert type")
|
||||
}
|
||||
}
|
|
@ -1,7 +1,22 @@
|
|||
package util
|
||||
|
||||
import (
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
)
|
||||
|
||||
var BrowserType = binary.BrowserTypes_CHROME
|
||||
|
||||
const GoogleAPIKey = "AIzaSyCA4RsOZUFrm9whhtGosPlJLmVPnfSHKz8"
|
||||
const UserAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36"
|
||||
const OS = "Linux"
|
||||
const XUserAgent = "grpc-web-javascript/0.1"
|
||||
const QRCodeURLBase = "https://support.google.com/messages/?p=web_computer#?c="
|
||||
|
||||
// Deprecated
|
||||
var (
|
||||
BROWSER_TYPE = BrowserType
|
||||
GOOG_API_KEY = GoogleAPIKey
|
||||
USER_AGENT = UserAgent
|
||||
X_USER_AGENT = XUserAgent
|
||||
QR_CODE_URL = QRCodeURLBase
|
||||
)
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
package util
|
||||
|
||||
import "fmt"
|
||||
|
||||
type InstructionNotFound struct {
|
||||
Opcode int64
|
||||
}
|
||||
|
||||
func (e *InstructionNotFound) Error() string {
|
||||
return fmt.Sprintf("Could not find instruction for opcode %d", e.Opcode)
|
||||
}
|
|
@ -3,16 +3,24 @@ package util
|
|||
import (
|
||||
crand "crypto/rand"
|
||||
"encoding/hex"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
|
||||
"go.mau.fi/mautrix-gmessages/libgm/binary"
|
||||
)
|
||||
|
||||
var Charset = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
|
||||
|
||||
func TimestampNow() time.Time {
|
||||
return time.Now().UTC()
|
||||
}
|
||||
|
||||
func RandStr(length int) string {
|
||||
b := make([]rune, length)
|
||||
for i := range b {
|
||||
|
@ -132,3 +140,48 @@ func NewMediaUploadHeaders(imageSize string, command string, uploadOffset string
|
|||
headers.Add("accept-language", "en-US,en;q=0.9")
|
||||
return headers
|
||||
}
|
||||
|
||||
func ParseConfigVersion(res []byte) (*binary.ConfigVersion, error) {
|
||||
var data []interface{}
|
||||
|
||||
marshalErr := json.Unmarshal(res, &data)
|
||||
if marshalErr != nil {
|
||||
return nil, marshalErr
|
||||
}
|
||||
|
||||
version := data[0].(string)
|
||||
v1 := version[0:4]
|
||||
v2 := version[4:6]
|
||||
v3 := version[6:8]
|
||||
|
||||
if v2[0] == 48 {
|
||||
v2 = string(v2[1])
|
||||
}
|
||||
if v3[0] == 48 {
|
||||
v3 = string(v3[1])
|
||||
}
|
||||
|
||||
first, e := strconv.Atoi(v1)
|
||||
if e != nil {
|
||||
return nil, e
|
||||
}
|
||||
|
||||
second, e1 := strconv.Atoi(v2)
|
||||
if e1 != nil {
|
||||
return nil, e1
|
||||
}
|
||||
|
||||
third, e2 := strconv.Atoi(v3)
|
||||
if e2 != nil {
|
||||
return nil, e2
|
||||
}
|
||||
|
||||
configMessage := &binary.ConfigVersion{
|
||||
V1: int32(first),
|
||||
V2: int32(second),
|
||||
V3: int32(third),
|
||||
V4: 4,
|
||||
V5: 6,
|
||||
}
|
||||
return configMessage, nil
|
||||
}
|
||||
|
|
|
@ -18,3 +18,8 @@ var MESSAGING = INSTANT_MESSAGING + "/$rpc/google.internal.communications.instan
|
|||
var RECEIVE_MESSAGES = MESSAGING + "/ReceiveMessages"
|
||||
var SEND_MESSAGE = MESSAGING + "/SendMessage"
|
||||
var ACK_MESSAGES = MESSAGING + "/AckMessages"
|
||||
|
||||
var REGISTRATION = INSTANT_MESSAGING + "/$rpc/google.internal.communications.instantmessaging.v1.Registration"
|
||||
var REGISTER_REFRESH = REGISTRATION + "/RegisterRefresh"
|
||||
|
||||
var CONFIG_URL = "https://messages.google.com/web/config"
|
||||
|
|
25
portal.go
25
portal.go
|
@ -303,9 +303,9 @@ func (portal *Portal) handleMessageLoop() {
|
|||
func (portal *Portal) isOutgoingMessage(evt *binary.Message) id.EventID {
|
||||
portal.outgoingMessagesLock.Lock()
|
||||
defer portal.outgoingMessagesLock.Unlock()
|
||||
evtID, ok := portal.outgoingMessages[evt.TmpId]
|
||||
evtID, ok := portal.outgoingMessages[evt.TmpID]
|
||||
if ok {
|
||||
delete(portal.outgoingMessages, evt.TmpId)
|
||||
delete(portal.outgoingMessages, evt.TmpID)
|
||||
portal.markHandled(evt, map[string]id.EventID{"": evtID}, true)
|
||||
return evtID
|
||||
}
|
||||
|
@ -338,7 +338,8 @@ func (portal *Portal) handleMessage(source *User, evt *binary.Message) {
|
|||
}
|
||||
|
||||
var intent *appservice.IntentAPI
|
||||
if evt.GetFrom().GetFromMe() {
|
||||
// TODO is there a fromMe flag?
|
||||
if evt.GetParticipantID() == portal.SelfUserID {
|
||||
intent = source.DoublePuppetIntent
|
||||
if intent == nil {
|
||||
log.Debug().Msg("Dropping message from self as double puppeting is not enabled")
|
||||
|
@ -364,17 +365,17 @@ func (portal *Portal) handleMessage(source *User, evt *binary.Message) {
|
|||
MsgType: event.MsgText,
|
||||
Body: data.MessageContent.GetContent(),
|
||||
}
|
||||
case *binary.MessageInfo_ImageContent:
|
||||
case *binary.MessageInfo_MediaContent:
|
||||
content = event.MessageEventContent{
|
||||
MsgType: event.MsgNotice,
|
||||
Body: fmt.Sprintf("Attachment %s", data.ImageContent.GetImageName()),
|
||||
Body: fmt.Sprintf("Attachment %s", data.MediaContent.GetMediaName()),
|
||||
}
|
||||
}
|
||||
resp, err := portal.sendMessage(intent, event.EventMessage, &content, nil, ts)
|
||||
if err != nil {
|
||||
log.Err(err).Msg("Failed to send message")
|
||||
} else {
|
||||
eventIDs[part.OrderInternal] = resp.EventID
|
||||
eventIDs[part.GetActionMessageID()] = resp.EventID
|
||||
lastEventID = resp.EventID
|
||||
}
|
||||
}
|
||||
|
@ -423,7 +424,7 @@ func (portal *Portal) SyncParticipants(source *User, metadata *binary.Conversati
|
|||
for _, participant := range metadata.Participants {
|
||||
if participant.IsMe {
|
||||
continue
|
||||
} else if participant.Id.Number == "" {
|
||||
} else if participant.ID.Number == "" {
|
||||
portal.zlog.Warn().Interface("participant", participant).Msg("No number found in non-self participant entry")
|
||||
continue
|
||||
}
|
||||
|
@ -433,7 +434,7 @@ func (portal *Portal) SyncParticipants(source *User, metadata *binary.Conversati
|
|||
manyParticipants = true
|
||||
}
|
||||
portal.zlog.Debug().Interface("participant", participant).Msg("Syncing participant")
|
||||
puppet := source.GetPuppetByID(participant.Id.ParticipantID, participant.Id.Number)
|
||||
puppet := source.GetPuppetByID(participant.ID.ParticipantID, participant.ID.Number)
|
||||
userIDs = append(userIDs, puppet.MXID)
|
||||
puppet.Sync(source, participant)
|
||||
if portal.MXID != "" {
|
||||
|
@ -445,12 +446,12 @@ func (portal *Portal) SyncParticipants(source *User, metadata *binary.Conversati
|
|||
}
|
||||
}
|
||||
}
|
||||
if !metadata.IsGroupChat && !manyParticipants && portal.OtherUserID != firstParticipant.Id.ParticipantID {
|
||||
if !metadata.IsGroupChat && !manyParticipants && portal.OtherUserID != firstParticipant.ID.ParticipantID {
|
||||
portal.zlog.Info().
|
||||
Str("old_other_user_id", portal.OtherUserID).
|
||||
Str("new_other_user_id", firstParticipant.Id.ParticipantID).
|
||||
Str("new_other_user_id", firstParticipant.ID.ParticipantID).
|
||||
Msg("Found other user ID in DM")
|
||||
portal.OtherUserID = firstParticipant.Id.ParticipantID
|
||||
portal.OtherUserID = firstParticipant.ID.ParticipantID
|
||||
changed = true
|
||||
}
|
||||
return userIDs, changed
|
||||
|
@ -906,7 +907,7 @@ func (portal *Portal) HandleMatrixMessage(sender *User, evt *event.Event, timing
|
|||
SetConversationID(portal.ID).
|
||||
SetSelfParticipantID(portal.SelfUserID).
|
||||
SetContent(text).
|
||||
SetTmpID(txnID), "",
|
||||
SetTmpID(txnID),
|
||||
)
|
||||
if err != nil {
|
||||
go ms.sendMessageMetrics(evt, err, "Error sending", true)
|
||||
|
|
|
@ -263,8 +263,8 @@ func (puppet *Puppet) Sync(source *User, contact *binary.Participant) {
|
|||
|
||||
update := false
|
||||
if contact != nil {
|
||||
if contact.Id.Number != "" && puppet.Phone != contact.Id.Number {
|
||||
puppet.Phone = contact.Id.Number
|
||||
if contact.ID.Number != "" && puppet.Phone != contact.ID.Number {
|
||||
puppet.Phone = contact.ID.Number
|
||||
update = true
|
||||
}
|
||||
update = puppet.UpdateName(contact.GetFormattedNumber(), contact.GetFullName(), contact.GetFirstName()) || update
|
||||
|
|
61
user.go
61
user.go
|
@ -386,25 +386,12 @@ func (user *User) SetManagementRoom(roomID id.RoomID) {
|
|||
var ErrAlreadyLoggedIn = errors.New("already logged in")
|
||||
|
||||
func (user *User) createClient() {
|
||||
var devicePair *libgm.DevicePair
|
||||
var cryptor *crypto.Cryptor
|
||||
if user.Session != nil && user.Session.WebAuthKey != nil {
|
||||
devicePair = &libgm.DevicePair{
|
||||
Mobile: user.Session.PhoneInfo,
|
||||
Browser: user.Session.BrowserInfo,
|
||||
}
|
||||
cryptor = &crypto.Cryptor{
|
||||
AESCTR256Key: user.Session.AESKey,
|
||||
SHA256Key: user.Session.HMACKey,
|
||||
}
|
||||
} else {
|
||||
cryptor = crypto.NewCryptor(nil, nil)
|
||||
user.Session = &database.Session{
|
||||
AESKey: cryptor.AESCTR256Key,
|
||||
HMACKey: cryptor.SHA256Key,
|
||||
if user.Session == nil {
|
||||
user.Session = &libgm.AuthData{
|
||||
Cryptor: crypto.NewCryptor(nil, nil),
|
||||
}
|
||||
}
|
||||
user.Client = libgm.NewClient(devicePair, cryptor, user.zlog.With().Str("component", "libgm").Logger(), nil)
|
||||
user.Client = libgm.NewClient(user.Session, user.zlog.With().Str("component", "libgm").Logger())
|
||||
user.Client.SetEventHandler(user.HandleEvent)
|
||||
}
|
||||
|
||||
|
@ -417,15 +404,7 @@ func (user *User) Login(ctx context.Context) (<-chan string, error) {
|
|||
user.unlockedDeleteConnection()
|
||||
}
|
||||
user.createClient()
|
||||
pairer, err := user.Client.NewPairer(nil, 20)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to initialize pairer: %w", err)
|
||||
}
|
||||
resp, err := pairer.RegisterPhoneRelay()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to register phone relay: %w", err)
|
||||
}
|
||||
err = user.Client.Connect(resp.Field5.RpcKey)
|
||||
err := user.Client.Connect()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to connect to Google Messages: %w", err)
|
||||
}
|
||||
|
@ -446,7 +425,7 @@ func (user *User) Connect() bool {
|
|||
user.zlog.Debug().Msg("Connecting to Google Messages")
|
||||
user.BridgeState.Send(status.BridgeState{StateEvent: status.StateConnecting, Error: GMConnecting})
|
||||
user.createClient()
|
||||
err := user.Client.Connect(user.Session.WebAuthKey)
|
||||
err := user.Client.Connect()
|
||||
if err != nil {
|
||||
user.zlog.Err(err).Msg("Error connecting to Google Messages")
|
||||
user.BridgeState.Send(status.BridgeState{
|
||||
|
@ -550,36 +529,34 @@ func (user *User) HandleEvent(event interface{}) {
|
|||
user.hackyLoginCommand = nil
|
||||
user.hackyLoginCommandPrevEvent = ""
|
||||
user.tryAutomaticDoublePuppeting()
|
||||
user.Phone = v.PairDeviceData.Mobile.RegistrationID
|
||||
user.Session.PhoneInfo = v.PairDeviceData.Mobile
|
||||
user.Session.BrowserInfo = v.PairDeviceData.Browser
|
||||
user.Session.WebAuthKey = v.PairDeviceData.WebAuthKeyData.GetWebAuthKey()
|
||||
user.Phone = v.GetMobile().GetSourceID()
|
||||
user.addToPhoneMap()
|
||||
err := user.Update(context.TODO())
|
||||
if err != nil {
|
||||
user.zlog.Err(err).Msg("Failed to update session in database")
|
||||
}
|
||||
case *binary.Event_ConversationEvent:
|
||||
portal := user.GetPortalByID(v.ConversationEvent.GetData().GetConversationID())
|
||||
case *events.AuthTokenRefreshed:
|
||||
err := user.Update(context.TODO())
|
||||
if err != nil {
|
||||
user.zlog.Err(err).Msg("Failed to update session in database")
|
||||
}
|
||||
case *binary.Conversation:
|
||||
portal := user.GetPortalByID(v.GetConversationID())
|
||||
if portal.MXID != "" {
|
||||
portal.UpdateMetadata(user, v.ConversationEvent.GetData())
|
||||
portal.UpdateMetadata(user, v)
|
||||
} else {
|
||||
err := portal.CreateMatrixRoom(user, v.ConversationEvent.GetData())
|
||||
err := portal.CreateMatrixRoom(user, v)
|
||||
if err != nil {
|
||||
user.zlog.Err(err).Msg("Error creating Matrix room from conversation event")
|
||||
}
|
||||
}
|
||||
case *binary.Event_MessageEvent:
|
||||
portal := user.GetPortalByID(v.MessageEvent.GetData().GetConversationID())
|
||||
portal.messages <- PortalMessage{evt: v.MessageEvent.GetData(), source: user}
|
||||
case *binary.Message:
|
||||
portal := user.GetPortalByID(v.GetConversationID())
|
||||
portal.messages <- PortalMessage{evt: v, source: user}
|
||||
case *events.ClientReady:
|
||||
user.zlog.Trace().Any("data", v).Msg("Client is ready!")
|
||||
case *events.BrowserActive:
|
||||
user.zlog.Trace().Any("data", v).Msg("Browser active")
|
||||
case *events.Battery:
|
||||
user.zlog.Trace().Any("data", v).Msg("Battery")
|
||||
case *events.DataConnection:
|
||||
user.zlog.Trace().Any("data", v).Msg("Data connection")
|
||||
default:
|
||||
user.zlog.Trace().Any("data", v).Msg("Unknown event")
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue