From 9216896777d197290507908a7769e889e8584323 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 24 Apr 2023 14:12:24 +0200 Subject: [PATCH 01/10] Add errors to proto --- commonspace/spacesyncproto/errors.go | 12 +- .../spacesyncproto/protos/spacesync.proto | 2 + commonspace/spacesyncproto/spacesync.pb.go | 166 +++++++++--------- 3 files changed, 96 insertions(+), 84 deletions(-) diff --git a/commonspace/spacesyncproto/errors.go b/commonspace/spacesyncproto/errors.go index 56ac0446..0760c70b 100644 --- a/commonspace/spacesyncproto/errors.go +++ b/commonspace/spacesyncproto/errors.go @@ -8,9 +8,11 @@ import ( var ( errGroup = rpcerr.ErrGroup(ErrCodes_ErrorOffset) - ErrUnexpected = errGroup.Register(errors.New("unexpected error"), uint64(ErrCodes_Unexpected)) - ErrSpaceMissing = errGroup.Register(errors.New("space is missing"), uint64(ErrCodes_SpaceMissing)) - ErrSpaceExists = errGroup.Register(errors.New("space exists"), uint64(ErrCodes_SpaceExists)) - ErrSpaceNotInCache = errGroup.Register(errors.New("space not in cache"), uint64(ErrCodes_SpaceNotInCache)) - ErrSpaceIsDeleted = errGroup.Register(errors.New("space is deleted"), uint64(ErrCodes_SpaceIsDeleted)) + ErrUnexpected = errGroup.Register(errors.New("unexpected error"), uint64(ErrCodes_Unexpected)) + ErrSpaceMissing = errGroup.Register(errors.New("space is missing"), uint64(ErrCodes_SpaceMissing)) + ErrSpaceExists = errGroup.Register(errors.New("space exists"), uint64(ErrCodes_SpaceExists)) + ErrSpaceNotInCache = errGroup.Register(errors.New("space not in cache"), uint64(ErrCodes_SpaceNotInCache)) + ErrSpaceIsDeleted = errGroup.Register(errors.New("space is deleted"), uint64(ErrCodes_SpaceIsDeleted)) + ErrPeerIsNotResponsible = errGroup.Register(errors.New("peer is not responsible for space"), uint64(ErrCodes_PeerIsNotResponsible)) + ErrReceiptInvalid = errGroup.Register(errors.New("space receipt is not valid"), uint64(ErrCodes_ReceiptIsInvalid)) ) diff --git a/commonspace/spacesyncproto/protos/spacesync.proto b/commonspace/spacesyncproto/protos/spacesync.proto index 3bf03320..d5b461cf 100644 --- a/commonspace/spacesyncproto/protos/spacesync.proto +++ b/commonspace/spacesyncproto/protos/spacesync.proto @@ -9,6 +9,8 @@ enum ErrCodes { SpaceExists = 2; SpaceNotInCache = 3; SpaceIsDeleted = 4; + PeerIsNotResponsible = 5; + ReceiptIsInvalid = 6; ErrorOffset = 100; } diff --git a/commonspace/spacesyncproto/spacesync.pb.go b/commonspace/spacesyncproto/spacesync.pb.go index bb5b0e6e..33caed5b 100644 --- a/commonspace/spacesyncproto/spacesync.pb.go +++ b/commonspace/spacesyncproto/spacesync.pb.go @@ -25,12 +25,14 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type ErrCodes int32 const ( - ErrCodes_Unexpected ErrCodes = 0 - ErrCodes_SpaceMissing ErrCodes = 1 - ErrCodes_SpaceExists ErrCodes = 2 - ErrCodes_SpaceNotInCache ErrCodes = 3 - ErrCodes_SpaceIsDeleted ErrCodes = 4 - ErrCodes_ErrorOffset ErrCodes = 100 + ErrCodes_Unexpected ErrCodes = 0 + ErrCodes_SpaceMissing ErrCodes = 1 + ErrCodes_SpaceExists ErrCodes = 2 + ErrCodes_SpaceNotInCache ErrCodes = 3 + ErrCodes_SpaceIsDeleted ErrCodes = 4 + ErrCodes_PeerIsNotResponsible ErrCodes = 5 + ErrCodes_ReceiptIsInvalid ErrCodes = 6 + ErrCodes_ErrorOffset ErrCodes = 100 ) var ErrCodes_name = map[int32]string{ @@ -39,16 +41,20 @@ var ErrCodes_name = map[int32]string{ 2: "SpaceExists", 3: "SpaceNotInCache", 4: "SpaceIsDeleted", + 5: "PeerIsNotResponsible", + 6: "ReceiptIsInvalid", 100: "ErrorOffset", } var ErrCodes_value = map[string]int32{ - "Unexpected": 0, - "SpaceMissing": 1, - "SpaceExists": 2, - "SpaceNotInCache": 3, - "SpaceIsDeleted": 4, - "ErrorOffset": 100, + "Unexpected": 0, + "SpaceMissing": 1, + "SpaceExists": 2, + "SpaceNotInCache": 3, + "SpaceIsDeleted": 4, + "PeerIsNotResponsible": 5, + "ReceiptIsInvalid": 6, + "ErrorOffset": 100, } func (x ErrCodes) String() string { @@ -1248,73 +1254,75 @@ func init() { } var fileDescriptor_80e49f1f4ac27799 = []byte{ - // 1042 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xf7, 0x6e, 0xd2, 0x24, 0x7e, 0x71, 0x9c, 0xed, 0x34, 0x6d, 0x8d, 0x1b, 0xb9, 0xd6, 0x08, - 0xa1, 0xa8, 0x87, 0xb4, 0x75, 0x10, 0x52, 0x0b, 0x1c, 0x5a, 0x27, 0xa5, 0x16, 0x2a, 0x89, 0xc6, - 0x54, 0x48, 0x48, 0x3d, 0x4c, 0x76, 0x5f, 0xec, 0x85, 0xf5, 0xee, 0xb2, 0x33, 0x26, 0xf1, 0x91, - 0x13, 0x57, 0xce, 0xf0, 0x35, 0xf8, 0x10, 0x1c, 0xcb, 0x8d, 0x23, 0x4a, 0xbe, 0x08, 0x9a, 0xd9, - 0xd9, 0x3f, 0xb6, 0xd7, 0x95, 0xb8, 0x38, 0x3b, 0xbf, 0xf7, 0xde, 0xef, 0xfd, 0x9b, 0x79, 0x2f, - 0xf0, 0xd4, 0x8d, 0x26, 0x93, 0x28, 0x14, 0x31, 0x77, 0xf1, 0xb1, 0xfe, 0x15, 0xb3, 0xd0, 0x8d, - 0x93, 0x48, 0x46, 0x8f, 0xf5, 0xaf, 0x28, 0xd0, 0x43, 0x0d, 0x90, 0x7a, 0x0e, 0xd0, 0x01, 0xec, - 0xbc, 0x46, 0xee, 0x0d, 0x67, 0xa1, 0xcb, 0x78, 0x38, 0x42, 0x42, 0x60, 0xfd, 0x22, 0x89, 0x26, - 0x2d, 0xab, 0x6b, 0x1d, 0xac, 0x33, 0xfd, 0x4d, 0x9a, 0x60, 0xcb, 0xa8, 0x65, 0x6b, 0xc4, 0x96, - 0x11, 0xd9, 0x83, 0x5b, 0x81, 0x3f, 0xf1, 0x65, 0x6b, 0xad, 0x6b, 0x1d, 0xec, 0xb0, 0xf4, 0x40, - 0xaf, 0xa0, 0x99, 0x53, 0xa1, 0x98, 0x06, 0x52, 0x71, 0x8d, 0xb9, 0x18, 0x6b, 0xae, 0x06, 0xd3, - 0xdf, 0xe4, 0x0b, 0xd8, 0xc2, 0x00, 0x27, 0x18, 0x4a, 0xd1, 0xb2, 0xbb, 0x6b, 0x07, 0xdb, 0xbd, - 0xee, 0x61, 0x11, 0xdf, 0x3c, 0xc1, 0x49, 0xaa, 0xc8, 0x72, 0x0b, 0xe5, 0xd9, 0x8d, 0xa6, 0x61, - 0xee, 0x59, 0x1f, 0xe8, 0xe7, 0x70, 0xb7, 0xd2, 0x50, 0x05, 0xee, 0x7b, 0xda, 0x7d, 0x9d, 0xd9, - 0xbe, 0xa7, 0x03, 0x42, 0xee, 0xe9, 0x54, 0xea, 0x4c, 0x7f, 0xd3, 0x77, 0xb0, 0x5b, 0x18, 0xff, - 0x34, 0x45, 0x21, 0x49, 0x0b, 0x36, 0x75, 0x48, 0x83, 0xcc, 0x36, 0x3b, 0x92, 0x27, 0xb0, 0x91, - 0xa8, 0x32, 0x65, 0xb1, 0xb7, 0xaa, 0x62, 0x57, 0x0a, 0xcc, 0xe8, 0xd1, 0xaf, 0xc0, 0x29, 0xc5, - 0x16, 0x47, 0xa1, 0x40, 0x72, 0x04, 0x9b, 0x89, 0x8e, 0x53, 0xb4, 0x2c, 0x4d, 0xf3, 0xd1, 0xca, - 0x12, 0xb0, 0x4c, 0x93, 0xfe, 0x61, 0xc1, 0xed, 0xd3, 0xf3, 0x1f, 0xd0, 0x95, 0x4a, 0xfa, 0x06, - 0x85, 0xe0, 0x23, 0xfc, 0x40, 0xa8, 0xfb, 0x50, 0x4f, 0xd2, 0x7c, 0x06, 0x59, 0xc2, 0x05, 0xa0, - 0xec, 0x12, 0x8c, 0x83, 0xd9, 0xc0, 0xd3, 0xa5, 0xac, 0xb3, 0xec, 0xa8, 0x24, 0x31, 0x9f, 0x05, - 0x11, 0xf7, 0x5a, 0xeb, 0xba, 0x6f, 0xd9, 0x91, 0xb4, 0x61, 0x2b, 0xd2, 0x01, 0x0c, 0xbc, 0xd6, - 0x2d, 0x6d, 0x94, 0x9f, 0x29, 0x82, 0x33, 0x54, 0x8e, 0xcf, 0xa6, 0x62, 0x9c, 0x95, 0xf1, 0x69, - 0xc1, 0xa4, 0x62, 0xdb, 0xee, 0xdd, 0x2f, 0xa5, 0x99, 0x6a, 0xa7, 0xe2, 0xc2, 0x45, 0x07, 0xa0, - 0x9f, 0xa0, 0x87, 0xa1, 0xf4, 0x79, 0xa0, 0xa3, 0x6e, 0xb0, 0x12, 0x42, 0xef, 0xc0, 0xed, 0x92, - 0x9b, 0xb4, 0x9c, 0x94, 0xe6, 0xbe, 0x83, 0x20, 0xf3, 0xbd, 0xd0, 0x79, 0xfa, 0x2a, 0x37, 0x54, - 0x3a, 0xa6, 0x0f, 0xff, 0x3f, 0x40, 0xfa, 0x8b, 0x0d, 0x8d, 0xb2, 0x84, 0xbc, 0x80, 0x6d, 0x6d, - 0xa3, 0xda, 0x86, 0x89, 0xe1, 0x79, 0x58, 0xe2, 0x61, 0xfc, 0x72, 0x58, 0x28, 0x7c, 0xe7, 0xcb, - 0xf1, 0xc0, 0x63, 0x65, 0x1b, 0x95, 0x34, 0x77, 0x03, 0x43, 0x98, 0x25, 0x5d, 0x20, 0x84, 0x42, - 0xa3, 0x38, 0xe5, 0x0d, 0x9b, 0xc3, 0x48, 0x0f, 0xf6, 0x34, 0xe5, 0x10, 0xa5, 0xf4, 0xc3, 0x91, - 0x38, 0x9b, 0x6b, 0x61, 0xa5, 0x8c, 0x7c, 0x06, 0xf7, 0xaa, 0xf0, 0xbc, 0xbb, 0x2b, 0xa4, 0xf4, - 0x6f, 0x0b, 0xb6, 0x4b, 0x29, 0xa9, 0x7b, 0xe1, 0xeb, 0x06, 0xc9, 0x99, 0x79, 0xea, 0xf9, 0x59, - 0xdd, 0x42, 0xe9, 0x4f, 0x50, 0x48, 0x3e, 0x89, 0x75, 0x6a, 0x6b, 0xac, 0x00, 0x94, 0x54, 0xfb, - 0xf8, 0x76, 0x16, 0xa3, 0x49, 0xab, 0x00, 0xc8, 0x27, 0xd0, 0x54, 0x97, 0xd2, 0x77, 0xb9, 0xf4, - 0xa3, 0xf0, 0x6b, 0x9c, 0xe9, 0x6c, 0xd6, 0xd9, 0x02, 0xaa, 0x5e, 0xb5, 0x40, 0x4c, 0xa3, 0x6e, - 0x30, 0xfd, 0x4d, 0x0e, 0x81, 0x94, 0x4a, 0x9c, 0x55, 0x63, 0x43, 0x6b, 0x54, 0x48, 0xe8, 0x19, - 0x34, 0xe7, 0x1b, 0x45, 0xba, 0xcb, 0x8d, 0x6d, 0xcc, 0xf7, 0x4d, 0x45, 0xef, 0x8f, 0x42, 0x2e, - 0xa7, 0x09, 0x9a, 0xb6, 0x15, 0x00, 0x3d, 0x86, 0xbd, 0xaa, 0xd6, 0xeb, 0x77, 0xc9, 0x2f, 0xe7, - 0x58, 0x0b, 0xc0, 0xdc, 0x5b, 0x3b, 0xbf, 0xb7, 0xbf, 0x5b, 0xb0, 0x37, 0x2c, 0xb7, 0xa1, 0x1f, - 0x85, 0x52, 0x8d, 0xb6, 0x2f, 0xa1, 0x91, 0x3e, 0xbe, 0x63, 0x0c, 0x50, 0x62, 0xc5, 0x05, 0x3e, - 0x2d, 0x89, 0x5f, 0xd7, 0xd8, 0x9c, 0x3a, 0x79, 0x6e, 0xb2, 0x33, 0xd6, 0xb6, 0xb6, 0xbe, 0xb7, - 0x78, 0xfd, 0x73, 0xe3, 0xb2, 0xf2, 0xcb, 0x4d, 0xb8, 0xf5, 0x33, 0x0f, 0xa6, 0x48, 0x3b, 0xd0, - 0x28, 0x3b, 0x59, 0x7a, 0x74, 0x47, 0xe6, 0x9e, 0x18, 0xf1, 0xc7, 0xb0, 0xe3, 0xe9, 0xaf, 0xe4, - 0x0c, 0x31, 0xc9, 0x27, 0xd6, 0x3c, 0x48, 0xdf, 0xc1, 0xdd, 0xb9, 0x84, 0x87, 0x21, 0x8f, 0xc5, - 0x38, 0x92, 0xea, 0x99, 0xa4, 0x9a, 0xde, 0xc0, 0x4b, 0x07, 0x67, 0x9d, 0x95, 0x90, 0x65, 0x7a, - 0xbb, 0x8a, 0xfe, 0x57, 0x0b, 0x1a, 0x19, 0xf5, 0x31, 0x97, 0x9c, 0x3c, 0x83, 0x4d, 0x37, 0xad, - 0xa9, 0x19, 0xc6, 0x0f, 0x17, 0xab, 0xb0, 0x50, 0x7a, 0x96, 0xe9, 0xab, 0x5d, 0x26, 0x4c, 0x74, - 0xa6, 0x82, 0xdd, 0x55, 0xb6, 0x59, 0x16, 0x2c, 0xb7, 0xa0, 0x3f, 0x9a, 0x91, 0x34, 0x9c, 0x9e, - 0x0b, 0x37, 0xf1, 0x63, 0x75, 0x9d, 0xd5, 0x5b, 0x32, 0x03, 0x3c, 0x4b, 0x31, 0x3f, 0x93, 0xe7, - 0xb0, 0xc1, 0x5d, 0xa5, 0xa5, 0x9d, 0x35, 0x7b, 0x74, 0xc9, 0x59, 0x89, 0xe9, 0x85, 0xd6, 0x64, - 0xc6, 0xe2, 0xd1, 0x25, 0x6c, 0x9d, 0x24, 0x49, 0x3f, 0xf2, 0x50, 0x90, 0x26, 0xc0, 0xdb, 0x10, - 0xaf, 0x62, 0x74, 0x25, 0x7a, 0x4e, 0x8d, 0x38, 0x66, 0xa4, 0xbd, 0xf1, 0x85, 0xf0, 0xc3, 0x91, - 0x63, 0x91, 0x5d, 0xd3, 0xb8, 0x93, 0x2b, 0x5f, 0x48, 0xe1, 0xd8, 0xe4, 0x0e, 0xec, 0x6a, 0xe0, - 0x9b, 0x48, 0x0e, 0xc2, 0x3e, 0x77, 0xc7, 0xe8, 0xac, 0x11, 0x02, 0x4d, 0x0d, 0x0e, 0x44, 0xda, - 0x60, 0xcf, 0x59, 0x57, 0x96, 0x27, 0x49, 0x12, 0x25, 0xa7, 0x17, 0x17, 0x02, 0xa5, 0xe3, 0x3d, - 0x7a, 0x06, 0xf7, 0x57, 0xc4, 0x46, 0x76, 0xa0, 0x6e, 0xd0, 0x73, 0x74, 0x6a, 0xca, 0xf4, 0x6d, - 0x28, 0x72, 0xc0, 0xea, 0xfd, 0x69, 0x43, 0x3d, 0xb5, 0x9d, 0x85, 0x2e, 0xe9, 0xc3, 0x56, 0xb6, - 0x1a, 0x49, 0xbb, 0x72, 0x5f, 0xea, 0xc9, 0xdf, 0x7e, 0x50, 0xbd, 0x4b, 0xd3, 0x89, 0xff, 0xca, - 0x30, 0xaa, 0xfd, 0x41, 0x1e, 0x2c, 0x4d, 0xfb, 0x62, 0x79, 0xb5, 0xf7, 0xab, 0x85, 0x4b, 0x3c, - 0x41, 0x50, 0xc5, 0x93, 0x2f, 0xa2, 0x2a, 0x9e, 0xd2, 0x06, 0x62, 0xe0, 0x14, 0x3b, 0x7d, 0x28, - 0x13, 0xe4, 0x13, 0xb2, 0xbf, 0xf4, 0x86, 0x4b, 0x0b, 0xbf, 0xfd, 0x41, 0xe9, 0x81, 0xf5, 0xc4, - 0x7a, 0xf9, 0xe9, 0x5f, 0xd7, 0x1d, 0xeb, 0xfd, 0x75, 0xc7, 0xfa, 0xf7, 0xba, 0x63, 0xfd, 0x76, - 0xd3, 0xa9, 0xbd, 0xbf, 0xe9, 0xd4, 0xfe, 0xb9, 0xe9, 0xd4, 0xbe, 0x6f, 0xaf, 0xfe, 0x57, 0xf1, - 0x7c, 0x43, 0xff, 0x39, 0xfa, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x13, 0xff, 0xe7, 0x17, 0x4f, 0x0a, - 0x00, 0x00, + // 1077 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0xcd, 0x6e, 0xdb, 0x46, + 0x10, 0x16, 0xe9, 0x5f, 0x8d, 0x65, 0x99, 0xd9, 0x28, 0x89, 0xaa, 0x18, 0x8a, 0xb0, 0x28, 0x0a, + 0x23, 0x07, 0x27, 0xb1, 0x8b, 0x02, 0x49, 0xdb, 0x43, 0x62, 0x3b, 0x0d, 0x51, 0x24, 0x36, 0x56, + 0x0d, 0x0a, 0x14, 0xc8, 0x61, 0x4d, 0x8e, 0x2d, 0xb6, 0x14, 0xc9, 0x72, 0x57, 0x89, 0x75, 0xec, + 0xa9, 0xd7, 0x9e, 0xdb, 0x07, 0xe8, 0x0b, 0xf4, 0x21, 0x7a, 0x4c, 0x6f, 0x3d, 0x16, 0xf6, 0x8b, + 0x14, 0xbb, 0x5c, 0xfe, 0xc8, 0xa2, 0x02, 0xe4, 0x22, 0xed, 0x7e, 0x33, 0xf3, 0xcd, 0xdf, 0xee, + 0x0e, 0xe1, 0x91, 0x17, 0x8f, 0xc7, 0x71, 0x24, 0x12, 0xee, 0xe1, 0x03, 0xfd, 0x2b, 0xa6, 0x91, + 0x97, 0xa4, 0xb1, 0x8c, 0x1f, 0xe8, 0x5f, 0x51, 0xa2, 0xbb, 0x1a, 0x20, 0xcd, 0x02, 0xa0, 0x2e, + 0x6c, 0xbe, 0x40, 0xee, 0x0f, 0xa7, 0x91, 0xc7, 0x78, 0x74, 0x8e, 0x84, 0xc0, 0xf2, 0x59, 0x1a, + 0x8f, 0xbb, 0xd6, 0xc0, 0xda, 0x59, 0x66, 0x7a, 0x4d, 0xda, 0x60, 0xcb, 0xb8, 0x6b, 0x6b, 0xc4, + 0x96, 0x31, 0xe9, 0xc0, 0x4a, 0x18, 0x8c, 0x03, 0xd9, 0x5d, 0x1a, 0x58, 0x3b, 0x9b, 0x2c, 0xdb, + 0xd0, 0x0b, 0x68, 0x17, 0x54, 0x28, 0x26, 0xa1, 0x54, 0x5c, 0x23, 0x2e, 0x46, 0x9a, 0xab, 0xc5, + 0xf4, 0x9a, 0x7c, 0x05, 0xeb, 0x18, 0xe2, 0x18, 0x23, 0x29, 0xba, 0xf6, 0x60, 0x69, 0x67, 0x63, + 0x6f, 0xb0, 0x5b, 0xc6, 0x37, 0x4b, 0x70, 0x94, 0x29, 0xb2, 0xc2, 0x42, 0x79, 0xf6, 0xe2, 0x49, + 0x54, 0x78, 0xd6, 0x1b, 0xfa, 0x25, 0xdc, 0xaa, 0x35, 0x54, 0x81, 0x07, 0xbe, 0x76, 0xdf, 0x64, + 0x76, 0xe0, 0xeb, 0x80, 0x90, 0xfb, 0x3a, 0x95, 0x26, 0xd3, 0x6b, 0xfa, 0x06, 0xb6, 0x4a, 0xe3, + 0x9f, 0x27, 0x28, 0x24, 0xe9, 0xc2, 0x9a, 0x0e, 0xc9, 0xcd, 0x6d, 0xf3, 0x2d, 0x79, 0x08, 0xab, + 0xa9, 0x2a, 0x53, 0x1e, 0x7b, 0xb7, 0x2e, 0x76, 0xa5, 0xc0, 0x8c, 0x1e, 0xfd, 0x06, 0x9c, 0x4a, + 0x6c, 0x49, 0x1c, 0x09, 0x24, 0xfb, 0xb0, 0x96, 0xea, 0x38, 0x45, 0xd7, 0xd2, 0x34, 0x9f, 0x2c, + 0x2c, 0x01, 0xcb, 0x35, 0xe9, 0x1f, 0x16, 0xdc, 0x38, 0x3e, 0xfd, 0x11, 0x3d, 0xa9, 0xa4, 0x2f, + 0x51, 0x08, 0x7e, 0x8e, 0x1f, 0x08, 0x75, 0x1b, 0x9a, 0x69, 0x96, 0x8f, 0x9b, 0x27, 0x5c, 0x02, + 0xca, 0x2e, 0xc5, 0x24, 0x9c, 0xba, 0xbe, 0x2e, 0x65, 0x93, 0xe5, 0x5b, 0x25, 0x49, 0xf8, 0x34, + 0x8c, 0xb9, 0xdf, 0x5d, 0xd6, 0x7d, 0xcb, 0xb7, 0xa4, 0x07, 0xeb, 0xb1, 0x0e, 0xc0, 0xf5, 0xbb, + 0x2b, 0xda, 0xa8, 0xd8, 0x53, 0x04, 0x67, 0xa8, 0x1c, 0x9f, 0x4c, 0xc4, 0x28, 0x2f, 0xe3, 0xa3, + 0x92, 0x49, 0xc5, 0xb6, 0xb1, 0x77, 0xa7, 0x92, 0x66, 0xa6, 0x9d, 0x89, 0x4b, 0x17, 0x7d, 0x80, + 0x83, 0x14, 0x7d, 0x8c, 0x64, 0xc0, 0x43, 0x1d, 0x75, 0x8b, 0x55, 0x10, 0x7a, 0x13, 0x6e, 0x54, + 0xdc, 0x64, 0xe5, 0xa4, 0xb4, 0xf0, 0x1d, 0x86, 0xb9, 0xef, 0x6b, 0x9d, 0xa7, 0xcf, 0x0b, 0x43, + 0xa5, 0x63, 0xfa, 0xf0, 0xf1, 0x01, 0xd2, 0x5f, 0x6c, 0x68, 0x55, 0x25, 0xe4, 0x29, 0x6c, 0x68, + 0x1b, 0xd5, 0x36, 0x4c, 0x0d, 0xcf, 0xbd, 0x0a, 0x0f, 0xe3, 0xef, 0x86, 0xa5, 0xc2, 0xf7, 0x81, + 0x1c, 0xb9, 0x3e, 0xab, 0xda, 0xa8, 0xa4, 0xb9, 0x17, 0x1a, 0xc2, 0x3c, 0xe9, 0x12, 0x21, 0x14, + 0x5a, 0xe5, 0xae, 0x68, 0xd8, 0x0c, 0x46, 0xf6, 0xa0, 0xa3, 0x29, 0x87, 0x28, 0x65, 0x10, 0x9d, + 0x8b, 0x93, 0x99, 0x16, 0xd6, 0xca, 0xc8, 0x17, 0x70, 0xbb, 0x0e, 0x2f, 0xba, 0xbb, 0x40, 0x4a, + 0xff, 0xb1, 0x60, 0xa3, 0x92, 0x92, 0x3a, 0x17, 0x81, 0x6e, 0x90, 0x9c, 0x9a, 0xab, 0x5e, 0xec, + 0xd5, 0x29, 0x94, 0xc1, 0x18, 0x85, 0xe4, 0xe3, 0x44, 0xa7, 0xb6, 0xc4, 0x4a, 0x40, 0x49, 0xb5, + 0x8f, 0xef, 0xa6, 0x09, 0x9a, 0xb4, 0x4a, 0x80, 0x7c, 0x06, 0x6d, 0x75, 0x28, 0x03, 0x8f, 0xcb, + 0x20, 0x8e, 0xbe, 0xc5, 0xa9, 0xce, 0x66, 0x99, 0x5d, 0x43, 0xd5, 0xad, 0x16, 0x88, 0x59, 0xd4, + 0x2d, 0xa6, 0xd7, 0x64, 0x17, 0x48, 0xa5, 0xc4, 0x79, 0x35, 0x56, 0xb5, 0x46, 0x8d, 0x84, 0x9e, + 0x40, 0x7b, 0xb6, 0x51, 0x64, 0x30, 0xdf, 0xd8, 0xd6, 0x6c, 0xdf, 0x54, 0xf4, 0xc1, 0x79, 0xc4, + 0xe5, 0x24, 0x45, 0xd3, 0xb6, 0x12, 0xa0, 0x87, 0xd0, 0xa9, 0x6b, 0xbd, 0xbe, 0x97, 0xfc, 0xdd, + 0x0c, 0x6b, 0x09, 0x98, 0x73, 0x6b, 0x17, 0xe7, 0xf6, 0x77, 0x0b, 0x3a, 0xc3, 0x6a, 0x1b, 0x0e, + 0xe2, 0x48, 0xaa, 0xa7, 0xed, 0x6b, 0x68, 0x65, 0x97, 0xef, 0x10, 0x43, 0x94, 0x58, 0x73, 0x80, + 0x8f, 0x2b, 0xe2, 0x17, 0x0d, 0x36, 0xa3, 0x4e, 0x9e, 0x98, 0xec, 0x8c, 0xb5, 0xad, 0xad, 0x6f, + 0x5f, 0x3f, 0xfe, 0x85, 0x71, 0x55, 0xf9, 0xd9, 0x1a, 0xac, 0xbc, 0xe5, 0xe1, 0x04, 0x69, 0x1f, + 0x5a, 0x55, 0x27, 0x73, 0x97, 0x6e, 0xdf, 0x9c, 0x13, 0x23, 0xfe, 0x14, 0x36, 0x7d, 0xbd, 0x4a, + 0x4f, 0x10, 0xd3, 0xe2, 0xc5, 0x9a, 0x05, 0xe9, 0x1b, 0xb8, 0x35, 0x93, 0xf0, 0x30, 0xe2, 0x89, + 0x18, 0xc5, 0x52, 0x5d, 0x93, 0x4c, 0xd3, 0x77, 0xfd, 0xec, 0xe1, 0x6c, 0xb2, 0x0a, 0x32, 0x4f, + 0x6f, 0xd7, 0xd1, 0xff, 0x6a, 0x41, 0x2b, 0xa7, 0x3e, 0xe4, 0x92, 0x93, 0xc7, 0xb0, 0xe6, 0x65, + 0x35, 0x35, 0x8f, 0xf1, 0xbd, 0xeb, 0x55, 0xb8, 0x56, 0x7a, 0x96, 0xeb, 0xab, 0x59, 0x26, 0x4c, + 0x74, 0xa6, 0x82, 0x83, 0x45, 0xb6, 0x79, 0x16, 0xac, 0xb0, 0xa0, 0x3f, 0x99, 0x27, 0x69, 0x38, + 0x39, 0x15, 0x5e, 0x1a, 0x24, 0xea, 0x38, 0xab, 0xbb, 0x64, 0x1e, 0xf0, 0x3c, 0xc5, 0x62, 0x4f, + 0x9e, 0xc0, 0x2a, 0xf7, 0x94, 0x96, 0x76, 0xd6, 0xde, 0xa3, 0x73, 0xce, 0x2a, 0x4c, 0x4f, 0xb5, + 0x26, 0x33, 0x16, 0xf7, 0xff, 0xb4, 0x60, 0xfd, 0x28, 0x4d, 0x0f, 0x62, 0x1f, 0x05, 0x69, 0x03, + 0xbc, 0x8e, 0xf0, 0x22, 0x41, 0x4f, 0xa2, 0xef, 0x34, 0x88, 0x63, 0xde, 0xb4, 0x97, 0x81, 0x10, + 0x41, 0x74, 0xee, 0x58, 0x64, 0xcb, 0x74, 0xee, 0xe8, 0x22, 0x10, 0x52, 0x38, 0x36, 0xb9, 0x09, + 0x5b, 0x1a, 0x78, 0x15, 0x4b, 0x37, 0x3a, 0xe0, 0xde, 0x08, 0x9d, 0x25, 0x42, 0xa0, 0xad, 0x41, + 0x57, 0x64, 0x1d, 0xf6, 0x9d, 0x65, 0xd2, 0x85, 0x8e, 0xae, 0xb4, 0x78, 0x15, 0x4b, 0xf3, 0xd0, + 0x06, 0xa7, 0x21, 0x3a, 0x2b, 0xa4, 0x03, 0x0e, 0x43, 0x0f, 0x83, 0x44, 0xba, 0xc2, 0x8d, 0xde, + 0xf2, 0x30, 0xf0, 0x9d, 0x55, 0xe5, 0xe9, 0x28, 0x4d, 0xe3, 0xf4, 0xf8, 0xec, 0x4c, 0xa0, 0x74, + 0xfc, 0xfb, 0x8f, 0xe1, 0xce, 0x82, 0x64, 0xc8, 0x26, 0x34, 0x0d, 0x7a, 0x8a, 0x4e, 0x43, 0x99, + 0xbe, 0x8e, 0x44, 0x01, 0x58, 0x7b, 0x7f, 0xd9, 0xd0, 0xcc, 0x6c, 0xa7, 0x91, 0x47, 0x0e, 0x60, + 0x3d, 0x9f, 0xa5, 0xa4, 0x57, 0x3b, 0x60, 0xf5, 0xa8, 0xe8, 0xdd, 0xad, 0x1f, 0xbe, 0xd9, 0x88, + 0x78, 0x6e, 0x18, 0xd5, 0xc0, 0x21, 0x77, 0xe7, 0xc6, 0x43, 0x39, 0xed, 0x7a, 0xdb, 0xf5, 0xc2, + 0x39, 0x9e, 0x30, 0xac, 0xe3, 0x29, 0x26, 0x57, 0x1d, 0x4f, 0x65, 0x64, 0x31, 0x70, 0xca, 0x8f, + 0x80, 0xa1, 0x4c, 0x91, 0x8f, 0xc9, 0xf6, 0xdc, 0xa5, 0xaf, 0x7c, 0x21, 0xf4, 0x3e, 0x28, 0xdd, + 0xb1, 0x1e, 0x5a, 0xcf, 0x3e, 0xff, 0xfb, 0xb2, 0x6f, 0xbd, 0xbf, 0xec, 0x5b, 0xff, 0x5d, 0xf6, + 0xad, 0xdf, 0xae, 0xfa, 0x8d, 0xf7, 0x57, 0xfd, 0xc6, 0xbf, 0x57, 0xfd, 0xc6, 0x0f, 0xbd, 0xc5, + 0xdf, 0x96, 0xa7, 0xab, 0xfa, 0x6f, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd3, 0x01, 0xff, + 0xb5, 0x80, 0x0a, 0x00, 0x00, } func (m *HeadSyncRange) Marshal() (dAtA []byte, err error) { From b0f3fec939c74e247e017d03372fa9604c20efb6 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Mon, 24 Apr 2023 20:33:35 +0200 Subject: [PATCH 02/10] Add receipt check --- commonspace/checks.go | 44 ++++++++++++ coordinator/coordinatorclient/receipt.go | 85 ++++++++++++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 commonspace/checks.go create mode 100644 coordinator/coordinatorclient/receipt.go diff --git a/commonspace/checks.go b/commonspace/checks.go new file mode 100644 index 00000000..5469e2f2 --- /dev/null +++ b/commonspace/checks.go @@ -0,0 +1,44 @@ +package commonspace + +import ( + "context" + "github.com/anytypeio/any-sync/commonspace/spacesyncproto" + "github.com/anytypeio/any-sync/net/peer" + "github.com/anytypeio/any-sync/nodeconf" + "github.com/anytypeio/any-sync/util/crypto" + "golang.org/x/exp/slices" +) + +func CheckResponsible(ctx context.Context, confService nodeconf.Service, spaceId string) (err error) { + peerId, err := peer.CtxPeerId(ctx) + if err != nil { + return + } + if isClient(confService, peerId) && !confService.IsResponsible(spaceId) { + return spacesyncproto.ErrPeerIsNotResponsible + } + return +} + +func isClient(confService nodeconf.Service, peerId string) bool { + return len(confService.NodeTypes(peerId)) == 0 +} + +func checkCoordinator(confService nodeconf.Service, identity []byte, payload, signature []byte) (err error) { + controlKey, err := crypto.UnmarshalEd25519PublicKey(identity) + if err != nil { + return + } + nodeTypes := confService.NodeTypes(controlKey.PeerId()) + if len(nodeTypes) == 0 || !slices.Contains(nodeTypes, nodeconf.NodeTypeCoordinator) { + return errNoSuchCoordinatorNode + } + res, err := controlKey.Verify(payload, signature) + if err != nil { + return + } + if !res { + return errReceiptSignatureIncorrect + } + return +} diff --git a/coordinator/coordinatorclient/receipt.go b/coordinator/coordinatorclient/receipt.go new file mode 100644 index 00000000..4a7f3162 --- /dev/null +++ b/coordinator/coordinatorclient/receipt.go @@ -0,0 +1,85 @@ +package coordinatorclient + +import ( + "bytes" + "context" + "errors" + "github.com/anytypeio/any-sync/commonspace/spacesyncproto" + "github.com/anytypeio/any-sync/coordinator/coordinatorproto" + "github.com/anytypeio/any-sync/net/peer" + "github.com/anytypeio/any-sync/nodeconf" + "github.com/anytypeio/any-sync/util/crypto" + "github.com/gogo/protobuf/proto" + "golang.org/x/exp/slices" + "time" +) + +var ( + errReceiptSignatureIncorrect = errors.New("receipt signature is incorrect") + errNoSuchCoordinatorNode = errors.New("no such control node") + errReceiptSpaceIdIncorrect = errors.New("receipt space id is incorrect") + errReceiptPeerIdIncorrect = errors.New("receipt peer id is incorrect") + errReceiptAccountIncorrect = errors.New("receipt account id is incorrect") + errReceiptExpired = errors.New("receipt is expired") +) + +func CheckReceipt(ctx context.Context, confService nodeconf.Service, request *spacesyncproto.SpacePushRequest) (err error) { + peerId, err := peer.CtxPeerId(ctx) + if err != nil { + return + } + accountIdentity, err := peer.CtxIdentity(ctx) + if err != nil { + return + } + credential := &coordinatorproto.SpaceReceiptWithSignature{} + err = proto.Unmarshal(request.GetCredential(), credential) + if err != nil { + return + } + payload := &coordinatorproto.SpaceReceipt{} + err = proto.Unmarshal(credential.GetSpaceReceiptPayload(), payload) + if err != nil { + return + } + if payload.GetSpaceId() != request.GetPayload().GetSpaceHeader().GetId() { + return errReceiptSpaceIdIncorrect + } + if payload.GetPeerId() != peerId { + return errReceiptPeerIdIncorrect + } + if !bytes.Equal(payload.GetAccountIdentity(), accountIdentity) { + return errReceiptAccountIncorrect + } + err = checkCoordinator( + confService, + payload.GetControlNodeIdentity(), + credential.GetSpaceReceiptPayload(), + credential.GetSignature()) + if err != nil { + return + } + if payload.GetValidUntil() < uint64(time.Now().Unix()) { + return errReceiptExpired + } + return +} + +func checkCoordinator(confService nodeconf.Service, identity []byte, payload, signature []byte) (err error) { + cooordinatorKey, err := crypto.UnmarshalEd25519PublicKey(identity) + if err != nil { + return + } + nodeTypes := confService.NodeTypes(cooordinatorKey.PeerId()) + if len(nodeTypes) == 0 || !slices.Contains(nodeTypes, nodeconf.NodeTypeCoordinator) { + return errNoSuchCoordinatorNode + } + res, err := cooordinatorKey.Verify(payload, signature) + if err != nil { + return + } + if !res { + return errReceiptSignatureIncorrect + } + return +} From 4b330e8b2da3db16417b45cdbbd242d3bdcd02fc Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 25 Apr 2023 09:54:12 +0200 Subject: [PATCH 03/10] Move receipt logic to any-sync, write tests --- coordinator/coordinatorclient/receipt.go | 85 ------------ coordinator/coordinatorproto/receipt.go | 100 ++++++++++++++ coordinator/coordinatorproto/receipt_test.go | 130 +++++++++++++++++++ 3 files changed, 230 insertions(+), 85 deletions(-) delete mode 100644 coordinator/coordinatorclient/receipt.go create mode 100644 coordinator/coordinatorproto/receipt.go create mode 100644 coordinator/coordinatorproto/receipt_test.go diff --git a/coordinator/coordinatorclient/receipt.go b/coordinator/coordinatorclient/receipt.go deleted file mode 100644 index 4a7f3162..00000000 --- a/coordinator/coordinatorclient/receipt.go +++ /dev/null @@ -1,85 +0,0 @@ -package coordinatorclient - -import ( - "bytes" - "context" - "errors" - "github.com/anytypeio/any-sync/commonspace/spacesyncproto" - "github.com/anytypeio/any-sync/coordinator/coordinatorproto" - "github.com/anytypeio/any-sync/net/peer" - "github.com/anytypeio/any-sync/nodeconf" - "github.com/anytypeio/any-sync/util/crypto" - "github.com/gogo/protobuf/proto" - "golang.org/x/exp/slices" - "time" -) - -var ( - errReceiptSignatureIncorrect = errors.New("receipt signature is incorrect") - errNoSuchCoordinatorNode = errors.New("no such control node") - errReceiptSpaceIdIncorrect = errors.New("receipt space id is incorrect") - errReceiptPeerIdIncorrect = errors.New("receipt peer id is incorrect") - errReceiptAccountIncorrect = errors.New("receipt account id is incorrect") - errReceiptExpired = errors.New("receipt is expired") -) - -func CheckReceipt(ctx context.Context, confService nodeconf.Service, request *spacesyncproto.SpacePushRequest) (err error) { - peerId, err := peer.CtxPeerId(ctx) - if err != nil { - return - } - accountIdentity, err := peer.CtxIdentity(ctx) - if err != nil { - return - } - credential := &coordinatorproto.SpaceReceiptWithSignature{} - err = proto.Unmarshal(request.GetCredential(), credential) - if err != nil { - return - } - payload := &coordinatorproto.SpaceReceipt{} - err = proto.Unmarshal(credential.GetSpaceReceiptPayload(), payload) - if err != nil { - return - } - if payload.GetSpaceId() != request.GetPayload().GetSpaceHeader().GetId() { - return errReceiptSpaceIdIncorrect - } - if payload.GetPeerId() != peerId { - return errReceiptPeerIdIncorrect - } - if !bytes.Equal(payload.GetAccountIdentity(), accountIdentity) { - return errReceiptAccountIncorrect - } - err = checkCoordinator( - confService, - payload.GetControlNodeIdentity(), - credential.GetSpaceReceiptPayload(), - credential.GetSignature()) - if err != nil { - return - } - if payload.GetValidUntil() < uint64(time.Now().Unix()) { - return errReceiptExpired - } - return -} - -func checkCoordinator(confService nodeconf.Service, identity []byte, payload, signature []byte) (err error) { - cooordinatorKey, err := crypto.UnmarshalEd25519PublicKey(identity) - if err != nil { - return - } - nodeTypes := confService.NodeTypes(cooordinatorKey.PeerId()) - if len(nodeTypes) == 0 || !slices.Contains(nodeTypes, nodeconf.NodeTypeCoordinator) { - return errNoSuchCoordinatorNode - } - res, err := cooordinatorKey.Verify(payload, signature) - if err != nil { - return - } - if !res { - return errReceiptSignatureIncorrect - } - return -} diff --git a/coordinator/coordinatorproto/receipt.go b/coordinator/coordinatorproto/receipt.go new file mode 100644 index 00000000..630eeffb --- /dev/null +++ b/coordinator/coordinatorproto/receipt.go @@ -0,0 +1,100 @@ +package coordinatorproto + +import ( + "bytes" + "errors" + "github.com/anytypeio/any-sync/util/crypto" + "github.com/gogo/protobuf/proto" + "golang.org/x/exp/slices" + "time" +) + +var ( + errReceiptSignatureIncorrect = errors.New("receipt signature is incorrect") + errNoSuchCoordinatorNode = errors.New("no such control node") + errReceiptSpaceIdIncorrect = errors.New("receipt space id is incorrect") + errReceiptPeerIdIncorrect = errors.New("receipt peer id is incorrect") + errReceiptAccountIncorrect = errors.New("receipt account is incorrect") + errReceiptExpired = errors.New("receipt is expired") +) + +func PrepareSpaceReceipt(spaceId, peerId string, validPeriod time.Duration, accountPubKey crypto.PubKey, nodeKey crypto.PrivKey) (signedReceipt *SpaceReceiptWithSignature, err error) { + marshalledAccount, err := accountPubKey.Marshall() + if err != nil { + return + } + marshalledNode, err := nodeKey.GetPublic().Marshall() + if err != nil { + return + } + receipt := &SpaceReceipt{ + SpaceId: spaceId, + PeerId: peerId, + AccountIdentity: marshalledAccount, + ControlNodeIdentity: marshalledNode, + ValidUntil: uint64(time.Now().Add(validPeriod).Unix()), + } + receiptData, err := receipt.Marshal() + if err != nil { + return + } + sign, err := nodeKey.Sign(receiptData) + if err != nil { + return + } + return &SpaceReceiptWithSignature{ + SpaceReceiptPayload: receiptData, + Signature: sign, + }, nil +} + +func CheckReceipt(peerId, spaceId string, accountIdentity []byte, coordinators []string, receipt *SpaceReceiptWithSignature) (err error) { + payload := &SpaceReceipt{} + err = proto.Unmarshal(receipt.GetSpaceReceiptPayload(), payload) + if err != nil { + return + } + if payload.SpaceId != spaceId { + return errReceiptSpaceIdIncorrect + } + if payload.PeerId != peerId { + return errReceiptPeerIdIncorrect + } + protoIdentity, err := crypto.UnmarshalEd25519PublicKeyProto(payload.AccountIdentity) + if err != nil { + return + } + if !bytes.Equal(protoIdentity.Storage(), accountIdentity) { + return errReceiptAccountIncorrect + } + err = checkCoordinator( + coordinators, + payload.ControlNodeIdentity, + receipt.GetSpaceReceiptPayload(), + receipt.GetSignature()) + if err != nil { + return + } + if payload.GetValidUntil() <= uint64(time.Now().Unix()) { + return errReceiptExpired + } + return +} + +func checkCoordinator(coordinators []string, identity []byte, payload, signature []byte) (err error) { + coordinatorKey, err := crypto.UnmarshalEd25519PublicKeyProto(identity) + if err != nil { + return + } + if !slices.Contains(coordinators, coordinatorKey.PeerId()) { + return errNoSuchCoordinatorNode + } + res, err := coordinatorKey.Verify(payload, signature) + if err != nil { + return + } + if !res { + return errReceiptSignatureIncorrect + } + return +} diff --git a/coordinator/coordinatorproto/receipt_test.go b/coordinator/coordinatorproto/receipt_test.go new file mode 100644 index 00000000..38ca6d75 --- /dev/null +++ b/coordinator/coordinatorproto/receipt_test.go @@ -0,0 +1,130 @@ +package coordinatorproto + +import ( + "context" + "crypto/rand" + "github.com/anytypeio/any-sync/util/crypto" + "github.com/gogo/protobuf/proto" + "github.com/stretchr/testify/require" + "testing" + "time" +) + +type fixture struct { + coordinatorKey crypto.PrivKey + accountKey crypto.PubKey + accountIdentity []byte + ctx context.Context + originalReceipt *SpaceReceipt + signedReceipt *SpaceReceiptWithSignature + spaceId string + peerId string +} + +func newFixture(t *testing.T) *fixture { + coordinatorKey, _, err := crypto.GenerateEd25519Key(rand.Reader) + require.NoError(t, err) + signKey, _, err := crypto.GenerateEd25519Key(rand.Reader) + require.NoError(t, err) + signKeyRaw, err := signKey.GetPublic().Raw() + require.NoError(t, err) + return &fixture{ + spaceId: "spaceId", + peerId: "peerId", + accountIdentity: signKeyRaw, + coordinatorKey: coordinatorKey, + accountKey: signKey.GetPublic(), + } +} + +func (fx *fixture) prepareReceipt(t *testing.T, validPeriod time.Duration) { + var err error + fx.signedReceipt, err = PrepareSpaceReceipt(fx.spaceId, fx.peerId, validPeriod, fx.accountKey, fx.coordinatorKey) + require.NoError(t, err) + fx.originalReceipt = &SpaceReceipt{} + err = proto.Unmarshal(fx.signedReceipt.SpaceReceiptPayload, fx.originalReceipt) + require.NoError(t, err) + return +} + +func (fx *fixture) updateReceipt(t *testing.T, update func(t *testing.T, receipt *SpaceReceipt)) { + update(t, fx.originalReceipt) + marshalled, err := proto.Marshal(fx.originalReceipt) + require.NoError(t, err) + signature, err := fx.coordinatorKey.Sign(marshalled) + require.NoError(t, err) + fx.signedReceipt = &SpaceReceiptWithSignature{ + SpaceReceiptPayload: marshalled, + Signature: signature, + } +} + +func TestReceiptValid(t *testing.T) { + fx := newFixture(t) + fx.prepareReceipt(t, time.Second) + err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) + require.NoError(t, err) +} + +func TestReceiptIncorrectSpaceId(t *testing.T) { + fx := newFixture(t) + fx.prepareReceipt(t, time.Second) + err := CheckReceipt(fx.peerId, "otherId", fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) + require.Error(t, errReceiptSpaceIdIncorrect, err) +} + +func TestReceiptIncorrectPeerId(t *testing.T) { + fx := newFixture(t) + fx.prepareReceipt(t, time.Second) + err := CheckReceipt("otherId", fx.spaceId, fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) + require.Error(t, errReceiptPeerIdIncorrect, err) +} + +func TestReceiptIncorrectAccountIdentity(t *testing.T) { + fx := newFixture(t) + fx.prepareReceipt(t, time.Second) + err := CheckReceipt(fx.peerId, fx.spaceId, []byte("some identity"), []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) + require.Error(t, errReceiptAccountIncorrect, err) +} + +func TestReceiptIncorrectCoordinatorKey(t *testing.T) { + fx := newFixture(t) + fx.prepareReceipt(t, time.Second) + + t.Run("random key payload", func(t *testing.T) { + fx.updateReceipt(t, func(t *testing.T, receipt *SpaceReceipt) { + receipt.AccountIdentity = []byte("some random stuff") + }) + err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) + require.Error(t, err) + }) + t.Run("random incorrect key", func(t *testing.T) { + fx.updateReceipt(t, func(t *testing.T, receipt *SpaceReceipt) { + randomKey, _, err := crypto.GenerateEd25519Key(rand.Reader) + require.NoError(t, err) + keyBytes, err := randomKey.GetPublic().Marshall() + require.NoError(t, err) + receipt.AccountIdentity = keyBytes + }) + err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) + require.Error(t, errNoSuchCoordinatorNode, err) + }) +} + +func TestReceiptIncorrectSignature(t *testing.T) { + fx := newFixture(t) + fx.prepareReceipt(t, time.Second) + fx.signedReceipt.Signature = []byte("random sig") + err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) + require.Error(t, errReceiptSignatureIncorrect, err) +} + +func TestReceiptExpired(t *testing.T) { + fx := newFixture(t) + fx.prepareReceipt(t, time.Second) + fx.updateReceipt(t, func(t *testing.T, receipt *SpaceReceipt) { + receipt.ValidUntil = uint64(time.Now().Add(-time.Second).Unix()) + }) + err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) + require.Error(t, errReceiptExpired, err) +} From bf44f1b24f183ee126997cd59531284256294a8a Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 25 Apr 2023 10:04:42 +0200 Subject: [PATCH 04/10] Use same format for identity --- coordinator/coordinatorproto/receipt.go | 8 ++++++-- coordinator/coordinatorproto/receipt_test.go | 8 ++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/coordinator/coordinatorproto/receipt.go b/coordinator/coordinatorproto/receipt.go index 630eeffb..1c87bb12 100644 --- a/coordinator/coordinatorproto/receipt.go +++ b/coordinator/coordinatorproto/receipt.go @@ -60,11 +60,15 @@ func CheckReceipt(peerId, spaceId string, accountIdentity []byte, coordinators [ if payload.PeerId != peerId { return errReceiptPeerIdIncorrect } - protoIdentity, err := crypto.UnmarshalEd25519PublicKeyProto(payload.AccountIdentity) + protoRaw, err := crypto.UnmarshalEd25519PublicKeyProto(payload.AccountIdentity) if err != nil { return } - if !bytes.Equal(protoIdentity.Storage(), accountIdentity) { + accountRaw, err := crypto.UnmarshalEd25519PublicKeyProto(accountIdentity) + if err != nil { + return + } + if !bytes.Equal(protoRaw.Storage(), accountRaw.Storage()) { return errReceiptAccountIncorrect } err = checkCoordinator( diff --git a/coordinator/coordinatorproto/receipt_test.go b/coordinator/coordinatorproto/receipt_test.go index 38ca6d75..1a85a7d1 100644 --- a/coordinator/coordinatorproto/receipt_test.go +++ b/coordinator/coordinatorproto/receipt_test.go @@ -24,16 +24,16 @@ type fixture struct { func newFixture(t *testing.T) *fixture { coordinatorKey, _, err := crypto.GenerateEd25519Key(rand.Reader) require.NoError(t, err) - signKey, _, err := crypto.GenerateEd25519Key(rand.Reader) + accountKey, _, err := crypto.GenerateEd25519Key(rand.Reader) require.NoError(t, err) - signKeyRaw, err := signKey.GetPublic().Raw() + accountKeyProto, err := accountKey.GetPublic().Marshall() require.NoError(t, err) return &fixture{ spaceId: "spaceId", peerId: "peerId", - accountIdentity: signKeyRaw, + accountIdentity: accountKeyProto, coordinatorKey: coordinatorKey, - accountKey: signKey.GetPublic(), + accountKey: accountKey.GetPublic(), } } From 854913a22b54adc3532f4625464617ef167fe36a Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 25 Apr 2023 10:38:22 +0200 Subject: [PATCH 05/10] Remove commonspace checks --- commonspace/checks.go | 44 ------------------------------------------- 1 file changed, 44 deletions(-) delete mode 100644 commonspace/checks.go diff --git a/commonspace/checks.go b/commonspace/checks.go deleted file mode 100644 index 5469e2f2..00000000 --- a/commonspace/checks.go +++ /dev/null @@ -1,44 +0,0 @@ -package commonspace - -import ( - "context" - "github.com/anytypeio/any-sync/commonspace/spacesyncproto" - "github.com/anytypeio/any-sync/net/peer" - "github.com/anytypeio/any-sync/nodeconf" - "github.com/anytypeio/any-sync/util/crypto" - "golang.org/x/exp/slices" -) - -func CheckResponsible(ctx context.Context, confService nodeconf.Service, spaceId string) (err error) { - peerId, err := peer.CtxPeerId(ctx) - if err != nil { - return - } - if isClient(confService, peerId) && !confService.IsResponsible(spaceId) { - return spacesyncproto.ErrPeerIsNotResponsible - } - return -} - -func isClient(confService nodeconf.Service, peerId string) bool { - return len(confService.NodeTypes(peerId)) == 0 -} - -func checkCoordinator(confService nodeconf.Service, identity []byte, payload, signature []byte) (err error) { - controlKey, err := crypto.UnmarshalEd25519PublicKey(identity) - if err != nil { - return - } - nodeTypes := confService.NodeTypes(controlKey.PeerId()) - if len(nodeTypes) == 0 || !slices.Contains(nodeTypes, nodeconf.NodeTypeCoordinator) { - return errNoSuchCoordinatorNode - } - res, err := controlKey.Verify(payload, signature) - if err != nil { - return - } - if !res { - return errReceiptSignatureIncorrect - } - return -} From cadd63d45804e532aa5b4ab3662dd44219fff760 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 25 Apr 2023 14:00:38 +0200 Subject: [PATCH 06/10] Nodeconf error and periodicsync partial rename --- nodeconf/service.go | 2 +- util/periodicsync/periodicsync.go | 55 +++++++++++++------------- util/periodicsync/periodicsync_test.go | 4 +- 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/nodeconf/service.go b/nodeconf/service.go index ef2dd9ef..d19d0874 100644 --- a/nodeconf/service.go +++ b/nodeconf/service.go @@ -57,7 +57,7 @@ func (s *service) Init(a *app.App) (err error) { s.sync = periodicsync.NewPeriodicSync(updatePeriodSec, 0, func(ctx context.Context) (err error) { err = s.updateConfiguration(ctx) if err != nil { - if err == ErrConfigurationNotChanged { + if err == ErrConfigurationNotChanged || err == ErrConfigurationNotFound { err = nil } } diff --git a/util/periodicsync/periodicsync.go b/util/periodicsync/periodicsync.go index 3ce74cdd..abe998c0 100644 --- a/util/periodicsync/periodicsync.go +++ b/util/periodicsync/periodicsync.go @@ -15,64 +15,65 @@ type PeriodicSync interface { type SyncerFunc func(ctx context.Context) error -func NewPeriodicSync(periodSeconds int, timeout time.Duration, syncer SyncerFunc, l logger.CtxLogger) PeriodicSync { +func NewPeriodicSync(periodSeconds int, timeout time.Duration, caller SyncerFunc, l logger.CtxLogger) PeriodicSync { + // TODO: rename to PeriodicCall ctx, cancel := context.WithCancel(context.Background()) - ctx = logger.CtxWithFields(ctx, zap.String("rootOp", "periodicSync")) - return &periodicSync{ - syncer: syncer, + ctx = logger.CtxWithFields(ctx, zap.String("rootOp", "periodicCall")) + return &periodicCall{ + caller: caller, log: l, - syncCtx: ctx, - syncCancel: cancel, - syncLoopDone: make(chan struct{}), + loopCtx: ctx, + loopCancel: cancel, + loopDone: make(chan struct{}), periodSeconds: periodSeconds, timeout: timeout, } } -type periodicSync struct { +type periodicCall struct { log logger.CtxLogger - syncer SyncerFunc - syncCtx context.Context - syncCancel context.CancelFunc - syncLoopDone chan struct{} + caller SyncerFunc + loopCtx context.Context + loopCancel context.CancelFunc + loopDone chan struct{} periodSeconds int timeout time.Duration } -func (p *periodicSync) Run() { - go p.syncLoop(p.periodSeconds) +func (p *periodicCall) Run() { + go p.loop(p.periodSeconds) } -func (p *periodicSync) syncLoop(periodSeconds int) { +func (p *periodicCall) loop(periodSeconds int) { period := time.Duration(periodSeconds) * time.Second - defer close(p.syncLoopDone) - doSync := func() { - ctx := p.syncCtx + defer close(p.loopDone) + doCall := func() { + ctx := p.loopCtx if p.timeout != 0 { var cancel context.CancelFunc - ctx, cancel = context.WithTimeout(p.syncCtx, p.timeout) + ctx, cancel = context.WithTimeout(p.loopCtx, p.timeout) defer cancel() } - if err := p.syncer(ctx); err != nil { - p.log.Warn("periodic sync error", zap.Error(err)) + if err := p.caller(ctx); err != nil { + p.log.Warn("periodic call error", zap.Error(err)) } } - doSync() + doCall() if period > 0 { ticker := time.NewTicker(period) defer ticker.Stop() for { select { - case <-p.syncCtx.Done(): + case <-p.loopCtx.Done(): return case <-ticker.C: - doSync() + doCall() } } } } -func (p *periodicSync) Close() { - p.syncCancel() - <-p.syncLoopDone +func (p *periodicCall) Close() { + p.loopCancel() + <-p.loopDone } diff --git a/util/periodicsync/periodicsync_test.go b/util/periodicsync/periodicsync_test.go index 6ed933a4..fa1c091d 100644 --- a/util/periodicsync/periodicsync_test.go +++ b/util/periodicsync/periodicsync_test.go @@ -16,7 +16,7 @@ func TestPeriodicSync_Run(t *testing.T) { l := logger.NewNamed("sync") - t.Run("diff syncer 1 time", func(t *testing.T) { + t.Run("loop call 1 time", func(t *testing.T) { secs := 0 times := 0 diffSyncer := func(ctx context.Context) (err error) { @@ -30,7 +30,7 @@ func TestPeriodicSync_Run(t *testing.T) { require.Equal(t, 1, times) }) - t.Run("diff syncer 2 times", func(t *testing.T) { + t.Run("loop call 2 times", func(t *testing.T) { secs := 1 times := 0 From 6ec030942f9eaef5c125fff94d2cd86e544a66ed Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 25 Apr 2023 14:25:08 +0200 Subject: [PATCH 07/10] More info in receipt errors and change tests --- coordinator/coordinatorproto/receipt.go | 6 ++++-- coordinator/coordinatorproto/receipt_test.go | 7 ++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/coordinator/coordinatorproto/receipt.go b/coordinator/coordinatorproto/receipt.go index 1c87bb12..67287d9d 100644 --- a/coordinator/coordinatorproto/receipt.go +++ b/coordinator/coordinatorproto/receipt.go @@ -3,6 +3,7 @@ package coordinatorproto import ( "bytes" "errors" + "fmt" "github.com/anytypeio/any-sync/util/crypto" "github.com/gogo/protobuf/proto" "golang.org/x/exp/slices" @@ -11,7 +12,7 @@ import ( var ( errReceiptSignatureIncorrect = errors.New("receipt signature is incorrect") - errNoSuchCoordinatorNode = errors.New("no such control node") + errNoSuchCoordinatorNode = errors.New("no such coordinator node") errReceiptSpaceIdIncorrect = errors.New("receipt space id is incorrect") errReceiptPeerIdIncorrect = errors.New("receipt peer id is incorrect") errReceiptAccountIncorrect = errors.New("receipt account is incorrect") @@ -90,8 +91,9 @@ func checkCoordinator(coordinators []string, identity []byte, payload, signature if err != nil { return } + receiptCoordinator := coordinatorKey.PeerId() if !slices.Contains(coordinators, coordinatorKey.PeerId()) { - return errNoSuchCoordinatorNode + return fmt.Errorf("got coordinator %s: %w", receiptCoordinator, errNoSuchCoordinatorNode) } res, err := coordinatorKey.Verify(payload, signature) if err != nil { diff --git a/coordinator/coordinatorproto/receipt_test.go b/coordinator/coordinatorproto/receipt_test.go index 1a85a7d1..fc2bc200 100644 --- a/coordinator/coordinatorproto/receipt_test.go +++ b/coordinator/coordinatorproto/receipt_test.go @@ -3,6 +3,7 @@ package coordinatorproto import ( "context" "crypto/rand" + "errors" "github.com/anytypeio/any-sync/util/crypto" "github.com/gogo/protobuf/proto" "github.com/stretchr/testify/require" @@ -93,7 +94,7 @@ func TestReceiptIncorrectCoordinatorKey(t *testing.T) { t.Run("random key payload", func(t *testing.T) { fx.updateReceipt(t, func(t *testing.T, receipt *SpaceReceipt) { - receipt.AccountIdentity = []byte("some random stuff") + receipt.ControlNodeIdentity = []byte("some random stuff") }) err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) require.Error(t, err) @@ -104,10 +105,10 @@ func TestReceiptIncorrectCoordinatorKey(t *testing.T) { require.NoError(t, err) keyBytes, err := randomKey.GetPublic().Marshall() require.NoError(t, err) - receipt.AccountIdentity = keyBytes + receipt.ControlNodeIdentity = keyBytes }) err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) - require.Error(t, errNoSuchCoordinatorNode, err) + require.True(t, errors.Is(err, errNoSuchCoordinatorNode)) }) } From 1d29aba45ee1151b61da8fcbd2c9629c1110ab20 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 25 Apr 2023 20:49:31 +0200 Subject: [PATCH 08/10] Update space receipt to include network id --- .../coordinatorproto/coordinator.pb.go | 162 +++++++++--------- .../coordinatorproto/protos/coordinator.proto | 12 +- coordinator/coordinatorproto/receipt.go | 46 +++-- coordinator/coordinatorproto/receipt_test.go | 39 ++--- 4 files changed, 126 insertions(+), 133 deletions(-) diff --git a/coordinator/coordinatorproto/coordinator.pb.go b/coordinator/coordinatorproto/coordinator.pb.go index a08e0891..cef0151b 100644 --- a/coordinator/coordinatorproto/coordinator.pb.go +++ b/coordinator/coordinatorproto/coordinator.pb.go @@ -345,15 +345,15 @@ func (m *SpaceReceiptWithSignature) GetSignature() []byte { // SpaceReceipt contains permission to SpacePush operation type SpaceReceipt struct { - // spaceId + // SpaceId is the identifier of space SpaceId string `protobuf:"bytes,1,opt,name=spaceId,proto3" json:"spaceId,omitempty"` - // peerId of receipt requester + // PeerId of receipt requester PeerId string `protobuf:"bytes,2,opt,name=peerId,proto3" json:"peerId,omitempty"` - // identity of space owner + // AccountIdentity is an identity of a space owner AccountIdentity []byte `protobuf:"bytes,3,opt,name=accountIdentity,proto3" json:"accountIdentity,omitempty"` - // identity of control node - ControlNodeIdentity []byte `protobuf:"bytes,4,opt,name=controlNodeIdentity,proto3" json:"controlNodeIdentity,omitempty"` - // unix-timestamp with a deadline time of receipt validity + // NetworkId is the id of a network where the receipt is issued + NetworkId string `protobuf:"bytes,4,opt,name=networkId,proto3" json:"networkId,omitempty"` + // ValidUntil is a unix-timestamp with a deadline time of receipt validity ValidUntil uint64 `protobuf:"varint,5,opt,name=validUntil,proto3" json:"validUntil,omitempty"` } @@ -411,11 +411,11 @@ func (m *SpaceReceipt) GetAccountIdentity() []byte { return nil } -func (m *SpaceReceipt) GetControlNodeIdentity() []byte { +func (m *SpaceReceipt) GetNetworkId() string { if m != nil { - return m.ControlNodeIdentity + return m.NetworkId } - return nil + return "" } func (m *SpaceReceipt) GetValidUntil() uint64 { @@ -929,65 +929,65 @@ func init() { } var fileDescriptor_d94f6f99586adae2 = []byte{ - // 918 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xcd, 0x6e, 0x23, 0x45, - 0x10, 0xf6, 0xd8, 0x4e, 0x82, 0xcb, 0x91, 0x77, 0xd2, 0x24, 0x61, 0x30, 0x66, 0xb0, 0x06, 0x58, - 0x4c, 0x40, 0xd9, 0x95, 0x17, 0x10, 0x88, 0x0b, 0x60, 0x16, 0x29, 0x08, 0x85, 0x68, 0x12, 0x83, - 0x80, 0x03, 0x9a, 0x9d, 0xa9, 0x24, 0xad, 0x38, 0xdd, 0x43, 0x77, 0x9b, 0x4d, 0x0e, 0x48, 0x3c, - 0x02, 0x27, 0x0e, 0x3c, 0x03, 0x6f, 0x00, 0x0f, 0xc0, 0x31, 0x47, 0x8e, 0x28, 0x91, 0x78, 0x0e, - 0xd4, 0xf3, 0xe7, 0x1e, 0x7b, 0x9c, 0x20, 0xed, 0xc5, 0x76, 0x7f, 0xf5, 0xfb, 0x55, 0x55, 0x57, - 0x1b, 0xde, 0x0d, 0x39, 0x17, 0x11, 0x65, 0x81, 0xe2, 0xe2, 0x81, 0xf1, 0x3b, 0x16, 0x5c, 0xf1, - 0x07, 0xc9, 0xa7, 0x34, 0xf1, 0xdd, 0x04, 0x22, 0x6d, 0x03, 0xf2, 0x7e, 0xb3, 0xc0, 0x3e, 0x8c, - 0x83, 0x10, 0x0f, 0xe9, 0x09, 0xf3, 0xf1, 0x87, 0x29, 0x4a, 0x45, 0x1c, 0x58, 0x93, 0x1a, 0xdb, - 0x8b, 0x1c, 0xab, 0x6f, 0x0d, 0x5a, 0x7e, 0x7e, 0x24, 0xdb, 0xb0, 0x7a, 0x8a, 0x41, 0x84, 0xc2, - 0xa9, 0xf7, 0xad, 0xc1, 0xba, 0x9f, 0x9d, 0x48, 0x1f, 0xda, 0x7c, 0x12, 0xed, 0x45, 0xc8, 0x14, - 0x55, 0x97, 0x4e, 0x23, 0x11, 0x9a, 0x10, 0x19, 0xc2, 0x26, 0xc3, 0xa7, 0xf9, 0x51, 0x47, 0x0b, - 0xd4, 0x54, 0xa0, 0xd3, 0x4c, 0x54, 0x2b, 0x65, 0x9e, 0x02, 0x92, 0xe6, 0xa6, 0x02, 0x35, 0x95, - 0x07, 0xc1, 0xe5, 0x84, 0x07, 0x11, 0x79, 0x08, 0xab, 0x32, 0x01, 0x92, 0xe4, 0x3a, 0x43, 0x67, - 0xd7, 0xe4, 0x68, 0x18, 0xf8, 0x99, 0x1e, 0x79, 0x1b, 0x36, 0x22, 0x9c, 0xa0, 0xa2, 0x9c, 0x1d, - 0xd1, 0x73, 0x94, 0x2a, 0x38, 0x8f, 0x13, 0x02, 0x0d, 0x7f, 0x51, 0xe0, 0x8d, 0x61, 0xc3, 0xa8, - 0x88, 0x8c, 0x39, 0x93, 0x48, 0x3e, 0x82, 0x35, 0x81, 0x21, 0xd2, 0x58, 0x25, 0x51, 0xdb, 0xc3, - 0xfb, 0x8b, 0x51, 0xfd, 0x54, 0xe1, 0x6b, 0xaa, 0x4e, 0x0b, 0x0e, 0x7e, 0x6e, 0xe6, 0x9d, 0xc1, - 0x8b, 0x4b, 0xb5, 0xc8, 0x43, 0x78, 0x5e, 0x1a, 0xc2, 0x8c, 0x6a, 0x12, 0x6a, 0xdd, 0xaf, 0x12, - 0x91, 0x1e, 0xb4, 0x64, 0x51, 0xc4, 0xb4, 0x19, 0x33, 0xc0, 0xfb, 0xd3, 0x82, 0x75, 0x33, 0xda, - 0xed, 0x2d, 0x8d, 0x11, 0xc5, 0x5e, 0x94, 0x78, 0x69, 0xf9, 0xd9, 0x89, 0x0c, 0xe0, 0x5e, 0x10, - 0x86, 0x7c, 0xca, 0xd4, 0x5c, 0x5b, 0xe7, 0x61, 0x9d, 0x7c, 0xc8, 0x99, 0x12, 0x7c, 0xb2, 0xcf, - 0x23, 0x2c, 0xb4, 0xd3, 0xce, 0x56, 0x89, 0x88, 0x0b, 0xf0, 0x63, 0x30, 0xa1, 0xd1, 0x98, 0x29, - 0x3a, 0x71, 0x56, 0xfa, 0xd6, 0xa0, 0xe9, 0x1b, 0x88, 0xf7, 0x1d, 0x6c, 0x7d, 0x46, 0x27, 0xf8, - 0x05, 0x3d, 0xa7, 0x6a, 0x74, 0x8a, 0xe1, 0x59, 0x3e, 0x99, 0x15, 0x49, 0x59, 0xd5, 0x49, 0x19, - 0x84, 0xeb, 0x25, 0xc2, 0xde, 0x2e, 0x6c, 0xcf, 0x3b, 0xcf, 0x9a, 0xbc, 0x09, 0x2b, 0x13, 0x8d, - 0x26, 0x3e, 0x9b, 0x7e, 0x7a, 0xf0, 0x1e, 0xc1, 0x0b, 0xc6, 0x50, 0x95, 0xd2, 0x59, 0x5a, 0x55, - 0x6f, 0x0c, 0xce, 0xa2, 0x51, 0x16, 0xe6, 0x03, 0x58, 0x8b, 0x8d, 0x06, 0xb7, 0x87, 0xaf, 0x2c, - 0x9b, 0xe0, 0xac, 0xd9, 0x7e, 0xae, 0xef, 0xfd, 0x6a, 0xcd, 0xf9, 0x0d, 0xd8, 0x09, 0xde, 0x7d, - 0x6d, 0x77, 0xc0, 0xce, 0xe7, 0x3c, 0x35, 0x29, 0xaa, 0xb2, 0x80, 0x93, 0x77, 0x60, 0xab, 0x8c, - 0xe5, 0xc3, 0x98, 0x76, 0xbf, 0x5a, 0xe8, 0x7d, 0x95, 0x4d, 0x77, 0x39, 0xaf, 0x67, 0x27, 0xfc, - 0x21, 0xbc, 0xb4, 0x8f, 0xea, 0x29, 0x17, 0x67, 0x23, 0xce, 0x8e, 0xe9, 0xc9, 0x54, 0x04, 0x3a, - 0x78, 0x4e, 0xb9, 0x07, 0xad, 0x70, 0x2a, 0x04, 0xea, 0xc6, 0x67, 0xa4, 0x67, 0x80, 0xf7, 0x87, - 0x05, 0xbd, 0x6a, 0xeb, 0x2c, 0xb1, 0x01, 0xdc, 0x0b, 0x4d, 0x41, 0xe1, 0x64, 0x1e, 0xd6, 0x81, - 0x58, 0xea, 0xa9, 0x28, 0xdd, 0x0c, 0x20, 0x6f, 0xc0, 0x0a, 0xe3, 0x11, 0x4a, 0xa7, 0xd1, 0x6f, - 0x0c, 0xda, 0xc3, 0x8d, 0x12, 0x3d, 0x3d, 0xf9, 0x7e, 0x2a, 0xd7, 0x8d, 0x08, 0x05, 0x06, 0xf9, - 0xc2, 0x19, 0x33, 0x7a, 0x91, 0xdc, 0x93, 0xa6, 0xbf, 0x80, 0x7b, 0x14, 0x9a, 0xda, 0xd4, 0xb8, - 0xa0, 0x56, 0xe9, 0x82, 0xf6, 0xa0, 0x15, 0x44, 0x91, 0x40, 0x29, 0x51, 0x3a, 0xf5, 0x7e, 0x43, - 0xa7, 0x54, 0x00, 0xe4, 0x2d, 0x58, 0x51, 0x97, 0x71, 0x96, 0x52, 0x67, 0xb8, 0xb5, 0x90, 0xd2, - 0xd1, 0x65, 0x8c, 0x7e, 0xaa, 0xb3, 0xf3, 0xb3, 0x05, 0xf0, 0x58, 0x08, 0x2e, 0x46, 0x49, 0x96, - 0x1d, 0x80, 0x31, 0xc3, 0x8b, 0x18, 0x43, 0x85, 0x91, 0x5d, 0x23, 0x76, 0xb6, 0x4c, 0x3e, 0xd5, - 0xad, 0xc7, 0xc8, 0xb6, 0x88, 0x03, 0x9b, 0x33, 0x84, 0x72, 0x76, 0x80, 0x2c, 0xa2, 0xec, 0xc4, - 0xae, 0x17, 0xba, 0x23, 0x4d, 0x07, 0x23, 0xbb, 0x41, 0x08, 0x74, 0x12, 0x64, 0x9f, 0xab, 0xc7, - 0x17, 0x54, 0x2a, 0x69, 0x37, 0x89, 0x0d, 0xed, 0x24, 0xde, 0x97, 0xc7, 0xc7, 0x12, 0x95, 0xfd, - 0x7b, 0x7d, 0xe7, 0x27, 0x68, 0x1b, 0x73, 0x40, 0xb6, 0x4b, 0xab, 0x3f, 0x77, 0x56, 0x23, 0x2e, - 0x74, 0xcd, 0x71, 0x49, 0xc3, 0xe6, 0x59, 0xd8, 0xd6, 0x9c, 0x3c, 0x17, 0x1c, 0xaa, 0x40, 0x68, - 0xfb, 0xfa, 0x9c, 0xdf, 0x9c, 0x50, 0x63, 0xe7, 0x7d, 0x78, 0x2e, 0x2f, 0x0a, 0x69, 0xc3, 0xda, - 0x91, 0x40, 0xfc, 0xf8, 0x60, 0xcf, 0xae, 0xe9, 0x83, 0xde, 0x16, 0xfa, 0x60, 0x69, 0x2a, 0xa3, - 0x59, 0x19, 0x35, 0x56, 0x1f, 0xfe, 0xdb, 0x80, 0xb6, 0x01, 0x92, 0xcf, 0xa1, 0x55, 0x3c, 0x1f, - 0xe4, 0xe5, 0x8a, 0x41, 0x9f, 0x3d, 0xb4, 0x5d, 0x77, 0x99, 0x38, 0x9b, 0xcf, 0x6f, 0xa0, 0x53, - 0x5e, 0x55, 0xc4, 0x2b, 0x59, 0x54, 0x2e, 0xc9, 0xee, 0xab, 0xb7, 0xea, 0x64, 0xae, 0xbf, 0xcf, - 0xdf, 0xfd, 0xd9, 0x82, 0x22, 0xaf, 0x2d, 0xbb, 0x96, 0x25, 0xf7, 0xaf, 0xdf, 0xa1, 0x95, 0x05, - 0x78, 0x92, 0x3f, 0xa3, 0xc6, 0x46, 0x20, 0xb7, 0xd8, 0x1a, 0x9b, 0xac, 0x7b, 0xff, 0x2e, 0xb5, - 0x2c, 0xc6, 0x19, 0x6c, 0x56, 0xdd, 0x6f, 0x32, 0x28, 0x4f, 0xfb, 0xf2, 0x05, 0xd2, 0x7d, 0xf3, - 0x7f, 0x68, 0xa6, 0xc1, 0x3e, 0x79, 0xef, 0xaf, 0x6b, 0xd7, 0xba, 0xba, 0x76, 0xad, 0x7f, 0xae, - 0x5d, 0xeb, 0x97, 0x1b, 0xb7, 0x76, 0x75, 0xe3, 0xd6, 0xfe, 0xbe, 0x71, 0x6b, 0xdf, 0xf6, 0x6e, - 0xfb, 0x23, 0xf6, 0x64, 0x35, 0xf9, 0x7a, 0xf4, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x48, 0x5e, - 0x22, 0xba, 0xaf, 0x09, 0x00, 0x00, + // 914 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xcf, 0x6e, 0xeb, 0x44, + 0x17, 0x8f, 0x93, 0xb4, 0xfd, 0x72, 0x5c, 0xe5, 0xba, 0xf3, 0xb5, 0xc5, 0x84, 0x60, 0x22, 0x03, + 0x97, 0x50, 0x50, 0xef, 0x55, 0x2e, 0x20, 0x10, 0x1b, 0x20, 0x5c, 0xa4, 0x20, 0x54, 0x2a, 0xb7, + 0x01, 0x01, 0x0b, 0xe4, 0xeb, 0x39, 0x6d, 0x47, 0x4d, 0x6d, 0x33, 0x33, 0xe1, 0xb6, 0x0b, 0x24, + 0x1e, 0x81, 0x15, 0x0b, 0x9e, 0x80, 0x05, 0x6f, 0xc0, 0x0b, 0xb0, 0xbc, 0x4b, 0x96, 0xa8, 0x95, + 0x78, 0x0e, 0x34, 0x63, 0x3b, 0x19, 0x27, 0x4e, 0x8b, 0xc4, 0x26, 0xc9, 0xf9, 0x9d, 0xff, 0x73, + 0x7e, 0x73, 0x26, 0xf0, 0x76, 0x94, 0x24, 0x9c, 0xb2, 0x38, 0x94, 0x09, 0x7f, 0x60, 0xfc, 0x4e, + 0x79, 0x22, 0x93, 0x07, 0xfa, 0x53, 0x98, 0xf8, 0xbe, 0x86, 0x88, 0x6d, 0x40, 0xfe, 0x2f, 0x16, + 0x38, 0x47, 0x69, 0x18, 0xe1, 0x11, 0x3b, 0x8d, 0x03, 0xfc, 0x6e, 0x8a, 0x42, 0x12, 0x17, 0x36, + 0x84, 0xc2, 0x46, 0xd4, 0xb5, 0x7a, 0x56, 0xbf, 0x15, 0x14, 0x22, 0xd9, 0x85, 0xf5, 0x33, 0x0c, + 0x29, 0x72, 0xb7, 0xde, 0xb3, 0xfa, 0x9b, 0x41, 0x2e, 0x91, 0x1e, 0xd8, 0xc9, 0x84, 0x8e, 0x28, + 0xc6, 0x92, 0xc9, 0x2b, 0xb7, 0xa1, 0x95, 0x26, 0x44, 0x06, 0xb0, 0x1d, 0xe3, 0xd3, 0x42, 0x54, + 0xd9, 0x42, 0x39, 0xe5, 0xe8, 0x36, 0xb5, 0x69, 0xa5, 0xce, 0x97, 0x40, 0xb2, 0xda, 0x64, 0x28, + 0xa7, 0xe2, 0x30, 0xbc, 0x9a, 0x24, 0x21, 0x25, 0x0f, 0x61, 0x5d, 0x68, 0x40, 0x17, 0xd7, 0x1e, + 0xb8, 0xfb, 0x66, 0x8f, 0x86, 0x43, 0x90, 0xdb, 0x91, 0x37, 0x61, 0x8b, 0xe2, 0x04, 0x25, 0x4b, + 0xe2, 0x63, 0x76, 0x81, 0x42, 0x86, 0x17, 0xa9, 0x6e, 0xa0, 0x11, 0x2c, 0x2b, 0xfc, 0x31, 0x6c, + 0x19, 0x27, 0x22, 0xd2, 0x24, 0x16, 0x48, 0x3e, 0x80, 0x0d, 0x8e, 0x11, 0xb2, 0x54, 0xea, 0xac, + 0xf6, 0xe0, 0xfe, 0x72, 0xd6, 0x20, 0x33, 0xf8, 0x92, 0xc9, 0xb3, 0x59, 0x0f, 0x41, 0xe1, 0xe6, + 0x9f, 0xc3, 0xf3, 0x2b, 0xad, 0xc8, 0x43, 0xf8, 0xbf, 0x30, 0x94, 0x79, 0xab, 0x3a, 0xd5, 0x66, + 0x50, 0xa5, 0x22, 0x5d, 0x68, 0x89, 0xd9, 0x21, 0x66, 0xc3, 0x98, 0x03, 0xfe, 0xaf, 0x16, 0x6c, + 0x9a, 0xd9, 0x6e, 0x1f, 0x69, 0x8a, 0xc8, 0x47, 0x54, 0x47, 0x69, 0x05, 0xb9, 0x44, 0xfa, 0x70, + 0x2f, 0x8c, 0xa2, 0x64, 0x1a, 0xcb, 0x85, 0xb1, 0x2e, 0xc2, 0xaa, 0x94, 0x18, 0xe5, 0xd3, 0x84, + 0x9f, 0x8f, 0xa8, 0x9e, 0x67, 0x2b, 0x98, 0x03, 0xc4, 0x03, 0xf8, 0x3e, 0x9c, 0x30, 0x3a, 0x8e, + 0x25, 0x9b, 0xb8, 0x6b, 0x3d, 0xab, 0xdf, 0x0c, 0x0c, 0xc4, 0xff, 0x06, 0x76, 0x3e, 0x61, 0x13, + 0xfc, 0x8c, 0x5d, 0x30, 0x39, 0x3c, 0xc3, 0xe8, 0xbc, 0x60, 0x61, 0x45, 0x01, 0x56, 0x75, 0x01, + 0x46, 0x73, 0xf5, 0x52, 0x73, 0xfe, 0x3e, 0xec, 0x2e, 0x06, 0xcf, 0x07, 0xba, 0x0d, 0x6b, 0x13, + 0x85, 0xea, 0x98, 0xcd, 0x20, 0x13, 0xfc, 0x47, 0xf0, 0x9c, 0x41, 0xa0, 0x52, 0x39, 0x2b, 0x4f, + 0xd0, 0x1f, 0x83, 0xbb, 0xec, 0x94, 0xa7, 0x79, 0x0f, 0x36, 0x52, 0x63, 0x98, 0xf6, 0xe0, 0xa5, + 0x55, 0x6c, 0xcd, 0x07, 0x1b, 0x14, 0xf6, 0xfe, 0xcf, 0xd6, 0x42, 0xdc, 0x30, 0x3e, 0xc5, 0xbb, + 0xaf, 0xe8, 0x1e, 0x38, 0x05, 0xa7, 0x33, 0x97, 0xd9, 0xa9, 0x2c, 0xe1, 0xe4, 0x2d, 0xd8, 0x29, + 0x63, 0x05, 0xf1, 0xb2, 0x49, 0x57, 0x2b, 0xfd, 0x2f, 0x72, 0x26, 0x97, 0xeb, 0xfa, 0xef, 0x0d, + 0xbf, 0x0f, 0x2f, 0x1c, 0x64, 0xb4, 0x19, 0x26, 0xf1, 0x09, 0x3b, 0x9d, 0xf2, 0x50, 0x25, 0x2f, + 0x5a, 0xee, 0x42, 0x2b, 0x9a, 0x72, 0x8e, 0x6a, 0xf0, 0x79, 0xd3, 0x73, 0xc0, 0xff, 0xdd, 0x82, + 0x6e, 0xb5, 0x77, 0x5e, 0x58, 0x1f, 0xee, 0x45, 0xa6, 0x62, 0x16, 0x64, 0x11, 0x2e, 0xf3, 0xb9, + 0xbe, 0xc8, 0xe7, 0xd7, 0x60, 0x2d, 0x4e, 0x28, 0x0a, 0xb7, 0xd1, 0x6b, 0xf4, 0xed, 0xc1, 0x56, + 0xa9, 0xbd, 0x83, 0x84, 0x62, 0x90, 0xe9, 0xd5, 0x20, 0x22, 0x8e, 0x61, 0xb1, 0x5c, 0xc6, 0x31, + 0xbb, 0xd4, 0xb7, 0xa3, 0x19, 0x2c, 0xe1, 0x3e, 0x83, 0xa6, 0x72, 0x35, 0x2e, 0xa3, 0x55, 0xba, + 0x8c, 0x5d, 0x68, 0x85, 0x94, 0x72, 0x14, 0x02, 0x85, 0x5b, 0xef, 0x35, 0x54, 0x49, 0x33, 0x80, + 0xbc, 0x01, 0x6b, 0xf2, 0x2a, 0xcd, 0x4b, 0x6a, 0x0f, 0x76, 0x96, 0x4a, 0x3a, 0xbe, 0x4a, 0x31, + 0xc8, 0x6c, 0xf6, 0x7e, 0xb4, 0x00, 0x1e, 0x73, 0x9e, 0xf0, 0xa1, 0xae, 0xb2, 0x0d, 0x30, 0x8e, + 0xf1, 0x32, 0xc5, 0x48, 0x22, 0x75, 0x6a, 0xc4, 0xc9, 0x17, 0xc7, 0xc7, 0x6a, 0xf4, 0x48, 0x1d, + 0x8b, 0xb8, 0xb0, 0x3d, 0x47, 0x58, 0x12, 0x1f, 0x62, 0x4c, 0x59, 0x7c, 0xea, 0xd4, 0x67, 0xb6, + 0x43, 0xd5, 0x0e, 0x52, 0xa7, 0x41, 0x08, 0xb4, 0x35, 0x72, 0x90, 0xc8, 0xc7, 0x97, 0x4c, 0x48, + 0xe1, 0x34, 0x89, 0x03, 0xb6, 0xce, 0xf7, 0xf9, 0xc9, 0x89, 0x40, 0xe9, 0xfc, 0x56, 0xdf, 0xfb, + 0x01, 0x6c, 0x83, 0x07, 0x64, 0xb7, 0xb4, 0xe6, 0x8b, 0x60, 0x35, 0xe2, 0x41, 0xc7, 0xa4, 0x4b, + 0x96, 0xb6, 0xa8, 0xc2, 0xb1, 0x16, 0xf4, 0x85, 0xe2, 0x48, 0x86, 0x5c, 0xf9, 0xd7, 0x17, 0xe2, + 0x16, 0x0d, 0x35, 0xf6, 0xde, 0x85, 0xff, 0x15, 0x87, 0x42, 0x6c, 0xd8, 0x38, 0xe6, 0x88, 0x1f, + 0x1e, 0x8e, 0x9c, 0x9a, 0x12, 0xd4, 0xb6, 0x50, 0x82, 0xa5, 0x5a, 0x19, 0xce, 0x8f, 0x51, 0x61, + 0xf5, 0xc1, 0xdf, 0x0d, 0xb0, 0x0d, 0x90, 0x7c, 0x0a, 0xad, 0xd9, 0x53, 0x41, 0x5e, 0xac, 0x20, + 0xfa, 0xfc, 0x51, 0xed, 0x78, 0xab, 0xd4, 0x39, 0x3f, 0xbf, 0x82, 0x76, 0x79, 0x55, 0x11, 0xbf, + 0xe4, 0x51, 0xb9, 0x24, 0x3b, 0x2f, 0xdf, 0x6a, 0x93, 0x87, 0xfe, 0xb6, 0x78, 0xe3, 0xe7, 0x0b, + 0x8a, 0xbc, 0xb2, 0xea, 0x5a, 0x96, 0xc2, 0xbf, 0x7a, 0x87, 0x55, 0x9e, 0xe0, 0x49, 0xf1, 0x64, + 0x1a, 0x1b, 0x81, 0xdc, 0xe2, 0x6b, 0x6c, 0xb2, 0xce, 0xfd, 0xbb, 0xcc, 0xf2, 0x1c, 0xe7, 0xb0, + 0x5d, 0x75, 0xbf, 0x49, 0xbf, 0xcc, 0xf6, 0xd5, 0x0b, 0xa4, 0xf3, 0xfa, 0xbf, 0xb0, 0xcc, 0x92, + 0x7d, 0xf4, 0xce, 0x1f, 0xd7, 0x9e, 0xf5, 0xec, 0xda, 0xb3, 0xfe, 0xba, 0xf6, 0xac, 0x9f, 0x6e, + 0xbc, 0xda, 0xb3, 0x1b, 0xaf, 0xf6, 0xe7, 0x8d, 0x57, 0xfb, 0xba, 0x7b, 0xdb, 0x9f, 0xae, 0x27, + 0xeb, 0xfa, 0xeb, 0xd1, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x0f, 0xcc, 0xe8, 0x2d, 0x9b, 0x09, + 0x00, 0x00, } func (m *SpaceSignRequest) Marshal() (dAtA []byte, err error) { @@ -1171,10 +1171,10 @@ func (m *SpaceReceipt) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x28 } - if len(m.ControlNodeIdentity) > 0 { - i -= len(m.ControlNodeIdentity) - copy(dAtA[i:], m.ControlNodeIdentity) - i = encodeVarintCoordinator(dAtA, i, uint64(len(m.ControlNodeIdentity))) + if len(m.NetworkId) > 0 { + i -= len(m.NetworkId) + copy(dAtA[i:], m.NetworkId) + i = encodeVarintCoordinator(dAtA, i, uint64(len(m.NetworkId))) i-- dAtA[i] = 0x22 } @@ -1653,7 +1653,7 @@ func (m *SpaceReceipt) Size() (n int) { if l > 0 { n += 1 + l + sovCoordinator(uint64(l)) } - l = len(m.ControlNodeIdentity) + l = len(m.NetworkId) if l > 0 { n += 1 + l + sovCoordinator(uint64(l)) } @@ -2428,9 +2428,9 @@ func (m *SpaceReceipt) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ControlNodeIdentity", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NetworkId", wireType) } - var byteLen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowCoordinator @@ -2440,25 +2440,23 @@ func (m *SpaceReceipt) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthCoordinator } - postIndex := iNdEx + byteLen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthCoordinator } if postIndex > l { return io.ErrUnexpectedEOF } - m.ControlNodeIdentity = append(m.ControlNodeIdentity[:0], dAtA[iNdEx:postIndex]...) - if m.ControlNodeIdentity == nil { - m.ControlNodeIdentity = []byte{} - } + m.NetworkId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 5: if wireType != 0 { diff --git a/coordinator/coordinatorproto/protos/coordinator.proto b/coordinator/coordinatorproto/protos/coordinator.proto index 804957a1..c6767eab 100644 --- a/coordinator/coordinatorproto/protos/coordinator.proto +++ b/coordinator/coordinatorproto/protos/coordinator.proto @@ -67,15 +67,15 @@ message SpaceReceiptWithSignature { // SpaceReceipt contains permission to SpacePush operation message SpaceReceipt { - // spaceId + // SpaceId is the identifier of space string spaceId = 1; - // peerId of receipt requester + // PeerId of receipt requester string peerId = 2; - // identity of space owner + // AccountIdentity is an identity of a space owner bytes accountIdentity = 3; - // identity of control node - bytes controlNodeIdentity = 4; - // unix-timestamp with a deadline time of receipt validity + // NetworkId is the id of a network where the receipt is issued + string networkId = 4; + // ValidUntil is a unix-timestamp with a deadline time of receipt validity uint64 validUntil = 5; } diff --git a/coordinator/coordinatorproto/receipt.go b/coordinator/coordinatorproto/receipt.go index 67287d9d..d011038f 100644 --- a/coordinator/coordinatorproto/receipt.go +++ b/coordinator/coordinatorproto/receipt.go @@ -3,43 +3,38 @@ package coordinatorproto import ( "bytes" "errors" - "fmt" "github.com/anytypeio/any-sync/util/crypto" + "github.com/anytypeio/any-sync/util/strkey" "github.com/gogo/protobuf/proto" - "golang.org/x/exp/slices" "time" ) var ( errReceiptSignatureIncorrect = errors.New("receipt signature is incorrect") - errNoSuchCoordinatorNode = errors.New("no such coordinator node") + errNetworkIsIncorrect = errors.New("network is incorrect") errReceiptSpaceIdIncorrect = errors.New("receipt space id is incorrect") errReceiptPeerIdIncorrect = errors.New("receipt peer id is incorrect") errReceiptAccountIncorrect = errors.New("receipt account is incorrect") errReceiptExpired = errors.New("receipt is expired") ) -func PrepareSpaceReceipt(spaceId, peerId string, validPeriod time.Duration, accountPubKey crypto.PubKey, nodeKey crypto.PrivKey) (signedReceipt *SpaceReceiptWithSignature, err error) { +func PrepareSpaceReceipt(spaceId, peerId string, validPeriod time.Duration, accountPubKey crypto.PubKey, networkKey crypto.PrivKey) (signedReceipt *SpaceReceiptWithSignature, err error) { marshalledAccount, err := accountPubKey.Marshall() if err != nil { return } - marshalledNode, err := nodeKey.GetPublic().Marshall() - if err != nil { - return - } receipt := &SpaceReceipt{ - SpaceId: spaceId, - PeerId: peerId, - AccountIdentity: marshalledAccount, - ControlNodeIdentity: marshalledNode, - ValidUntil: uint64(time.Now().Add(validPeriod).Unix()), + SpaceId: spaceId, + PeerId: peerId, + AccountIdentity: marshalledAccount, + NetworkId: networkKey.GetPublic().Network(), + ValidUntil: uint64(time.Now().Add(validPeriod).Unix()), } receiptData, err := receipt.Marshal() if err != nil { return } - sign, err := nodeKey.Sign(receiptData) + sign, err := networkKey.Sign(receiptData) if err != nil { return } @@ -49,7 +44,7 @@ func PrepareSpaceReceipt(spaceId, peerId string, validPeriod time.Duration, acco }, nil } -func CheckReceipt(peerId, spaceId string, accountIdentity []byte, coordinators []string, receipt *SpaceReceiptWithSignature) (err error) { +func CheckReceipt(peerId, spaceId string, accountIdentity []byte, networkId string, receipt *SpaceReceiptWithSignature) (err error) { payload := &SpaceReceipt{} err = proto.Unmarshal(receipt.GetSpaceReceiptPayload(), payload) if err != nil { @@ -72,9 +67,9 @@ func CheckReceipt(peerId, spaceId string, accountIdentity []byte, coordinators [ if !bytes.Equal(protoRaw.Storage(), accountRaw.Storage()) { return errReceiptAccountIncorrect } - err = checkCoordinator( - coordinators, - payload.ControlNodeIdentity, + err = checkNetwork( + networkId, + payload.NetworkId, receipt.GetSpaceReceiptPayload(), receipt.GetSignature()) if err != nil { @@ -86,16 +81,19 @@ func CheckReceipt(peerId, spaceId string, accountIdentity []byte, coordinators [ return } -func checkCoordinator(coordinators []string, identity []byte, payload, signature []byte) (err error) { - coordinatorKey, err := crypto.UnmarshalEd25519PublicKeyProto(identity) +func checkNetwork(networkId, payloadNetworkId string, payload, signature []byte) (err error) { + if networkId != payloadNetworkId { + return errNetworkIsIncorrect + } + networkIdentity, err := strkey.Decode(strkey.NetworkAddressVersionByte, networkId) if err != nil { return } - receiptCoordinator := coordinatorKey.PeerId() - if !slices.Contains(coordinators, coordinatorKey.PeerId()) { - return fmt.Errorf("got coordinator %s: %w", receiptCoordinator, errNoSuchCoordinatorNode) + networkKey, err := crypto.UnmarshalEd25519PublicKey(networkIdentity) + if err != nil { + return } - res, err := coordinatorKey.Verify(payload, signature) + res, err := networkKey.Verify(payload, signature) if err != nil { return } diff --git a/coordinator/coordinatorproto/receipt_test.go b/coordinator/coordinatorproto/receipt_test.go index fc2bc200..28bd9dc3 100644 --- a/coordinator/coordinatorproto/receipt_test.go +++ b/coordinator/coordinatorproto/receipt_test.go @@ -3,7 +3,6 @@ package coordinatorproto import ( "context" "crypto/rand" - "errors" "github.com/anytypeio/any-sync/util/crypto" "github.com/gogo/protobuf/proto" "github.com/stretchr/testify/require" @@ -12,7 +11,7 @@ import ( ) type fixture struct { - coordinatorKey crypto.PrivKey + networkKey crypto.PrivKey accountKey crypto.PubKey accountIdentity []byte ctx context.Context @@ -23,7 +22,7 @@ type fixture struct { } func newFixture(t *testing.T) *fixture { - coordinatorKey, _, err := crypto.GenerateEd25519Key(rand.Reader) + networkKey, _, err := crypto.GenerateEd25519Key(rand.Reader) require.NoError(t, err) accountKey, _, err := crypto.GenerateEd25519Key(rand.Reader) require.NoError(t, err) @@ -33,14 +32,14 @@ func newFixture(t *testing.T) *fixture { spaceId: "spaceId", peerId: "peerId", accountIdentity: accountKeyProto, - coordinatorKey: coordinatorKey, + networkKey: networkKey, accountKey: accountKey.GetPublic(), } } func (fx *fixture) prepareReceipt(t *testing.T, validPeriod time.Duration) { var err error - fx.signedReceipt, err = PrepareSpaceReceipt(fx.spaceId, fx.peerId, validPeriod, fx.accountKey, fx.coordinatorKey) + fx.signedReceipt, err = PrepareSpaceReceipt(fx.spaceId, fx.peerId, validPeriod, fx.accountKey, fx.networkKey) require.NoError(t, err) fx.originalReceipt = &SpaceReceipt{} err = proto.Unmarshal(fx.signedReceipt.SpaceReceiptPayload, fx.originalReceipt) @@ -52,7 +51,7 @@ func (fx *fixture) updateReceipt(t *testing.T, update func(t *testing.T, receipt update(t, fx.originalReceipt) marshalled, err := proto.Marshal(fx.originalReceipt) require.NoError(t, err) - signature, err := fx.coordinatorKey.Sign(marshalled) + signature, err := fx.networkKey.Sign(marshalled) require.NoError(t, err) fx.signedReceipt = &SpaceReceiptWithSignature{ SpaceReceiptPayload: marshalled, @@ -63,52 +62,50 @@ func (fx *fixture) updateReceipt(t *testing.T, update func(t *testing.T, receipt func TestReceiptValid(t *testing.T) { fx := newFixture(t) fx.prepareReceipt(t, time.Second) - err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) + err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, fx.networkKey.GetPublic().Network(), fx.signedReceipt) require.NoError(t, err) } func TestReceiptIncorrectSpaceId(t *testing.T) { fx := newFixture(t) fx.prepareReceipt(t, time.Second) - err := CheckReceipt(fx.peerId, "otherId", fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) + err := CheckReceipt(fx.peerId, "otherId", fx.accountIdentity, fx.networkKey.GetPublic().Network(), fx.signedReceipt) require.Error(t, errReceiptSpaceIdIncorrect, err) } func TestReceiptIncorrectPeerId(t *testing.T) { fx := newFixture(t) fx.prepareReceipt(t, time.Second) - err := CheckReceipt("otherId", fx.spaceId, fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) + err := CheckReceipt("otherId", fx.spaceId, fx.accountIdentity, fx.networkKey.GetPublic().Network(), fx.signedReceipt) require.Error(t, errReceiptPeerIdIncorrect, err) } func TestReceiptIncorrectAccountIdentity(t *testing.T) { fx := newFixture(t) fx.prepareReceipt(t, time.Second) - err := CheckReceipt(fx.peerId, fx.spaceId, []byte("some identity"), []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) + err := CheckReceipt(fx.peerId, fx.spaceId, []byte("some identity"), fx.networkKey.GetPublic().Network(), fx.signedReceipt) require.Error(t, errReceiptAccountIncorrect, err) } -func TestReceiptIncorrectCoordinatorKey(t *testing.T) { +func TestReceiptIncorrectNetworkId(t *testing.T) { fx := newFixture(t) fx.prepareReceipt(t, time.Second) - t.Run("random key payload", func(t *testing.T) { + t.Run("random network id", func(t *testing.T) { fx.updateReceipt(t, func(t *testing.T, receipt *SpaceReceipt) { - receipt.ControlNodeIdentity = []byte("some random stuff") + receipt.NetworkId = "some random network id" }) - err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) + err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, fx.networkKey.GetPublic().Network(), fx.signedReceipt) require.Error(t, err) }) t.Run("random incorrect key", func(t *testing.T) { fx.updateReceipt(t, func(t *testing.T, receipt *SpaceReceipt) { randomKey, _, err := crypto.GenerateEd25519Key(rand.Reader) require.NoError(t, err) - keyBytes, err := randomKey.GetPublic().Marshall() - require.NoError(t, err) - receipt.ControlNodeIdentity = keyBytes + receipt.NetworkId = randomKey.GetPublic().Network() }) - err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) - require.True(t, errors.Is(err, errNoSuchCoordinatorNode)) + err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, fx.networkKey.GetPublic().Network(), fx.signedReceipt) + require.Error(t, errNetworkIsIncorrect, err) }) } @@ -116,7 +113,7 @@ func TestReceiptIncorrectSignature(t *testing.T) { fx := newFixture(t) fx.prepareReceipt(t, time.Second) fx.signedReceipt.Signature = []byte("random sig") - err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) + err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, fx.networkKey.GetPublic().Network(), fx.signedReceipt) require.Error(t, errReceiptSignatureIncorrect, err) } @@ -126,6 +123,6 @@ func TestReceiptExpired(t *testing.T) { fx.updateReceipt(t, func(t *testing.T, receipt *SpaceReceipt) { receipt.ValidUntil = uint64(time.Now().Add(-time.Second).Unix()) }) - err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, []string{fx.coordinatorKey.GetPublic().PeerId()}, fx.signedReceipt) + err := CheckReceipt(fx.peerId, fx.spaceId, fx.accountIdentity, fx.networkKey.GetPublic().Network(), fx.signedReceipt) require.Error(t, errReceiptExpired, err) } From 46de85a7f824379972c01f87c443784c154bedfc Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 25 Apr 2023 20:55:00 +0200 Subject: [PATCH 09/10] Check peerId when dialling --- net/dialer/dialer.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/net/dialer/dialer.go b/net/dialer/dialer.go index 00cdb996..4d85005b 100644 --- a/net/dialer/dialer.go +++ b/net/dialer/dialer.go @@ -24,7 +24,10 @@ import ( const CName = "common.net.dialer" -var ErrArrdsNotFound = errors.New("addrs for peer not found") +var ( + ErrAddrsNotFound = errors.New("addrs for peer not found") + ErrPeerIdIsUnexpected = errors.New("expected to connect with other peer id") +) var log = logger.NewNamed(CName) @@ -80,7 +83,7 @@ func (d *dialer) getPeerAddrs(peerId string) ([]string, error) { } addrs, ok := d.peerAddrs[peerId] if !ok || len(addrs) == 0 { - return nil, ErrArrdsNotFound + return nil, ErrAddrsNotFound } return addrs, nil } @@ -103,7 +106,7 @@ func (d *dialer) Dial(ctx context.Context, peerId string) (p peer.Peer, err erro ) log.InfoCtx(ctx, "dial", zap.String("peerId", peerId), zap.Strings("addrs", addrs)) for _, addr := range addrs { - conn, sc, err = d.handshake(ctx, addr) + conn, sc, err = d.handshake(ctx, addr, peerId) if err != nil { log.InfoCtx(ctx, "can't connect to host", zap.String("addr", addr), zap.Error(err)) } else { @@ -116,7 +119,7 @@ func (d *dialer) Dial(ctx context.Context, peerId string) (p peer.Peer, err erro return peer.NewPeer(sc, conn), nil } -func (d *dialer) handshake(ctx context.Context, addr string) (conn drpc.Conn, sc sec.SecureConn, err error) { +func (d *dialer) handshake(ctx context.Context, addr, peerId string) (conn drpc.Conn, sc sec.SecureConn, err error) { st := time.Now() // TODO: move dial timeout to config tcpConn, err := net.DialTimeout("tcp", addr, time.Second*3) @@ -129,6 +132,9 @@ func (d *dialer) handshake(ctx context.Context, addr string) (conn drpc.Conn, sc if err != nil { return nil, nil, fmt.Errorf("tls handshaeke error: %v; since start: %v", err, time.Since(st)) } + if peerId != sc.RemotePeer().String() { + return nil, nil, ErrPeerIdIsUnexpected + } log.Info("connected with remote host", zap.String("serverPeer", sc.RemotePeer().String()), zap.String("addr", addr)) conn = drpcconn.NewWithOptions(sc, drpcconn.Options{Manager: drpcmanager.Options{ Reader: drpcwire.ReaderOptions{MaximumBufferSize: d.config.Stream.MaxMsgSizeMb * (1 << 20)}, From e9c6f9599103e39bd1d9449194e1541c44a7b4d5 Mon Sep 17 00:00:00 2001 From: mcrakhman Date: Tue, 25 Apr 2023 21:41:18 +0200 Subject: [PATCH 10/10] Add reference to linear task in periodicsync todo --- util/periodicsync/periodicsync.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/util/periodicsync/periodicsync.go b/util/periodicsync/periodicsync.go index abe998c0..8838faad 100644 --- a/util/periodicsync/periodicsync.go +++ b/util/periodicsync/periodicsync.go @@ -16,7 +16,8 @@ type PeriodicSync interface { type SyncerFunc func(ctx context.Context) error func NewPeriodicSync(periodSeconds int, timeout time.Duration, caller SyncerFunc, l logger.CtxLogger) PeriodicSync { - // TODO: rename to PeriodicCall + // TODO: rename to PeriodicCall (including folders) and do PRs in all repos where we are using this + // https://linear.app/anytype/issue/GO-1241/change-periodicsync-component-to-periodiccall ctx, cancel := context.WithCancel(context.Background()) ctx = logger.CtxWithFields(ctx, zap.String("rootOp", "periodicCall")) return &periodicCall{