Sha256: 0751d33e1e5fdd0a332e33972985ad18775fa75c2cc547ae08d02e27b8155d70

Contents?: true

Size: 1.91 KB

Versions: 4

Compression:

Stored size: 1.91 KB

Contents

module AfipWsfe
  # Authorization class. Handles interactions wiht the WSAA, to provide
  # valid key and signature that will last for a day.
  #
  class Wsaa

    def initialize(url=nil)
      @client = AfipWsfe::Client.new(false)
      @endpoint = :wsaa
      @response = nil
      @status = false
    end

    def login
      @status, @response = @client.call_endpoint @endpoint, :login_cms, {in0: build_tra}
      parse_response
      @status
    end

    private

    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')

      tra = {
        "header" => {
          "uniqueId"       => id,
          "generationTime" => from,
          "expirationTime" => to
        },
        "service" => "wsfe"
      }.to_xml(root: "loginTicketRequest")

      pkcs7 = OpenSSL::PKCS7.sign(cert, key, tra)
      OpenSSL::PKCS7.write_smime(pkcs7).lines[5..-2].join()
    end

    def parse_response
      write_yaml(@response["loginTicketResponse"]["credentials"])
    end

    def write_yaml(credentials)
      filename = AuthData.todays_data_file_name
      content = {
        token: credentials["token"],
        sign: credentials["sign"]
      }
      File.open(filename, 'w') { |f|
        f.write content.to_yaml
      }
    end

    def cert
      OpenSSL::X509::Certificate.new(read_content(AfipWsfe.cert))
    end

    def key
      OpenSSL::PKey::RSA.new(read_content(AfipWsfe.pkey))
    end

    def read_content(my_file)
      raise(NullOrInvalidAttribute.new, "No está definido el storage de las keys") unless AfipWsfe.storage
      raise(NullOrInvalidAttribute.new, "No se han proporcionado las keys necesarias") unless my_file
      
      if AfipWsfe.storage == :file
        File.read my_file
      else
        my_file
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
afip_wsfe-0.2.7 lib/afip_wsfe/wsaa.rb
afip_wsfe-0.2.6 lib/afip_wsfe/wsaa.rb
afip_wsfe-0.2.5 lib/afip_wsfe/wsaa.rb
afip_wsfe-0.2.4 lib/afip_wsfe/wsaa.rb