2019-09-25 01:31:32 +00:00
|
|
|
require "base64"
|
|
|
|
require "digest"
|
|
|
|
require "ed25519"
|
|
|
|
require "securerandom"
|
|
|
|
|
|
|
|
# Remove this when we launch or add ENVs:
|
|
|
|
require "pry"
|
|
|
|
|
2019-12-03 03:18:44 +00:00
|
|
|
module Pigeon
|
|
|
|
SEED_CONFIG_KEY = "SEED"
|
|
|
|
VERSION = "0.0.1"
|
|
|
|
TPL_DIR = "views"
|
|
|
|
|
|
|
|
PIGEON_DB_PATH = File.join("db.pigeon")
|
2020-03-15 16:51:13 +00:00
|
|
|
DEFAULT_BUNDLE_PATH = "./pigeon.bundle"
|
|
|
|
|
2019-12-03 03:18:44 +00:00
|
|
|
# MESSAGE TEMPLATE CONSTANTS:
|
|
|
|
HEADER_TPL = File.read(File.join(TPL_DIR, "1_header.erb")).sub("\n", "")
|
|
|
|
BODY_TPL = File.read(File.join(TPL_DIR, "2_body.erb")).sub("\n", "")
|
|
|
|
FOOTER_TPL = File.read(File.join(TPL_DIR, "3_footer.erb")).sub("\n", "")
|
|
|
|
COMPLETE_TPL = [HEADER_TPL, BODY_TPL, FOOTER_TPL].join("")
|
2019-12-11 03:52:43 +00:00
|
|
|
CURRENT_DRAFT = "HEAD.draft"
|
|
|
|
EMPTY_MESSAGE = "NONE"
|
|
|
|
OUTBOX_PATH = File.join(".pigeon", "user")
|
2020-03-05 13:59:11 +00:00
|
|
|
DRAFT_PLACEHOLDER = "DRAFT"
|
2020-03-15 17:50:57 +00:00
|
|
|
CR = "\n"
|
|
|
|
BUNDLE_MESSAGE_SEPARATOR = CR * 2
|
2019-12-03 03:18:44 +00:00
|
|
|
# /MESSAGE TEMPLATE CONSTANTS
|
|
|
|
|
|
|
|
# Internal namespaces for PStore keys:
|
|
|
|
ROOT_NS = ".pigeon"
|
|
|
|
CONF_NS = "conf"
|
|
|
|
BLOB_NS = "blobs"
|
|
|
|
PEER_NS = "peers"
|
|
|
|
USER_NS = "user"
|
|
|
|
BLCK_NS = "blocked"
|
2019-12-05 04:11:04 +00:00
|
|
|
MESG_NS = "messages"
|
2020-03-29 00:43:59 +00:00
|
|
|
MESSAGE_BY_DEPTH_NS = "messages.by_depth"
|
2020-03-26 14:00:17 +00:00
|
|
|
COUNT_INDEX_NS = "messages.count"
|
2019-12-05 04:11:04 +00:00
|
|
|
|
2019-12-03 03:18:44 +00:00
|
|
|
# ^ Internal namespaces for PStore keys
|
|
|
|
|
2019-12-05 00:17:36 +00:00
|
|
|
BLOB_SIGIL = "&"
|
2020-03-09 13:56:45 +00:00
|
|
|
MESSAGE_SIGIL = "%"
|
2019-12-05 00:17:36 +00:00
|
|
|
IDENTITY_SIGIL = "@"
|
|
|
|
STRING_SIGIL = "\""
|
2020-03-27 12:07:48 +00:00
|
|
|
IDENTITY_FOOTER = ".ed25519"
|
2019-12-03 03:18:44 +00:00
|
|
|
BLOB_FOOTER = ".sha256"
|
2020-03-14 03:02:45 +00:00
|
|
|
SIG_FOOTER = ".sig.ed25519"
|
2019-12-30 02:16:42 +00:00
|
|
|
|
|
|
|
# Error messages
|
|
|
|
PREV_REQUIRES_SAVE = "Can't fetch `prev` on unsaved messages"
|
2020-03-15 17:50:57 +00:00
|
|
|
NO_DRAFT_FOUND = "NO DRAFT FOUND"
|
|
|
|
STRING_KEYS_ONLY = "String keys only"
|
|
|
|
MISSING_BODY = "BODY CANT BE EMPTY"
|
2020-03-27 12:07:48 +00:00
|
|
|
|
|
|
|
# Constants for internal use only:
|
|
|
|
FOOTERS_REGEX = Regexp.new("#{SIG_FOOTER}|#{IDENTITY_FOOTER}")
|
|
|
|
SIG_RANGE = (SIG_FOOTER.length * -1)..-1
|
|
|
|
# /Constants for internal use only
|
|
|
|
|
|
|
|
class Helpers
|
2020-03-27 12:48:17 +00:00
|
|
|
def self.verify_string(identity, signature, string)
|
|
|
|
key = Ed25519::VerifyKey.new(decode_multihash(identity.public_key))
|
|
|
|
raw_sig = decode_multihash(signature)
|
|
|
|
key.verify(raw_sig, string)
|
|
|
|
end
|
|
|
|
|
2020-03-27 12:07:48 +00:00
|
|
|
def self.decode_multihash(string)
|
2020-03-27 12:48:17 +00:00
|
|
|
if string[SIG_RANGE] == SIG_FOOTER
|
|
|
|
return Base64.urlsafe_decode64(string.gsub(SIG_FOOTER, ""))
|
2020-03-27 12:07:48 +00:00
|
|
|
else
|
2020-03-27 12:48:17 +00:00
|
|
|
return Base64.urlsafe_decode64(string[1..].gsub(FOOTERS_REGEX, ""))
|
2020-03-27 12:07:48 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2019-12-03 03:18:44 +00:00
|
|
|
end
|
|
|
|
|
2020-03-24 12:39:32 +00:00
|
|
|
require_relative File.join("pigeon", "local_identity.rb")
|
2020-03-26 13:17:50 +00:00
|
|
|
require_relative File.join("pigeon", "remote_identity.rb")
|
2019-09-23 01:07:14 +00:00
|
|
|
require_relative File.join("pigeon", "storage.rb")
|
2020-03-07 15:38:34 +00:00
|
|
|
require_relative File.join("pigeon", "draft_serializer.rb")
|
|
|
|
require_relative File.join("pigeon", "message_serializer.rb")
|
2019-09-23 01:07:14 +00:00
|
|
|
require_relative File.join("pigeon", "message.rb")
|
2020-03-05 13:59:11 +00:00
|
|
|
require_relative File.join("pigeon", "draft.rb")
|
2020-03-18 12:32:40 +00:00
|
|
|
require_relative File.join("pigeon", "lexer.rb")
|
2020-03-24 12:39:32 +00:00
|
|
|
require_relative File.join("pigeon", "parser.rb")
|
2020-03-15 16:51:13 +00:00
|
|
|
require_relative File.join("pigeon", "bundle.rb")
|