class Session

Public Class Methods

new(app, key, endpoint) click to toggle source
# File lib/redpay/session.rb, line 11
def initialize(app, key, endpoint)
  @app      = app
  @key      = key
  @endpoint = endpoint

  # Generate and save Random key
  @cipher = OpenSSL::Cipher::AES.new(128, :CBC)
  @cipher.encrypt
  
  @random = @cipher.random_key
  @iv = @cipher.random_iv

  # Have decipher ready to decrypt response
  @decipher = OpenSSL::Cipher::AES.new(128, :CBC)
  @decipher.decrypt
  @decipher.key = @random
  @decipher.iv = @iv

  @public_key = OpenSSL::PKey::RSA.new(Base64.decode64(@key))
  @encrypted_random = Base64.encode64(@public_key.public_encrypt(Base64.encode64(@random)))
  #puts "encrypted_random ->" + @encrypted_random

  # POST Request sessionId
  begin
    uri = URI(@endpoint)
    header = {'Content-Type': 'text/json'}
    data = 
    {
      "rsaPublicKey" => @key,
      "aesKey" => @encrypted_random
    }
    
    # Create the HTTP objects
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true if uri.scheme == 'https'
    req = Net::HTTP::Post.new(uri.request_uri, header)
    req.body = data.to_json
    
    # Send the request
    res = http.request(req)

    # Parse and send back sessionId
    ses = JSON.parse(res.body)
    @sessionId = ses["sessionId"]
    # puts "sessionId ->" + @sessionId
  rescue => e
    @sessionId = "ERROR #{e}"
  end
end

Public Instance Methods

Send(request) click to toggle source
# File lib/redpay/session.rb, line 61
def Send(request)
  plaintext_request = request.to_json;
  #puts "plaintext_request -> " + plaintext_request
  encrypted = @cipher.update(plaintext_request) + @cipher.final
  #encrypted_request = URI::encode(Base64.encode64(encrypted))
  encrypted_request = Base64.encode64(encrypted)
  #puts "encrypted_request -> " + encrypted_request
  
  data = 
  {
    "sessionId" => @sessionId,
    "app" => @app,
    "iv" => Base64.encode64(@iv),
    "aesData" => encrypted_request
  }

  #POST Request packet
  begin
    uri = URI(@endpoint)
    header = {'Content-Type': 'text/json'}

    # Create the HTTP objects
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true if uri.scheme == 'https'
    req = Net::HTTP::Post.new(uri.request_uri, header)
    req.body = data.to_json
    
    # Send the request
    res = http.request(req)

    # Get encrypted response
    encrypted_response = JSON.parse(res.body)

    # Decrypt response
    plain_response = @decipher.update(Base64.decode64(encrypted_response["aesData"])) + @decipher.final
    return JSON.parse(plain_response)
  rescue => e
    return "ERROR #{e}"
  end
end