support passing kdf and node config from receiver when local pairing (#3179)

This commit is contained in:
frank 2023-02-17 21:02:42 +08:00 committed by GitHub
parent b9de89ca38
commit e64091c779
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 405 additions and 298 deletions

View File

@ -1 +1 @@
0.131.9 0.131.10

View File

@ -2435,7 +2435,6 @@ type SyncRawMessage struct {
// we need these to be able to login // we need these to be able to login
SubAccountsJsonBytes []byte `protobuf:"bytes,2,opt,name=subAccountsJsonBytes,proto3" json:"subAccountsJsonBytes,omitempty"` SubAccountsJsonBytes []byte `protobuf:"bytes,2,opt,name=subAccountsJsonBytes,proto3" json:"subAccountsJsonBytes,omitempty"`
SettingsJsonBytes []byte `protobuf:"bytes,3,opt,name=settingsJsonBytes,proto3" json:"settingsJsonBytes,omitempty"` SettingsJsonBytes []byte `protobuf:"bytes,3,opt,name=settingsJsonBytes,proto3" json:"settingsJsonBytes,omitempty"`
NodeConfigJsonBytes []byte `protobuf:"bytes,4,opt,name=nodeConfigJsonBytes,proto3" json:"nodeConfigJsonBytes,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -2487,13 +2486,6 @@ func (m *SyncRawMessage) GetSettingsJsonBytes() []byte {
return nil return nil
} }
func (m *SyncRawMessage) GetNodeConfigJsonBytes() []byte {
if m != nil {
return m.NodeConfigJsonBytes
}
return nil
}
func init() { func init() {
proto.RegisterEnum("protobuf.SyncTrustedUser_TrustStatus", SyncTrustedUser_TrustStatus_name, SyncTrustedUser_TrustStatus_value) proto.RegisterEnum("protobuf.SyncTrustedUser_TrustStatus", SyncTrustedUser_TrustStatus_name, SyncTrustedUser_TrustStatus_value)
proto.RegisterEnum("protobuf.SyncVerificationRequest_VerificationStatus", SyncVerificationRequest_VerificationStatus_name, SyncVerificationRequest_VerificationStatus_value) proto.RegisterEnum("protobuf.SyncVerificationRequest_VerificationStatus", SyncVerificationRequest_VerificationStatus_name, SyncVerificationRequest_VerificationStatus_value)
@ -2539,154 +2531,153 @@ func init() {
} }
var fileDescriptor_d61ab7221f0b5518 = []byte{ var fileDescriptor_d61ab7221f0b5518 = []byte{
// 2378 bytes of a gzipped FileDescriptorProto // 2361 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x19, 0x4d, 0x73, 0x1b, 0x49, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x19, 0x4d, 0x73, 0x1b, 0x49,
0x75, 0x47, 0x52, 0x2c, 0xe9, 0x49, 0x96, 0x95, 0xb6, 0x77, 0xa3, 0xd8, 0xde, 0x8a, 0x33, 0xcb, 0x75, 0x47, 0x52, 0x2c, 0xe9, 0x49, 0x96, 0x95, 0x8e, 0x77, 0xa3, 0xd8, 0x4e, 0xc5, 0x99, 0x90,
0xd6, 0x86, 0xaa, 0xc5, 0xbb, 0x95, 0x00, 0x0b, 0x9b, 0x4d, 0xed, 0x2a, 0xb2, 0xd9, 0x38, 0x1f, 0xda, 0x50, 0x15, 0xbc, 0x54, 0x02, 0x2c, 0x6c, 0x36, 0xb5, 0xab, 0xc8, 0x66, 0xe3, 0x7c, 0x38,
0x8e, 0xab, 0x6d, 0x27, 0x40, 0x51, 0x35, 0xd5, 0x9e, 0x69, 0x5b, 0x8d, 0x47, 0x33, 0xc3, 0x74, 0xae, 0xb6, 0x9d, 0x00, 0x45, 0xd5, 0x54, 0x7b, 0xa6, 0x63, 0x35, 0x1e, 0xcd, 0x0c, 0xd3, 0x2d,
0xcb, 0x41, 0xdc, 0xb8, 0xf0, 0x03, 0xb8, 0x70, 0xdd, 0x3b, 0x37, 0xaa, 0x96, 0x13, 0x3f, 0x80, 0x87, 0xe1, 0xc6, 0x85, 0x1f, 0xc0, 0x85, 0xeb, 0x9e, 0xe1, 0x46, 0xd5, 0x72, 0xe2, 0x07, 0x70,
0x1b, 0x07, 0x2e, 0x54, 0xc1, 0x2f, 0xe0, 0x57, 0x50, 0xfd, 0xba, 0x47, 0x33, 0x23, 0x4b, 0xc6, 0xe3, 0xc0, 0x85, 0x2a, 0xf8, 0x05, 0xfc, 0x0a, 0xaa, 0x5f, 0xf7, 0x48, 0x33, 0xb2, 0x64, 0x9c,
0x29, 0x4e, 0x9c, 0x3c, 0xef, 0xf5, 0x7b, 0xaf, 0x5f, 0xbf, 0xef, 0x27, 0xc3, 0x72, 0xc2, 0x44, 0xe2, 0xc4, 0xc9, 0xfd, 0xde, 0xbc, 0xf7, 0xfa, 0xf5, 0xfb, 0x7e, 0x32, 0x2c, 0x27, 0x4c, 0xa4,
0x2a, 0xa2, 0xb3, 0xed, 0x24, 0x8d, 0x55, 0x4c, 0x1a, 0xf8, 0xe7, 0x64, 0x7c, 0xba, 0xbe, 0x2a, 0x22, 0x3a, 0xd9, 0x4a, 0xd2, 0x58, 0xc5, 0xa4, 0x81, 0x7f, 0x8e, 0xc7, 0x6f, 0xd7, 0xae, 0xc9,
0x27, 0x91, 0xef, 0x49, 0xae, 0x94, 0x88, 0xce, 0xa4, 0x39, 0x5e, 0x77, 0x59, 0x92, 0x84, 0xc2, 0x2c, 0xf2, 0x3d, 0xc9, 0x95, 0x12, 0xd1, 0x89, 0x34, 0x9f, 0xd7, 0x5c, 0x96, 0x24, 0xa1, 0xf0,
0x67, 0x4a, 0xc4, 0x91, 0x37, 0xe2, 0x8a, 0x05, 0x4c, 0x31, 0x6f, 0xc4, 0xa5, 0x64, 0x67, 0xdc, 0x99, 0x12, 0x71, 0xe4, 0x8d, 0xb8, 0x62, 0x01, 0x53, 0xcc, 0x1b, 0x71, 0x29, 0xd9, 0x09, 0x37,
0xd0, 0xb8, 0x0c, 0x36, 0x7e, 0xc2, 0x95, 0x3f, 0x14, 0xd1, 0xd9, 0x63, 0xe6, 0x9f, 0xf3, 0xe0, 0x34, 0x2e, 0x83, 0xf5, 0x1f, 0x73, 0xe5, 0x0f, 0x45, 0x74, 0xf2, 0x84, 0xf9, 0xa7, 0x3c, 0x38,
0x38, 0xd9, 0x61, 0x8a, 0xed, 0x70, 0xc5, 0x44, 0x28, 0xc9, 0x1d, 0x68, 0x21, 0x53, 0x34, 0x1e, 0x4a, 0xb6, 0x99, 0x62, 0xdb, 0x5c, 0x31, 0x11, 0x4a, 0x72, 0x0b, 0x5a, 0xc8, 0x14, 0x8d, 0x47,
0x9d, 0xf0, 0xb4, 0xe7, 0x6c, 0x39, 0xf7, 0x96, 0x29, 0x68, 0xd4, 0x3e, 0x62, 0xc8, 0x5d, 0x68, 0xc7, 0x3c, 0xed, 0x39, 0x9b, 0xce, 0xbd, 0x65, 0x0a, 0x1a, 0xb5, 0x87, 0x18, 0x72, 0x1b, 0xda,
0xab, 0x58, 0xb1, 0x30, 0xa3, 0xa8, 0x20, 0x45, 0x0b, 0x71, 0x86, 0xc4, 0xfd, 0x47, 0x0d, 0x96, 0x2a, 0x56, 0x2c, 0xcc, 0x29, 0x2a, 0x48, 0xd1, 0x42, 0x9c, 0x21, 0x71, 0xff, 0x51, 0x83, 0x25,
0xb4, 0xec, 0x71, 0x42, 0xd6, 0xe0, 0x86, 0x1f, 0xc6, 0xfe, 0x39, 0x0a, 0xaa, 0x51, 0x03, 0x90, 0x2d, 0x7b, 0x9c, 0x90, 0x55, 0xb8, 0xe2, 0x87, 0xb1, 0x7f, 0x8a, 0x82, 0x6a, 0xd4, 0x00, 0xa4,
0x0e, 0x54, 0x44, 0x80, 0x9c, 0x4d, 0x5a, 0x11, 0x01, 0xf9, 0x12, 0x1a, 0x7e, 0x1c, 0x29, 0xe6, 0x03, 0x15, 0x11, 0x20, 0x67, 0x93, 0x56, 0x44, 0x40, 0xbe, 0x80, 0x86, 0x1f, 0x47, 0x8a, 0xf9,
0x2b, 0xd9, 0xab, 0x6e, 0x55, 0xef, 0xb5, 0xee, 0x7f, 0xb0, 0x9d, 0xbd, 0x74, 0xfb, 0x70, 0x12, 0x4a, 0xf6, 0xaa, 0x9b, 0xd5, 0x7b, 0xad, 0x07, 0x77, 0xb6, 0xf2, 0x97, 0x6e, 0x1d, 0x64, 0x91,
0xf9, 0x7b, 0x91, 0x54, 0x2c, 0x0c, 0xf1, 0x61, 0x03, 0x43, 0xf9, 0xea, 0x3e, 0x9d, 0x32, 0x91, 0xbf, 0x1b, 0x49, 0xc5, 0xc2, 0x10, 0x1f, 0x36, 0x30, 0x94, 0xaf, 0x1f, 0xd0, 0x09, 0x13, 0xf9,
0x1f, 0x43, 0xcb, 0x8f, 0x47, 0xa3, 0x71, 0x24, 0x94, 0xe0, 0xb2, 0x57, 0x43, 0x19, 0xb7, 0xca, 0x11, 0xb4, 0xfc, 0x78, 0x34, 0x1a, 0x47, 0x42, 0x09, 0x2e, 0x7b, 0x35, 0x94, 0x71, 0xbd, 0x2c,
0x32, 0x06, 0x96, 0x60, 0x42, 0x8b, 0xb4, 0xe4, 0x25, 0xac, 0x64, 0x62, 0xac, 0x0d, 0x7a, 0x37, 0x63, 0x60, 0x09, 0x32, 0x5a, 0xa4, 0x25, 0xaf, 0x60, 0x25, 0x17, 0x63, 0x6d, 0xd0, 0xbb, 0xb2,
0xb6, 0x9c, 0x7b, 0xad, 0xfb, 0x1f, 0xe6, 0xec, 0x57, 0x18, 0x8c, 0xce, 0x72, 0x93, 0x63, 0x20, 0xe9, 0xdc, 0x6b, 0x3d, 0xb8, 0x3b, 0x65, 0xbf, 0xc0, 0x60, 0x74, 0x96, 0x9b, 0x1c, 0x01, 0x29,
0x05, 0xf9, 0x99, 0xcc, 0xa5, 0xb7, 0x91, 0x39, 0x47, 0x00, 0x79, 0x00, 0xf5, 0x24, 0x8d, 0x4f, 0xc8, 0xcf, 0x65, 0x2e, 0xbd, 0x8f, 0xcc, 0x39, 0x02, 0xc8, 0x43, 0xa8, 0x27, 0x69, 0xfc, 0x56,
0x45, 0xc8, 0x7b, 0x75, 0x94, 0x75, 0x3b, 0x97, 0x95, 0xc9, 0x38, 0x30, 0x04, 0x34, 0xa3, 0x24, 0x84, 0xbc, 0x57, 0x47, 0x59, 0x37, 0xa6, 0xb2, 0x72, 0x19, 0xfb, 0x86, 0x80, 0xe6, 0x94, 0xe4,
0x2f, 0xa0, 0x63, 0x3f, 0x33, 0x3d, 0x1a, 0x6f, 0xa3, 0xc7, 0x0c, 0x33, 0xf9, 0x04, 0xea, 0x36, 0x25, 0x74, 0xec, 0x31, 0xd7, 0xa3, 0xf1, 0x3e, 0x7a, 0xcc, 0x30, 0x93, 0x4f, 0xa0, 0x6e, 0x23,
0xe2, 0x7a, 0x4d, 0x94, 0xf3, 0x6e, 0xd9, 0xc4, 0x87, 0xe6, 0x90, 0x66, 0x54, 0xda, 0xb8, 0x59, 0xae, 0xd7, 0x44, 0x39, 0x1f, 0x96, 0x4d, 0x7c, 0x60, 0x3e, 0xd2, 0x9c, 0x4a, 0x1b, 0x37, 0x0f,
0x88, 0x66, 0x0a, 0xc0, 0x5b, 0x19, 0x77, 0x86, 0xdb, 0xfd, 0x4b, 0x0d, 0xda, 0x2f, 0xc6, 0xa1, 0xd1, 0x5c, 0x01, 0x78, 0x2f, 0xe3, 0xce, 0x70, 0xbb, 0x7f, 0xa9, 0x41, 0xfb, 0xe5, 0x38, 0x54,
0x12, 0x7d, 0xdf, 0x8f, 0xc7, 0x91, 0x22, 0x04, 0x6a, 0x11, 0x1b, 0x71, 0x8c, 0xaf, 0x26, 0xc5, 0xa2, 0xef, 0xfb, 0xf1, 0x38, 0x52, 0x84, 0x40, 0x2d, 0x62, 0x23, 0x8e, 0xf1, 0xd5, 0xa4, 0x78,
0x6f, 0xb2, 0x09, 0x4d, 0x25, 0x46, 0x5c, 0x2a, 0x36, 0x4a, 0x30, 0xca, 0xaa, 0x34, 0x47, 0xe8, 0x26, 0x1b, 0xd0, 0x54, 0x62, 0xc4, 0xa5, 0x62, 0xa3, 0x04, 0xa3, 0xac, 0x4a, 0xa7, 0x08, 0xfd,
0x53, 0x11, 0xf0, 0x48, 0x09, 0x3f, 0x8e, 0x7a, 0x55, 0x64, 0xcb, 0x11, 0xe4, 0x2b, 0x00, 0x3f, 0x55, 0x04, 0x3c, 0x52, 0xc2, 0x8f, 0xa3, 0x5e, 0x15, 0xd9, 0xa6, 0x08, 0xf2, 0x25, 0x80, 0x1f,
0x0e, 0xe3, 0xd4, 0x1b, 0x32, 0x39, 0xb4, 0x81, 0x74, 0x37, 0x57, 0xb6, 0x78, 0xf7, 0xf6, 0x20, 0x87, 0x71, 0xea, 0x0d, 0x99, 0x1c, 0xda, 0x40, 0xba, 0x3d, 0x55, 0xb6, 0x78, 0xf7, 0xd6, 0x20,
0x0e, 0xe3, 0x71, 0xfa, 0x84, 0xc9, 0x21, 0x6d, 0x22, 0x93, 0xfe, 0x24, 0x3d, 0xa8, 0x23, 0xb0, 0x0e, 0xe3, 0x71, 0xfa, 0x94, 0xc9, 0x21, 0x6d, 0x22, 0x93, 0x3e, 0x92, 0x1e, 0xd4, 0x11, 0xd8,
0x17, 0x60, 0x20, 0x55, 0x69, 0x06, 0x92, 0x8f, 0x60, 0xe5, 0x9c, 0x4f, 0x7c, 0x96, 0x06, 0x9e, 0x0d, 0x30, 0x90, 0xaa, 0x34, 0x07, 0xc9, 0xc7, 0xb0, 0x72, 0xca, 0x33, 0x9f, 0xa5, 0x81, 0x67,
0x4d, 0x6b, 0x0c, 0x8b, 0x26, 0xed, 0x58, 0xf4, 0x81, 0xc1, 0x92, 0x5b, 0x50, 0x3f, 0xe7, 0x13, 0xd3, 0x1a, 0xc3, 0xa2, 0x49, 0x3b, 0x16, 0xbd, 0x6f, 0xb0, 0xe4, 0x3a, 0xd4, 0x4f, 0x79, 0xe6,
0x6f, 0x2c, 0x02, 0xf4, 0x75, 0x93, 0x2e, 0x9d, 0xf3, 0xc9, 0xb1, 0x08, 0xc8, 0x17, 0xb0, 0x24, 0x8d, 0x45, 0x80, 0xbe, 0x6e, 0xd2, 0xa5, 0x53, 0x9e, 0x1d, 0x89, 0x80, 0x7c, 0x0e, 0x4b, 0x62,
0x46, 0xec, 0x8c, 0x6b, 0x3f, 0x6a, 0xcd, 0xbe, 0xb3, 0x40, 0xb3, 0x3d, 0x7c, 0x8f, 0x9a, 0xec, 0xc4, 0x4e, 0xb8, 0xf6, 0xa3, 0xd6, 0xec, 0x5b, 0x0b, 0x34, 0xdb, 0xc5, 0xf7, 0xa8, 0x6c, 0x57,
0x69, 0x62, 0x6a, 0x79, 0xd6, 0x5d, 0x80, 0x5c, 0x65, 0x9d, 0x9a, 0x22, 0x0a, 0xf8, 0xaf, 0x7b, 0x13, 0x53, 0xcb, 0xb3, 0xe6, 0x02, 0x4c, 0x55, 0xd6, 0xa9, 0x29, 0xa2, 0x80, 0xff, 0xaa, 0xe7,
0xce, 0x56, 0xf5, 0x5e, 0x95, 0x1a, 0x60, 0xfd, 0x9f, 0x0e, 0x2c, 0x97, 0xb8, 0x8b, 0xca, 0x38, 0x6c, 0x56, 0xef, 0x55, 0xa9, 0x01, 0xd6, 0xfe, 0xe9, 0xc0, 0x72, 0x89, 0xbb, 0xa8, 0x8c, 0x53,
0x25, 0x65, 0x32, 0xd3, 0x57, 0x0a, 0xa6, 0xef, 0x41, 0x3d, 0x61, 0x93, 0x30, 0x66, 0x01, 0x9a, 0x52, 0x26, 0x37, 0x7d, 0xa5, 0x60, 0xfa, 0x1e, 0xd4, 0x13, 0x96, 0x85, 0x31, 0x0b, 0xd0, 0xb4,
0xb6, 0x4d, 0x33, 0x50, 0x5f, 0xf7, 0x46, 0x04, 0x4a, 0xdb, 0x54, 0x1b, 0xc5, 0x00, 0xe4, 0x3d, 0x6d, 0x9a, 0x83, 0xfa, 0xba, 0x77, 0x22, 0x50, 0xda, 0xa6, 0xda, 0x28, 0x06, 0x20, 0x1f, 0xc1,
0x58, 0x1a, 0x72, 0x71, 0x36, 0x54, 0xd6, 0x56, 0x16, 0x22, 0xeb, 0xd0, 0xd0, 0x81, 0x27, 0xc5, 0xd2, 0x90, 0x8b, 0x93, 0xa1, 0xb2, 0xb6, 0xb2, 0x10, 0x59, 0x83, 0x86, 0x0e, 0x3c, 0x29, 0x7e,
0x6f, 0x38, 0xda, 0xa8, 0x4a, 0xa7, 0x30, 0xf9, 0x00, 0x96, 0x53, 0xfc, 0xf2, 0x14, 0x4b, 0xcf, 0xcd, 0xd1, 0x46, 0x55, 0x3a, 0x81, 0xc9, 0x1d, 0x58, 0x4e, 0xf1, 0xe4, 0x29, 0x96, 0x9e, 0x70,
0xb8, 0x42, 0x1b, 0x55, 0x69, 0xdb, 0x20, 0x8f, 0x10, 0x97, 0x17, 0x9e, 0x46, 0xa1, 0xf0, 0xb8, 0x85, 0x36, 0xaa, 0xd2, 0xb6, 0x41, 0x1e, 0x22, 0x6e, 0x5a, 0x78, 0x1a, 0x85, 0xc2, 0xe3, 0xfe,
0x7f, 0x77, 0x60, 0xf5, 0x79, 0xec, 0xb3, 0xd0, 0x5a, 0xfa, 0xc0, 0x2a, 0xf7, 0x03, 0xa8, 0x9d, 0xdd, 0x81, 0x6b, 0x2f, 0x62, 0x9f, 0x85, 0xd6, 0xd2, 0xfb, 0x56, 0xb9, 0xef, 0x43, 0xed, 0x94,
0xf3, 0x89, 0x44, 0x53, 0x94, 0xfc, 0x3d, 0x87, 0x78, 0xfb, 0x19, 0x9f, 0x50, 0x24, 0x27, 0x9f, 0x67, 0x12, 0x4d, 0x51, 0xf2, 0xf7, 0x1c, 0xe2, 0xad, 0xe7, 0x3c, 0xa3, 0x48, 0x4e, 0x3e, 0x83,
0x43, 0x7b, 0xa4, 0xcd, 0xce, 0x8c, 0xd9, 0xd1, 0x12, 0xad, 0xfb, 0xef, 0xcd, 0x77, 0x0a, 0x2d, 0xf6, 0x48, 0x9b, 0x9d, 0x19, 0xb3, 0xa3, 0x25, 0x5a, 0x0f, 0x3e, 0x9a, 0xef, 0x14, 0x5a, 0xa2,
0xd1, 0xea, 0x17, 0x26, 0x4c, 0xca, 0x37, 0x71, 0x1a, 0xd8, 0x28, 0x9c, 0xc2, 0xeb, 0xdf, 0x83, 0xd5, 0x2f, 0x4c, 0x98, 0x94, 0xef, 0xe2, 0x34, 0xb0, 0x51, 0x38, 0x81, 0xd7, 0xbe, 0x03, 0xd5,
0xea, 0x33, 0x3e, 0x99, 0x1b, 0xdb, 0x04, 0x6a, 0xba, 0x18, 0xe3, 0x55, 0x6d, 0x8a, 0xdf, 0xee, 0xe7, 0x3c, 0x9b, 0x1b, 0xdb, 0x04, 0x6a, 0xba, 0x18, 0xe3, 0x55, 0x6d, 0x8a, 0x67, 0xf7, 0xb7,
0xef, 0x1c, 0xe8, 0x6a, 0x1d, 0x8b, 0x55, 0x72, 0x41, 0xe5, 0xfd, 0x08, 0x56, 0x44, 0x81, 0xca, 0x0e, 0x74, 0xb5, 0x8e, 0xc5, 0x2a, 0xb9, 0xa0, 0xf2, 0x7e, 0x0c, 0x2b, 0xa2, 0x40, 0xe5, 0x4d,
0x9b, 0x96, 0xe1, 0x4e, 0x11, 0xbd, 0x17, 0x60, 0x1f, 0xe0, 0x17, 0xc2, 0xe7, 0x9e, 0x9a, 0x24, 0xca, 0x70, 0xa7, 0x88, 0xde, 0x0d, 0xb0, 0x0f, 0xf0, 0x33, 0xe1, 0x73, 0x4f, 0x65, 0x09, 0xb7,
0xdc, 0x6a, 0x08, 0x06, 0x75, 0x34, 0x49, 0xf8, 0x54, 0xb9, 0x5a, 0xae, 0x9c, 0xfb, 0x6f, 0x07, 0x1a, 0x82, 0x41, 0x1d, 0x66, 0x09, 0x9f, 0x28, 0x57, 0x9b, 0x2a, 0xe7, 0xfe, 0xdb, 0x81, 0xeb,
0x6e, 0x2d, 0x28, 0xd7, 0xd7, 0xec, 0x04, 0x1f, 0xc0, 0xb2, 0xad, 0x39, 0x1e, 0x06, 0xad, 0xbd, 0x0b, 0xca, 0xf5, 0x25, 0x3b, 0xc1, 0x1d, 0x58, 0xb6, 0x35, 0xc7, 0xc3, 0xa0, 0xb5, 0x17, 0xb7,
0xb8, 0x6d, 0x91, 0x26, 0x22, 0x6f, 0x43, 0x83, 0x47, 0xd2, 0x2b, 0x5c, 0x5f, 0xe7, 0x91, 0xdc, 0x2d, 0xd2, 0x44, 0xe4, 0x0d, 0x68, 0xf0, 0x48, 0x7a, 0x85, 0xeb, 0xeb, 0x3c, 0x92, 0x7b, 0xda,
0xd7, 0xe6, 0xb9, 0x0b, 0xed, 0x90, 0x49, 0xe5, 0x8d, 0x93, 0x80, 0x29, 0x6e, 0x32, 0xb0, 0x46, 0x3c, 0xb7, 0xa1, 0x1d, 0x32, 0xa9, 0xbc, 0x71, 0x12, 0x30, 0xc5, 0x4d, 0x06, 0xd6, 0x68, 0x4b,
0x5b, 0x1a, 0x77, 0x6c, 0x50, 0xfa, 0x65, 0x72, 0x22, 0x15, 0x1f, 0x79, 0x8a, 0x9d, 0xe9, 0xc2, 0xe3, 0x8e, 0x0c, 0x4a, 0xbf, 0x4c, 0x66, 0x52, 0xf1, 0x91, 0xa7, 0xd8, 0x89, 0x2e, 0xcc, 0x55,
0x5c, 0xd5, 0x2f, 0x33, 0xa8, 0x23, 0x76, 0x26, 0xc9, 0x87, 0xd0, 0x09, 0xb5, 0xdb, 0xbd, 0x48, 0xfd, 0x32, 0x83, 0x3a, 0x64, 0x27, 0x92, 0xdc, 0x85, 0x4e, 0xa8, 0xdd, 0xee, 0x45, 0xc2, 0x3f,
0xf8, 0xe7, 0x78, 0x89, 0x49, 0xc2, 0x65, 0xc4, 0xee, 0x5b, 0xa4, 0xfb, 0xdb, 0x25, 0xb8, 0xbd, 0xc5, 0x4b, 0x4c, 0x12, 0x2e, 0x23, 0x76, 0xcf, 0x22, 0xdd, 0xdf, 0x2c, 0xc1, 0x8d, 0x85, 0xbd,
0xb0, 0x37, 0x91, 0x4f, 0x61, 0xad, 0xa8, 0x88, 0x87, 0xbc, 0xe1, 0xc4, 0xbe, 0x9e, 0x14, 0x14, 0x89, 0x7c, 0x17, 0x56, 0x8b, 0x8a, 0x78, 0xc8, 0x1b, 0x66, 0xf6, 0xf5, 0xa4, 0xa0, 0xd0, 0x0b,
0x7a, 0x6e, 0x4e, 0xfe, 0x8f, 0x4d, 0xa1, 0x7d, 0xcb, 0x82, 0x80, 0x07, 0xd8, 0x15, 0x1a, 0xd4, 0xf3, 0xe5, 0xff, 0xd8, 0x14, 0xda, 0xb7, 0x2c, 0x08, 0x78, 0x80, 0x5d, 0xa1, 0x41, 0x0d, 0xa0,
0x00, 0xba, 0x16, 0x9c, 0x68, 0x27, 0xf3, 0x00, 0x8b, 0x7e, 0x83, 0x66, 0xa0, 0xa6, 0x1f, 0x8d, 0x6b, 0xc1, 0xb1, 0x76, 0x32, 0x0f, 0xb0, 0xe8, 0x37, 0x68, 0x0e, 0x6a, 0xfa, 0xd1, 0x58, 0xeb,
0xb5, 0x4e, 0x2d, 0x43, 0x8f, 0x80, 0xa6, 0x4f, 0xf9, 0x28, 0xbe, 0xe0, 0x41, 0xaf, 0x6d, 0xe8, 0xd4, 0x32, 0xf4, 0x08, 0x68, 0xfa, 0x94, 0x8f, 0xe2, 0x33, 0x1e, 0xf4, 0xda, 0x86, 0xde, 0x82,
0x2d, 0x48, 0xb6, 0xa0, 0x3d, 0x64, 0xd2, 0x43, 0xb1, 0xde, 0x58, 0xf6, 0x96, 0xf1, 0x18, 0x86, 0x64, 0x13, 0xda, 0x43, 0x26, 0x3d, 0x14, 0xeb, 0x8d, 0x65, 0x6f, 0x19, 0x3f, 0xc3, 0x90, 0xc9,
0x4c, 0xf6, 0x35, 0xea, 0x58, 0x77, 0xa6, 0xd5, 0x0b, 0x9e, 0x8a, 0xd3, 0x6c, 0xf8, 0x91, 0x8a, 0xbe, 0x46, 0x1d, 0xe9, 0xce, 0x74, 0xed, 0x8c, 0xa7, 0xe2, 0x6d, 0x3e, 0xfc, 0x48, 0xc5, 0xd4,
0xa9, 0xb1, 0xec, 0x75, 0xb0, 0x32, 0x90, 0xe2, 0xd1, 0x21, 0x9e, 0xe0, 0x18, 0x93, 0x8e, 0xa5, 0x58, 0xf6, 0x3a, 0x58, 0x19, 0x48, 0xf1, 0xd3, 0x01, 0x7e, 0xc1, 0x31, 0x26, 0x1d, 0x4b, 0x95,
0xca, 0x28, 0x57, 0x90, 0xb2, 0x85, 0x38, 0x4b, 0xf2, 0x08, 0x36, 0x6c, 0x6f, 0xf7, 0x52, 0xfe, 0x53, 0xae, 0x20, 0x65, 0x0b, 0x71, 0x96, 0xe4, 0x31, 0xac, 0xdb, 0xde, 0xee, 0xa5, 0xfc, 0x97,
0xab, 0x31, 0x97, 0xca, 0x78, 0x11, 0x59, 0x78, 0xaf, 0x8b, 0x1c, 0x3d, 0x4b, 0x42, 0x0d, 0x05, 0x63, 0x2e, 0x95, 0xf1, 0x22, 0xb2, 0xf0, 0x5e, 0x17, 0x39, 0x7a, 0x96, 0x84, 0x1a, 0x0a, 0x74,
0x3a, 0x53, 0xf3, 0xf3, 0xc5, 0xec, 0x26, 0x0d, 0x6e, 0x2e, 0x64, 0x1f, 0x60, 0x66, 0x7c, 0x09, 0xa6, 0xe6, 0xe7, 0x8b, 0xd9, 0x4d, 0x1a, 0x5c, 0x5d, 0xc8, 0x3e, 0xc0, 0xcc, 0xf8, 0x02, 0x36,
0x9b, 0xb3, 0xec, 0xda, 0x1c, 0x8a, 0xdb, 0xeb, 0x09, 0xf2, 0xdf, 0x2e, 0xf3, 0x53, 0xa4, 0x30, 0x66, 0xd9, 0xb5, 0x39, 0x14, 0xb7, 0xd7, 0x13, 0xe4, 0xbf, 0x51, 0xe6, 0xa7, 0x48, 0x61, 0xee,
0xf7, 0x2f, 0x16, 0x60, 0x14, 0x58, 0x5d, 0x2c, 0xc0, 0x68, 0x70, 0x17, 0xda, 0x81, 0x90, 0x49, 0x5f, 0x2c, 0xc0, 0x28, 0x70, 0x6d, 0xb1, 0x00, 0xa3, 0xc1, 0x6d, 0x68, 0x07, 0x42, 0x26, 0x21,
0xc8, 0x26, 0x26, 0xbe, 0xd6, 0xd0, 0xf5, 0x2d, 0x8b, 0xd3, 0x31, 0xe6, 0xbe, 0xb9, 0x9c, 0xef, 0xcb, 0x4c, 0x7c, 0xad, 0xa2, 0xeb, 0x5b, 0x16, 0xa7, 0x63, 0xcc, 0x7d, 0x77, 0x3e, 0xdf, 0xf3,
0x59, 0x63, 0x9e, 0x9f, 0xef, 0x97, 0x82, 0xba, 0x32, 0x27, 0xa8, 0x67, 0x23, 0xb7, 0x7a, 0x29, 0xc6, 0x3c, 0x3f, 0xdf, 0xcf, 0x05, 0x75, 0x65, 0x4e, 0x50, 0xcf, 0x46, 0x6e, 0xf5, 0x5c, 0xe4,
0x72, 0xdd, 0xc7, 0xb0, 0x3e, 0x7b, 0xf1, 0xc1, 0xf8, 0x24, 0x14, 0xfe, 0x60, 0xc8, 0xae, 0x59, 0xba, 0x4f, 0x60, 0x6d, 0xf6, 0xe2, 0xfd, 0xf1, 0x71, 0x28, 0xfc, 0xc1, 0x90, 0x5d, 0xb2, 0xd6,
0x6b, 0xdc, 0x6f, 0xab, 0xb0, 0x5c, 0x1a, 0x0c, 0xff, 0x2b, 0x5f, 0x1b, 0x13, 0xf3, 0x0e, 0xb4, 0xb8, 0xdf, 0x54, 0x61, 0xb9, 0x34, 0x18, 0xfe, 0x57, 0xbe, 0x36, 0x26, 0xe6, 0x2d, 0x68, 0x25,
0x92, 0x54, 0x5c, 0x30, 0xc5, 0xbd, 0x73, 0x3e, 0xb1, 0x7d, 0x0e, 0x2c, 0x4a, 0xd7, 0xed, 0x2d, 0xa9, 0x38, 0x63, 0x8a, 0x7b, 0xa7, 0x3c, 0xb3, 0x7d, 0x0e, 0x2c, 0x4a, 0xd7, 0xed, 0x4d, 0x5d,
0x5d, 0x3b, 0xa5, 0x9f, 0x8a, 0x44, 0xeb, 0x85, 0x79, 0xd9, 0xa6, 0x45, 0x94, 0x6e, 0x7b, 0xbf, 0x3b, 0xa5, 0x9f, 0x8a, 0x44, 0xeb, 0x85, 0x79, 0xd9, 0xa6, 0x45, 0x94, 0x6e, 0x7b, 0xbf, 0x88,
0x8c, 0x45, 0x64, 0xb3, 0xb2, 0x41, 0x2d, 0xa4, 0x9b, 0x82, 0x89, 0x55, 0x1e, 0x60, 0xdb, 0x6b, 0x45, 0x64, 0xb3, 0xb2, 0x41, 0x2d, 0xa4, 0x9b, 0x82, 0x89, 0x55, 0x1e, 0x60, 0xdb, 0x6b, 0xd0,
0xd0, 0x29, 0x9c, 0x27, 0x4d, 0xbd, 0x98, 0x34, 0x2f, 0xa1, 0x6b, 0xbd, 0x2b, 0x3d, 0x15, 0x7b, 0x09, 0x3c, 0x4d, 0x9a, 0x7a, 0x31, 0x69, 0x5e, 0x41, 0xd7, 0x7a, 0x57, 0x7a, 0x2a, 0xf6, 0xb4,
0x5a, 0x8e, 0x9d, 0x0d, 0x3e, 0x5c, 0x34, 0xfe, 0x5a, 0xf2, 0xa3, 0xf8, 0x69, 0x2c, 0x22, 0xda, 0x1c, 0x3b, 0x1b, 0xdc, 0x5d, 0x34, 0xfe, 0x5a, 0xf2, 0xc3, 0xf8, 0x59, 0x2c, 0x22, 0xda, 0x49,
0x49, 0x4b, 0x30, 0x79, 0x08, 0x8d, 0x6c, 0xe8, 0xb2, 0x43, 0xde, 0x9d, 0x05, 0x82, 0xec, 0xb4, 0x4b, 0x30, 0x79, 0x04, 0x8d, 0x7c, 0xe8, 0xb2, 0x43, 0xde, 0xad, 0x05, 0x82, 0xec, 0xb4, 0x27,
0x27, 0xe9, 0x94, 0x41, 0xcf, 0x56, 0x3c, 0xf2, 0xd3, 0x49, 0xa2, 0xa6, 0x49, 0x9f, 0x23, 0xf4, 0xe9, 0x84, 0x41, 0xcf, 0x56, 0x3c, 0xf2, 0xd3, 0x2c, 0x51, 0x93, 0xa4, 0x9f, 0x22, 0xf4, 0x57,
0xa9, 0x4c, 0xb8, 0xaf, 0x58, 0x9e, 0xfa, 0x39, 0x42, 0xb7, 0x26, 0x4b, 0xaa, 0x13, 0x18, 0xdb, 0x99, 0x70, 0x5f, 0xb1, 0x69, 0xea, 0x4f, 0x11, 0xba, 0x35, 0x59, 0x52, 0x9d, 0xc0, 0xd8, 0x8e,
0x71, 0x1b, 0x2d, 0xd7, 0xc9, 0xd1, 0xcf, 0xf8, 0x44, 0xba, 0x7f, 0x73, 0x60, 0xe3, 0x8a, 0x17, 0xdb, 0x68, 0xb9, 0xce, 0x14, 0xfd, 0x9c, 0x67, 0xd2, 0xfd, 0x9b, 0x03, 0xeb, 0x17, 0xbc, 0xc8,
0x59, 0x7f, 0x39, 0x53, 0x7f, 0xbd, 0x0f, 0x90, 0x60, 0x6c, 0xa0, 0xbb, 0x8c, 0xff, 0x9b, 0x06, 0xfa, 0xcb, 0x99, 0xf8, 0xeb, 0x26, 0x40, 0x82, 0xb1, 0x81, 0xee, 0x32, 0xfe, 0x6f, 0x1a, 0x8c,
0xa3, 0xbd, 0x35, 0x75, 0x7a, 0xb5, 0xe8, 0xf4, 0x2b, 0x0a, 0xeb, 0x2d, 0xa8, 0xfb, 0x43, 0xa6, 0xf6, 0xd6, 0xc4, 0xe9, 0xd5, 0xa2, 0xd3, 0x2f, 0x28, 0xac, 0xd7, 0xa1, 0xee, 0x0f, 0x99, 0xd2,
0x74, 0xef, 0xbc, 0x61, 0x06, 0x22, 0x0d, 0xee, 0x05, 0x3a, 0x6e, 0xb3, 0xc1, 0x7d, 0xa2, 0x4f, 0xbd, 0xf3, 0x8a, 0x19, 0x88, 0x34, 0xb8, 0x1b, 0xe8, 0xb8, 0xcd, 0x07, 0xf7, 0x4c, 0x7f, 0x5d,
0x97, 0x8c, 0xe3, 0xa7, 0xb8, 0x3d, 0x74, 0xa2, 0x49, 0xdf, 0xba, 0xb9, 0x0c, 0x01, 0xf7, 0xf7, 0x32, 0x8e, 0x9f, 0xe0, 0x76, 0xd1, 0x89, 0x26, 0x7d, 0xeb, 0xe6, 0x32, 0x04, 0xdc, 0xdf, 0x55,
0x15, 0xe8, 0xce, 0x86, 0x33, 0x79, 0x54, 0x58, 0x8a, 0x2e, 0xcd, 0x25, 0x0b, 0x1a, 0x4f, 0x61, 0xa0, 0x3b, 0x1b, 0xce, 0xe4, 0x71, 0x61, 0x29, 0x3a, 0x37, 0x97, 0x2c, 0x68, 0x3c, 0x85, 0x95,
0x25, 0xfa, 0x1a, 0xda, 0xf6, 0xd5, 0x5a, 0x3b, 0xd9, 0xab, 0xcc, 0x0e, 0x8c, 0x8b, 0xf3, 0x87, 0xe8, 0x2b, 0x68, 0xdb, 0x57, 0x6b, 0xed, 0x64, 0xaf, 0x32, 0x3b, 0x30, 0x2e, 0xce, 0x1f, 0xda,
0xb6, 0x92, 0xe9, 0xb7, 0x24, 0x0f, 0xa1, 0x9e, 0xcd, 0x37, 0x55, 0x8c, 0x87, 0x2b, 0xd4, 0xc8, 0x4a, 0x26, 0x67, 0x49, 0x1e, 0x41, 0x3d, 0x9f, 0x6f, 0xaa, 0x18, 0x0f, 0x17, 0xa8, 0x91, 0x8f,
0x46, 0x9d, 0x8c, 0xe3, 0x7f, 0x58, 0xcc, 0xdc, 0xcf, 0x60, 0x05, 0x4f, 0xb5, 0x42, 0xb6, 0x0f, 0x3a, 0x39, 0xc7, 0xff, 0xb0, 0x98, 0xb9, 0x9f, 0xc2, 0x0a, 0x7e, 0xd5, 0x0a, 0xd9, 0x3e, 0x70,
0x5c, 0x2f, 0xaf, 0xbf, 0x80, 0xb5, 0x8c, 0xf1, 0x85, 0x59, 0x7d, 0x25, 0xe5, 0xec, 0xba, 0xdc, 0xb9, 0xbc, 0xfe, 0x1c, 0x56, 0x73, 0xc6, 0x97, 0x66, 0xf5, 0x95, 0x94, 0xb3, 0xcb, 0x72, 0x7f,
0x5f, 0xc1, 0x7b, 0x9a, 0xbb, 0xef, 0x2b, 0x71, 0x21, 0xd4, 0x64, 0xc0, 0x23, 0xc5, 0xd3, 0x2b, 0x09, 0x1f, 0x69, 0xee, 0xbe, 0xaf, 0xc4, 0x99, 0x50, 0xd9, 0x80, 0x47, 0x8a, 0xa7, 0x17, 0xf0,
0xf8, 0xbb, 0x50, 0x15, 0x81, 0x31, 0x6f, 0x9b, 0xea, 0x4f, 0x77, 0xc7, 0xd4, 0xa6, 0xb2, 0x84, 0x77, 0xa1, 0x2a, 0x02, 0x63, 0xde, 0x36, 0xd5, 0x47, 0x77, 0xdb, 0xd4, 0xa6, 0xb2, 0x84, 0xbe,
0xbe, 0xef, 0x73, 0x4c, 0x82, 0xeb, 0x4a, 0xd9, 0x35, 0x41, 0x5e, 0x96, 0xb2, 0x23, 0xe4, 0x48, 0xef, 0x73, 0x4c, 0x82, 0xcb, 0x4a, 0xd9, 0x31, 0x41, 0x5e, 0x96, 0xb2, 0x2d, 0xe4, 0x48, 0x48,
0x48, 0xf9, 0x16, 0x62, 0xbe, 0x71, 0xa0, 0xad, 0xe5, 0x3c, 0x8e, 0xe3, 0xf3, 0x11, 0x4b, 0xcf, 0xf9, 0x1e, 0x62, 0xbe, 0x76, 0xa0, 0xad, 0xe5, 0x3c, 0x89, 0xe3, 0xd3, 0x11, 0x4b, 0x4f, 0x17,
0x17, 0x33, 0x8e, 0xd3, 0xd0, 0x9a, 0x41, 0x7f, 0x4e, 0xe7, 0xbb, 0x6a, 0x61, 0xf8, 0xdc, 0x80, 0x33, 0x8e, 0xd3, 0xd0, 0x9a, 0x41, 0x1f, 0x27, 0xf3, 0x5d, 0xb5, 0x30, 0x7c, 0xae, 0x43, 0x13,
0x26, 0x56, 0x6d, 0x4f, 0xd3, 0x9a, 0xac, 0x68, 0x20, 0xe2, 0x38, 0x0d, 0x8b, 0xed, 0xfb, 0x46, 0xab, 0xb6, 0xa7, 0x69, 0x4d, 0x56, 0x34, 0x10, 0x71, 0x94, 0x86, 0xc5, 0xf6, 0x7d, 0xa5, 0xdc,
0xb9, 0x7d, 0xbf, 0x0f, 0x10, 0xf0, 0x90, 0xeb, 0x31, 0x88, 0x29, 0xcc, 0x8a, 0x1a, 0x6d, 0x5a, 0xbe, 0x6f, 0x02, 0x04, 0x3c, 0xe4, 0x7a, 0x0c, 0x62, 0x0a, 0xb3, 0xa2, 0x46, 0x9b, 0x16, 0xd3,
0x4c, 0x5f, 0xb9, 0x4f, 0x4d, 0xf0, 0x0f, 0x42, 0xce, 0xd2, 0x27, 0x42, 0xaa, 0x38, 0x9d, 0x14, 0x57, 0xee, 0x33, 0x13, 0xfc, 0x83, 0x90, 0xb3, 0xf4, 0xa9, 0x90, 0x2a, 0x4e, 0xb3, 0x62, 0x8e,
0x73, 0xcc, 0x29, 0xe5, 0xd8, 0xfb, 0x00, 0xbe, 0x26, 0x34, 0xb2, 0x2a, 0x46, 0x96, 0xc5, 0xf4, 0x39, 0xa5, 0x1c, 0xbb, 0x09, 0xe0, 0x6b, 0x42, 0x23, 0xab, 0x62, 0x64, 0x59, 0x4c, 0x5f, 0xb9,
0x95, 0xfb, 0x57, 0x07, 0x88, 0x16, 0x66, 0x37, 0xe1, 0x03, 0xe1, 0xab, 0x71, 0xca, 0xe7, 0x4e, 0x7f, 0x75, 0x80, 0x68, 0x61, 0x76, 0x13, 0xde, 0x17, 0xbe, 0x1a, 0xa7, 0x7c, 0xee, 0x24, 0x5d,
0xd2, 0x85, 0x55, 0xa5, 0xb2, 0x60, 0x55, 0xa9, 0xe2, 0x6f, 0x1b, 0x97, 0x56, 0x95, 0x1a, 0xa2, 0x58, 0x55, 0x2a, 0x0b, 0x56, 0x95, 0x2a, 0xfe, 0xb6, 0x71, 0x6e, 0x55, 0xa9, 0x21, 0x3a, 0x5f,
0xb3, 0x55, 0x65, 0x03, 0x9a, 0xd8, 0xcf, 0x70, 0x57, 0xb9, 0x81, 0x47, 0xb8, 0xab, 0x1c, 0xce, 0x55, 0xd6, 0xa1, 0x89, 0xfd, 0x0c, 0x77, 0x95, 0x2b, 0xf8, 0x09, 0x77, 0x95, 0x83, 0xb9, 0xbb,
0xdd, 0x55, 0x96, 0x90, 0x60, 0xc1, 0xae, 0x52, 0x2f, 0xee, 0x2a, 0x43, 0x58, 0xbd, 0xfc, 0x12, 0xca, 0x12, 0x12, 0x2c, 0xd8, 0x55, 0xea, 0xc5, 0x5d, 0x65, 0x08, 0xd7, 0xce, 0xbf, 0x44, 0x2e,
0xb9, 0x78, 0x1d, 0xfb, 0x11, 0x34, 0x12, 0x4b, 0x64, 0x93, 0x7d, 0xb3, 0x9c, 0x67, 0x65, 0x49, 0x5e, 0xc7, 0x7e, 0x08, 0x8d, 0xc4, 0x12, 0xd9, 0x64, 0xdf, 0x28, 0xe7, 0x59, 0x59, 0x12, 0x9d,
0x74, 0x4a, 0xed, 0xfe, 0xb1, 0x02, 0x37, 0x35, 0xc1, 0x6b, 0x16, 0x86, 0x5c, 0x5d, 0xdd, 0xc0, 0x50, 0xbb, 0x7f, 0xac, 0xc0, 0x55, 0x4d, 0xf0, 0x86, 0x85, 0x21, 0x57, 0x17, 0x37, 0xf0, 0x1e,
0x7b, 0x50, 0x67, 0x41, 0x90, 0x72, 0x29, 0x33, 0xab, 0x59, 0x50, 0xdb, 0xe7, 0x0d, 0x0a, 0x40, 0xd4, 0x59, 0x10, 0xa4, 0x5c, 0xca, 0xdc, 0x6a, 0x16, 0xd4, 0xf6, 0x79, 0x87, 0x02, 0xd0, 0x6c,
0xb3, 0x35, 0xa8, 0x85, 0xb4, 0xed, 0xb5, 0xef, 0xd0, 0x6a, 0x0d, 0x8a, 0xdf, 0x1a, 0x87, 0x6b, 0x0d, 0x6a, 0x21, 0x6d, 0x7b, 0xed, 0x3b, 0xb4, 0x5a, 0x83, 0xe2, 0x59, 0xe3, 0x70, 0xad, 0x30,
0x85, 0xa9, 0x9f, 0xf8, 0xad, 0x25, 0x6b, 0xdf, 0xeb, 0xa1, 0xc0, 0x6c, 0xc5, 0x19, 0xa8, 0xa9, 0xf5, 0x13, 0xcf, 0x5a, 0xb2, 0xf6, 0xbd, 0x1e, 0x0a, 0xcc, 0x56, 0x9c, 0x83, 0x9a, 0x3a, 0x61,
0x13, 0xa6, 0x86, 0x76, 0xf6, 0xc4, 0x6f, 0xdd, 0x4b, 0xa6, 0x25, 0x1c, 0x77, 0xbc, 0x76, 0xb1, 0x6a, 0x68, 0x67, 0x4f, 0x3c, 0xeb, 0x5e, 0x32, 0x29, 0xe1, 0xb8, 0xe3, 0xb5, 0x8b, 0x35, 0x3d,
0xa6, 0x67, 0xfe, 0x6e, 0x16, 0xfc, 0xad, 0xdf, 0xa3, 0x17, 0x71, 0xec, 0x4b, 0x4d, 0x6a, 0x00, 0xf7, 0x77, 0xb3, 0xe0, 0x6f, 0xfd, 0x1e, 0xbd, 0x88, 0x63, 0x5f, 0x6a, 0x52, 0x03, 0xa0, 0x57,
0xf4, 0xaa, 0x08, 0x02, 0x1e, 0xd9, 0x86, 0x64, 0xa1, 0xc5, 0xc3, 0xa8, 0xfb, 0xc2, 0x44, 0x58, 0x45, 0x10, 0xf0, 0xc8, 0x36, 0x24, 0x0b, 0x2d, 0x1e, 0x46, 0xdd, 0x97, 0x26, 0xc2, 0x4a, 0xc6,
0xc9, 0x58, 0x92, 0x7c, 0x06, 0x0d, 0x5b, 0xf3, 0xb2, 0x6a, 0xbd, 0x51, 0xb6, 0x7e, 0x89, 0x9e, 0x92, 0xe4, 0x53, 0x68, 0xd8, 0x9a, 0x97, 0x57, 0xeb, 0xf5, 0xb2, 0xf5, 0x4b, 0xf4, 0x74, 0x42,
0x4e, 0x89, 0xdd, 0x3f, 0x3b, 0x26, 0xfc, 0x0f, 0xd9, 0x05, 0x0f, 0xfa, 0xd6, 0x96, 0x05, 0x2b, 0xec, 0xfe, 0xd9, 0x31, 0xe1, 0x7f, 0xc0, 0xce, 0x78, 0xd0, 0xb7, 0xb6, 0x2c, 0x58, 0xd9, 0x29,
0x3b, 0x65, 0x2b, 0xcf, 0x5b, 0xba, 0x37, 0xa1, 0x79, 0xca, 0x2e, 0xe2, 0x71, 0x2a, 0x14, 0xb7, 0x5b, 0x79, 0xde, 0xd2, 0xbd, 0x01, 0xcd, 0xb7, 0xec, 0x2c, 0x1e, 0xa7, 0x42, 0x71, 0x6b, 0xfc,
0xc6, 0xcf, 0x11, 0xba, 0x93, 0xf9, 0x43, 0x26, 0x70, 0xd7, 0xab, 0xa1, 0x2b, 0xeb, 0x08, 0xef, 0x29, 0x42, 0x77, 0x32, 0x7f, 0xc8, 0x04, 0xee, 0x7a, 0x35, 0x74, 0x65, 0x1d, 0xe1, 0xdd, 0xe0,
0x05, 0x57, 0xa4, 0xec, 0x5d, 0x68, 0x9b, 0xe9, 0xcb, 0x2b, 0x46, 0x66, 0xcb, 0xe0, 0x70, 0x3c, 0x82, 0x94, 0xbd, 0x0d, 0x6d, 0x33, 0x7d, 0x79, 0xc5, 0xc8, 0x6c, 0x19, 0x1c, 0x8e, 0x87, 0xee,
0x74, 0xff, 0xe0, 0xc0, 0xbb, 0x73, 0xe7, 0x81, 0x05, 0x91, 0x33, 0xdb, 0x1d, 0xcd, 0x0b, 0x4a, 0xef, 0x1d, 0xf8, 0x70, 0xee, 0x3c, 0xb0, 0x20, 0x72, 0x66, 0xbb, 0xa3, 0x79, 0x41, 0xa9, 0x3b,
0xdd, 0x71, 0x17, 0xee, 0x0c, 0x4d, 0x01, 0xf0, 0x58, 0xea, 0x0f, 0xc5, 0x05, 0xf7, 0xe4, 0x38, 0xee, 0xc0, 0xad, 0xa1, 0x29, 0x00, 0x1e, 0x4b, 0xfd, 0xa1, 0x38, 0xe3, 0x9e, 0x1c, 0x27, 0x49,
0x49, 0xe2, 0x54, 0x79, 0x3c, 0x62, 0x27, 0xa1, 0x9d, 0x05, 0x1b, 0x74, 0xd3, 0x92, 0xf5, 0x0d, 0x9c, 0x2a, 0x8f, 0x47, 0xec, 0x38, 0xb4, 0xb3, 0x60, 0x83, 0x6e, 0x58, 0xb2, 0xbe, 0xa1, 0x3a,
0xd5, 0xa1, 0x21, 0xda, 0x35, 0x34, 0xee, 0x9f, 0x1c, 0xd3, 0x3a, 0x8e, 0xf4, 0x30, 0xaf, 0xd7, 0x30, 0x44, 0x3b, 0x86, 0xc6, 0xfd, 0x93, 0x63, 0x5a, 0xc7, 0xa1, 0x1e, 0xe6, 0xf5, 0x7a, 0xc0,
0x03, 0x9e, 0x5e, 0x73, 0xfd, 0x7c, 0x04, 0x4b, 0x76, 0x1f, 0xd0, 0xf7, 0x74, 0x66, 0x67, 0xa8, 0xd3, 0x4b, 0xae, 0x9f, 0x8f, 0x61, 0xc9, 0xee, 0x03, 0xfa, 0x9e, 0xce, 0xec, 0x0c, 0x55, 0x10,
0x82, 0xc0, 0xed, 0xa3, 0x7c, 0x53, 0xa0, 0x96, 0xc9, 0xfd, 0x1c, 0x5a, 0x05, 0x34, 0x69, 0x41, 0xb8, 0x75, 0x38, 0xdd, 0x14, 0xa8, 0x65, 0x72, 0x3f, 0x83, 0x56, 0x01, 0x4d, 0x5a, 0x50, 0x3f,
0xfd, 0x78, 0xff, 0xd9, 0xfe, 0xcb, 0xd7, 0xfb, 0xdd, 0x77, 0x34, 0x70, 0x44, 0x8f, 0x0f, 0x8f, 0xda, 0x7b, 0xbe, 0xf7, 0xea, 0xcd, 0x5e, 0xf7, 0x03, 0x0d, 0x1c, 0xd2, 0xa3, 0x83, 0xc3, 0x9d,
0x76, 0x77, 0xba, 0x0e, 0xb9, 0x09, 0xcb, 0xc7, 0xfb, 0x08, 0xbe, 0x7e, 0x49, 0x8f, 0x9e, 0xfc, 0xed, 0xae, 0x43, 0xae, 0xc2, 0xf2, 0xd1, 0x1e, 0x82, 0x6f, 0x5e, 0xd1, 0xc3, 0xa7, 0x3f, 0xed,
0xac, 0x5b, 0x71, 0xbf, 0xa9, 0x9a, 0x59, 0xfa, 0x55, 0x61, 0x57, 0xb1, 0x83, 0xcd, 0x02, 0xe5, 0x56, 0xdc, 0xaf, 0xab, 0x66, 0x96, 0x7e, 0x5d, 0xd8, 0x55, 0xec, 0x60, 0xb3, 0x40, 0x79, 0x02,
0x09, 0xd4, 0x4e, 0xd3, 0x78, 0x94, 0x85, 0x82, 0xfe, 0xd6, 0x0f, 0x52, 0xb1, 0xad, 0xd9, 0x15, 0xb5, 0xb7, 0x69, 0x3c, 0xca, 0x43, 0x41, 0x9f, 0xf5, 0x83, 0x54, 0x6c, 0x6b, 0x76, 0x45, 0xc5,
0x15, 0xeb, 0xd0, 0xf0, 0x87, 0x3a, 0xf2, 0xa2, 0xb3, 0x6c, 0x8e, 0xc9, 0x11, 0xda, 0x25, 0x76, 0x3a, 0x34, 0xfc, 0xa1, 0x8e, 0xbc, 0xe8, 0x24, 0x9f, 0x63, 0xa6, 0x08, 0xed, 0x12, 0x3b, 0xfd,
0xfa, 0x33, 0xe5, 0xd4, 0xae, 0x88, 0x53, 0x5c, 0x1f, 0x7f, 0xa6, 0x48, 0xb9, 0x4c, 0xe2, 0x48, 0x99, 0x72, 0x6a, 0x57, 0xc4, 0x09, 0xae, 0x8f, 0x3f, 0x53, 0xa4, 0x5c, 0x26, 0x71, 0x24, 0xf3,
0x66, 0x69, 0x39, 0x85, 0x75, 0x2d, 0x4e, 0x79, 0x12, 0x0a, 0xc3, 0x6c, 0x42, 0xa4, 0x69, 0x31, 0xb4, 0x9c, 0xc0, 0xba, 0x16, 0xa7, 0x3c, 0x09, 0x85, 0x61, 0x36, 0x21, 0xd2, 0xb4, 0x98, 0xbe,
0x7d, 0x45, 0xf8, 0xfc, 0x9d, 0xac, 0x81, 0x96, 0xfd, 0x7e, 0xd9, 0xb2, 0x73, 0x5e, 0xbd, 0xfd, 0x22, 0x7c, 0xfe, 0x4e, 0xd6, 0x40, 0xcb, 0x7e, 0xaf, 0x6c, 0xd9, 0x39, 0xaf, 0xde, 0x7a, 0x7d,
0xea, 0xd2, 0xd6, 0x36, 0x77, 0x93, 0x33, 0x3e, 0x6c, 0x4e, 0x1b, 0xf8, 0x4f, 0x81, 0x5c, 0xe6, 0x6e, 0x6b, 0x9b, 0xbb, 0xc9, 0x19, 0x1f, 0x36, 0x27, 0x0d, 0xfc, 0x27, 0x40, 0xce, 0x73, 0x9e,
0xbc, 0xe4, 0x8b, 0x83, 0xdd, 0xfd, 0x9d, 0xbd, 0xfd, 0xaf, 0xbb, 0x0e, 0x69, 0x43, 0xa3, 0x3f, 0xf3, 0xc5, 0xfe, 0xce, 0xde, 0xf6, 0xee, 0xde, 0x57, 0x5d, 0x87, 0xb4, 0xa1, 0xd1, 0x1f, 0x0c,
0x18, 0xec, 0x1e, 0x68, 0xcf, 0x54, 0x34, 0xb4, 0xb3, 0x3b, 0x78, 0xbe, 0xb7, 0xbf, 0xbb, 0xd3, 0x76, 0xf6, 0xb5, 0x67, 0x2a, 0x1a, 0xda, 0xde, 0x19, 0xbc, 0xd8, 0xdd, 0xdb, 0xd9, 0xee, 0x56,
0xad, 0x6a, 0x68, 0xd0, 0xdf, 0x1f, 0xec, 0x3e, 0xdf, 0xdd, 0xe9, 0xd6, 0xdc, 0x7f, 0x39, 0xa6, 0x35, 0x34, 0xe8, 0xef, 0x0d, 0x76, 0x5e, 0xec, 0x6c, 0x77, 0x6b, 0xee, 0xbf, 0x1c, 0xd3, 0xd9,
0xb3, 0x0f, 0x4a, 0x2b, 0xd3, 0x0e, 0xf7, 0x85, 0x5c, 0xfc, 0x8b, 0xcb, 0x26, 0x34, 0xad, 0x3d, 0x07, 0xa5, 0x95, 0x69, 0x9b, 0xfb, 0x42, 0x2e, 0xfe, 0xc5, 0x65, 0x03, 0x9a, 0xd6, 0x9e, 0xbb,
0xf7, 0xb2, 0x48, 0xcb, 0x11, 0xe4, 0x17, 0xb0, 0x12, 0x58, 0x7e, 0xaf, 0x14, 0x79, 0x0f, 0x66, 0x79, 0xa4, 0x4d, 0x11, 0xe4, 0xe7, 0xb0, 0x12, 0x58, 0x7e, 0xaf, 0x14, 0x79, 0x0f, 0x67, 0x67,
0x67, 0xa4, 0x79, 0x57, 0x6e, 0x67, 0x1f, 0xd6, 0x3c, 0x9d, 0xa0, 0x04, 0xbb, 0x1f, 0x43, 0xa7, 0xa4, 0x79, 0x57, 0x6e, 0xe5, 0x07, 0x6b, 0x9e, 0x4e, 0x50, 0x82, 0xdd, 0xfb, 0xd0, 0x29, 0x53,
0x4c, 0x51, 0x7a, 0xec, 0x3b, 0xa5, 0xc7, 0x3a, 0xee, 0xb7, 0x0e, 0xac, 0xcc, 0xfc, 0x92, 0xbc, 0x94, 0x1e, 0xfb, 0x41, 0xe9, 0xb1, 0x8e, 0xfb, 0x8d, 0x03, 0x2b, 0x33, 0xbf, 0x24, 0x2f, 0xee,
0xb8, 0xdb, 0xcc, 0x2e, 0x87, 0x95, 0x4b, 0xcb, 0x21, 0xf9, 0x18, 0x48, 0x91, 0xc4, 0x2b, 0x4e, 0x36, 0xb3, 0xcb, 0x61, 0xe5, 0xdc, 0x72, 0x48, 0xee, 0x03, 0x29, 0x92, 0x78, 0xc5, 0x29, 0xbb,
0xd9, 0xdd, 0x02, 0xa1, 0xd9, 0x36, 0x8b, 0xed, 0xab, 0xf6, 0x56, 0xed, 0x4b, 0x02, 0x50, 0xf6, 0x5b, 0x20, 0x34, 0xdb, 0x66, 0xb1, 0x7d, 0xd5, 0xde, 0xab, 0x7d, 0x49, 0x00, 0xca, 0xde, 0xd9,
0xc6, 0x8e, 0x7a, 0xc5, 0xb6, 0xee, 0x94, 0xdb, 0xfa, 0x33, 0x68, 0xd9, 0x7f, 0x85, 0x1c, 0xe9, 0x51, 0xaf, 0xd8, 0xd6, 0x9d, 0x72, 0x5b, 0x7f, 0x0e, 0x2d, 0xfb, 0xaf, 0x90, 0x43, 0xdd, 0x7b,
0xde, 0x53, 0x41, 0x3b, 0x7f, 0x37, 0xbf, 0xa4, 0x9f, 0xff, 0xf3, 0xe4, 0x85, 0xfd, 0xdf, 0x89, 0x2a, 0x68, 0xe7, 0x6f, 0x4f, 0x2f, 0xe9, 0x4f, 0xff, 0x79, 0xf2, 0xd2, 0xfe, 0xef, 0xc4, 0x0a,
0x15, 0xba, 0xad, 0x19, 0x68, 0x91, 0x5b, 0xc7, 0x42, 0x47, 0x6b, 0x55, 0xb8, 0xf9, 0x87, 0xd0, 0xdd, 0xd2, 0x0c, 0xb4, 0xc8, 0xed, 0xfe, 0xc1, 0x81, 0x8e, 0xd6, 0xaa, 0x70, 0xf3, 0x0f, 0xa0,
0x4a, 0xa7, 0x50, 0xd6, 0x05, 0xd6, 0x72, 0xf9, 0x39, 0x29, 0x2d, 0x12, 0x92, 0xfb, 0xb0, 0x26, 0x95, 0x4e, 0xa0, 0xbc, 0x0b, 0xac, 0x4e, 0xe5, 0x4f, 0x49, 0x69, 0x91, 0x90, 0x3c, 0x80, 0x55,
0xc7, 0x27, 0x59, 0x27, 0x79, 0x2a, 0xe3, 0xe8, 0xf1, 0x44, 0xf1, 0xac, 0xbf, 0xce, 0x3d, 0x23, 0x39, 0x3e, 0xce, 0x3b, 0xc9, 0x33, 0x19, 0x47, 0x4f, 0x32, 0xc5, 0xf3, 0xfe, 0x3a, 0xf7, 0x1b,
0x1f, 0xc3, 0xcd, 0x6c, 0xe9, 0xca, 0x19, 0xcc, 0x26, 0x7a, 0xf9, 0x80, 0x7c, 0x0a, 0xab, 0x51, 0xb9, 0x0f, 0x57, 0xf3, 0xa5, 0x6b, 0xca, 0x60, 0x36, 0xd1, 0xf3, 0x1f, 0x9e, 0x2c, 0xff, 0xac,
0x1c, 0xf0, 0x41, 0x1c, 0x9d, 0x8a, 0xb3, 0x9c, 0xde, 0x2c, 0xa6, 0xf3, 0x8e, 0x1e, 0x2f, 0xff, 0xb5, 0xf5, 0xc9, 0xa3, 0x5c, 0x91, 0xe3, 0x25, 0x3c, 0x3d, 0xfc, 0x4f, 0x00, 0x00, 0x00, 0xff,
0xbc, 0xb5, 0xfd, 0xc9, 0xc3, 0x4c, 0xf5, 0x93, 0x25, 0xfc, 0x7a, 0xf0, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xa8, 0x44, 0x31, 0x9e, 0x5d, 0x1a, 0x00, 0x00,
0xff, 0xff, 0xbb, 0x15, 0xb2, 0x92, 0x8f, 0x1a, 0x00, 0x00,
} }

View File

@ -297,5 +297,4 @@ message SyncRawMessage {
// we need these to be able to login // we need these to be able to login
bytes subAccountsJsonBytes = 2; bytes subAccountsJsonBytes = 2;
bytes settingsJsonBytes = 3; bytes settingsJsonBytes = 3;
bytes nodeConfigJsonBytes = 4;
} }

View File

@ -5,7 +5,6 @@ import (
"crypto/ecdsa" "crypto/ecdsa"
"crypto/tls" "crypto/tls"
"crypto/x509" "crypto/x509"
"encoding/json"
"encoding/pem" "encoding/pem"
"fmt" "fmt"
"io" "io"
@ -76,7 +75,7 @@ func NewPairingClient(backend *api.GethStatusBackend, c *ConnectionParams, confi
return nil, err return nil, err
} }
rmpm, err := NewRawMessagePayloadManager(logutils.ZapLogger().Named("Client"), pm.accountPayload, c.aesKey, backend, config.KeystorePath) rmpm, err := NewRawMessagePayloadManager(logutils.ZapLogger().Named("Client"), pm.accountPayload, c.aesKey, backend, config.GetNodeConfig(), config.GetSettingCurrentNetwork())
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -280,19 +279,18 @@ func StartUpPairingClient(backend *api.GethStatusBackend, cs, configJSON string)
} }
func setupClient(backend *api.GethStatusBackend, cs string, configJSON string) (*Client, error) { func setupClient(backend *api.GethStatusBackend, cs string, configJSON string) (*Client, error) {
var conf PayloadSourceConfig
err := json.Unmarshal([]byte(configJSON), &conf)
if err != nil {
return nil, err
}
ccp := new(ConnectionParams) ccp := new(ConnectionParams)
err = ccp.FromString(cs) err := ccp.FromString(cs)
if err != nil { if err != nil {
return nil, err return nil, err
} }
c, err := NewPairingClient(backend, ccp, &AccountPayloadManagerConfig{backend.GetMultiaccountDB(), &conf}) conf, err := NewPayloadSourceForClient(configJSON, ccp.serverMode)
if err != nil {
return nil, err
}
c, err := NewPairingClient(backend, ccp, &AccountPayloadManagerConfig{backend.GetMultiaccountDB(), conf})
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -118,11 +118,7 @@ func (tpsc *TestPairingServerComponents) SetupPairingServerComponents(t *testing
EK: tpsc.EphemeralAES, EK: tpsc.EphemeralAES,
Cert: &tpsc.Cert, Cert: &tpsc.Cert,
Hostname: tpsc.OutboundIP.String(), Hostname: tpsc.OutboundIP.String(),
AccountPayloadManagerConfig: &AccountPayloadManagerConfig{ AccountPayloadManagerConfig: &AccountPayloadManagerConfig{}})
PayloadSourceConfig: &PayloadSourceConfig{
KeystorePath: "",
},
}})
require.NoError(t, err) require.NoError(t, err)
} }

View File

@ -9,20 +9,23 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"github.com/status-im/status-go/api"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"go.uber.org/zap" "go.uber.org/zap"
"github.com/status-im/status-go/account/generator" "github.com/status-im/status-go/account/generator"
"github.com/status-im/status-go/api"
"github.com/status-im/status-go/eth-node/keystore" "github.com/status-im/status-go/eth-node/keystore"
"github.com/status-im/status-go/multiaccounts" "github.com/status-im/status-go/multiaccounts"
"github.com/status-im/status-go/params"
"github.com/status-im/status-go/protocol/common" "github.com/status-im/status-go/protocol/common"
"github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/protocol/protobuf"
) )
var ( var (
ErrKeyFileAlreadyExists = errors.New("key file already exists") ErrKeyFileAlreadyExists = errors.New("key file already exists")
ErrKeyUIDEmptyAsSender = errors.New("keyUID must be provided as sender")
ErrNodeConfigNilAsReceiver = errors.New("node config must be provided as receiver")
ErrPayloadSourceConfigBothSet = errors.New("payloadSourceSenderConfig and payloadSourceReceiverConfig cannot be both set")
) )
// PayloadManager is the interface for PayloadManagers and wraps the basic functions for fulfilling payload management // PayloadManager is the interface for PayloadManagers and wraps the basic functions for fulfilling payload management
@ -49,29 +52,123 @@ type PayloadManager interface {
LockPayload() LockPayload()
} }
type PayloadSourceSenderConfig struct {
KeyUID string `json:"keyUID"`
Password string `json:"password"`
}
type PayloadSourceReceiverConfig struct {
KDFIterations int `json:"kdfIterations"`
NodeConfig *params.NodeConfig
// this field already exists within params.NodeConfig, but it doesn't support json marshalling, so we need to duplicate it here
RootDataDir string
// corresponding to field current_network from table settings, so that we can override current network from sender
SettingCurrentNetwork string
}
// PayloadSourceConfig represents location and access data of the pairing payload // PayloadSourceConfig represents location and access data of the pairing payload
// ONLY available from the application client // ONLY available from the application client
type PayloadSourceConfig struct { type PayloadSourceConfig struct {
// required // required for sender and receiver, there are some different cases:
// 1. for sender, KeystorePath must end with keyUID
// 2. for receiver, KeystorePath must not end with keyUID (because keyUID is not known yet)
KeystorePath string `json:"keystorePath"` KeystorePath string `json:"keystorePath"`
// following 2 fields r optional. *PayloadSourceSenderConfig
// optional cases: *PayloadSourceReceiverConfig
// 1. server mode is Receiving and server side doesn't contain this info
// 2. server mode is Sending and client side doesn't contain this info
// they are required in other cases
KeyUID string `json:"keyUID"`
Password string `json:"password"`
// Timeout the number of milliseconds after which the pairing server will automatically terminate // Timeout the number of milliseconds after which the pairing server will automatically terminate
Timeout uint `json:"timeout"` Timeout uint `json:"timeout"`
} }
type payloadSourceUnmarshalCallback func(conf *PayloadSourceConfig) (*PayloadSourceConfig, error)
func NewPayloadSourceForClient(configJSON string, mode Mode) (*PayloadSourceConfig, error) {
return unmarshalPayloadSourceConfig(configJSON, func(conf *PayloadSourceConfig) (*PayloadSourceConfig, error) {
if mode == Sending && conf.NodeConfig == nil {
return nil, ErrNodeConfigNilAsReceiver
}
if mode == Receiving && conf.KeyUID == "" {
return nil, ErrKeyUIDEmptyAsSender
}
return updateRootDataDirToNodeConfig(conf)
})
}
func NewPayloadSourceForServer(configJSON string, mode Mode) (*PayloadSourceConfig, error) {
return unmarshalPayloadSourceConfig(configJSON, func(conf *PayloadSourceConfig) (*PayloadSourceConfig, error) {
if mode == Sending && conf.KeyUID == "" {
return nil, ErrKeyUIDEmptyAsSender
}
if mode == Receiving && conf.NodeConfig == nil {
return nil, ErrNodeConfigNilAsReceiver
}
return updateRootDataDirToNodeConfig(conf)
})
}
func updateRootDataDirToNodeConfig(conf *PayloadSourceConfig) (*PayloadSourceConfig, error) {
if conf.PayloadSourceReceiverConfig != nil && conf.PayloadSourceReceiverConfig.NodeConfig != nil {
conf.NodeConfig.RootDataDir = conf.RootDataDir
}
return conf, nil
}
func unmarshalPayloadSourceConfig(configJSON string, successCallback payloadSourceUnmarshalCallback) (*PayloadSourceConfig, error) {
var conf = PayloadSourceConfig{}
err := json.Unmarshal([]byte(configJSON), &conf)
if err != nil {
return nil, err
}
return successCallback(&conf)
}
// AccountPayloadManagerConfig represents the initialisation parameters required for a AccountPayloadManager // AccountPayloadManagerConfig represents the initialisation parameters required for a AccountPayloadManager
type AccountPayloadManagerConfig struct { type AccountPayloadManagerConfig struct {
DB *multiaccounts.Database DB *multiaccounts.Database
*PayloadSourceConfig *PayloadSourceConfig
} }
func (a *AccountPayloadManagerConfig) GetNodeConfig() *params.NodeConfig {
if a.PayloadSourceConfig != nil && a.PayloadSourceConfig.PayloadSourceReceiverConfig != nil {
return a.NodeConfig
}
return nil
}
func (a *AccountPayloadManagerConfig) GetSettingCurrentNetwork() string {
if a.PayloadSourceConfig != nil && a.PayloadSourceConfig.PayloadSourceReceiverConfig != nil {
return a.SettingCurrentNetwork
}
return ""
}
func (a *AccountPayloadManagerConfig) GetPayloadSourceSenderConfig() *PayloadSourceSenderConfig {
if a.PayloadSourceConfig != nil && a.PayloadSourceConfig.PayloadSourceSenderConfig != nil {
return a.PayloadSourceSenderConfig
}
return nil
}
func (a *AccountPayloadManagerConfig) GetPayloadSourceReceiverConfig() *PayloadSourceReceiverConfig {
if a.PayloadSourceConfig != nil && a.PayloadSourceConfig.PayloadSourceReceiverConfig != nil {
return a.PayloadSourceReceiverConfig
}
return nil
}
func (a *AccountPayloadManagerConfig) GetKeystorePath() string {
if a.PayloadSourceConfig != nil {
return a.KeystorePath
}
return ""
}
func (a *AccountPayloadManagerConfig) GetTimeout() uint {
if a.PayloadSourceConfig != nil {
return a.Timeout
}
return 0
}
// AccountPayloadManager is responsible for the whole lifecycle of a AccountPayload // AccountPayloadManager is responsible for the whole lifecycle of a AccountPayload
type AccountPayloadManager struct { type AccountPayloadManager struct {
logger *zap.Logger logger *zap.Logger
@ -93,13 +190,17 @@ func NewAccountPayloadManager(aesKey []byte, config *AccountPayloadManagerConfig
// A new SHARED AccountPayload // A new SHARED AccountPayload
p := new(AccountPayload) p := new(AccountPayload)
accountPayloadRepository, err := NewAccountPayloadRepository(p, config)
if err != nil {
return nil, err
}
return &AccountPayloadManager{ return &AccountPayloadManager{
logger: l, logger: l,
accountPayload: p, accountPayload: p,
PayloadEncryptionManager: pem, PayloadEncryptionManager: pem,
accountPayloadMarshaller: NewPairingPayloadMarshaller(p, l), accountPayloadMarshaller: NewPairingPayloadMarshaller(p, l),
payloadRepository: NewAccountPayloadRepository(p, config), payloadRepository: accountPayloadRepository,
}, nil }, nil
} }
@ -357,22 +458,32 @@ type AccountPayloadRepository struct {
multiaccountsDB *multiaccounts.Database multiaccountsDB *multiaccounts.Database
keystorePath, keyUID string keystorePath, keyUID string
kdfIterations int
} }
func NewAccountPayloadRepository(p *AccountPayload, config *AccountPayloadManagerConfig) *AccountPayloadRepository { func NewAccountPayloadRepository(p *AccountPayload, config *AccountPayloadManagerConfig) (*AccountPayloadRepository, error) {
ppr := &AccountPayloadRepository{ ppr := &AccountPayloadRepository{
AccountPayload: p, AccountPayload: p,
} }
if config == nil { if config == nil {
return ppr return ppr, nil
} }
ppr.multiaccountsDB = config.DB ppr.multiaccountsDB = config.DB
ppr.keystorePath = config.KeystorePath
if config.GetPayloadSourceSenderConfig() != nil && config.GetPayloadSourceReceiverConfig() != nil {
return nil, ErrPayloadSourceConfigBothSet
}
if config.GetPayloadSourceSenderConfig() != nil {
ppr.keyUID = config.KeyUID ppr.keyUID = config.KeyUID
ppr.password = config.Password ppr.password = config.Password
return ppr } else if config.GetPayloadSourceReceiverConfig() != nil {
ppr.kdfIterations = config.KDFIterations
}
ppr.keystorePath = config.GetKeystorePath()
return ppr, nil
} }
func (apr *AccountPayloadRepository) LoadFromSource() error { func (apr *AccountPayloadRepository) LoadFromSource() error {
@ -515,6 +626,7 @@ func (apr *AccountPayloadRepository) storeKeys(keyStorePath string) error {
} }
func (apr *AccountPayloadRepository) storeMultiAccount() error { func (apr *AccountPayloadRepository) storeMultiAccount() error {
apr.multiaccount.KDFIterations = apr.kdfIterations
return apr.multiaccountsDB.SaveAccount(*apr.multiaccount) return apr.multiaccountsDB.SaveAccount(*apr.multiaccount)
} }
@ -526,7 +638,7 @@ type RawMessagePayloadManager struct {
payloadRepository *RawMessageRepository payloadRepository *RawMessageRepository
} }
func NewRawMessagePayloadManager(logger *zap.Logger, accountPayload *AccountPayload, aesKey []byte, backend *api.GethStatusBackend, keystorePath string) (*RawMessagePayloadManager, error) { func NewRawMessagePayloadManager(logger *zap.Logger, accountPayload *AccountPayload, aesKey []byte, backend *api.GethStatusBackend, nodeConfig *params.NodeConfig, settingCurrentNetwork string) (*RawMessagePayloadManager, error) {
l := logger.Named("RawMessagePayloadManager") l := logger.Named("RawMessagePayloadManager")
pem, err := NewPayloadEncryptionManager(aesKey, l) pem, err := NewPayloadEncryptionManager(aesKey, l)
if err != nil { if err != nil {
@ -536,7 +648,7 @@ func NewRawMessagePayloadManager(logger *zap.Logger, accountPayload *AccountPayl
logger: l, logger: l,
accountPayload: accountPayload, accountPayload: accountPayload,
PayloadEncryptionManager: pem, PayloadEncryptionManager: pem,
payloadRepository: NewRawMessageRepository(backend, keystorePath, accountPayload), payloadRepository: NewRawMessageRepository(backend, accountPayload, nodeConfig, settingCurrentNetwork),
}, nil }, nil
} }
@ -565,16 +677,18 @@ func (r *RawMessagePayloadManager) ResetPayload() {
type RawMessageRepository struct { type RawMessageRepository struct {
payload []byte payload []byte
syncRawMessageHandler *SyncRawMessageHandler syncRawMessageHandler *SyncRawMessageHandler
keystorePath string
accountPayload *AccountPayload accountPayload *AccountPayload
nodeConfig *params.NodeConfig
settingCurrentNetwork string
} }
func NewRawMessageRepository(backend *api.GethStatusBackend, keystorePath string, accountPayload *AccountPayload) *RawMessageRepository { func NewRawMessageRepository(backend *api.GethStatusBackend, accountPayload *AccountPayload, config *params.NodeConfig, settingCurrentNetwork string) *RawMessageRepository {
return &RawMessageRepository{ return &RawMessageRepository{
syncRawMessageHandler: NewSyncRawMessageHandler(backend), syncRawMessageHandler: NewSyncRawMessageHandler(backend),
keystorePath: keystorePath,
payload: make([]byte, 0), payload: make([]byte, 0),
accountPayload: accountPayload, accountPayload: accountPayload,
nodeConfig: config,
settingCurrentNetwork: settingCurrentNetwork,
} }
} }
@ -596,5 +710,5 @@ func (r *RawMessageRepository) StoreToSource() error {
if accountPayload == nil || accountPayload.multiaccount == nil { if accountPayload == nil || accountPayload.multiaccount == nil {
return fmt.Errorf("no known multiaccount when storing raw messages") return fmt.Errorf("no known multiaccount when storing raw messages")
} }
return r.syncRawMessageHandler.HandleRawMessage(accountPayload.multiaccount, accountPayload.password, r.keystorePath, r.payload) return r.syncRawMessageHandler.HandleRawMessage(accountPayload.multiaccount, accountPayload.password, r.nodeConfig, r.settingCurrentNetwork, r.payload)
} }

View File

@ -136,18 +136,22 @@ func (pms *PayloadMarshallerSuite) SetupTest() {
DB: db1, DB: db1,
PayloadSourceConfig: &PayloadSourceConfig{ PayloadSourceConfig: &PayloadSourceConfig{
KeystorePath: keystore1, KeystorePath: keystore1,
PayloadSourceSenderConfig: &PayloadSourceSenderConfig{
KeyUID: keyUID, KeyUID: keyUID,
Password: password, Password: password,
}, },
},
} }
pms.config2 = &AccountPayloadManagerConfig{ pms.config2 = &AccountPayloadManagerConfig{
DB: db2, DB: db2,
PayloadSourceConfig: &PayloadSourceConfig{ PayloadSourceConfig: &PayloadSourceConfig{
KeystorePath: keystore2, KeystorePath: keystore2,
PayloadSourceSenderConfig: &PayloadSourceSenderConfig{
KeyUID: keyUID, KeyUID: keyUID,
Password: password, Password: password,
}, },
},
} }
} }
@ -160,8 +164,9 @@ func (pms *PayloadMarshallerSuite) TestPayloadMarshaller_LoadPayloads() {
pp := new(AccountPayload) pp := new(AccountPayload)
// Make and LoadFromSource PairingPayloadRepository 1 // Make and LoadFromSource PairingPayloadRepository 1
ppr := NewAccountPayloadRepository(pp, pms.config1) ppr, err := NewAccountPayloadRepository(pp, pms.config1)
err := ppr.LoadFromSource() pms.Require().NoError(err)
err = ppr.LoadFromSource()
pms.Require().NoError(err) pms.Require().NoError(err)
// TEST PairingPayloadRepository 1 LoadFromSource() // TEST PairingPayloadRepository 1 LoadFromSource()
@ -193,8 +198,9 @@ func (pms *PayloadMarshallerSuite) TestPayloadMarshaller_MarshalToProtobuf() {
pp := new(AccountPayload) pp := new(AccountPayload)
// Make and LoadFromSource PairingPayloadRepository 1 // Make and LoadFromSource PairingPayloadRepository 1
ppr := NewAccountPayloadRepository(pp, pms.config1) ppr, err := NewAccountPayloadRepository(pp, pms.config1)
err := ppr.LoadFromSource() pms.Require().NoError(err)
err = ppr.LoadFromSource()
pms.Require().NoError(err) pms.Require().NoError(err)
// Make and Load PairingPayloadMarshaller 1 // Make and Load PairingPayloadMarshaller 1
@ -222,8 +228,9 @@ func (pms *PayloadMarshallerSuite) TestPayloadMarshaller_UnmarshalProtobuf() {
pp := new(AccountPayload) pp := new(AccountPayload)
// Make and LoadFromSource PairingPayloadRepository 1 // Make and LoadFromSource PairingPayloadRepository 1
ppr := NewAccountPayloadRepository(pp, pms.config1) ppr, err := NewAccountPayloadRepository(pp, pms.config1)
err := ppr.LoadFromSource() pms.Require().NoError(err)
err = ppr.LoadFromSource()
pms.Require().NoError(err) pms.Require().NoError(err)
// Make and Load PairingPayloadMarshaller 1 // Make and Load PairingPayloadMarshaller 1
@ -275,8 +282,9 @@ func (pms *PayloadMarshallerSuite) TestPayloadMarshaller_StorePayloads() {
pp := new(AccountPayload) pp := new(AccountPayload)
// Make and LoadFromSource PairingPayloadRepository 1 // Make and LoadFromSource PairingPayloadRepository 1
ppr := NewAccountPayloadRepository(pp, pms.config1) ppr, err := NewAccountPayloadRepository(pp, pms.config1)
err := ppr.LoadFromSource() pms.Require().NoError(err)
err = ppr.LoadFromSource()
pms.Require().NoError(err) pms.Require().NoError(err)
// Make and Load PairingPayloadMarshaller 1 // Make and Load PairingPayloadMarshaller 1
@ -295,8 +303,8 @@ func (pms *PayloadMarshallerSuite) TestPayloadMarshaller_StorePayloads() {
pms.Require().NoError(err) pms.Require().NoError(err)
// Make and Load PairingPayloadRepository 2 // Make and Load PairingPayloadRepository 2
ppr2 := NewAccountPayloadRepository(pp2, pms.config2) ppr2, err := NewAccountPayloadRepository(pp2, pms.config2)
require.NoError(pms.T(), err)
err = ppr2.StoreToSource() err = ppr2.StoreToSource()
pms.Require().NoError(err) pms.Require().NoError(err)

View File

@ -5,17 +5,13 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"path/filepath" "path/filepath"
"strings"
"github.com/google/uuid"
"github.com/status-im/status-go/multiaccounts/settings"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"github.com/status-im/status-go/api" "github.com/status-im/status-go/api"
"github.com/status-im/status-go/multiaccounts" "github.com/status-im/status-go/multiaccounts"
"github.com/status-im/status-go/multiaccounts/accounts" "github.com/status-im/status-go/multiaccounts/accounts"
"github.com/status-im/status-go/multiaccounts/settings"
"github.com/status-im/status-go/params" "github.com/status-im/status-go/params"
"github.com/status-im/status-go/protocol/protobuf" "github.com/status-im/status-go/protocol/protobuf"
) )
@ -81,45 +77,26 @@ func (s *SyncRawMessageHandler) PrepareRawMessage(keyUID string) ([]byte, error)
return nil, err return nil, err
} }
nodeConfig := s.backend.StatusNode().Config()
dataDir := nodeConfig.DataDir
disabledDataDir := nodeConfig.ShhextConfig.BackupDisabledDataDir
defer func() {
// restore data dir
nodeConfig.DataDir = dataDir
nodeConfig.ShhextConfig.BackupDisabledDataDir = disabledDataDir
}()
nodeConfig.DataDir = strings.Replace(dataDir, nodeConfig.RootDataDir, "", 1)
nodeConfig.ShhextConfig.BackupDisabledDataDir = strings.Replace(disabledDataDir, nodeConfig.RootDataDir, "", 1)
if syncRawMessage.NodeConfigJsonBytes, err = json.Marshal(nodeConfig); err != nil {
return nil, err
}
return proto.Marshal(syncRawMessage) return proto.Marshal(syncRawMessage)
} }
func (s *SyncRawMessageHandler) HandleRawMessage(account *multiaccounts.Account, password, keystorePath string, payload []byte) error { func (s *SyncRawMessageHandler) HandleRawMessage(account *multiaccounts.Account, password string, nodeConfig *params.NodeConfig, settingCurrentNetwork string, payload []byte) error {
rawMessages, subAccounts, setting, nodeConfig, err := s.unmarshalSyncRawMessage(payload) rawMessages, subAccounts, setting, err := s.unmarshalSyncRawMessage(payload)
if err != nil { if err != nil {
return err return err
} }
newKeystoreDir := filepath.Join(keystorePath, account.KeyUID) s.backend.UpdateRootDataDir(nodeConfig.RootDataDir)
// because client don't know keyUID before received data, we need help client to update keystore dir
newKeystoreDir := filepath.Join(nodeConfig.KeyStoreDir, account.KeyUID)
nodeConfig.KeyStoreDir = newKeystoreDir
accountManager := s.backend.AccountManager() accountManager := s.backend.AccountManager()
err = accountManager.InitKeystore(newKeystoreDir) err = accountManager.InitKeystore(filepath.Join(nodeConfig.RootDataDir, newKeystoreDir))
if err != nil { if err != nil {
return err return err
} }
setting.InstallationID = nodeConfig.ShhextConfig.InstallationID
//TODO root data dir should be passed from client, following is a temporary solution setting.CurrentNetwork = settingCurrentNetwork
nodeConfig.RootDataDir = filepath.Dir(keystorePath)
nodeConfig.KeyStoreDir = filepath.Join(filepath.Base(keystorePath), account.KeyUID)
installationID := uuid.New().String()
nodeConfig.ShhextConfig.InstallationID = installationID
setting.InstallationID = installationID
//TODO we need a better way(e.g. pass from client when doing local pair?) to handle this, following is a temporary solution
nodeConfig.LogDir = nodeConfig.RootDataDir
nodeConfig.LogFile = "geth.log"
err = s.backend.StartNodeWithAccountAndInitialConfig(*account, password, *setting, nodeConfig, subAccounts) err = s.backend.StartNodeWithAccountAndInitialConfig(*account, password, *setting, nodeConfig, subAccounts)
if err != nil { if err != nil {
@ -133,28 +110,23 @@ func (s *SyncRawMessageHandler) HandleRawMessage(account *multiaccounts.Account,
return messenger.HandleSyncRawMessages(rawMessages) return messenger.HandleSyncRawMessages(rawMessages)
} }
func (s *SyncRawMessageHandler) unmarshalSyncRawMessage(payload []byte) ([]*protobuf.RawMessage, []*accounts.Account, *settings.Settings, *params.NodeConfig, error) { func (s *SyncRawMessageHandler) unmarshalSyncRawMessage(payload []byte) ([]*protobuf.RawMessage, []*accounts.Account, *settings.Settings, error) {
var ( var (
syncRawMessage protobuf.SyncRawMessage syncRawMessage protobuf.SyncRawMessage
subAccounts []*accounts.Account subAccounts []*accounts.Account
setting *settings.Settings setting *settings.Settings
nodeConfig *params.NodeConfig
) )
err := proto.Unmarshal(payload, &syncRawMessage) err := proto.Unmarshal(payload, &syncRawMessage)
if err != nil { if err != nil {
return nil, nil, nil, nil, err return nil, nil, nil, err
} }
err = json.Unmarshal(syncRawMessage.SubAccountsJsonBytes, &subAccounts) err = json.Unmarshal(syncRawMessage.SubAccountsJsonBytes, &subAccounts)
if err != nil { if err != nil {
return nil, nil, nil, nil, err return nil, nil, nil, err
} }
err = json.Unmarshal(syncRawMessage.SettingsJsonBytes, &setting) err = json.Unmarshal(syncRawMessage.SettingsJsonBytes, &setting)
if err != nil { if err != nil {
return nil, nil, nil, nil, err return nil, nil, nil, err
} }
err = json.Unmarshal(syncRawMessage.NodeConfigJsonBytes, &nodeConfig) return syncRawMessage.RawMessages, subAccounts, setting, nil
if err != nil {
return nil, nil, nil, nil, err
}
return syncRawMessage.RawMessages, subAccounts, setting, nodeConfig, nil
} }

View File

@ -5,17 +5,15 @@ import (
"crypto/elliptic" "crypto/elliptic"
"crypto/rand" "crypto/rand"
"crypto/tls" "crypto/tls"
"encoding/json"
"fmt" "fmt"
"net" "net"
"time" "time"
"github.com/status-im/status-go/api"
"github.com/status-im/status-go/server"
"github.com/gorilla/sessions" "github.com/gorilla/sessions"
"github.com/status-im/status-go/api"
"github.com/status-im/status-go/logutils" "github.com/status-im/status-go/logutils"
"github.com/status-im/status-go/server"
) )
type Server struct { type Server struct {
@ -61,7 +59,8 @@ func makeCookieStore() (*sessions.CookieStore, error) {
// NewPairingServer returns a *Server init from the given *Config // NewPairingServer returns a *Server init from the given *Config
func NewPairingServer(backend *api.GethStatusBackend, config *Config) (*Server, error) { func NewPairingServer(backend *api.GethStatusBackend, config *Config) (*Server, error) {
logger := logutils.ZapLogger().Named("Server") logger := logutils.ZapLogger().Named("Server")
pm, err := NewAccountPayloadManager(config.EK, config.AccountPayloadManagerConfig, logger) accountPayloadManagerConfig := config.AccountPayloadManagerConfig
pm, err := NewAccountPayloadManager(config.EK, accountPayloadManagerConfig, logger)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -71,7 +70,7 @@ func NewPairingServer(backend *api.GethStatusBackend, config *Config) (*Server,
return nil, err return nil, err
} }
rmpm, err := NewRawMessagePayloadManager(logger, pm.accountPayload, config.EK, backend, config.KeystorePath) rmpm, err := NewRawMessagePayloadManager(logger, pm.accountPayload, config.EK, backend, accountPayloadManagerConfig.GetNodeConfig(), accountPayloadManagerConfig.GetSettingCurrentNetwork())
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -89,7 +88,7 @@ func NewPairingServer(backend *api.GethStatusBackend, config *Config) (*Server,
cookieStore: cs, cookieStore: cs,
rawMessagePayloadManager: rmpm, rawMessagePayloadManager: rmpm,
} }
s.SetTimeout(config.Timeout) s.SetTimeout(config.GetTimeout())
return s, nil return s, nil
} }
@ -189,13 +188,12 @@ func MakeFullPairingServer(backend *api.GethStatusBackend, mode Mode, storeConfi
// StartUpPairingServer generates a Server, starts the pairing server in the correct mode // StartUpPairingServer generates a Server, starts the pairing server in the correct mode
// and returns the ConnectionParams string to allow a Client to make a successful connection. // and returns the ConnectionParams string to allow a Client to make a successful connection.
func StartUpPairingServer(backend *api.GethStatusBackend, mode Mode, configJSON string) (string, error) { func StartUpPairingServer(backend *api.GethStatusBackend, mode Mode, configJSON string) (string, error) {
var conf PayloadSourceConfig conf, err := NewPayloadSourceForServer(configJSON, mode)
err := json.Unmarshal([]byte(configJSON), &conf)
if err != nil { if err != nil {
return "", err return "", err
} }
ps, err := MakeFullPairingServer(backend, mode, &conf) ps, err := MakeFullPairingServer(backend, mode, conf)
if err != nil { if err != nil {
return "", err return "", err
} }

View File

@ -74,6 +74,10 @@ func (s *PairingServerSuite) TestMultiTimeout() {
s.Require().False(s.PS.IsRunning()) s.Require().False(s.PS.IsRunning())
} }
func newAccountPayloadManagerConfig() *AccountPayloadManagerConfig {
return &AccountPayloadManagerConfig{}
}
func (s *PairingServerSuite) TestPairingServer_StartPairing() { func (s *PairingServerSuite) TestPairingServer_StartPairing() {
// Replace PairingServer.PayloadManager with a MockEncryptOnlyPayloadManager // Replace PairingServer.PayloadManager with a MockEncryptOnlyPayloadManager
pm, err := NewMockEncryptOnlyPayloadManager(s.EphemeralAES) pm, err := NewMockEncryptOnlyPayloadManager(s.EphemeralAES)
@ -101,9 +105,7 @@ func (s *PairingServerSuite) TestPairingServer_StartPairing() {
err = ccp.FromString(qr) err = ccp.FromString(qr)
s.Require().NoError(err) s.Require().NoError(err)
c, err := NewPairingClient(nil, ccp, &AccountPayloadManagerConfig{ c, err := NewPairingClient(nil, ccp, newAccountPayloadManagerConfig())
PayloadSourceConfig: &PayloadSourceConfig{KeystorePath: ""},
})
s.Require().NoError(err) s.Require().NoError(err)
// Compare cert values // Compare cert values
@ -164,9 +166,7 @@ func (s *PairingServerSuite) sendingSetup() *Client {
err = ccp.FromString(qr) err = ccp.FromString(qr)
s.Require().NoError(err) s.Require().NoError(err)
c, err := NewPairingClient(nil, ccp, &AccountPayloadManagerConfig{ c, err := NewPairingClient(nil, ccp, newAccountPayloadManagerConfig())
PayloadSourceConfig: &PayloadSourceConfig{KeystorePath: ""},
})
s.Require().NoError(err) s.Require().NoError(err)
// Replace PairingClient.PayloadManager with a MockEncryptOnlyPayloadManager // Replace PairingClient.PayloadManager with a MockEncryptOnlyPayloadManager
@ -277,9 +277,7 @@ func (s *PairingServerSuite) TestGetOutboundIPWithFullServerE2e() {
err = ccp.FromString(qr) err = ccp.FromString(qr)
s.Require().NoError(err) s.Require().NoError(err)
c, err := NewPairingClient(nil, ccp, &AccountPayloadManagerConfig{ c, err := NewPairingClient(nil, ccp, newAccountPayloadManagerConfig())
PayloadSourceConfig: &PayloadSourceConfig{KeystorePath: ""},
})
s.Require().NoError(err) s.Require().NoError(err)
thing, err := makeThingToSay() thing, err := makeThingToSay()

View File

@ -3,7 +3,6 @@ package pairing
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"fmt"
"os" "os"
"path/filepath" "path/filepath"
"testing" "testing"
@ -33,6 +32,8 @@ var paths = []string{pathWalletRoot, pathEIP1581, pathDefaultChat, pathDefaultWa
const keystoreDir = "keystore" const keystoreDir = "keystore"
const currentNetwork = "mainnet_rpc"
func TestSyncDeviceSuite(t *testing.T) { func TestSyncDeviceSuite(t *testing.T) {
suite.Run(t, new(SyncDeviceSuite)) suite.Run(t, new(SyncDeviceSuite))
} }
@ -85,7 +86,7 @@ func (s *SyncDeviceSuite) prepareBackendWithAccount(tmpdir string) *api.GethStat
account.Name = settings.Name account.Name = settings.Name
nodeConfig, err := defaultNodeConfig(tmpdir, settings.InstallationID, account.KeyUID) nodeConfig, err := defaultNodeConfig(settings.InstallationID, account.KeyUID)
require.NoError(s.T(), err) require.NoError(s.T(), err)
walletDerivedAccount := derivedAddresses[pathDefaultWallet] walletDerivedAccount := derivedAddresses[pathDefaultWallet]
@ -135,9 +136,22 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsSender() {
require.NoError(s.T(), err) require.NoError(s.T(), err)
err = serverBackend.OpenAccounts() err = serverBackend.OpenAccounts()
require.NoError(s.T(), err) require.NoError(s.T(), err)
serverKeystorePath := filepath.Join(serverTmpDir, keystoreDir) serverNodeConfig, err := defaultNodeConfig(uuid.New().String(), "")
configJSON := fmt.Sprintf(`{"KeystorePath":"%s"}`, serverKeystorePath) require.NoError(s.T(), err)
cs, err := StartUpPairingServer(serverBackend, Receiving, configJSON) expectedKDFIterations := 1024
serverKeystoreDir := filepath.Join(serverTmpDir, keystoreDir)
serverPayloadSourceConfig := PayloadSourceConfig{
KeystorePath: serverKeystoreDir,
PayloadSourceReceiverConfig: &PayloadSourceReceiverConfig{
KDFIterations: expectedKDFIterations,
NodeConfig: serverNodeConfig,
RootDataDir: serverTmpDir,
SettingCurrentNetwork: currentNetwork,
},
}
serverConfigBytes, err := json.Marshal(serverPayloadSourceConfig)
require.NoError(s.T(), err)
cs, err := StartUpPairingServer(serverBackend, Receiving, string(serverConfigBytes))
require.NoError(s.T(), err) require.NoError(s.T(), err)
// generate some data for the client // generate some data for the client
@ -151,14 +165,16 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsSender() {
clientActiveAccount, err := clientBackend.GetActiveAccount() clientActiveAccount, err := clientBackend.GetActiveAccount()
require.NoError(s.T(), err) require.NoError(s.T(), err)
clientKeystorePath := filepath.Join(clientTmpDir, keystoreDir, clientActiveAccount.KeyUID) clientKeystorePath := filepath.Join(clientTmpDir, keystoreDir, clientActiveAccount.KeyUID)
var config = PayloadSourceConfig{ clientPayloadSourceConfig := PayloadSourceConfig{
KeystorePath: clientKeystorePath, KeystorePath: clientKeystorePath,
PayloadSourceSenderConfig: &PayloadSourceSenderConfig{
KeyUID: clientActiveAccount.KeyUID, KeyUID: clientActiveAccount.KeyUID,
Password: s.password, Password: s.password,
},
} }
configBytes, err := json.Marshal(config) clientConfigBytes, err := json.Marshal(clientPayloadSourceConfig)
require.NoError(s.T(), err) require.NoError(s.T(), err)
err = StartUpPairingClient(clientBackend, cs, string(configBytes)) err = StartUpPairingClient(clientBackend, cs, string(clientConfigBytes))
require.NoError(s.T(), err) require.NoError(s.T(), err)
require.NoError(s.T(), clientBackend.Logout()) require.NoError(s.T(), clientBackend.Logout())
@ -171,6 +187,7 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsSender() {
serverActiveAccount, err := serverBackend.GetActiveAccount() serverActiveAccount, err := serverBackend.GetActiveAccount()
require.NoError(s.T(), err) require.NoError(s.T(), err)
require.Equal(s.T(), serverActiveAccount.Name, clientActiveAccount.Name) require.Equal(s.T(), serverActiveAccount.Name, clientActiveAccount.Name)
require.Equal(s.T(), serverActiveAccount.KDFIterations, expectedKDFIterations)
} }
func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsReceiver() { func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsReceiver() {
@ -188,8 +205,10 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsReceiver() {
serverKeystorePath := filepath.Join(serverTmpDir, keystoreDir, serverActiveAccount.KeyUID) serverKeystorePath := filepath.Join(serverTmpDir, keystoreDir, serverActiveAccount.KeyUID)
var config = PayloadSourceConfig{ var config = PayloadSourceConfig{
KeystorePath: serverKeystorePath, KeystorePath: serverKeystorePath,
PayloadSourceSenderConfig: &PayloadSourceSenderConfig{
KeyUID: serverActiveAccount.KeyUID, KeyUID: serverActiveAccount.KeyUID,
Password: s.password, Password: s.password,
},
} }
configBytes, err := json.Marshal(config) configBytes, err := json.Marshal(config)
require.NoError(s.T(), err) require.NoError(s.T(), err)
@ -208,9 +227,22 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsReceiver() {
require.NoError(s.T(), err) require.NoError(s.T(), err)
err = clientBackend.OpenAccounts() err = clientBackend.OpenAccounts()
require.NoError(s.T(), err) require.NoError(s.T(), err)
clientKeystorePath := filepath.Join(clientTmpDir, keystoreDir) clientNodeConfig, err := defaultNodeConfig(uuid.New().String(), "")
configJSON := fmt.Sprintf(`{"KeystorePath":"%s"}`, clientKeystorePath) require.NoError(s.T(), err)
err = StartUpPairingClient(clientBackend, cs, configJSON) expectedKDFIterations := 2048
clientKeystoreDir := filepath.Join(clientTmpDir, keystoreDir)
clientPayloadSourceConfig := PayloadSourceConfig{
KeystorePath: clientKeystoreDir,
PayloadSourceReceiverConfig: &PayloadSourceReceiverConfig{
KDFIterations: expectedKDFIterations,
NodeConfig: clientNodeConfig,
RootDataDir: clientTmpDir,
SettingCurrentNetwork: currentNetwork,
},
}
clientConfigBytes, err := json.Marshal(clientPayloadSourceConfig)
require.NoError(s.T(), err)
err = StartUpPairingClient(clientBackend, cs, string(clientConfigBytes))
require.NoError(s.T(), err) require.NoError(s.T(), err)
require.NoError(s.T(), serverBackend.Logout()) require.NoError(s.T(), serverBackend.Logout())
@ -224,6 +256,7 @@ func (s *SyncDeviceSuite) TestPairingSyncDeviceClientAsReceiver() {
clientActiveAccount, err := clientBackend.GetActiveAccount() clientActiveAccount, err := clientBackend.GetActiveAccount()
require.NoError(s.T(), err) require.NoError(s.T(), err)
require.Equal(s.T(), serverActiveAccount.Name, clientActiveAccount.Name) require.Equal(s.T(), serverActiveAccount.Name, clientActiveAccount.Name)
require.Equal(s.T(), clientActiveAccount.KDFIterations, expectedKDFIterations)
} }
func defaultSettings(generatedAccountInfo generator.GeneratedAccountInfo, derivedAddresses map[string]generator.AccountInfo, mnemonic *string) (*settings.Settings, error) { func defaultSettings(generatedAccountInfo generator.GeneratedAccountInfo, derivedAddresses map[string]generator.AccountInfo, mnemonic *string) (*settings.Settings, error) {
@ -273,18 +306,18 @@ func defaultSettings(generatedAccountInfo generator.GeneratedAccountInfo, derive
} }
networkRawMessage := json.RawMessage(networksJSON) networkRawMessage := json.RawMessage(networksJSON)
settings.Networks = &networkRawMessage settings.Networks = &networkRawMessage
settings.CurrentNetwork = "mainnet_rpc" settings.CurrentNetwork = currentNetwork
return settings, nil return settings, nil
} }
func defaultNodeConfig(tmpdir, installationID, keyUID string) (*params.NodeConfig, error) { func defaultNodeConfig(installationID, keyUID string) (*params.NodeConfig, error) {
// Set mainnet // Set mainnet
nodeConfig := &params.NodeConfig{} nodeConfig := &params.NodeConfig{}
nodeConfig.NetworkID = 1 nodeConfig.NetworkID = 1
nodeConfig.LogLevel = "ERROR" nodeConfig.LogLevel = "ERROR"
nodeConfig.DataDir = filepath.Join(tmpdir, "ethereum/mainnet_rpc") nodeConfig.DataDir = filepath.Join("ethereum/mainnet_rpc")
nodeConfig.KeyStoreDir = filepath.Join(tmpdir, keystoreDir, keyUID) nodeConfig.KeyStoreDir = filepath.Join(keystoreDir, keyUID)
nodeConfig.UpstreamConfig = params.UpstreamRPCConfig{ nodeConfig.UpstreamConfig = params.UpstreamRPCConfig{
Enabled: true, Enabled: true,
URL: "https://mainnet.infura.io/v3/800c641949d64d768a5070a1b0511938", URL: "https://mainnet.infura.io/v3/800c641949d64d768a5070a1b0511938",