lib/lastpass/vault.rb in lastpass-1.3.0 vs lib/lastpass/vault.rb in lastpass-1.4.0
- old
+ new
@@ -4,49 +4,70 @@
module LastPass
class Vault
attr_reader :accounts
# Fetches a blob from the server and creates a vault
- def self.open_remote username, password, multifactor_password = nil
- open Vault.fetch_blob(username, password, multifactor_password), username, password
+ def self.open_remote username, password, multifactor_password = nil, client_id = nil
+ blob = Vault.fetch_blob username, password, multifactor_password, client_id
+ open blob, username, password
end
# Creates a vault from a locally stored blob
def self.open_local blob_filename, username, password
# TODO: read the blob here
+ raise NotImplementedError
end
# Creates a vault from a blob object
def self.open blob, username, password
new blob, blob.encryption_key(username, password)
end
# Just fetches the blob, could be used to store it locally
- def self.fetch_blob username, password, multifactor_password = nil
- Fetcher.fetch Fetcher.login username, password, multifactor_password
+ def self.fetch_blob username, password, multifactor_password = nil, client_id = nil
+ session = Fetcher.login username, password, multifactor_password, client_id
+ blob = Fetcher.fetch session
+ Fetcher.logout session
+
+ blob
end
# This more of an internal method, use one of the static constructors instead
def initialize blob, encryption_key
- @accounts = []
+ chunks = Parser.extract_chunks blob
+ if !complete? chunks
+ raise InvalidResponseError, "Blob is truncated"
+ end
+ @accounts = parse_accounts chunks, encryption_key
+ end
+
+ def complete? chunks
+ !chunks.empty? && chunks.last.id == "ENDM" && chunks.last.payload == "OK"
+ end
+
+ def parse_accounts chunks, encryption_key
+ accounts = []
+
key = encryption_key
rsa_private_key = nil
- Parser.extract_chunks(blob).each do |i|
+ chunks.each do |i|
case i.id
when "ACCT"
# TODO: Put shared folder name as group in the account
account = Parser.parse_ACCT i, key
if account
- @accounts << account
+ accounts << account
end
when "PRIK"
rsa_private_key = Parser.parse_PRIK i, encryption_key
when "SHAR"
# After SHAR chunk all the folliwing accounts are enrypted with a new key
key = Parser.parse_SHAR(i, encryption_key, rsa_private_key)[:encryption_key]
end
end
+
+ accounts
end
end
end