TODO: Continue removing footer / renaming sigils. 33 examples, 17 failures
This commit is contained in:
parent
351f7db3e7
commit
c10b809193
|
@ -46,10 +46,8 @@ module Pigeon
|
|||
|
||||
BLOB_SIGIL = "FILE."
|
||||
MESSAGE_SIGIL = "TEXT."
|
||||
IDENTITY_SIGIL = "TEXT."
|
||||
IDENTITY_SIGIL = "USER."
|
||||
STRING_SIGIL = "\""
|
||||
IDENTITY_FOOTER = ".ed25519"
|
||||
SIG_FOOTER = ".sig.ed25519"
|
||||
|
||||
# Error messages
|
||||
PREV_REQUIRES_SAVE = "Can't fetch `prev` on unsaved messages"
|
||||
|
@ -61,8 +59,6 @@ module Pigeon
|
|||
RUNAWAY_LOOP = "RUNAWAY LOOP DETECTED"
|
||||
|
||||
# Constants for internal use only:
|
||||
FOOTERS_REGEX = Regexp.new("#{SIG_FOOTER}|#{IDENTITY_FOOTER}")
|
||||
SIG_RANGE = (SIG_FOOTER.length * -1)..-1
|
||||
BLOB_BYTE_LIMIT = 360_000
|
||||
|
||||
class Helpers
|
||||
|
@ -270,11 +266,8 @@ module Pigeon
|
|||
end
|
||||
|
||||
def self.decode_multihash(string)
|
||||
if string[SIG_RANGE] == SIG_FOOTER
|
||||
return b32_decode(string.gsub(SIG_FOOTER, ""))
|
||||
else
|
||||
return b32_decode(string[1..].gsub(FOOTERS_REGEX, ""))
|
||||
end
|
||||
# "FEED.", "FILE.", "USER." etc..
|
||||
return b32_decode(string[5..])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -23,7 +23,7 @@ module Pigeon
|
|||
def []=(key, value)
|
||||
raise STRING_KEYS_ONLY unless key.is_a?(String)
|
||||
|
||||
case value[0]
|
||||
case value[0..4]
|
||||
when BLOB_SIGIL, MESSAGE_SIGIL, IDENTITY_SIGIL, STRING_SIGIL
|
||||
body[key] = value
|
||||
else
|
||||
|
|
|
@ -58,7 +58,7 @@ module Pigeon
|
|||
# TODO: Create regexes using string and Regexp.new() for cleaner regexes.
|
||||
NUMERIC = /\d{1,7}/
|
||||
NULL_VALUE = /NONE/
|
||||
FEED_VALUE = /FEED.{52}/
|
||||
FEED_VALUE = /USER.{52}/
|
||||
MESG_VALUE = /TEXT.{52}/
|
||||
BLOB_VALUE = /FILE.{52}/
|
||||
STRG_VALUE = /".{1,128}"/
|
||||
|
@ -80,7 +80,7 @@ module Pigeon
|
|||
PREV = /prev (#{MESG_VALUE}|#{NULL_VALUE})\n/
|
||||
KIND = /kind #{ALPHANUMERICISH}\n/
|
||||
BODY_ENTRY = /#{ALPHANUMERICISH}:#{ANY_VALUE}\n/
|
||||
FOOTER_ENTRY = /signature .*{103}\.sig\.ed25519\n?/
|
||||
FOOTER_ENTRY = /signature .*{103}\n?/
|
||||
|
||||
LEXER_STATES = [HEADER = :header, BODY = :body, FOOTER = :footer]
|
||||
|
||||
|
|
|
@ -21,13 +21,12 @@ module Pigeon
|
|||
bytes = @signing_key.verify_key.to_bytes
|
||||
b64 = Helpers.b32_encode(bytes)
|
||||
|
||||
@multihash ||= [IDENTITY_SIGIL, b64, IDENTITY_FOOTER].join("")
|
||||
@multihash ||= [IDENTITY_SIGIL, b64].join("")
|
||||
end
|
||||
|
||||
def sign(string)
|
||||
hex = @signing_key.sign(string)
|
||||
b64 = Helpers.b32_encode(hex)
|
||||
b64 + SIG_FOOTER
|
||||
Helpers.b32_encode(hex)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -12,7 +12,7 @@ module Pigeon
|
|||
tpl = render
|
||||
digest = Digest::SHA256.digest(tpl)
|
||||
sha256 = Helpers.b32_encode(digest)
|
||||
"#{MESSAGE_SIGIL}#{sha256}#{BLOB_FOOTER}"
|
||||
"#{MESSAGE_SIGIL}#{sha256}"
|
||||
end
|
||||
|
||||
def initialize(author:,
|
||||
|
|
|
@ -60,7 +60,7 @@ module Pigeon
|
|||
|
||||
raw_digest = Digest::SHA256.digest(data)
|
||||
b32_hash = Helpers.b32_encode(raw_digest)
|
||||
multihash = [BLOB_SIGIL, b32_hash, BLOB_FOOTER].join("")
|
||||
multihash = "#{BLOB_SIGIL}#{b32_hash}"
|
||||
write_to_disk(multihash, data)
|
||||
multihash
|
||||
end
|
||||
|
|
Before Width: | Height: | Size: 708 B After Width: | Height: | Size: 708 B |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
@ -40,7 +40,7 @@ RSpec.describe Pigeon::Message do
|
|||
|
||||
it "does not ingest messages from blocked peers" do
|
||||
db.reset_database
|
||||
antagonist = "TEXT.YDVX7JWTVNRFEVYC8E8DS9MVWW9KB66F1XQYMNB2FQ6QBPXKAQX0.ed25519"
|
||||
antagonist = "TEXT.YDVX7JWTVNRFEVYC8E8DS9MVWW9KB66F1XQYMNB2FQ6QBPXKAQX0"
|
||||
db.block_peer(antagonist)
|
||||
db.import_bundle(BLOCKED_PEER_FIXTURE_PATH)
|
||||
expect(db.all_messages.count).to eq(0)
|
||||
|
|
|
@ -23,7 +23,7 @@ RSpec.describe Pigeon::Draft do
|
|||
"lipmaa DRAFT",
|
||||
"prev DRAFT",
|
||||
"\na:\"bar\"",
|
||||
"b:&CHHABX8Q9D9Q0BY2BBZ6FA7SMAFNE9GGMSDTZVZZC9TK2N9F15QG.sha256",
|
||||
"b:FILE.CHHABX8Q9D9Q0BY2BBZ6FA7SMAFNE9GGMSDTZVZZC9TK2N9F15QG",
|
||||
"\n",
|
||||
].join("\n")
|
||||
|
||||
|
@ -40,10 +40,7 @@ RSpec.describe Pigeon::Draft do
|
|||
hash = db.add_blob(File.read("./logo.png"))
|
||||
expectations = {
|
||||
kind: "unit_test",
|
||||
body: {
|
||||
"a" => "bar".to_json,
|
||||
"b" => hash,
|
||||
},
|
||||
body: { "a" => "bar".to_json, "b" => hash },
|
||||
}
|
||||
db.update_draft("a", "bar")
|
||||
db.update_draft("b", hash)
|
||||
|
|
|
@ -2,7 +2,7 @@ require "spec_helper"
|
|||
|
||||
RSpec.describe Pigeon::Lexer do
|
||||
EXPECTED_TOKENS1 = [
|
||||
[:AUTHOR, "TEXT.3DWXGXHXCB02WV1TEA47J43HHTTBNMM496ANME7FZ2SYPGA9KTZG.ed25519", 69],
|
||||
[:AUTHOR, "TEXT.3DWXGXHXCB02WV1TEA47J43HHTTBNMM496ANME7FZ2SYPGA9KTZG", 69],
|
||||
[:DEPTH, 0, 77],
|
||||
[:KIND, "unit_test1", 93],
|
||||
[:LIPMAA, "NONE", 105],
|
||||
|
@ -10,32 +10,32 @@ RSpec.describe Pigeon::Lexer do
|
|||
[:HEADER_END, 116],
|
||||
[:BODY_ENTRY, "foo", "\"bar\"", 126],
|
||||
[:BODY_END, 127],
|
||||
[:SIGNATURE, "2BTX69F6E30BBDNQ0XTT20NCG8C0B393SGQSW5M00G8KF33CAE1YB1MPT760KSTRV2ZJCCNJ883JXEWTTTEEJ8JBHNWEJQFSZ035P0R.sig.ed25519", 253],
|
||||
[:SIGNATURE, "2BTX69F6E30BBDNQ0XTT20NCG8C0B393SGQSW5M00G8KF33CAE1YB1MPT760KSTRV2ZJCCNJ883JXEWTTTEEJ8JBHNWEJQFSZ035P0R", 253],
|
||||
[:MESSAGE_DELIM, 254],
|
||||
[:AUTHOR, "TEXT.3DWXGXHXCB02WV1TEA47J43HHTTBNMM496ANME7FZ2SYPGA9KTZG.ed25519", 323],
|
||||
[:AUTHOR, "TEXT.3DWXGXHXCB02WV1TEA47J43HHTTBNMM496ANME7FZ2SYPGA9KTZG", 323],
|
||||
[:DEPTH, 1, 331],
|
||||
[:KIND, "unit_test2", 347],
|
||||
[:LIPMAA, "NONE", 359],
|
||||
[:PREV, "TEXT.RW61BRVRAAM31RFPQ8W6MTYBN840Y898MQ2GTDRSMQES84RPJKHG.sha256", 425],
|
||||
[:PREV, "TEXT.RW61BRVRAAM31RFPQ8W6MTYBN840Y898MQ2GTDRSMQES84RPJKHG", 425],
|
||||
[:HEADER_END, 426],
|
||||
[:BODY_ENTRY, "bar", "\"baz\"", 436],
|
||||
[:BODY_END, 437],
|
||||
[:SIGNATURE, "TXC15FZZVK30Q5ZRERFR9VXAJ8KKE58ZGF1JEBNETJN1MHN9EGRQJP7PX99NBZMX177XZWE3M2PCPPF4VBN4J93W2H5FTNJ7K7VG818.sig.ed25519", 563],
|
||||
[:SIGNATURE, "TXC15FZZVK30Q5ZRERFR9VXAJ8KKE58ZGF1JEBNETJN1MHN9EGRQJP7PX99NBZMX177XZWE3M2PCPPF4VBN4J93W2H5FTNJ7K7VG818", 563],
|
||||
[:MESSAGE_DELIM, 564],
|
||||
[:AUTHOR, "TEXT.3DWXGXHXCB02WV1TEA47J43HHTTBNMM496ANME7FZ2SYPGA9KTZG.ed25519", 633],
|
||||
[:AUTHOR, "TEXT.3DWXGXHXCB02WV1TEA47J43HHTTBNMM496ANME7FZ2SYPGA9KTZG", 633],
|
||||
[:DEPTH, 2, 641],
|
||||
[:KIND, "unit_test3", 657],
|
||||
[:LIPMAA, "NONE", 669],
|
||||
[:PREV, "TEXT.CSX0CDPY96DGTGT9V0TNZJ4S84JTSK4AYNE193VXF8AH9ZJHT82G.sha256", 735],
|
||||
[:PREV, "TEXT.CSX0CDPY96DGTGT9V0TNZJ4S84JTSK4AYNE193VXF8AH9ZJHT82G", 735],
|
||||
[:HEADER_END, 736],
|
||||
[:BODY_ENTRY, "cats", "\"meow\"", 748],
|
||||
[:BODY_END, 749],
|
||||
[:SIGNATURE, "91TBR3H90720KGA8FPSSEPHB1R6QGZ0YGTC2T6RT1GBWV9TNR95CWHF0KB4P57RMJQPSC6EA6D5FDN5PC8VM7V8BC32F17V9R9VDR0G.sig.ed25519", 875],
|
||||
[:SIGNATURE, "91TBR3H90720KGA8FPSSEPHB1R6QGZ0YGTC2T6RT1GBWV9TNR95CWHF0KB4P57RMJQPSC6EA6D5FDN5PC8VM7V8BC32F17V9R9VDR0G", 875],
|
||||
[:MESSAGE_DELIM, 875],
|
||||
].freeze
|
||||
|
||||
MESSAGE_LINES = [
|
||||
"author @VG44QCHKA38E7754RQ5DAFBMMD2CCZQRZ8BR2J4MRHHGVTHGW670.ed25519",
|
||||
"author @VG44QCHKA38E7754RQ5DAFBMMD2CCZQRZ8BR2J4MRHHGVTHGW670",
|
||||
"depth 0",
|
||||
"kind unit_test",
|
||||
"lipmaa NONE",
|
||||
|
@ -43,7 +43,7 @@ RSpec.describe Pigeon::Lexer do
|
|||
"",
|
||||
"foo:\"bar\"",
|
||||
"",
|
||||
"signature hHvhdvUcrabhFPz52GSGa9_iuudOsGEEE7S0o0WJLqjQyhLfgUy72yppHXsG6T4E21p6EEI6B3yRcjfurxegCA==.sig.ed25519",
|
||||
"signature hHvhdvUcrabhFPz52GSGa9_iuudOsGEEE7S0o0WJLqjQyhLfgUy72yppHXsG6T4E21p6EEI6B3yRcjfurxegCA==",
|
||||
].freeze
|
||||
|
||||
let(:db) do
|
||||
|
@ -86,7 +86,7 @@ RSpec.describe Pigeon::Lexer do
|
|||
expect(hash[:DEPTH]).to eq(message.depth)
|
||||
expect(hash[:KIND]).to eq(message.kind)
|
||||
expect(hash[:PREV]).to eq Pigeon::NOTHING
|
||||
expect(hash[:SIGNATURE]).to eq(message.signature)
|
||||
expect(hash[:SIGNATURE]).to eq(messagenature)
|
||||
end
|
||||
|
||||
it "catches syntax errors" do
|
||||
|
|
|
@ -9,14 +9,13 @@ RSpec.describe Pigeon::LocalIdentity do
|
|||
HELLO_SIGNATURE = [
|
||||
"FARSW9ENM9DK1JD4M9ES1D4WWVG5SXT8Z6VXT6HXRV17M4Q9X5W2",
|
||||
"T5Y7ZZC0C5JYBTMBQ2HAQBRGWGAK42PK3BHQXAX1FPTKBFJQJ1R",
|
||||
".sig.ed25519",
|
||||
].join("")
|
||||
it "signs arbitrary data" do
|
||||
expect(kp.sign("hello")).to eq(HELLO_SIGNATURE)
|
||||
end
|
||||
|
||||
it "generates a pair from a seed" do
|
||||
x = "TEXT.XSZY1ME6QMA5BBSJ8QSDJCSG6EVDTCKYNMV221SB7B2NZR5K09J0.ed25519"
|
||||
x = "USER.XSZY1ME6QMA5BBSJ8QSDJCSG6EVDTCKYNMV221SB7B2NZR5K09J0"
|
||||
expect(kp.multihash).to eq(x)
|
||||
y = "2PRTG7F13HWF1HPW9FF9NDSYGSQS5VXQ2WMZY0A510J64AE9G840"
|
||||
expect(kp.private_key).to eq(y)
|
||||
|
@ -24,11 +23,7 @@ RSpec.describe Pigeon::LocalIdentity do
|
|||
|
||||
it "strips headers" do
|
||||
whatever = "af697f3063d46fe9546f651c08c378f8"
|
||||
example = [
|
||||
Pigeon::IDENTITY_SIGIL,
|
||||
whatever,
|
||||
Pigeon::IDENTITY_FOOTER,
|
||||
].join("")
|
||||
example = [Pigeon::IDENTITY_SIGIL, whatever].join("")
|
||||
result = Pigeon::Helpers.decode_multihash(example)
|
||||
expect(result).to eq(Pigeon::Helpers.b32_decode(whatever))
|
||||
end
|
||||
|
|
|
@ -42,7 +42,6 @@ RSpec.describe Pigeon::Message do
|
|||
expect(message.depth).to eq(0)
|
||||
expect(message.kind).to eq("unit_test")
|
||||
expect(message.prev).to eq(Pigeon::NOTHING)
|
||||
expect(message.signature.include?(Pigeon::SIG_FOOTER)).to eq(true)
|
||||
expect(message.signature.length).to be > 99
|
||||
actual = message.render
|
||||
expected = [
|
||||
|
@ -124,8 +123,8 @@ RSpec.describe Pigeon::Message do
|
|||
combinations = [[key1, sig1], [key1, sig2], [key2, sig1], [key2, sig2]]
|
||||
combinations.map { |(key, sig)| key.verify_key.verify(sig, plaintext) }
|
||||
|
||||
sig1_b64 = Pigeon::Helpers.b32_encode(sig1) + Pigeon::SIG_FOOTER
|
||||
sig2_b64 = Pigeon::Helpers.b32_encode(sig2) + Pigeon::SIG_FOOTER
|
||||
sig1_b64 = Pigeon::Helpers.b32_encode(sig1)
|
||||
sig2_b64 = Pigeon::Helpers.b32_encode(sig2)
|
||||
expect(message.signature).to eq(sig1_b64)
|
||||
expect(message.signature).to eq(sig2_b64)
|
||||
end
|
||||
|
@ -139,7 +138,7 @@ RSpec.describe Pigeon::Message do
|
|||
[:LIPMAA, "TEXT.4PE7S4XCCAYPQ42S98K730CEW6ME5HRWJKHHEGYVYPFHSJWXEY1G"],
|
||||
[:HEADER_END],
|
||||
[:BODY_ENTRY, "duplicate", "This key is a duplicate."],
|
||||
[:SIGNATURE, "DN7yPTE-m433ND3jBL4oM23XGxBKafjq0Dp9ArBQa_TIGU7DmCxTumieuPBN-NKxlx_0N7-c5zjLb5XXVHYPCQ==.sig.ed25519"],
|
||||
[:SIGNATURE, "DN7yPTE-m433ND3jBL4oM23XGxBKafjq0Dp9ArBQa_TIGU7DmCxTumieuPBN-NKxlx_0N7-c5zjLb5XXVHYPCQ=="],
|
||||
[:MESSAGE_DELIM],
|
||||
]
|
||||
e = Pigeon::Helpers::VerificationError
|
||||
|
|
|
@ -10,7 +10,7 @@ RSpec.describe Pigeon::Lexer do
|
|||
let(:tokens) { Pigeon::Lexer.tokenize(example_bundle) }
|
||||
|
||||
BAD_TOKENS = [
|
||||
[:AUTHOR, "TEXT.DYdgK1KUInVtG3lS45hA1HZ-jTuvfLKsxDpXPFCve04=.ed25519"],
|
||||
[:AUTHOR, "FEED.DYdgK1KUInVtG3lS45hA1HZ-jTuvfLKsxDpXPFCve04="],
|
||||
[:KIND, "invalid"],
|
||||
[:PREV, "NONE"],
|
||||
[:DEPTH, 0],
|
||||
|
@ -18,7 +18,7 @@ RSpec.describe Pigeon::Lexer do
|
|||
[:HEADER_END],
|
||||
[:BODY_ENTRY, "duplicate", "Pigeon does not allow duplicate keys."],
|
||||
[:BODY_ENTRY, "duplicate", "This key is a duplicate."],
|
||||
[:SIGNATURE, "DN7yPTE-m433ND3jBL4oM23XGxBKafjq0Dp9ArBQa_TIGU7DmCxTumieuPBN-NKxlx_0N7-c5zjLb5XXVHYPCQ==.sig.ed25519"],
|
||||
[:SIGNATURE, "DN7yPTE-m433ND3jBL4oM23XGxBKafjq0Dp9ArBQa_TIGU7DmCxTumieuPBN-NKxlx_0N7-c5zjLb5XXVHYPCQ=="],
|
||||
[:MESSAGE_DELIM],
|
||||
].freeze
|
||||
|
||||
|
|
|
@ -2,8 +2,8 @@ require "spec_helper"
|
|||
|
||||
RSpec.describe Pigeon::Storage do
|
||||
LOGO_BLOB = File.read("./logo.png")
|
||||
IDS = %w[@ZMWM5PSXRN7RFRMSWW1E3V5DNGC4XGGJTHKCAGB48SNRG4XXE5NG.ed25519
|
||||
@VF0Q4KXQNY6WCAXF17GAZGDPAX8XKM70SB8N7V0NSD1H370ZCJBG.ed25519].freeze
|
||||
IDS = %w[USER.ZMWM5PSXRN7RFRMSWW1E3V5DNGC4XGGJTHKCAGB48SNRG4XXE5NG
|
||||
USER.VF0Q4KXQNY6WCAXF17GAZGDPAX8XKM70SB8N7V0NSD1H370ZCJBG].freeze
|
||||
|
||||
let(:db) do
|
||||
db = Pigeon::Database.new
|
||||
|
|
Loading…
Reference in New Issue