Sha256: a03f875396eb56c72efad614231de4f39bdf98045948b5402e765fd33430bdde

Contents?: true

Size: 1023 Bytes

Versions: 2

Compression:

Stored size: 1023 Bytes

Contents

module MonoMerchant
  class WebhookValidator

    def initialize(request)
      @request = request
      @webhook_data = @request.raw_post
    end

    def public_key
      Pubkey.get
    end

    # Validate webhook data signature with public key
    #
    # @return [Boolean] valid?
    def valid?
      return false if @webhook_data.nil?
      return false if signature.nil?
      return false unless public_key

      openssl_ec = OpenSSL::PKey::EC.new(public_key)
      openssl_ec.check_key

      return true if openssl_ec.verify(digest, signature, @webhook_data)

      warn "Webhook isn't authorized. Might be wrong signature or inconsistent webhook data."

      false
    end

    private

    # Get signature from request headers
    #
    # @return [String] signature
    def signature
      @signature ||= Base.decode(@request.headers["X-Sign"])
    end

    # Get digest from OpenSSL
    #
    # @return [OpenSSL::Digest] digest
    def digest
      @digest ||= OpenSSL::Digest.new("SHA256")
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
mono-merchant-0.2.0 lib/mono-merchant/webhook_validator.rb
mono-merchant-0.1.0 lib/mono-merchant/webhook_validator.rb