lib/afip_wsfe/wsaa.rb in afip_wsfe-0.1.3 vs lib/afip_wsfe/wsaa.rb in afip_wsfe-0.2.0
- old
+ new
@@ -3,50 +3,28 @@
# valid key and signature that will last for a day.
#
class Wsaa
def initialize(url=nil)
- AfipWsfe.environment ||= :test
- @client = Savon.client(
- wsdl: AfipWsfe::URLS[AfipWsfe.environment][:wsaa],
- namespaces: {
- "xmlns:soapenv" => "http://schemas.xmlsoap.org/soap/envelope/",
- "xmlns:ar" => "http://ar.gov.afip.dif.FEV1/"
- },
- log: AfipWsfe.log?,
- log_level: AfipWsfe.log_level || :debug,
- ssl_verify_mode: :none,
- read_timeout: 90,
- open_timeout: 90,
- headers: {
- "Accept-Encoding" => "gzip, deflate",
- "Connection" => "Keep-Alive"
- },
- convert_request_keys_to: :none
- )
-
- @cms = nil
- @performed = false
+ @client = AfipWsfe::Client.new(false)
+ @endpoint = :wsaa
@response = nil
+ @status = false
end
def login
+ raise "Ruta del archivo de llave privada no declarado" unless AfipWsfe.pkey.present?
+ raise "Ruta del archivo certificado no declarado" unless AfipWsfe.cert.present?
raise "Archivo de llave privada no encontrado en #{ AfipWsfe.pkey }" unless File.exists?(AfipWsfe.pkey)
raise "Archivo certificado no encontrado en #{ AfipWsfe.cert }" unless File.exists?(AfipWsfe.cert)
- build_tra
- call_web_service
+ @status, @response = @client.call_endpoint @endpoint, :login_cms, {in0: build_tra}
parse_response
- status
+ @status
end
- def status
- return false unless @performed
- @response.success?
- end
+ private
- protected
-
def build_tra
now = Time.zone.now
from = now.beginning_of_day.strftime('%FT%T%:z')
to = now.end_of_day.strftime('%FT%T%:z')
id = now.strftime('%s')
@@ -58,36 +36,33 @@
"expirationTime" => to
},
"service" => "wsfe"
}.to_xml(root: "loginTicketRequest")
- @cms = `echo '#{ tra }' |
- #{ AfipWsfe.openssl_bin } cms -sign -in /dev/stdin -signer #{ AfipWsfe.cert } -inkey #{ AfipWsfe.pkey } -nodetach -outform der |
- #{ AfipWsfe.openssl_bin } base64 -e`
+ pkcs7 = OpenSSL::PKCS7.sign(cert, key, tra)
+ OpenSSL::PKCS7.write_smime(pkcs7).lines[5..-2].join()
end
- def call_web_service
- @response = @client.call :login_cms, message: {in0: @cms}
- @performed = true
- end
-
def parse_response
- if status
- response_hash = Hash.from_xml @response.body[:login_cms_response][:login_cms_return]
- token = response_hash["loginTicketResponse"]["credentials"]["token"]
- sign = response_hash["loginTicketResponse"]["credentials"]["sign"]
- write_yaml(token, sign)
- end
+ write_yaml(@response["loginTicketResponse"]["credentials"])
end
- def write_yaml(token, sign)
- filename = "/tmp/bravo_#{ AfipWsfe.cuit }_#{ Time.zone.today.strftime('%Y_%m_%d') }.yml"
+ def write_yaml(credentials)
+ filename = AuthData.todays_data_file_name
content = {
- token: token,
- sign: sign
+ token: credentials["token"],
+ sign: credentials["sign"]
}
File.open(filename, 'w') { |f|
f.write content.to_yaml
}
+ end
+
+ def cert
+ OpenSSL::X509::Certificate.new(File.read(AfipWsfe.cert))
+ end
+
+ def key
+ OpenSSL::PKey::RSA.new(File.read(AfipWsfe.pkey))
end
end
end