Class: PayPal::SDK::REST::DataTypes::WebhookEvent
Constant Summary
Core::API::DataTypes::Base::ContentKey, Core::API::DataTypes::Base::HashOptions
Instance Attribute Summary
Attributes inherited from Base
#error, #header, #request_id
Class Method Summary
collapse
-
.all(options = {}) ⇒ Object
-
.find(resource_id) ⇒ Object
-
.get(webhook_event_id) ⇒ Object
-
.get_cert(cert_url) ⇒ Object
-
.get_cert_chain ⇒ Object
-
.get_expected_sig(transmission_id, timestamp, webhook_id, event_body) ⇒ Object
-
.get_resource_class(name) ⇒ Object
-
.load_members ⇒ Object
-
.search(page_size, start_time, end_time) ⇒ Object
-
.verify(transmission_id, timestamp, webhook_id, event_body, cert_url, sig, algo = 'sha256') ⇒ Object
-
.verify_cert(cert) ⇒ Object
-
.verify_cert_chain(cert_store, cert) ⇒ Object
-
.verify_common_name(cert) ⇒ Object
-
.verify_expiration(cert) ⇒ Object
-
.verify_signature(transmission_id, timestamp, webhook_id, event_body, cert, actual_sig_encoded, algo) ⇒ Object
Instance Method Summary
collapse
#api, api, #error=, included
Methods included from SetAPI
#client_id=, #client_secret=, #set_config, #token=
Methods inherited from Base
#http_header, #merge!, #raise_error!, raise_on_api_error, #success?
add_attribute, add_member, array_of, #convert_array, #convert_object, define_alias_methods, #hash_key, #initialize, #member_names, members, #members, #merge!, object_of, #set, #skip_value?, snakecase, #to_hash, #value_to_hash
#log_event, #logger, logger, logger=
Class Method Details
.all(options = {}) ⇒ Object
1614
1615
1616
1617
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1614
def all(options = {})
path = "v1/notifications/webhooks-events"
WebhookEventList.new(api.get(path, options))
end
|
.find(resource_id) ⇒ Object
1608
1609
1610
1611
1612
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1608
def find(resource_id)
raise ArgumentError.new("webhook_event_id required") if resource_id.to_s.strip.empty?
path = "v1/notifications/webhooks-events/#{resource_id}"
self.new(api.get(path))
end
|
.get(webhook_event_id) ⇒ Object
1604
1605
1606
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1604
def get(webhook_event_id)
WebhookEvent.find(webhook_event_id)
end
|
.get_cert(cert_url) ⇒ Object
1532
1533
1534
1535
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1532
def get_cert(cert_url)
data = Net::HTTP.get_response(URI.parse(cert_url))
cert = OpenSSL::X509::Certificate.new data.body
end
|
.get_cert_chain ⇒ Object
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1537
def get_cert_chain()
root_cert = File.expand_path(File.join(File.dirname(__FILE__), '../../../data/DigiCertHighAssuranceEVRootCA.pem'))
intermediate_cert = File.expand_path(File.join(File.dirname(__FILE__), '../../../data/DigiCertSHA2ExtendedValidationServerCA.pem'))
cert_store = OpenSSL::X509::Store.new
cert_store.add_file(root_cert)
cert_store.add_file(intermediate_cert)
cert_store
end
|
.get_expected_sig(transmission_id, timestamp, webhook_id, event_body) ⇒ Object
1548
1549
1550
1551
1552
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1548
def get_expected_sig(transmission_id, timestamp, webhook_id, event_body)
utf8_encoded_event_body = event_body.force_encoding("UTF-8")
crc = Zlib::crc32(utf8_encoded_event_body).to_s
transmission_id + "|" + timestamp + "|" + webhook_id + "|" + crc
end
|
.get_resource_class(name) ⇒ Object
1589
1590
1591
1592
1593
1594
1595
1596
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1589
def get_resource_class(name)
class_array = PayPal::SDK::REST.constants.select {|c| Class === PayPal::SDK::REST.const_get(c)}
class_array.each do |classname|
if (classname.to_s.downcase == name.downcase)
return classname
end
end
end
|
.load_members ⇒ Object
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1501
def self.load_members
object_of :id, String
object_of :create_time, String
object_of :resource_type, String
object_of :event_version, String
object_of :event_type, String
object_of :summary, String
object_of :status, String
object_of :resource, Hash
array_of :links, Links
end
|
.search(page_size, start_time, end_time) ⇒ Object
1598
1599
1600
1601
1602
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1598
def search(page_size, start_time, end_time)
path = "v1/notifications/webhooks-events"
options = { :page_size => page_size, :start_time => start_time, :end_time => end_time }
WebhookEventList.new(api.get(path, options))
end
|
.verify(transmission_id, timestamp, webhook_id, event_body, cert_url, sig, algo = 'sha256') ⇒ Object
1584
1585
1586
1587
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1584
def verify(transmission_id, timestamp, webhook_id, event_body, cert_url, sig, algo='sha256')
cert = get_cert(cert_url)
verify_signature(transmission_id, timestamp, webhook_id, event_body, cert, sig, algo) && verify_cert(cert)
end
|
.verify_cert(cert) ⇒ Object
1578
1579
1580
1581
1582
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1578
def verify_cert(cert)
cert_store = get_cert_chain()
verify_cert_chain(cert_store, cert) && verify_common_name(cert) && verify_expiration(cert)
end
|
.verify_cert_chain(cert_store, cert) ⇒ Object
1574
1575
1576
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1574
def verify_cert_chain(cert_store, cert)
cert_store.verify(cert)
end
|
.verify_common_name(cert) ⇒ Object
1554
1555
1556
1557
1558
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1554
def verify_common_name(cert)
common_name = cert.subject.to_a.select{|name, _, _| name == 'CN' }.first[1]
common_name.start_with?("messageverificationcerts.") && common_name.end_with?(".paypal.com")
end
|
.verify_expiration(cert) ⇒ Object
1570
1571
1572
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1570
def verify_expiration(cert)
cert.not_after >= Time.now
end
|
.verify_signature(transmission_id, timestamp, webhook_id, event_body, cert, actual_sig_encoded, algo) ⇒ Object
1560
1561
1562
1563
1564
1565
1566
1567
1568
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1560
def verify_signature(transmission_id, timestamp, webhook_id, event_body, cert, actual_sig_encoded, algo)
expected_sig = get_expected_sig(transmission_id, timestamp, webhook_id, event_body)
digest = OpenSSL::Digest.new(algo)
digest.update(expected_sig)
actual_sig = Base64.decode64(actual_sig_encoded).force_encoding('UTF-8')
cert.public_key.verify(digest, actual_sig, expected_sig)
end
|
Instance Method Details
#get_resource ⇒ Object
1518
1519
1520
1521
1522
1523
1524
1525
1526
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1518
def get_resource()
webhook_resource_type = self.resource_type
resource_class = self.class.get_resource_class(webhook_resource_type)
if resource_class
return Object::const_get(resource_class).new(self.resource)
else
return self.resource
end
end
|
#resend ⇒ Object
1513
1514
1515
1516
|
# File 'lib/paypal-sdk/rest/data_types.rb', line 1513
def resend()
path = "v1/notifications/webhooks-events/#{self.id}/resend"
WebhookEvent.new(api.post(path))
end
|