Give up on `lipmaa` (for now)
This commit is contained in:
parent
cba6749e2f
commit
8464c81ecc
|
@ -49,7 +49,6 @@ See `kitchen_sink.sh` examples.
|
|||
- [ ] Stop using old nested blob bundles. Start using "flat" blobs.
|
||||
- [ ] Ability to unblock someone.
|
||||
- [ ] Ability to delete a key from a draft.
|
||||
- [ ] Update Dev docs in protocol spec to reflect changes to `lipmaa` header.
|
||||
- [ ] 100% class / module documentation
|
||||
- [ ] Run a [terminology extraction tool](https://www.visualthesaurus.com/vocabgrabber/#) on the documentation and write a glossary of terms.
|
||||
- [ ] Ability to list all blocked users.
|
||||
|
@ -57,7 +56,6 @@ See `kitchen_sink.sh` examples.
|
|||
|
||||
# "Nice to Have"
|
||||
|
||||
- [ ] Support partial verification via `lipmaa` property.
|
||||
- [ ] Add `--since=`/`--until=` args to `bundle create` for sending partial / "slice" bundles.
|
||||
- [ ] Interest and Disinterest Signalling for document routing: Create a `$blob_status` message to express `have`, `want` signalling. This can steer bundle creation and an eventual `--for` flag at bundle creation time to customize a bundle to a particular user.
|
||||
- [ ] Add a schema for `$peer_status`. Eg: `block`, `unblock`, `follow`, `unfollow`.
|
||||
|
|
|
@ -17,7 +17,6 @@ module Pigeon
|
|||
"author <%= author %>",
|
||||
"depth <%= depth %>",
|
||||
"kind <%= kind %>",
|
||||
"lipmaa <%= lipmaa %>",
|
||||
"prev <%= prev %>",
|
||||
"\n",
|
||||
].join("\n")
|
||||
|
@ -91,40 +90,6 @@ module Pigeon
|
|||
"X" => 0b11101, "Y" => 0b11110, "Z" => 0b11111,
|
||||
}.freeze
|
||||
|
||||
def self.lipmaa(n)
|
||||
# The original lipmaa function returns -1 for 0
|
||||
# but that does not mesh well with our serialization
|
||||
# scheme. Comments welcome on this one.
|
||||
if n < 1 # Prevent -1, division by zero etc..
|
||||
return nil
|
||||
end
|
||||
|
||||
m, po3, x = 1, 3, n
|
||||
# find k such that (3^k - 1)/2 >= n
|
||||
while (m < n)
|
||||
po3 *= 3
|
||||
m = (po3 - 1) / 2
|
||||
end
|
||||
po3 /= 3
|
||||
# find longest possible backjump
|
||||
if (m != n)
|
||||
while x != 0
|
||||
m = (po3 - 1) / 2
|
||||
po3 /= 3
|
||||
x %= m
|
||||
end
|
||||
if (m != po3)
|
||||
po3 = m
|
||||
end
|
||||
end
|
||||
result = n - po3
|
||||
if result == n - 1
|
||||
return nil
|
||||
else
|
||||
return result
|
||||
end
|
||||
end
|
||||
|
||||
# http://www.crockford.com/wrmg/base32.html
|
||||
def self.b32_encode(string)
|
||||
string
|
||||
|
@ -176,12 +141,6 @@ module Pigeon
|
|||
draft.author = author
|
||||
draft.depth = depth
|
||||
draft.prev = db.get_message_by_depth(mhash, depth - 1)
|
||||
lpma = Helpers.lipmaa(depth)
|
||||
if lpma && draft.prev
|
||||
draft.lipmaa = db.get_message_by_depth(mhash, lpma)
|
||||
else
|
||||
draft.lipmaa = NOTHING
|
||||
end
|
||||
|
||||
unsigned = template.render_without_signature
|
||||
draft.signature = author.sign(unsigned)
|
||||
|
@ -214,13 +173,6 @@ module Pigeon
|
|||
count = db.get_message_count_for(author.multihash)
|
||||
expected_prev = db.get_message_by_depth(author.multihash, count - 1) || Pigeon::NOTHING
|
||||
assert("depth", count, msg.depth)
|
||||
expected_lpma = Helpers.lipmaa(msg.depth)
|
||||
if expected_lpma
|
||||
real = db.get_message_by_depth(author.multihash, expected_lpma)
|
||||
assert("lipmaa", msg.lipmaa, real)
|
||||
else
|
||||
assert("lipmaa", msg.lipmaa, NOTHING)
|
||||
end
|
||||
assert("prev", msg.prev, expected_prev)
|
||||
tpl = msg.template.render_without_signature
|
||||
Helpers.verify_string(author, signature, tpl)
|
||||
|
|
|
@ -67,14 +67,12 @@ module Pigeon
|
|||
body:,
|
||||
depth:,
|
||||
kind:,
|
||||
lipmaa:,
|
||||
prev:,
|
||||
signature:)
|
||||
msg = Message.new(author: RemoteIdentity.new(author),
|
||||
kind: kind,
|
||||
body: body,
|
||||
prev: prev,
|
||||
lipmaa: lipmaa,
|
||||
signature: signature,
|
||||
depth: depth)
|
||||
_save_message(msg)
|
||||
|
|
|
@ -2,7 +2,7 @@ require "digest"
|
|||
|
||||
module Pigeon
|
||||
class Draft
|
||||
attr_accessor :signature, :prev, :lipmaa, :kind, :depth,
|
||||
attr_accessor :signature, :prev, :kind, :depth,
|
||||
:body, :author
|
||||
|
||||
def initialize(kind:, body: {})
|
||||
|
@ -12,7 +12,6 @@ module Pigeon
|
|||
@depth = -1
|
||||
@body = {}
|
||||
@author = Pigeon::NOTHING
|
||||
@lipmaa = Pigeon::NOTHING
|
||||
body.to_a.map { |(k, v)| self[k] = v }
|
||||
end
|
||||
|
||||
|
|
|
@ -11,7 +11,6 @@ module Pigeon
|
|||
depth = DRAFT_PLACEHOLDER
|
||||
prev = DRAFT_PLACEHOLDER
|
||||
signature = DRAFT_PLACEHOLDER
|
||||
lipmaa = DRAFT_PLACEHOLDER
|
||||
ERB.new([HEADER_TPL, BODY_TPL].join("")).result(binding)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -76,7 +76,6 @@ module Pigeon
|
|||
SEPERATOR = /\n/
|
||||
AUTHOR = /author #{FEED_VALUE}\n/
|
||||
DEPTH = /depth #{NUMERIC}\n/
|
||||
LIPMAA = /lipmaa (#{MESG_VALUE}|#{NULL_VALUE})\n/
|
||||
PREV = /prev (#{MESG_VALUE}|#{NULL_VALUE})\n/
|
||||
KIND = /kind #{ALPHANUMERICISH}\n/
|
||||
BODY_ENTRY = /#{ALPHANUMERICISH}:#{ANY_VALUE}\n/
|
||||
|
@ -106,8 +105,7 @@ module Pigeon
|
|||
AUTHOR: [:FOOTER_SEPERATOR, :START],
|
||||
DEPTH: [:AUTHOR],
|
||||
KIND: [:DEPTH],
|
||||
LIPMAA: [:KIND],
|
||||
PREV: [:LIPMAA],
|
||||
PREV: [:KIND],
|
||||
HEADER_SEPERATOR: [:PREV],
|
||||
}
|
||||
|
||||
|
@ -136,13 +134,6 @@ module Pigeon
|
|||
return
|
||||
end
|
||||
|
||||
if scanner.scan(LIPMAA)
|
||||
depth = scanner.matched.chomp.gsub("lipmaa ", "")
|
||||
@tokens << [:LIPMAA, depth, scanner.pos]
|
||||
check_header_order(:LIPMAA)
|
||||
return
|
||||
end
|
||||
|
||||
if scanner.scan(PREV)
|
||||
prev = scanner.matched.chomp.gsub("prev ", "")
|
||||
@tokens << [:PREV, prev, scanner.pos]
|
||||
|
|
|
@ -2,7 +2,7 @@ require "digest"
|
|||
|
||||
module Pigeon
|
||||
class Message
|
||||
attr_reader :author, :kind, :body, :signature, :depth, :lipmaa, :prev
|
||||
attr_reader :author, :kind, :body, :signature, :depth, :prev
|
||||
|
||||
def render
|
||||
template.render.chomp
|
||||
|
@ -20,7 +20,6 @@ module Pigeon
|
|||
body:,
|
||||
depth:,
|
||||
prev:,
|
||||
lipmaa:,
|
||||
signature:)
|
||||
raise MISSING_BODY if body.empty?
|
||||
|
||||
|
@ -29,7 +28,6 @@ module Pigeon
|
|||
@depth = depth
|
||||
@kind = kind
|
||||
@prev = prev || Pigeon::NOTHING
|
||||
@lipmaa = lipmaa
|
||||
@signature = signature
|
||||
end
|
||||
|
||||
|
|
|
@ -26,7 +26,6 @@ module Pigeon
|
|||
depth = message.depth
|
||||
kind = message.kind
|
||||
prev = message.prev || NOTHING
|
||||
lipmaa = message.lipmaa || NOTHING
|
||||
signature = message.signature
|
||||
|
||||
ERB.new(template).result(binding)
|
||||
|
|
|
@ -22,7 +22,6 @@ module Pigeon
|
|||
when :KIND then set(:kind, token[1])
|
||||
when :DEPTH then set(:depth, token[1])
|
||||
when :PREV then set(:prev, token[1])
|
||||
when :LIPMAA then set(:lipmaa, token[1])
|
||||
when :HEADER_END then set(:body, {})
|
||||
when :BODY_ENTRY then set(token[1], token[2], @scratchpad[:body])
|
||||
when :BODY_END then nil
|
||||
|
|
|
@ -88,7 +88,7 @@ We do not have a draft yet. We need to create one:
|
|||
db.new_draft(kind: "garden_diary", body: {"message_text"=>"Tomato plant looking healthy."})
|
||||
=> #<Pigeon::Draft:0x00005603ed399b48 @author="NONE",
|
||||
# @body={"greeting"=>"\"Hello, world!\""}, @depth=-1, @kind="example123",
|
||||
# @lipmaa="NONE", @prev="NONE", @signature="NONE">
|
||||
# @prev="NONE", @signature="NONE">
|
||||
```
|
||||
|
||||
The command above creates a new draft entry of kind `garden_entry` with one key/value pair in the body. We can view the draft at any time via `#get_draft`:
|
||||
|
@ -97,7 +97,7 @@ The command above creates a new draft entry of kind `garden_entry` with one key/
|
|||
db.get_draft
|
||||
# => #<Pigeon::Draft:0x00005603ed81e830 @author="NONE",
|
||||
# @body={"greeting"=>"\"Hello, world!\""}, @depth=-1,
|
||||
# @kind="example123", @lipmaa="NONE", @prev="NONE",
|
||||
# @kind="example123", @prev="NONE",
|
||||
# @signature="NONE">
|
||||
```
|
||||
|
||||
|
@ -123,7 +123,6 @@ puts human_readable_string
|
|||
# => author DRAFT
|
||||
# depth DRAFT
|
||||
# kind garden_diary
|
||||
# lipmaa DRAFT
|
||||
# prev DRAFT
|
||||
#
|
||||
# greeting:"Hello, world!"
|
||||
|
@ -133,7 +132,7 @@ puts human_readable_string
|
|||
Some interesting things about the draft we just rendered:
|
||||
|
||||
* Unlike a message, a draft has no signature (yet).
|
||||
* The `author`, `kind`, `prev`, `depth`, `lipmaa` properties are all set to `"DRAFT"`. Real values will be populated when we finally publish the draft.
|
||||
* The `author`, `kind`, `prev`, `depth` properties are all set to `"DRAFT"`. Real values will be populated when we finally publish the draft.
|
||||
|
||||
If we want to start over, we can delete a draft via `delete_current_draft`:
|
||||
|
||||
|
@ -156,7 +155,6 @@ my_message = db.publish_draft
|
|||
@body={"greeting"=>"\"Hello, world!\"", "current_mood"=>"\"Feeling great\""},
|
||||
@depth=0,
|
||||
@kind="garden_diary",
|
||||
@lipmaa="NONE",
|
||||
@prev="NONE",
|
||||
@signature="QNY...208">
|
||||
```
|
||||
|
@ -168,7 +166,6 @@ puts my_message.render
|
|||
# author USER.6DQ4RRNBKJ2T4EY5E1GZYYX6X6SZXV1W0GNH1HA4KGKA5KZ2Y2DG
|
||||
# depth 0
|
||||
# kind garden_diary
|
||||
# lipmaa NONE
|
||||
# prev NONE
|
||||
#
|
||||
# greeting:"Hello, world!"
|
||||
|
@ -195,7 +192,6 @@ message = db.add_message("garden_entry", {"message_text" => "The basil is just O
|
|||
# @body={"message_text"=>"\"The basil is just OK\"", "current_mood"=>"\"content\""},
|
||||
# @depth=1,
|
||||
# @kind="garden_entry",
|
||||
# @lipmaa="NONE",
|
||||
# @prev="TEXT.NPNQZAP9CB79GP8J0SN52F38EBJ9WV370HX6MVZD3XB804TVQQB0",
|
||||
# @signature="95E...J3G">
|
||||
|
||||
|
@ -203,7 +199,6 @@ puts message.render
|
|||
# author USER.6DQ4RRNBKJ2T4EY5E1GZYYX6X6SZXV1W0GNH1HA4KGKA5KZ2Y2DG
|
||||
# depth 1
|
||||
# kind garden_entry
|
||||
# lipmaa NONE
|
||||
# prev TEXT.NPNQZAP9CB79GP8J0SN52F38EBJ9WV370HX6MVZD3XB804TVQQB0
|
||||
#
|
||||
# message_text:"The basil is just OK"
|
||||
|
@ -231,7 +226,6 @@ old_message = db.read_message("TEXT.444CC4NFHGQDQEZ6B6HSEPNZAZ80RSQF8TCAX8QR9NBR
|
|||
# @body={"message_text"=>"\"The basil is just OK\"", "current_mood"=>"\"content\""},
|
||||
# @depth=1,
|
||||
# @kind="garden_entry",
|
||||
# @lipmaa="NONE",
|
||||
# @prev="TEXT.NPNQZAP9CB79GP8J0SN52F38EBJ9WV370HX6MVZD3XB804TVQQB0",
|
||||
# @signature="95E...J3G">
|
||||
|
||||
|
@ -239,7 +233,6 @@ puts old_message.render
|
|||
# author USER.6DQ4RRNBKJ2T4EY5E1GZYYX6X6SZXV1W0GNH1HA4KGKA5KZ2Y2DG
|
||||
# depth 1
|
||||
# kind garden_entry
|
||||
# lipmaa NONE
|
||||
# prev TEXT.NPNQZAP9CB79GP8J0SN52F38EBJ9WV370HX6MVZD3XB804TVQQB0
|
||||
|
||||
# message_text:"The basil is just OK"
|
||||
|
@ -367,7 +360,6 @@ puts msg.render
|
|||
# author USER.6DQ4RRNBKJ2T4EY5E1GZYYX6X6SZXV1W0GNH1HA4KGKA5KZ2Y2DG
|
||||
# depth 2
|
||||
# kind photo
|
||||
# lipmaa NONE
|
||||
# prev TEXT.444CC4NFHGQDQEZ6B6HSEPNZAZ80RSQF8TCAX8QR9NBR5T0XX92G
|
||||
#
|
||||
# my_cat_picture:FILE.FV0FJ0YZADY7C5JTTFYPKDBHTZJ5JVVP5TCKP0605WWXYJG4VMRG
|
||||
|
|
|
@ -1,29 +1,26 @@
|
|||
author USER.09XBQDDGZPEKFBFBY67XNR5QA0TRWAKYKYNEDNQTZJV0F1JB0DGG
|
||||
author USER.59X51RSZQZR15BX86VDWG37AAMVP43PTBWD1WS66FQFCDPHAQDZ0
|
||||
depth 0
|
||||
kind example
|
||||
lipmaa NONE
|
||||
prev NONE
|
||||
|
||||
file_name:FILE.FV0FJ0YZADY7C5JTTFYPKDBHTZJ5JVVP5TCKP0605WWXYJG4VMRG
|
||||
|
||||
signature ZYSCKNFP8TW9DME9P9DK4Z4RV09APVEE762HK628K18NMS4DX084XKED71TCRXJNZBWY3TWDYVK1W3K496QF7Y55SCKEWP1D0SP5R30
|
||||
signature N33N7D8KFFVVPHTDE17JS7708YPAVF2F0F0AZS1FFW3D15ZH1K3HEFNQJK7KT7NMSAF8PDC1YDD5M57NPG2PTEEYPBKC1G3HFHN3J08
|
||||
|
||||
author USER.09XBQDDGZPEKFBFBY67XNR5QA0TRWAKYKYNEDNQTZJV0F1JB0DGG
|
||||
author USER.59X51RSZQZR15BX86VDWG37AAMVP43PTBWD1WS66FQFCDPHAQDZ0
|
||||
depth 1
|
||||
kind example
|
||||
lipmaa NONE
|
||||
prev TEXT.RGKRHC0APNN9FCJTVBN1NR1ZYQ9ZY34PYYASSMJ6016S30ZTWHR0
|
||||
prev TEXT.S5G187G11N2T76E2TSPS40K5QEY6S9ZC68TKEVH7JBPN27VDTKY0
|
||||
|
||||
file_name:FILE.YPF11E5N9JFVB6KB1N1WDVVT9DXMCHE0XJWBZHT2CQ29S5SEPCSG
|
||||
|
||||
signature GAZGWG8PWZSP4VSSNYD8J873CQ6KDM93SBMA9VGGC1YW66FER96HEGZQ4CJBH51YN22WMGYADNY2SCWS0JY6YPX4APFDQ60X751JJ1R
|
||||
signature 53454CZKNSBK4D8NZCKWRWWE37DVANJWCS891XGRR2M8M4AJP2XNTC86MQAWAMYX3W517KWW6JD9MX3FMXNNBQ1TJS5HSK9CTW9G018
|
||||
|
||||
author USER.09XBQDDGZPEKFBFBY67XNR5QA0TRWAKYKYNEDNQTZJV0F1JB0DGG
|
||||
author USER.59X51RSZQZR15BX86VDWG37AAMVP43PTBWD1WS66FQFCDPHAQDZ0
|
||||
depth 2
|
||||
kind example
|
||||
lipmaa NONE
|
||||
prev TEXT.Z3QS1HPX756E22XWKXAXH7NTSTJGY0AHEM9KQNATTC6HHCACZGN0
|
||||
prev TEXT.5BBGSKGBHKYE6R0SJSZAGNEQA8PGJ5CMTQD1XGKKP2CHYPZR8G90
|
||||
|
||||
file_name:FILE.622PRNJ7C0S05XR2AHDPKWMG051B1QW5SXMN2RQHF2AND6J8VGPG
|
||||
|
||||
signature W94BVC4ED00Z4TJC0T3BEVC63RJYJC1J4DDS13BJTTGGXK40JSX276B9MV3GPS5JJHZW92YKAZNZ1Q4DCG0K58SCD9ZD0TVZVX7100G
|
||||
signature JVN1YPVA637NF6GGPCX8GXT5FXTZPA1YM68ZWQQNXYD36CX0PSDBHXQMY7PMJYMCPFYW5BR56P2GVETM8AVYSKAFSYPVM3F7KVDW020
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 63 KiB |
|
@ -1,29 +1,35 @@
|
|||
author USER.Q62ZN46TV1HHYBBD7EFSKWTJQ32PGMYKYXM0GVVM121F8R21RAWG
|
||||
author USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0
|
||||
depth 0
|
||||
kind unit_test1
|
||||
lipmaa NONE
|
||||
kind nonsense
|
||||
prev NONE
|
||||
|
||||
example:"Just block me"
|
||||
|
||||
signature 0N0B419YSCHYM82YWGBB6VF0MHHCS0ACGBKD8MYMTGS59XC1T60W2JHKHEW9ZQJW53KTJMVB3MGV3JTFKZWQH9QMAAWG3DE6AQ6SJ30
|
||||
|
||||
author USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0
|
||||
depth 1
|
||||
kind unit_test1
|
||||
prev TEXT.839FP9NB9E1KFG17SZF49X57B9AYNNX1HQ8DGVE940BPWCRXS82G
|
||||
|
||||
foo:"bar"
|
||||
|
||||
signature HAM8XEPCAB81P0A5DQKZ3DQG19Q06KR1G4RZ28CX4EXYCZA1A1MPVBQG540EZQSWHS46W523GJK4K3EWM4C0NWSM7NNG99AMJ70VC1G
|
||||
signature 7YC6P4AJMPV3JH57JV0AHDP0ZV59WZYKHF49DEM2CJP5ZQCVR4XN6RMS18SBE5S2YXAFG05FA8S3B2YC35CH464822ZQXTCMN2F9G3R
|
||||
|
||||
author USER.Q62ZN46TV1HHYBBD7EFSKWTJQ32PGMYKYXM0GVVM121F8R21RAWG
|
||||
depth 1
|
||||
author USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0
|
||||
depth 2
|
||||
kind unit_test2
|
||||
lipmaa NONE
|
||||
prev TEXT.DHSWRP0B9241KZ680WJAHVCVR4C79SH5NN3JCE3HFG9DB51WXC2G
|
||||
prev TEXT.XHHQMFDK1DQSVXQ0XJQDSZQWXF8BNQ1QNRZW4K9V34264MF3WSFG
|
||||
|
||||
bar:"baz"
|
||||
|
||||
signature S0CSCTVWQ8R827XP4RNW7MQSQ5AT4EPG0AWF259R4ZWR3C83AZYPARXQXZ9Q32GPKEEWTC9RAKC00A0RTHZCETR712D8T7WVV9RBE18
|
||||
signature 5YBYC1RSB27WZ00H567RP1YAYBW30PAVHG3ZG55VY2R137YMPZZ0ZMD4T7MJ8RYCMTT72AN4WCN7QAS1NPAPQE134TE8CX7PH2TFM2R
|
||||
|
||||
author USER.Q62ZN46TV1HHYBBD7EFSKWTJQ32PGMYKYXM0GVVM121F8R21RAWG
|
||||
depth 2
|
||||
author USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0
|
||||
depth 3
|
||||
kind unit_test3
|
||||
lipmaa NONE
|
||||
prev TEXT.8DPH5WX4DWWQ7DF9DBKYMT69Y44XNHHM8W8MV5BNQ7RYRM3W4NSG
|
||||
prev TEXT.DG0BZ241KY8E60C1F88MTZNEDDBQFZS4EMCNR23VD6Y6RZGNEXSG
|
||||
|
||||
cats:"meow"
|
||||
|
||||
signature G9NC8H0SJGZ6KKQFM6V9VCGVK5FS0MM6B6G1RHJ09EM1ACVQSJPMHBB8YJYPZWXX2EDRD4MMKYEZ6725RAAXYY42KXZC9PPRVVGKR3G
|
||||
signature QWHA8KHSVFBC0X84VH2F2BS3CSCY58ER4ETXH1WB8SEEMDBS0TBAQHA2HNK1W7VDATBVZHB7EHWNYEN86HYBKK7BBMNSSMR45CEG838
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
author USER.FFQE19PEB55S1JMT5CVWZXK6V9D6E54GG8SK31QRXBDGF2AGHW50
|
||||
author USER.YJTH2BBAAAXK2RYKWRXYE0E0ANME1YPZPD8TV5VCS40X3D75AJ3G
|
||||
depth 0
|
||||
kind nonsense
|
||||
lipmaa NONE
|
||||
prev NONE
|
||||
|
||||
example:"Just block me"
|
||||
|
||||
signature ZCP05Q1N8147YT47M5TY84D3K5MW3AB428CQDA5DK57D0J8PH5V7WWZDG2YYET04YCTM9KN2V847Q5SNS6J04HPNP8RW9B9D0EVX610
|
||||
signature 3WD5EJCMZZ27JJ8EQZ3M5XNK3QZ40A5T894Q27ZVMBT4T65KVZWK5PC74F54DX5EB3D3EFYQJQ5C1D9X2J22QKAJHTSG3B7SC932W28
|
||||
|
|
|
@ -40,7 +40,8 @@ RSpec.describe Pigeon::Message do
|
|||
|
||||
it "does not ingest messages from blocked peers" do
|
||||
db.reset_database
|
||||
antagonist = "USER.FFQE19PEB55S1JMT5CVWZXK6V9D6E54GG8SK31QRXBDGF2AGHW50"
|
||||
expect(db.all_messages.count).to eq(0)
|
||||
antagonist = "USER.YJTH2BBAAAXK2RYKWRXYE0E0ANME1YPZPD8TV5VCS40X3D75AJ3G"
|
||||
db.block_peer(antagonist)
|
||||
db.import_bundle(BLOCKED_PEER_FIXTURE_PATH)
|
||||
expect(db.all_messages.count).to eq(0)
|
||||
|
|
|
@ -20,7 +20,6 @@ RSpec.describe Pigeon::Draft do
|
|||
"author DRAFT",
|
||||
"depth DRAFT",
|
||||
"kind unit_test",
|
||||
"lipmaa DRAFT",
|
||||
"prev DRAFT",
|
||||
"\na:\"bar\"",
|
||||
"b:FILE.CHHABX8Q9D9Q0BY2BBZ6FA7SMAFNE9GGMSDTZVZZC9TK2N9F15QG",
|
||||
|
|
|
@ -1,22 +1,4 @@
|
|||
RSpec.describe Pigeon::Helpers do
|
||||
it "creates lipmalinks" do
|
||||
[
|
||||
[-1, nil],
|
||||
[0, nil],
|
||||
[1, nil],
|
||||
[2, nil],
|
||||
[3, nil],
|
||||
[4, 1],
|
||||
[5, nil],
|
||||
[6, nil],
|
||||
[7, nil],
|
||||
[8, 4],
|
||||
[13, 4],
|
||||
].each do |(input, expected)|
|
||||
expect(Pigeon::Helpers.lipmaa(input)).to eq(expected)
|
||||
end
|
||||
end
|
||||
|
||||
it "handles Crockford Base 32 values" do
|
||||
10.times do
|
||||
raw_bytes = SecureRandom.random_bytes(32)
|
||||
|
|
|
@ -2,43 +2,48 @@ require "spec_helper"
|
|||
|
||||
RSpec.describe Pigeon::Lexer do
|
||||
EXPECTED_TOKENS1 = [
|
||||
[:AUTHOR, "USER.Q62ZN46TV1HHYBBD7EFSKWTJQ32PGMYKYXM0GVVM121F8R21RAWG", 65],
|
||||
[:AUTHOR, "USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0", 65],
|
||||
[:DEPTH, 0, 73],
|
||||
[:KIND, "unit_test1", 89],
|
||||
[:LIPMAA, "NONE", 101],
|
||||
[:PREV, "NONE", 111],
|
||||
[:HEADER_END, 112],
|
||||
[:BODY_ENTRY, "foo", "\"bar\"", 122],
|
||||
[:KIND, "nonsense", 87],
|
||||
[:PREV, "NONE", 97],
|
||||
[:HEADER_END, 98],
|
||||
[:BODY_ENTRY, "example", "\"Just block me\"", 122],
|
||||
[:BODY_END, 123],
|
||||
[:SIGNATURE, "HAM8XEPCAB81P0A5DQKZ3DQG19Q06KR1G4RZ28CX4EXYCZA1A1MPVBQG540EZQSWHS46W523GJK4K3EWM4C0NWSM7NNG99AMJ70VC1G", 237],
|
||||
[:SIGNATURE, "0N0B419YSCHYM82YWGBB6VF0MHHCS0ACGBKD8MYMTGS59XC1T60W2JHKHEW9ZQJW53KTJMVB3MGV3JTFKZWQH9QMAAWG3DE6AQ6SJ30", 237],
|
||||
[:MESSAGE_DELIM, 238],
|
||||
[:AUTHOR, "USER.Q62ZN46TV1HHYBBD7EFSKWTJQ32PGMYKYXM0GVVM121F8R21RAWG", 303],
|
||||
[:AUTHOR, "USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0", 303],
|
||||
[:DEPTH, 1, 311],
|
||||
[:KIND, "unit_test2", 327],
|
||||
[:LIPMAA, "NONE", 339],
|
||||
[:PREV, "TEXT.DHSWRP0B9241KZ680WJAHVCVR4C79SH5NN3JCE3HFG9DB51WXC2G", 402],
|
||||
[:HEADER_END, 403],
|
||||
[:BODY_ENTRY, "bar", "\"baz\"", 413],
|
||||
[:BODY_END, 414],
|
||||
[:SIGNATURE, "S0CSCTVWQ8R827XP4RNW7MQSQ5AT4EPG0AWF259R4ZWR3C83AZYPARXQXZ9Q32GPKEEWTC9RAKC00A0RTHZCETR712D8T7WVV9RBE18", 528],
|
||||
[:MESSAGE_DELIM, 529],
|
||||
[:AUTHOR, "USER.Q62ZN46TV1HHYBBD7EFSKWTJQ32PGMYKYXM0GVVM121F8R21RAWG", 594],
|
||||
[:DEPTH, 2, 602],
|
||||
[:KIND, "unit_test3", 618],
|
||||
[:LIPMAA, "NONE", 630],
|
||||
[:PREV, "TEXT.8DPH5WX4DWWQ7DF9DBKYMT69Y44XNHHM8W8MV5BNQ7RYRM3W4NSG", 693],
|
||||
[:HEADER_END, 694],
|
||||
[:BODY_ENTRY, "cats", "\"meow\"", 706],
|
||||
[:BODY_END, 707],
|
||||
[:SIGNATURE, "G9NC8H0SJGZ6KKQFM6V9VCGVK5FS0MM6B6G1RHJ09EM1ACVQSJPMHBB8YJYPZWXX2EDRD4MMKYEZ6725RAAXYY42KXZC9PPRVVGKR3G", 821],
|
||||
[:MESSAGE_DELIM, 821],
|
||||
].freeze
|
||||
[:KIND, "unit_test1", 327],
|
||||
[:PREV, "TEXT.839FP9NB9E1KFG17SZF49X57B9AYNNX1HQ8DGVE940BPWCRXS82G", 390],
|
||||
[:HEADER_END, 391],
|
||||
[:BODY_ENTRY, "foo", "\"bar\"", 401],
|
||||
[:BODY_END, 402],
|
||||
[:SIGNATURE, "7YC6P4AJMPV3JH57JV0AHDP0ZV59WZYKHF49DEM2CJP5ZQCVR4XN6RMS18SBE5S2YXAFG05FA8S3B2YC35CH464822ZQXTCMN2F9G3R", 516],
|
||||
[:MESSAGE_DELIM, 517],
|
||||
[:AUTHOR, "USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0", 582],
|
||||
[:DEPTH, 2, 590],
|
||||
[:KIND, "unit_test2", 606],
|
||||
[:PREV, "TEXT.XHHQMFDK1DQSVXQ0XJQDSZQWXF8BNQ1QNRZW4K9V34264MF3WSFG", 669],
|
||||
[:HEADER_END, 670],
|
||||
[:BODY_ENTRY, "bar", "\"baz\"", 680],
|
||||
[:BODY_END, 681],
|
||||
[:SIGNATURE, "5YBYC1RSB27WZ00H567RP1YAYBW30PAVHG3ZG55VY2R137YMPZZ0ZMD4T7MJ8RYCMTT72AN4WCN7QAS1NPAPQE134TE8CX7PH2TFM2R", 795],
|
||||
[:MESSAGE_DELIM, 796],
|
||||
[:AUTHOR, "USER.3VX92CSQKDK854SYDMESAP6SQKKDMB5Q6XP6HVNETYS064BA0WP0", 861],
|
||||
[:DEPTH, 3, 869],
|
||||
[:KIND, "unit_test3", 885],
|
||||
[:PREV, "TEXT.DG0BZ241KY8E60C1F88MTZNEDDBQFZS4EMCNR23VD6Y6RZGNEXSG", 948],
|
||||
[:HEADER_END, 949],
|
||||
[:BODY_ENTRY, "cats", "\"meow\"", 961],
|
||||
[:BODY_END, 962],
|
||||
[:SIGNATURE, "QWHA8KHSVFBC0X84VH2F2BS3CSCY58ER4ETXH1WB8SEEMDBS0TBAQHA2HNK1W7VDATBVZHB7EHWNYEN86HYBKK7BBMNSSMR45CEG838", 1076],
|
||||
[:MESSAGE_DELIM, 1076],
|
||||
]
|
||||
|
||||
MESSAGE_LINES = [
|
||||
"author @VG44QCHKA38E7754RQ5DAFBMMD2CCZQRZ8BR2J4MRHHGVTHGW670",
|
||||
"depth 0",
|
||||
"kind unit_test",
|
||||
"lipmaa NONE",
|
||||
"prev NONE",
|
||||
"",
|
||||
"foo:\"bar\"",
|
||||
|
|
|
@ -48,7 +48,6 @@ RSpec.describe Pigeon::Message do
|
|||
"author __AUTHOR__",
|
||||
"depth 0",
|
||||
"kind unit_test",
|
||||
"lipmaa NONE",
|
||||
"prev NONE",
|
||||
"",
|
||||
"a:\"bar\"",
|
||||
|
@ -135,7 +134,6 @@ RSpec.describe Pigeon::Message do
|
|||
[:KIND, "invalid"],
|
||||
[:PREV, "NONE"],
|
||||
[:DEPTH, 10],
|
||||
[:LIPMAA, "TEXT.4PE7S4XCCAYPQ42S98K730CEW6ME5HRWJKHHEGYVYPFHSJWXEY1G"],
|
||||
[:HEADER_END],
|
||||
[:BODY_ENTRY, "duplicate", "This key is a duplicate."],
|
||||
[:SIGNATURE, "DN7yPTE-m433ND3jBL4oM23XGxBKafjq0Dp9ArBQa_TIGU7DmCxTumieuPBN-NKxlx_0N7-c5zjLb5XXVHYPCQ=="],
|
||||
|
|
|
@ -14,7 +14,6 @@ RSpec.describe Pigeon::Lexer do
|
|||
[:KIND, "invalid"],
|
||||
[:PREV, "NONE"],
|
||||
[:DEPTH, 0],
|
||||
[:LIPMAA, Pigeon::Helpers.lipmaa(0)],
|
||||
[:HEADER_END],
|
||||
[:BODY_ENTRY, "duplicate", "Pigeon does not allow duplicate keys."],
|
||||
[:BODY_ENTRY, "duplicate", "This key is a duplicate."],
|
||||
|
@ -24,14 +23,22 @@ RSpec.describe Pigeon::Lexer do
|
|||
|
||||
it "parses tokens" do
|
||||
results = Pigeon::Parser.parse(db, tokens)
|
||||
expect(results.length).to eq(3)
|
||||
expect(results.length).to eq(4)
|
||||
expected_sigs = [
|
||||
"0N0B419YSCHYM82YWGBB6VF0MHHCS0ACGBKD8MYMTGS59XC1T60W2JHKHEW9ZQJW53KTJMVB3MGV3JTFKZWQH9QMAAWG3DE6AQ6SJ30",
|
||||
"7YC6P4AJMPV3JH57JV0AHDP0ZV59WZYKHF49DEM2CJP5ZQCVR4XN6RMS18SBE5S2YXAFG05FA8S3B2YC35CH464822ZQXTCMN2F9G3R",
|
||||
"5YBYC1RSB27WZ00H567RP1YAYBW30PAVHG3ZG55VY2R137YMPZZ0ZMD4T7MJ8RYCMTT72AN4WCN7QAS1NPAPQE134TE8CX7PH2TFM2R",
|
||||
"QWHA8KHSVFBC0X84VH2F2BS3CSCY58ER4ETXH1WB8SEEMDBS0TBAQHA2HNK1W7VDATBVZHB7EHWNYEN86HYBKK7BBMNSSMR45CEG838",
|
||||
].sort
|
||||
actual_sigs = results.map { |x| x.signature }.sort
|
||||
expect(actual_sigs - expected_sigs).to eq([])
|
||||
expect(results.first).to be_kind_of(Pigeon::Message)
|
||||
expect(results.last).to be_kind_of(Pigeon::Message)
|
||||
end
|
||||
|
||||
it "ingests and reconstructs a bundle" do
|
||||
messages = db.import_bundle("./spec/fixtures/normal")
|
||||
expect(messages.length).to eq(3)
|
||||
expect(messages.length).to eq(4)
|
||||
expect(messages.map(&:class).uniq).to eq([Pigeon::Message])
|
||||
re_bundled = messages.map(&:render).join("\n\n") + "\n"
|
||||
expect(re_bundled).to eq(example_bundle)
|
||||
|
|
|
@ -1,13 +1,12 @@
|
|||
require "spec_helper"
|
||||
|
||||
RSpec.describe Pigeon::MessageSerializer do
|
||||
SHIM_ATTRS = %i[author body kind depth prev signature lipmaa].freeze
|
||||
SHIM_ATTRS = %i[author body kind depth prev signature].freeze
|
||||
MessageShim = Struct.new(*SHIM_ATTRS)
|
||||
TOP_HALF = [
|
||||
"author FAKE_AUTHOR",
|
||||
"\ndepth 23",
|
||||
"\nkind FAKE_KIND",
|
||||
"\nlipmaa 22",
|
||||
"\nprev NONE",
|
||||
"\n\nfoo:\"bar\"\n\n",
|
||||
].join("")
|
||||
|
@ -28,7 +27,6 @@ RSpec.describe Pigeon::MessageSerializer do
|
|||
depth: 23,
|
||||
prev: nil,
|
||||
signature: "XYZ",
|
||||
lipmaa: 22,
|
||||
}.values
|
||||
message = MessageShim.new(*params)
|
||||
template = Pigeon::MessageSerializer.new(message)
|
||||
|
|
Loading…
Reference in New Issue