lib/client/client.rb in factor-0.1.07 vs lib/client/client.rb in factor-0.1.09
- old
+ new
@@ -2,11 +2,15 @@
require 'rest_client'
require 'zip'
require 'zip/zipfilesystem'
require 'zip/zip'
require 'open-uri'
+require 'digest/sha2'
+require 'openssl'
+require 'base64'
+
module Factor
module Client
class Client
attr_accessor :host
FACTOR_HOST = ENV["FACTOR_HOST"] || "factor.io"
@@ -38,15 +42,34 @@
code.call("loading complete for '#{workflow_info['name']}'")
end
engine
end
- def load_credentials(engine,&code)
+ def load_credentials(engine,secret=nil,&code)
code.call("downloading credential list")
- credentials = rest_get("credentials")
+ credentials = rest_get("credentials")["value"]
code.call("loading credentials")
- engine.load_credentials(credentials["value"])
+
+ if secret
+ code.call("decrypting credentials")
+ decrypter = OpenSSL::Cipher.new("AES-256-CFB")
+ sha256= Digest::SHA2.new(256)
+ decrypter.key=Base64.encode64(sha256.digest(secret))
+ decrypter.decrypt
+ credentials.each do |service,creds|
+ creds.each do |credential,value|
+ if value["encrypted"]
+ decrypted = decrypter.update(Base64.decode64(value["value"])) + decrypter.final
+ credentials[service][credential]["value"]=decrypted
+ credentials[service][credential]["encrypted"]=false
+ end
+ end
+ end
+ code.call("decrypting credentials complete")
+ end
+
+ engine.load_credentials(credentials)
engine
end
def load_channels(engine,&code)
@@ -89,20 +112,34 @@
engine
end
- def set_credential(key,value)
+ def set_credential(service,name,value,secret=nil)
# this is a PUT not POST because it is technically editing, not creating a new one
- rest_put("credentials",{:key=>key,:value=>value})
+ credential = {:service=>service,:name=>name,:value=>value}
+
+ if secret
+ payload=value
+ sha256= Digest::SHA2.new(256)
+ encrypter = OpenSSL::Cipher.new("AES-256-CFB")
+ encrypter.encrypt
+ encrypter.key=Base64.encode64(sha256.digest(secret))
+
+ encrypted = Base64.encode64(encrypter.update(value) + encrypter.final)
+ credential[:value]=encrypted
+ credential[:encrypted]=true
+ end
+
+ rest_post("credentials",credential)
end
- def get_credential(key="")
- rest_get("credentials",{:key=>key})
+ def get_credentials()
+ rest_get("credentials")
end
- def remove_credential(key="")
- rest_delete("credentials",{:key=>key})
+ def remove_credential(service,name)
+ rest_delete("credentials",{:service=>service,:name=>name})
end
\ No newline at end of file