diff --git a/go.mod b/go.mod index 4cc442b1ecc91476ab7953d52b9a3756f4b0a81e..1c2b50a3f5c0153e8dd458df02fd330726dc9c0a 100644 --- a/go.mod +++ b/go.mod @@ -19,14 +19,14 @@ require ( github.com/spf13/viper v1.7.1 github.com/ugorji/go v1.1.4 // indirect github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 // indirect - gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228 - gitlab.com/elixxir/comms v0.0.4-0.20210114174157-1306832d440b - gitlab.com/elixxir/crypto v0.0.7-0.20210114172156-b576829ba7d8 + gitlab.com/elixxir/bloomfilter v0.0.0-20210120224144-ac046983a17a + gitlab.com/elixxir/comms v0.0.4-0.20210208181740-1ad1139f7170 + gitlab.com/elixxir/crypto v0.0.7-0.20210205171416-0a952e4e10de gitlab.com/elixxir/ekv v0.1.4 gitlab.com/elixxir/primitives v0.0.3-0.20210127201240-6a42ad925e8a - gitlab.com/xx_network/comms v0.0.4-0.20210112233928-eac8db03c397 - gitlab.com/xx_network/crypto v0.0.5-0.20210107183440-804e0f8b7d22 - gitlab.com/xx_network/primitives v0.0.4-0.20210129204839-cc84bb5a253b + gitlab.com/xx_network/comms v0.0.4-0.20210121204701-7a1eb0542424 + gitlab.com/xx_network/crypto v0.0.5-0.20210121204626-b251b926e4f7 + gitlab.com/xx_network/primitives v0.0.4-0.20210208175706-a47ce8d49d4b golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad golang.org/x/net v0.0.0-20201224014010-6772e930b67b // indirect golang.org/x/sys v0.0.0-20210105210732-16f7687f5001 // indirect diff --git a/go.sum b/go.sum index 4f42c98a8b405cf42dd41313f56206f2d3f7da5d..5366c9636bf358b0e375d9969cdefde98fcfcf58 100644 --- a/go.sum +++ b/go.sum @@ -265,6 +265,9 @@ github.com/zeebo/pcg v1.0.0 h1:dt+dx+HvX8g7Un32rY9XWoYnd0NmKmrIzpHF7qiTDj0= github.com/zeebo/pcg v1.0.0/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228 h1:Gi6rj4mAlK0BJIk1HIzBVMjWNjIUfstrsXC2VqLYPcA= gitlab.com/elixxir/bloomfilter v0.0.0-20200930191214-10e9ac31b228/go.mod h1:H6jztdm0k+wEV2QGK/KYA+MY9nj9Zzatux/qIvDDv3k= +gitlab.com/elixxir/bloomfilter v0.0.0-20210120224144-ac046983a17a h1:0vLmGrqRDlaru89aKQPk3MyRPUInFujpqnVspBA6QTQ= +gitlab.com/elixxir/bloomfilter v0.0.0-20210120224144-ac046983a17a/go.mod h1:H6jztdm0k+wEV2QGK/KYA+MY9nj9Zzatux/qIvDDv3k= +gitlab.com/elixxir/comms v0.0.3/go.mod h1:5p7oz4yFrK037rPap6ooaWrloJrzuVZ4jnzOdvgyqnU= gitlab.com/elixxir/comms v0.0.4-0.20201217200754-6259dc49e6f1 h1:4iuAA/I8/aQ1Jn3gBguuR1u+LVy3YyShxpoNcqApaVg= gitlab.com/elixxir/comms v0.0.4-0.20201217200754-6259dc49e6f1/go.mod h1:2sNUHm725vQG4pG1RtvMd7kJ5CNqFb7Rl9cenuQCa2c= gitlab.com/elixxir/comms v0.0.4-0.20201229200853-c403d72e877c h1:YjTlUbZiNiJdL7Fy4TIUoWlHNK4dFOtuJ40YgsG7fac= @@ -279,10 +282,19 @@ gitlab.com/elixxir/comms v0.0.4-0.20210112234945-18c36b2d908f h1:EsCG5+sB1ZapIBY gitlab.com/elixxir/comms v0.0.4-0.20210112234945-18c36b2d908f/go.mod h1:R2Ank04m99uGRhKOssWzITqN47AT+EOyG2OiCHLGroE= gitlab.com/elixxir/comms v0.0.4-0.20210114174157-1306832d440b h1:LdlL28odDDoQbhpgF7jUR3x2TXG1P4TzGfVBg2Md6Ek= gitlab.com/elixxir/comms v0.0.4-0.20210114174157-1306832d440b/go.mod h1:R2Ank04m99uGRhKOssWzITqN47AT+EOyG2OiCHLGroE= +gitlab.com/elixxir/comms v0.0.4-0.20210126185553-8ccfd64bf81b h1:ENB2YHpF72bbVHA6GG8BrMXEb+si9JHhO39vx7vk7hA= +gitlab.com/elixxir/comms v0.0.4-0.20210126185553-8ccfd64bf81b/go.mod h1:5hxGwa/8BEpo4cZrbxhxyXPpXmwzMPunKE/H141+rPU= +gitlab.com/elixxir/comms v0.0.4-0.20210204222703-dfa824c42c56 h1:WroFBwpYtomIhzjpDto7tr1uW9+Ihk64S7mcIaOy1/M= +gitlab.com/elixxir/comms v0.0.4-0.20210204222703-dfa824c42c56/go.mod h1:fWuPOszadMhHLOywy2+mMSMH00k9sh/zw/povSWurn4= +gitlab.com/elixxir/comms v0.0.4-0.20210208175734-0f8b551dab3c h1:YJR7jPnxyBmUVf7FB2Vq8d5J8gs3M5B7bVHyFQBrGHI= +gitlab.com/elixxir/comms v0.0.4-0.20210208175734-0f8b551dab3c/go.mod h1:fWuPOszadMhHLOywy2+mMSMH00k9sh/zw/povSWurn4= +gitlab.com/elixxir/comms v0.0.4-0.20210208181740-1ad1139f7170 h1:YD0QgSP5puQXn3bMOJuA7sT7DXLCVgHBW//PSESU45o= +gitlab.com/elixxir/comms v0.0.4-0.20210208181740-1ad1139f7170/go.mod h1:fWuPOszadMhHLOywy2+mMSMH00k9sh/zw/povSWurn4= gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4 h1:28ftZDeYEko7xptCZzeFWS1Iam95dj46TWFVVlKmw6A= gitlab.com/elixxir/crypto v0.0.0-20200804182833-984246dea2c4/go.mod h1:ucm9SFKJo+K0N2GwRRpaNr+tKXMIOVWzmyUD0SbOu2c= gitlab.com/elixxir/crypto v0.0.3 h1:znCt/x2bL4y8czTPaaFkwzdgSgW3BJc/1+dxyf1jqVw= gitlab.com/elixxir/crypto v0.0.3/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA= +gitlab.com/elixxir/crypto v0.0.4/go.mod h1:ZNgBOblhYToR4m8tj4cMvJ9UsJAUKq+p0gCp07WQmhA= gitlab.com/elixxir/crypto v0.0.6 h1:c94CGzBTV7LgInGHfmeJHrqq9nIc/WEOLUd9OeQBN74= gitlab.com/elixxir/crypto v0.0.7-0.20201217200352-0ba771a66932/go.mod h1:nqSNe486j6ua96nv1et6x2ESl/qXevkx7f31GowMRh4= gitlab.com/elixxir/crypto v0.0.7-0.20201222203132-9b4cc1ae3da6 h1:Vyf2wJ1/CoHLznATpI+z84OJQ+sgAbpVLT9P1CNjSVI= @@ -293,6 +305,10 @@ gitlab.com/elixxir/crypto v0.0.7-0.20210107184400-5c3e52a35758 h1:h2l8SZbdgcyMVw gitlab.com/elixxir/crypto v0.0.7-0.20210107184400-5c3e52a35758/go.mod h1:JDC7EFs5V97qourZyiSHBiiXHGUoKWX9XtJVhfEvpC4= gitlab.com/elixxir/crypto v0.0.7-0.20210114172156-b576829ba7d8 h1:KhhsuPn+aPzZ66jdbbRF55SurogvQ/X9KuMWkXtmq+U= gitlab.com/elixxir/crypto v0.0.7-0.20210114172156-b576829ba7d8/go.mod h1:4AumkGNppiEaMo6bIpFBrV6wZtaIjpbvkpA5+FBisA8= +gitlab.com/elixxir/crypto v0.0.7-0.20210125231257-b52a556be893 h1:0NjQOwdGO/xBvgBMzRLSFXpSpnluzjT16obl5AcGfmI= +gitlab.com/elixxir/crypto v0.0.7-0.20210125231257-b52a556be893/go.mod h1:BoYrgHnTJPvvd4f/f4A+y22wwgZ7IxkYtGC8x9WiwxA= +gitlab.com/elixxir/crypto v0.0.7-0.20210205171416-0a952e4e10de h1:Zy8ZY1sbEDiuVTjkObqZjePvwH3Im151iyAxnPfxV10= +gitlab.com/elixxir/crypto v0.0.7-0.20210205171416-0a952e4e10de/go.mod h1:4AumkGNppiEaMo6bIpFBrV6wZtaIjpbvkpA5+FBisA8= gitlab.com/elixxir/ekv v0.1.4-0.20201217220111-9c7e8be21577 h1:qT3ZO9GbKv7PcmakATsXsUdzn/hlm817ETOT/csDIak= gitlab.com/elixxir/ekv v0.1.4-0.20201217220111-9c7e8be21577/go.mod h1:e6WPUt97taFZe5PFLPb1Dupk7tqmDCTQu1kkstqJvw4= gitlab.com/elixxir/ekv v0.1.4 h1:NLVMwsFEKArWcsDHu2DbXlm9374iSgn7oIA3rVSsvjc= @@ -302,6 +318,7 @@ gitlab.com/elixxir/primitives v0.0.0-20200804170709-a1896d262cd9/go.mod h1:p0Vel gitlab.com/elixxir/primitives v0.0.0-20200804182913-788f47bded40/go.mod h1:tzdFFvb1ESmuTCOl1z6+yf6oAICDxH2NPUemVgoNLxc= gitlab.com/elixxir/primitives v0.0.1 h1:q61anawANlNAExfkeQEE1NCsNih6vNV1FFLoUQX6txQ= gitlab.com/elixxir/primitives v0.0.1/go.mod h1:kNp47yPqja2lHSiS4DddTvFpB/4D9dB2YKnw5c+LJCE= +gitlab.com/elixxir/primitives v0.0.2/go.mod h1:3fxFHSlQhkV4vs+S0dZEz3Om3m+40WX8L806yvSnNFc= gitlab.com/elixxir/primitives v0.0.3-0.20201217193438-8ebfc882f1de/go.mod h1:H1OZ6ZXzTB3G4nOEdJzBJ7BySRnivpJTkTphxazFCl4= gitlab.com/elixxir/primitives v0.0.3-0.20201222171449-bdfe30389bb5 h1:BUV1ouY+9NA5+ZF+QfTpIBL1vO5zk31I68N7DX9bKj8= gitlab.com/elixxir/primitives v0.0.3-0.20201222171449-bdfe30389bb5/go.mod h1:5Z8fce94mks0aFhMvzftx2jJpDx4/pzDU20G2oTiU9w= @@ -313,11 +330,14 @@ gitlab.com/elixxir/primitives v0.0.3-0.20210106014507-bf3dfe228fa6 h1:sUqEla1uUI gitlab.com/elixxir/primitives v0.0.3-0.20210106014507-bf3dfe228fa6/go.mod h1:Ph6isHUDVjmRUd9DioyKpd8W9J52gKBiDeue4DCygXA= gitlab.com/elixxir/primitives v0.0.3-0.20210107183456-9cf6fe2de1e5 h1:50HbCJWirpX2Q+NNhIHcs0M9f45H1UJ/7LNMu81Bnn0= gitlab.com/elixxir/primitives v0.0.3-0.20210107183456-9cf6fe2de1e5/go.mod h1:Ph6isHUDVjmRUd9DioyKpd8W9J52gKBiDeue4DCygXA= +gitlab.com/elixxir/primitives v0.0.3-0.20210125225949-9469ce6b08fc/go.mod h1:bGYfAGerVVZhNzh+PxOMZVG7iYAUfInYvtdAkAqgiY8= +gitlab.com/elixxir/primitives v0.0.3-0.20210126180712-bfbfb725c75a/go.mod h1:bGYfAGerVVZhNzh+PxOMZVG7iYAUfInYvtdAkAqgiY8= gitlab.com/elixxir/primitives v0.0.3-0.20210127194347-988bd6621899 h1:23S/mz5H4HOj2v2b33arSeYHH8FrdPAzEoImnJP91j4= gitlab.com/elixxir/primitives v0.0.3-0.20210127194347-988bd6621899/go.mod h1:Ph6isHUDVjmRUd9DioyKpd8W9J52gKBiDeue4DCygXA= gitlab.com/elixxir/primitives v0.0.3-0.20210127201240-6a42ad925e8a h1:ZQncDfITNE12EdJK+shh6UzHlALhNU4Zjvv4hid2krs= gitlab.com/elixxir/primitives v0.0.3-0.20210127201240-6a42ad925e8a/go.mod h1:Ph6isHUDVjmRUd9DioyKpd8W9J52gKBiDeue4DCygXA= gitlab.com/xx_network/comms v0.0.0-20200805174823-841427dd5023/go.mod h1:owEcxTRl7gsoM8c3RQ5KAm5GstxrJp5tn+6JfQ4z5Hw= +gitlab.com/xx_network/comms v0.0.3/go.mod h1:YViGbRj7FjJYoaO4NpALGEd9dK/l8uUT000FEBbUTL8= gitlab.com/xx_network/comms v0.0.4-0.20201130190834-365ddae56e7b/go.mod h1:YViGbRj7FjJYoaO4NpALGEd9dK/l8uUT000FEBbUTL8= gitlab.com/xx_network/comms v0.0.4-0.20201217200138-87075d5b4ffd h1:4LjS3UuBNA/AaglIJ+k1IBoxYgCWt+FM1MPYxjAFfaQ= gitlab.com/xx_network/comms v0.0.4-0.20201217200138-87075d5b4ffd/go.mod h1:/vIk6tSrDqk/7HZOdrbSXZT+kEL43HIoz60AoZTzTXg= @@ -329,6 +349,8 @@ gitlab.com/xx_network/comms v0.0.4-0.20210107184305-7bb439c08ded h1:VHAQcap/+jcF gitlab.com/xx_network/comms v0.0.4-0.20210107184305-7bb439c08ded/go.mod h1:12OZe2Ol9lEk7JTm48GQ4zj1O01SH0ygfLqOb8EHrtU= gitlab.com/xx_network/comms v0.0.4-0.20210112233928-eac8db03c397 h1:E7p5lGX+nTAIKB6Wno3mRxBfC+SX5ZY2FKp8JEMzdSM= gitlab.com/xx_network/comms v0.0.4-0.20210112233928-eac8db03c397/go.mod h1:12OZe2Ol9lEk7JTm48GQ4zj1O01SH0ygfLqOb8EHrtU= +gitlab.com/xx_network/comms v0.0.4-0.20210121204701-7a1eb0542424 h1:zhfkbutYEY7PQuC1kcugCt4am/oRAyla6u4xDc5PqWs= +gitlab.com/xx_network/comms v0.0.4-0.20210121204701-7a1eb0542424/go.mod h1:MNkja6iUsM2yjBQicwLUGYctZmAU/D4AMpDD04vfBg8= gitlab.com/xx_network/crypto v0.0.3/go.mod h1:DF2HYvvCw9wkBybXcXAgQMzX+MiGbFPjwt3t17VRqRE= gitlab.com/xx_network/crypto v0.0.4 h1:lpKOL5mTJ2awWMfgBy30oD/UvJVrWZzUimSHlOdZZxo= gitlab.com/xx_network/crypto v0.0.4/go.mod h1:+lcQEy+Th4eswFgQDwT0EXKp4AXrlubxalwQFH5O0Mk= @@ -341,6 +363,8 @@ gitlab.com/xx_network/crypto v0.0.5-0.20210106014410-0554a33a7124 h1:G2fNW7uPzJE gitlab.com/xx_network/crypto v0.0.5-0.20210106014410-0554a33a7124/go.mod h1:tTYlvAZNUFMtndcijM37iujkM4gP8kUwGiS9n7NA5Ck= gitlab.com/xx_network/crypto v0.0.5-0.20210107183440-804e0f8b7d22 h1:SQga1vOuAGzbYURnBjG0f37r7WmWKZRdiqmdopaNMb4= gitlab.com/xx_network/crypto v0.0.5-0.20210107183440-804e0f8b7d22/go.mod h1:tTYlvAZNUFMtndcijM37iujkM4gP8kUwGiS9n7NA5Ck= +gitlab.com/xx_network/crypto v0.0.5-0.20210121204626-b251b926e4f7 h1:eraxUmI0EFDtfqTV4Ojndoh8Bv8PBUbZaT27VLU1yhc= +gitlab.com/xx_network/crypto v0.0.5-0.20210121204626-b251b926e4f7/go.mod h1:61fEAGI2+JD6CbT5PMzxy1SBMvgiFxE4MyiQghzoOVg= gitlab.com/xx_network/primitives v0.0.0-20200803231956-9b192c57ea7c/go.mod h1:wtdCMr7DPePz9qwctNoAUzZtbOSHSedcK++3Df3psjA= gitlab.com/xx_network/primitives v0.0.0-20200804183002-f99f7a7284da h1:CCVslUwNC7Ul7NG5nu3ThGTSVUt1TxNRX+47f5TUwnk= gitlab.com/xx_network/primitives v0.0.0-20200804183002-f99f7a7284da/go.mod h1:OK9xevzWCaPO7b1wiluVJGk7R5ZsuC7pHY5hteZFQug= @@ -360,10 +384,13 @@ gitlab.com/xx_network/primitives v0.0.4-0.20210118193646-93176e2e6925 h1:n40/5N6 gitlab.com/xx_network/primitives v0.0.4-0.20210118193646-93176e2e6925/go.mod h1:cs0QlFpdMDI6lAo61lDRH2JZz+3aVkHy+QogOB6F/qc= gitlab.com/xx_network/primitives v0.0.4-0.20210120193504-6fb365621996 h1:ChTPjKVl3XZDsqZpaSbWT8vixiHhhcGh/ytH4feYz4A= gitlab.com/xx_network/primitives v0.0.4-0.20210120193504-6fb365621996/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE= +gitlab.com/xx_network/primitives v0.0.4-0.20210121203635-8a771fc14f8a/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE= gitlab.com/xx_network/primitives v0.0.4-0.20210121231232-022320b01e08 h1:NZl2gjkiSZQVls4dHys+EoE6eGIU2YBXKqLaBVuV+b0= gitlab.com/xx_network/primitives v0.0.4-0.20210121231232-022320b01e08/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE= gitlab.com/xx_network/primitives v0.0.4-0.20210129204839-cc84bb5a253b h1:zKtKCoScDcJM8/nBC4U5uhjifDHHcND3vKm1gfoc5yQ= gitlab.com/xx_network/primitives v0.0.4-0.20210129204839-cc84bb5a253b/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE= +gitlab.com/xx_network/primitives v0.0.4-0.20210208175706-a47ce8d49d4b h1:JZjMW39yJXuHWqX3OPlvAPykarGB4KS0KHDU2jHG6eg= +gitlab.com/xx_network/primitives v0.0.4-0.20210208175706-a47ce8d49d4b/go.mod h1:9imZHvYwNFobxueSvVtHneZLk9wTK7HQTzxPm+zhFhE= gitlab.com/xx_network/ring v0.0.2 h1:TlPjlbFdhtJrwvRgIg4ScdngMTaynx/ByHBRZiXCoL0= gitlab.com/xx_network/ring v0.0.2/go.mod h1:aLzpP2TiZTQut/PVHR40EJAomzugDdHXetbieRClXIM= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -539,6 +566,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= diff --git a/network/follow.go b/network/follow.go index 2c0d7bc615b1fb8351db09f53d3a5067ff9032af..8d973a67c35fe70afa2da7f0d7cc66e40239a4a2 100644 --- a/network/follow.go +++ b/network/follow.go @@ -25,8 +25,8 @@ package network import ( "bytes" jww "github.com/spf13/jwalterweatherman" - bloom "gitlab.com/elixxir/bloomfilter" "gitlab.com/elixxir/client/network/gateway" + "gitlab.com/elixxir/client/network/rounds" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/primitives/knownRounds" "gitlab.com/elixxir/primitives/states" @@ -36,8 +36,8 @@ import ( "time" ) -const bloomFilterSize = 71888 // In Bits -const bloomFilterHashes = 8 +const BloomFilterSize = 904 // In Bits +const BloomFilterHashes = 10 //comms interface makes testing easier type followNetworkComms interface { @@ -45,6 +45,7 @@ type followNetworkComms interface { SendPoll(host *connect.Host, message *pb.GatewayPoll) (*pb.GatewayPollResponse, error) } + // followNetwork polls the network to get updated on the state of nodes, the // round status, and informs the client when messages can be retrieved. func (m *manager) followNetwork(quitCh <-chan struct{}) { @@ -71,6 +72,14 @@ func (m *manager) follow(rng csprng.Source, comms followNetworkComms) { jww.TRACE.Printf("follow: %d", followCnt) followCnt++ + //get the identity we will poll for + identity, err := m.Session.Reception().GetIdentity(rng) + if err!=nil{ + jww.FATAL.Panicf("Failed to get an ideneity, this should be " + + "impossible: %+v", err) + } + + //randomly select a gateway to poll //TODO: make this more intelligent gwHost, err := gateway.Get(m.Instance.GetPartialNdf().Get(), comms, rng) @@ -85,7 +94,9 @@ func (m *manager) follow(rng csprng.Source, comms followNetworkComms) { Hash: m.Instance.GetPartialNdf().GetHash(), }, LastUpdate: uint64(m.Instance.GetLastUpdateID()), - ClientID: m.Uid.Bytes(), + ReceptionID: identity.EphId[:], + StartTimestamp: identity.StartRequest.UnixNano(), + EndTimestamp: identity.EndRequest.UnixNano(), } jww.TRACE.Printf("Polling %s for NDF...", gwHost) pollResp, err := comms.SendPoll(gwHost, &pollReq) @@ -94,33 +105,13 @@ func (m *manager) follow(rng csprng.Source, comms followNetworkComms) { return } - // ---- Process Update Data ---- - lastTrackedRound := id.Round(pollResp.LastTrackedRound) + // ---- Process Network State Update Data ---- gwRoundsState := &knownRounds.KnownRounds{} err = gwRoundsState.Unmarshal(pollResp.KnownRounds) if err != nil { jww.ERROR.Printf("Failed to unmarshal: %+v", err) return } - var filterList []*bloom.Ring - for _, f := range pollResp.BloomFilters { - jww.DEBUG.Printf("Bloom Filter size: %d, hashes: %d", - bloomFilterSize, bloomFilterHashes) - filter, err := bloom.InitByParameters(bloomFilterSize, - bloomFilterHashes) - if err != nil { - jww.INFO.Printf("Bloom Filter Data: %v", f) - jww.FATAL.Panicf("Unable to create a bloom filter: %+v", - err) - } - if err := filter.UnmarshalBinary(f); err != nil { - jww.WARN.Printf("Failed to unmarshal filter: %+v", err) - jww.INFO.Printf("Bloom Filter Unmarshal Data: %v", f) - continue - } - filterList = append(filterList, filter) - } - jww.INFO.Printf("Bloom filters found in response: %d", len(filterList)) // ---- Node Events ---- // NOTE: this updates the structure, AND sends events over the node @@ -139,6 +130,9 @@ func (m *manager) follow(rng csprng.Source, comms followNetworkComms) { } } + //check that the stored address space is correct + m.Session.Reception().UpdateIDSize(uint(m.Instance.GetPartialNdf().Get().AddressSpaceSize)) + // NOTE: this updates rounds and updates the tracking of the health of the // network if pollResp.Updates != nil { @@ -187,20 +181,37 @@ func (m *manager) follow(rng csprng.Source, comms followNetworkComms) { } } - // ---- Round Processing ----- + // ---- Identity Specific Round Processing ----- + if identity.Fake{ + return + } + + //get the range fo filters which are valid for the identity + filtersStart, filtersEnd := rounds.ValidFilterRange(identity, pollResp.Filters) + + //check if there are any valid filters returned + if !(filtersEnd>filtersStart){ + return + } + + //prepare the filter objects for processing + filterList := make([]*rounds.RemoteFilter, filtersEnd-filtersStart) + for i:=filtersStart;i<filtersEnd;i++{ + filterList[i-filtersStart] = rounds.NewRemoteFilter(pollResp.Filters.Filters[i]) + } + + jww.INFO.Printf("Bloom filters found in response: %d, filters used: %s", + len(pollResp.Filters.Filters), len(filterList)) + // check rounds using the round checker function which determines if there // are messages waiting in rounds and then sends signals to the appropriate // handling threads roundChecker := func(rid id.Round) bool { - return m.round.Checker(rid, filterList) + return m.round.Checker(rid, filterList, identity) } // get the bit vector of rounds that have been checked checkedRounds := m.Session.GetCheckedRounds() - // cleave off old state in the bit vector which is deprecated from the - // network - jww.DEBUG.Printf("lastCheckedRound: %v", lastTrackedRound) - checkedRounds.Forward(lastTrackedRound) jww.TRACE.Printf("gwRoundState: %+v", gwRoundsState) jww.TRACE.Printf("pollResp.KnownRounds: %s", string(pollResp.KnownRounds)) @@ -208,6 +219,7 @@ func (m *manager) follow(rng csprng.Source, comms followNetworkComms) { // loop through all rounds the client does not know about and the gateway // does, checking the bloom filter for the user to see if there are // messages for the user (bloom not implemented yet) - checkedRounds.RangeUncheckedMasked(gwRoundsState, roundChecker, + checkedRounds.RangeUncheckedMaskedRange(gwRoundsState, roundChecker, + filterList[0].FirstRound(), filterList[len(filterList)-1].LastRound(), int(m.param.MaxCheckedRounds)) } diff --git a/network/message/bundle.go b/network/message/bundle.go index 84962ded31793e5600eefa1bb425a04cc3a5e881..56f1618d643641da6e9c2550e998a37a1269344c 100644 --- a/network/message/bundle.go +++ b/network/message/bundle.go @@ -8,6 +8,7 @@ package message import ( + "gitlab.com/elixxir/client/storage/reception" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" ) @@ -16,4 +17,5 @@ type Bundle struct { Round id.Round Messages []format.Message Finish func() + Identity reception.IdentityUse } diff --git a/network/message/handler.go b/network/message/handler.go index c81829858c05ceacbdb2642d2dcfe0bc1c52d48c..4a3e0ef65d91833e916bac35f5131fc038ee0871 100644 --- a/network/message/handler.go +++ b/network/message/handler.go @@ -10,10 +10,11 @@ package message import ( jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/interfaces/message" + "gitlab.com/elixxir/client/storage/reception" "gitlab.com/elixxir/crypto/e2e" + fingerprint2 "gitlab.com/elixxir/crypto/fingerprint" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/primitives/id" - "gitlab.com/xx_network/primitives/id/ephemeral" "time" ) @@ -25,7 +26,7 @@ func (m *Manager) handleMessages(quitCh <-chan struct{}) { done = true case bundle := <-m.messageReception: for _, msg := range bundle.Messages { - m.handleMessage(msg) + m.handleMessage(msg, bundle.Identity) } bundle.Finish() } @@ -33,7 +34,7 @@ func (m *Manager) handleMessages(quitCh <-chan struct{}) { } -func (m *Manager) handleMessage(ecrMsg format.Message) { +func (m *Manager) handleMessage(ecrMsg format.Message, identity reception.IdentityUse) { // We've done all the networking, now process the message fingerprint := ecrMsg.GetKeyFP() @@ -45,6 +46,15 @@ func (m *Manager) handleMessage(ecrMsg format.Message) { var err error var relationshipFingerprint []byte + //check if the identity fingerprint matches + forMe, err := fingerprint2.CheckIdentityFP(ecrMsg.GetIdentityFP(), ecrMsg.GetContents(), identity.Source) + if err!=nil{ + jww.FATAL.Panicf("Could not check IdentityFIngerprint: %+v", err) + } + if !forMe{ + return + } + // try to get the key fingerprint, process as e2e encryption if // the fingerprint is found if key, isE2E := e2eKv.PopKey(fingerprint); isE2E { @@ -73,7 +83,6 @@ func (m *Manager) handleMessage(ecrMsg format.Message) { // if it doesnt match any form of encrypted, hear it as a raw message // and add it to garbled messages to be handled later msg = ecrMsg - ephID, err := ephemeral.Marshal(msg.GetEphemeralRID()) if err!=nil{ jww.DEBUG.Printf("Failed to unmarshal ephemeral ID " + "on unknown message: %+v", err) @@ -82,9 +91,10 @@ func (m *Manager) handleMessage(ecrMsg format.Message) { Payload: msg.Marshal(), MessageType: message.Raw, Sender: nil, - EphemeralID: ephID, + EphemeralID: identity.EphId, Timestamp: time.Time{}, Encryption: message.None, + RecipientID: identity.Source, } jww.INFO.Printf("Garbled/RAW Message: %v", msg.GetKeyFP()) m.Session.GetGarbledMessages().Add(msg) @@ -96,6 +106,11 @@ func (m *Manager) handleMessage(ecrMsg format.Message) { // we get a full message xxMsg, ok := m.partitioner.HandlePartition(sender, encTy, msg.GetContents(), relationshipFingerprint) + + //Set the identities + xxMsg.RecipientID = identity.Source + xxMsg.EphemeralID = identity.EphId + // If the reception completed a message, hear it on the switchboard if ok { if xxMsg.MessageType == message.Raw { diff --git a/network/message/sendCmix.go b/network/message/sendCmix.go index 81050831aa9db87bb6ab999842d744324f4348d8..27a4eac2683ed03659a83c52000cab5762988bac 100644 --- a/network/message/sendCmix.go +++ b/network/message/sendCmix.go @@ -65,6 +65,17 @@ func (m *Manager) SendCMIX(msg format.Message, recipient *id.ID, param params.CM ephID, _, _, err := ephemeral.GetId(recipient, uint(bestRound.AddressSpaceSize), int64(bestRound.Timestamps[states.REALTIME])) + if err!=nil{ + jww.FATAL.Panicf("Failed to generate ephemeral ID: %+v", err) + } + + + rng := m.Rng.GetStream() + ephID, err = ephID.Fill(uint(bestRound.AddressSpaceSize), rng) + if err!=nil{ + jww.FATAL.Panicf("Failed to obviscate the ephemeralID: %+v", err) + } + rng.Close() msg.SetEphemeralRID(ephID[:]) diff --git a/network/rounds/check.go b/network/rounds/check.go index 72d31bed5d1840f6d2b5f7b00f8b24607a7963a8..f67ded8769112daa7c693de00dc87a99155b447f 100644 --- a/network/rounds/check.go +++ b/network/rounds/check.go @@ -11,6 +11,7 @@ import ( "encoding/binary" jww "github.com/spf13/jwalterweatherman" bloom "gitlab.com/elixxir/bloomfilter" + "gitlab.com/elixxir/client/storage/reception" "gitlab.com/xx_network/primitives/id" ) @@ -25,7 +26,7 @@ import ( // if the information about that round is already present, if it is the data is // sent to Message Retrieval Workers, otherwise it is sent to Historical Round // Retrieval -func (m *Manager) Checker(roundID id.Round, filters []*bloom.Ring) bool { +func (m *Manager) Checker(roundID id.Round, filters []*RemoteFilter, identity reception.IdentityUse) bool { jww.DEBUG.Printf("Checker(roundID: %d)", roundID) // Set round to processing, if we can processing, count := m.p.Process(roundID) @@ -43,14 +44,24 @@ func (m *Manager) Checker(roundID id.Round, filters []*bloom.Ring) bool { return true } - //check if the round is in the bloom filters - hasRound := false - serialRid := serializeRound(roundID) + //find filters that could have the round + var potentialFilters []*bloom.Bloom for _, filter := range filters { - hasRound = filter.Test(serialRid) - if hasRound { - break + if filter.FirstRound()<=roundID && filter.LastRound()>=roundID{ + potentialFilters = append(potentialFilters, filter.GetFilter()) + } + } + + hasRound := false + //check if the round is in any of the potential filters + if len(potentialFilters)>0{ + serialRid := serializeRound(roundID) + for _, f := range potentialFilters{ + if f.Test(serialRid){ + hasRound = true + break + } } } @@ -66,11 +77,17 @@ func (m *Manager) Checker(roundID id.Round, filters []*bloom.Ring) bool { if err != nil { jww.DEBUG.Printf("HistoricalRound <- %d", roundID) // If we didn't find it, send to Historical Rounds Retrieval - m.historicalRounds <- roundID + m.historicalRounds <- historicalRoundRequest{ + rid: roundID, + identity: identity, + } } else { jww.DEBUG.Printf("lookupRoundMessages <- %d", roundID) // IF found, send to Message Retrieval Workers - m.lookupRoundMessages <- ri + m.lookupRoundMessages <- roundLookup{ + roundInfo: ri, + identity: identity, + } } return false diff --git a/network/rounds/historical.go b/network/rounds/historical.go index 6b8fd8a53b2101b47b817bc3ec0341a1986ca9ef..9385425a6cca1f114d5566d25d565eb98d9a5b00 100644 --- a/network/rounds/historical.go +++ b/network/rounds/historical.go @@ -10,6 +10,7 @@ package rounds import ( jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/network/gateway" + "gitlab.com/elixxir/client/storage/reception" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/xx_network/comms/connect" "gitlab.com/xx_network/primitives/id" @@ -31,6 +32,12 @@ type historicalRoundsComms interface { message *pb.HistoricalRounds) (*pb.HistoricalRoundsResponse, error) } +//structure which contains a historical round lookup +type historicalRoundRequest struct{ + rid id.Round + identity reception.IdentityUse +} + // Long running thread which process historical rounds // Can be killed by sending a signal to the quit channel // takes a comms interface to aid in testing @@ -39,7 +46,7 @@ func (m *Manager) processHistoricalRounds(comm historicalRoundsComms, quitCh <-c timerCh := make(<-chan time.Time) rng := m.Rng.GetStream() - var rounds []uint64 + var roundRequests []historicalRoundRequest done := false for !done { @@ -48,28 +55,28 @@ func (m *Manager) processHistoricalRounds(comm historicalRoundsComms, quitCh <-c select { case <-quitCh: rng.Close() - // return all rounds in the queue to the input channel so they can + // return all roundRequests in the queue to the input channel so they can // be checked in the future. If the queue is full, disable them as // processing so they are picked up from the beginning - for _, rid := range rounds { + for _, r := range roundRequests { select { - case m.historicalRounds <- id.Round(rid): + case m.historicalRounds <- r: default: - m.p.NotProcessing(id.Round(rid)) + m.p.NotProcessing(r.rid) } } done = true - // if the timer elapses process rounds to ensure the delay isn't too long + // if the timer elapses process roundRequests to ensure the delay isn't too long case <-timerCh: - if len(rounds) > 0 { + if len(roundRequests) > 0 { shouldProcess = true } // get new round to lookup and force a lookup if - case rid := <-m.historicalRounds: - rounds = append(rounds, uint64(rid)) - if len(rounds) > int(m.params.MaxHistoricalRounds) { + case r := <-m.historicalRounds: + roundRequests = append(roundRequests, r) + if len(roundRequests) > int(m.params.MaxHistoricalRounds) { shouldProcess = true - } else if len(rounds) == 1 { + } else if len(roundRequests) == 1 { //if this is the first round, start the timeout timerCh = time.NewTimer(m.params.HistoricalRoundsPeriod).C } @@ -78,21 +85,26 @@ func (m *Manager) processHistoricalRounds(comm historicalRoundsComms, quitCh <-c continue } - //find a gateway to request about the rounds + //find a gateway to request about the roundRequests gwHost, err := gateway.Get(m.Instance.GetPartialNdf().Get(), comm, rng) if err != nil { jww.FATAL.Panicf("Failed to track network, NDF has corrupt "+ "data: %s", err) } - //send the historical rounds request + rounds := make([]uint64,len(roundRequests)) + for i, rr := range roundRequests{ + rounds[i] = uint64(rr.rid) + } + + //send the historical roundRequests request hr := &pb.HistoricalRounds{ Rounds: rounds, } response, err := comm.RequestHistoricalRounds(gwHost, hr) if err != nil { - jww.ERROR.Printf("Failed to request historical rounds "+ + jww.ERROR.Printf("Failed to request historical roundRequests "+ "data: %s", response) // if the check fails to resolve, break the loop and so they will be // checked again @@ -100,20 +112,24 @@ func (m *Manager) processHistoricalRounds(comm historicalRoundsComms, quitCh <-c continue } - // process the returned historical rounds. + // process the returned historical roundRequests. for i, roundInfo := range response.Rounds { - // The interface has missing returns returned as nil, such rounds + // The interface has missing returns returned as nil, such roundRequests // need be be removes as processing so the network follower will // pick them up in the future. if roundInfo == nil { jww.ERROR.Printf("could not retreive "+ - "historical round %d", rounds[i]) - m.p.Fail(id.Round(rounds[i])) + "historical round %d", roundRequests[i].rid) + m.p.Fail(roundRequests[i].rid) continue } - // Successfully retrieved rounds are sent to the Message + // Successfully retrieved roundRequests are sent to the Message // Retrieval Workers - m.lookupRoundMessages <- roundInfo + rl := roundLookup{ + roundInfo: roundInfo, + identity: roundRequests[i].identity, + } + m.lookupRoundMessages <- rl } } } diff --git a/network/rounds/manager.go b/network/rounds/manager.go index 3c3221474d3124b9de4ab1e688c7eeda118e8a52..9fe5ce57a34f342aaf1fb2b1055442e08f802d0a 100644 --- a/network/rounds/manager.go +++ b/network/rounds/manager.go @@ -13,8 +13,6 @@ import ( "gitlab.com/elixxir/client/network/internal" "gitlab.com/elixxir/client/network/message" "gitlab.com/elixxir/client/stoppable" - "gitlab.com/elixxir/comms/mixmessages" - "gitlab.com/xx_network/primitives/id" ) type Manager struct { @@ -24,8 +22,8 @@ type Manager struct { internal.Internal - historicalRounds chan id.Round - lookupRoundMessages chan *mixmessages.RoundInfo + historicalRounds chan historicalRoundRequest + lookupRoundMessages chan roundLookup messageBundles chan<- message.Bundle } @@ -35,8 +33,8 @@ func NewManager(internal internal.Internal, params params.Rounds, params: params, p: newProcessingRounds(), - historicalRounds: make(chan id.Round, params.HistoricalRoundsBufferLen), - lookupRoundMessages: make(chan *mixmessages.RoundInfo, params.LookupRoundsBufferLen), + historicalRounds: make(chan historicalRoundRequest, params.HistoricalRoundsBufferLen), + lookupRoundMessages: make(chan roundLookup, params.LookupRoundsBufferLen), messageBundles: bundles, } diff --git a/network/rounds/remoteFilters.go b/network/rounds/remoteFilters.go new file mode 100644 index 0000000000000000000000000000000000000000..da68caeaa39b8176762cbc2845fc05b3e66ea7cc --- /dev/null +++ b/network/rounds/remoteFilters.go @@ -0,0 +1,55 @@ +package rounds + +import ( + bloom "gitlab.com/elixxir/bloomfilter" + "gitlab.com/elixxir/client/network" + "gitlab.com/elixxir/client/storage/reception" + "gitlab.com/elixxir/comms/mixmessages" + "gitlab.com/xx_network/primitives/id" + "time" +) + +func NewRemoteFilter(data *mixmessages.ClientBloom)*RemoteFilter{ + return &RemoteFilter{ + data: data, + } +} + +type RemoteFilter struct{ + data *mixmessages.ClientBloom + filter *bloom.Bloom +} + +func (rf *RemoteFilter)GetFilter()*bloom.Bloom{ + + if rf.filter == nil{ + var err error + rf.filter, err = bloom.InitByParameters(network.BloomFilterSize, + network.BloomFilterHashes) + if err!=nil{ + return nil + } + } + return rf.filter +} + +func (rf *RemoteFilter)FirstRound()id.Round{ + return id.Round(rf.data.FirstRound) +} + +func (rf *RemoteFilter)LastRound()id.Round{ + return id.Round(rf.data.FirstRound + uint64(rf.data.RoundRange)) +} + +// ValidFilterRange calculates which of the returned filters are valid for the identity +func ValidFilterRange(identity reception.IdentityUse, filters *mixmessages.ClientBlooms)(start int, end int){ + firstFilterStart:= time.Unix(0,filters.FirstTimestamp) + filterDelta := time.Duration(filters.Period) + + deltaFromStart := int(identity.StartValid.Sub(firstFilterStart)/filterDelta) + deltaFromEnd := int((identity.EndValid.Sub(firstFilterStart)+filterDelta-1)/filterDelta) + if deltaFromEnd>(len(filters.Filters)-1){ + deltaFromEnd = len(filters.Filters) + } + return deltaFromStart, deltaFromEnd+1 +} \ No newline at end of file diff --git a/network/rounds/retrieve.go b/network/rounds/retrieve.go index 0762c3a197061273993e5a57ff056f6c041d51f0..d15bde5a28ae73d771cc51cb32ebc99821837086 100644 --- a/network/rounds/retrieve.go +++ b/network/rounds/retrieve.go @@ -12,6 +12,7 @@ import ( jww "github.com/spf13/jwalterweatherman" "gitlab.com/elixxir/client/network/gateway" "gitlab.com/elixxir/client/network/message" + "gitlab.com/elixxir/client/storage/reception" pb "gitlab.com/elixxir/comms/mixmessages" "gitlab.com/elixxir/primitives/format" "gitlab.com/xx_network/comms/connect" @@ -24,6 +25,11 @@ type messageRetrievalComms interface { message *pb.GetMessages) (*pb.GetMessagesResponse, error) } +type roundLookup struct{ + roundInfo *pb.RoundInfo + identity reception.IdentityUse +} + func (m *Manager) processMessageRetrieval(comms messageRetrievalComms, quitCh <-chan struct{}) { @@ -32,13 +38,15 @@ func (m *Manager) processMessageRetrieval(comms messageRetrievalComms, select { case <-quitCh: done = true - case ri := <-m.lookupRoundMessages: + case rl := <-m.lookupRoundMessages: + ri := rl.roundInfo bundle, err := m.getMessagesFromGateway(ri, comms) if err != nil { jww.WARN.Printf("Failed to get messages for round %v: %s", ri.ID, err) break } + bundle.Identity = rl.identity if len(bundle.Messages) != 0 { m.messageBundles <- bundle } diff --git a/storage/e2e/session.go b/storage/e2e/session.go index bcea1ff782e45d742dd1a7429e7df4f9a90983f6..91a518e5dfa8c76ddc03a5a0d78d1698feaf451f 100644 --- a/storage/e2e/session.go +++ b/storage/e2e/session.go @@ -16,9 +16,10 @@ import ( "gitlab.com/elixxir/client/storage/versioned" "gitlab.com/elixxir/crypto/cyclic" dh "gitlab.com/elixxir/crypto/diffieHellman" - "gitlab.com/elixxir/crypto/e2e" + "gitlab.com/xx_network/crypto/randomness" "gitlab.com/elixxir/crypto/hash" "gitlab.com/xx_network/primitives/id" + "math/big" "sync" "testing" "time" @@ -547,15 +548,12 @@ func (s *Session) generate(kv *versioned.KV) *versioned.KV { kv = kv.Prefix(makeSessionPrefix(s.GetID())) //generate ttl and keying info - keysTTL, numKeys := e2e.GenerateKeyTTL(s.baseKey.GetLargeInt(), - s.params.MinKeys, s.params.MaxKeys, s.params.TTLParams) + h, _ := hash.NewCMixHash() - //ensure that enough keys are remaining to rekey - if numKeys-uint32(keysTTL) < uint32(s.params.NumRekeys) { - numKeys = uint32(keysTTL + s.params.NumRekeys) - } + numKeys := uint32(randomness.RandInInterval(big.NewInt(int64(s.params.MaxKeys-s.params.MinKeys)), + s.baseKey.Bytes(),h).Int64()+int64(s.params.MinKeys)) - s.ttl = uint32(keysTTL) + s.ttl = uint32(s.params.NumRekeys) //create the new state vectors. This will cause disk operations storing them diff --git a/storage/reception/store.go b/storage/reception/store.go index 29dc7409f6a682b639e207dc985e95d9d0621557..4c168d49f4298ee8e391ea233834248560540bc2 100644 --- a/storage/reception/store.go +++ b/storage/reception/store.go @@ -225,6 +225,10 @@ func (s *Store) RemoveIdentity(ephID ephemeral.Id) { func (s *Store) UpdateIDSize(idSize uint) { s.mux.Lock() defer s.mux.Unlock() + if s.idSize == int(idSize){ + return + } + s.idSize = int(idSize) // Store the ID size @@ -240,6 +244,12 @@ func (s *Store) UpdateIDSize(idSize uint) { } } +func (s *Store)GetIDSize()uint { + s.mux.Lock() + defer s.mux.Unlock() + return uint(s.idSize) +} + func (s *Store) prune(now time.Time) { lengthBefore := len(s.active) diff --git a/storage/session.go b/storage/session.go index 8e596627aef3d75c2e1f99bac9fff9591ed6b106..a14a46c9edb8cb95819d4b5c161ac71cbab1b70e 100644 --- a/storage/session.go +++ b/storage/session.go @@ -18,6 +18,7 @@ import ( "gitlab.com/elixxir/client/storage/conversation" "gitlab.com/elixxir/client/storage/e2e" "gitlab.com/elixxir/client/storage/partition" + "gitlab.com/elixxir/client/storage/reception" "gitlab.com/elixxir/client/storage/user" "gitlab.com/elixxir/client/storage/utility" "gitlab.com/elixxir/client/storage/versioned" @@ -56,6 +57,7 @@ type Session struct { criticalRawMessages *utility.CmixMessageBuffer garbledMessages *utility.MeteredCmixMessageBuffer checkedRounds *utility.KnownRounds + reception *reception.Store } // Initialize a new Session object @@ -129,6 +131,9 @@ func New(baseDir, password string, u userInterface.User, cmixGrp, s.conversations = conversation.NewStore(s.kv) s.partition = partition.New(s.kv) + s.reception = reception.NewStore(s.kv) + + return s, nil } @@ -190,6 +195,8 @@ func Load(baseDir, password string, rng *fastRNG.StreamGenerator) (*Session, err s.conversations = conversation.NewStore(s.kv) s.partition = partition.New(s.kv) + s.reception = reception.LoadStore(s.kv) + return s, nil } @@ -217,6 +224,12 @@ func (s *Session) Auth() *auth.Store { return s.auth } +func (s *Session) Reception() *reception.Store { + s.mux.RLock() + defer s.mux.RUnlock() + return s.reception +} + func (s *Session) GetCriticalMessages() *utility.E2eMessageBuffer { s.mux.RLock() defer s.mux.RUnlock()