From 8d2a721d846ae1252e66d4fe12b1fa6a580146dc Mon Sep 17 00:00:00 2001 From: Rick Carlino Date: Tue, 24 Mar 2020 08:12:35 -0500 Subject: [PATCH] Continue Pigeon::Parser. ::Message.ingest() will be required though. Everything is stubbed out, just need to get tests to pass. --- dist/pigeon/message.rb | 28 +++++++++++++++++++++++++--- dist/pigeon/parser.rb | 7 ++----- dist/pigeon/storage.rb | 3 ++- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/dist/pigeon/message.rb b/dist/pigeon/message.rb index a6a19bf..f09d4fc 100644 --- a/dist/pigeon/message.rb +++ b/dist/pigeon/message.rb @@ -4,6 +4,7 @@ module Pigeon class Message attr_reader :author, :kind, :body, :signature, :depth, :prev + # Author a new message. def self.publish(draft, author: LocalIdentity.current) msg = self.new(author: LocalIdentity.current, kind: draft.kind, @@ -15,6 +16,17 @@ module Pigeon msg end + # Store a message that someone (not the LocalIdentity) + # has authored. + def self.ingest(author:, body:, depth:, kind:, prev:, signature:) + message = new(author: author, + kind: kind, + body: body, + signature: signature) + message.verify! + message.save + end + def render template.render.chomp end @@ -24,11 +36,17 @@ module Pigeon "#{MESSAGE_SIGIL}#{sha256}#{BLOB_FOOTER}" end + def verify! + verify_depth + verify_prev + verify_signature + end + private - def template - @template ||= MessageSerializer.new(self) - end + def verify_depth; raise "WIP"; end + def verify_prev; raise "WIP"; end + def verify_signature; raise "WIP"; end def initialize(author:, kind:, body:, signature: nil) raise MISSING_BODY if body.empty? @@ -44,6 +62,10 @@ module Pigeon store.save_message(self) end + def template + @template ||= MessageSerializer.new(self) + end + def calculate_signature @author.sign(template.render_without_signature) end diff --git a/dist/pigeon/parser.rb b/dist/pigeon/parser.rb index 15b044e..ac9fac2 100644 --- a/dist/pigeon/parser.rb +++ b/dist/pigeon/parser.rb @@ -30,12 +30,9 @@ module Pigeon private def finish_this_message! - # Step 1: Create a message - # Step 2: Verify message - # Step 3: Push current scratchpad onto `results` array - # Step 4: Reset @scratchpad to empty hash. + @scratchpad.freeze + @results.push(Message.ingest(**@scratchpad)) @scratchpad = {} - raise "See steps above." end def set(key, value, hash = @scratchpad) diff --git a/dist/pigeon/storage.rb b/dist/pigeon/storage.rb index 150b9e8..1831604 100644 --- a/dist/pigeon/storage.rb +++ b/dist/pigeon/storage.rb @@ -12,9 +12,10 @@ module Pigeon end def get_message_by_depth(author, depth) + raise "Expected string, got #{author.class}" unless author.is_a?(String) # Delete later store.transaction do # Map<[author(str), depth(int)], Signature> - store[DEPTH_INDEX_NS][[author.public_key, depth]] + store[DEPTH_INDEX_NS][[author, depth]] end end