Skip to content

Instantly share code, notes, and snippets.

@manuelep
Created February 27, 2018 16:43
Show Gist options
  • Save manuelep/a66ff70ccac331a3a086d432ec0872ae to your computer and use it in GitHub Desktop.
Save manuelep/a66ff70ccac331a3a086d432ec0872ae to your computer and use it in GitHub Desktop.
woocommerce webhook check
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import hmac
import hashlib
import base64
import unittest
import argparse
import logging
import sys
parser = argparse.ArgumentParser(
description = """DOC""",
formatter_class = argparse.RawTextHelpFormatter
)
parser.add_argument("-L", "--Log",
help = "Log level",
default = "debug",
dest = "log"
)
sargs, oargs = parser.parse_known_args()
def _get_logger_():
try:
level = int(sargs.log)
assert level%10==0 and 0<=level<=50
except ValueError:
level = getattr(logging, sargs.log.upper())
logging.basicConfig(
format = "%(asctime)-15s %(levelname)s %(funcName)s @ %(lineno)s says: '%(message)s'",
level = level
)
logger = logging.getLogger()
logger.setLevel(level)
handler = logging.StreamHandler()
handler.setLevel(level)
logger.addHandler(handler)
logger.propagate = False
return logger
logger = _get_logger_()
# Script core starts from here
class baseVerifier(object):
def __init__(self):
super(baseVerifier, self).__init__()
@staticmethod
def gethmac(*args, **kw):
raise NotImplementedError
@classmethod
def run(cls, signature, *args, **kwargs):
computed = cls.gethmac(*args, **kwargs)
logger.debug(cls.__name__)
logger.debug("{signature} <-> {computed}".format(**vars()))
return signature==computed
class Verifier1(baseVerifier):
@staticmethod
def gethmac(secret, body):
dig = hmac.new(secret.encode(),
msg = body.encode(), # your_bytes_string
digestmod = hashlib.sha256
).digest()
res = base64.b64encode(dig).decode() # py3k-mode
return res
class Verifier2(baseVerifier):
@staticmethod
def gethmac(secret, body):
m = hashlib.sha256()
m.update(secret+body)
res = base64.b64encode(m.digest()).decode()
return res
# Unittest starts from here
class TestCase(unittest.TestCase):
"""
body as returned from web2py request object with command:
request.body.read()
"""
secret = 'M.L7U@xP8RxEt5$W#hoUKZ9ZwOQ$X+YJ+Qm2?0+RC@(;uZ iZo'
body = '''{"id":155,"name":"deleteme asap (subscription)","slug":"deleteme-asap-subscription","permalink":"https:\\/\\/www.colouree.com\\/product\\/deleteme-asap-subscription\\/","date_created":"2018-02-27T10:10:18","date_created_gmt":"2018-02-27T10:10:18","date_modified":"2018-02-27T15:46:55","date_modified_gmt":"2018-02-27T15:46:55","type":"subscription","status":"publish","featured":false,"catalog_visibility":"visible","description":"<p>test 2<\\/p>\\n","short_description":"","sku":"","price":"","regular_price":"","sale_price":"","date_on_sale_from":null,"date_on_sale_from_gmt":null,"date_on_sale_to":null,"date_on_sale_to_gmt":null,"price_html":"<ins class=\\"h2\\"><\\/ins> <span class=\\"subscription-details\\"> \\/ month<\\/span>","on_sale":false,"purchasable":false,"total_sales":0,"virtual":false,"downloadable":false,"downloads":[],"download_limit":-1,"download_expiry":-1,"external_url":"","button_text":"","tax_status":"taxable","tax_class":"","manage_stock":false,"stock_quantity":null,"in_stock":true,"backorders":"no","backorders_allowed":false,"backordered":false,"sold_individually":false,"weight":"","dimensions":{"length":"","width":"","height":""},"shipping_required":true,"shipping_taxable":true,"shipping_class":"","shipping_class_id":0,"reviews_allowed":false,"average_rating":"0.00","rating_count":0,"related_ids":[151,143,153],"upsell_ids":[],"cross_sell_ids":[],"parent_id":0,"purchase_note":"","categories":[{"id":15,"name":"Uncategorized","slug":"uncategorized"}],"tags":[],"images":[{"id":0,"date_created":"2018-02-27T15:47:04","date_created_gmt":"2018-02-27T15:47:04","date_modified":"2018-02-27T15:47:04","date_modified_gmt":"2018-02-27T15:47:04","src":"https:\\/\\/www.colouree.com\\/wp-content\\/plugins\\/woocommerce\\/assets\\/images\\/placeholder.png","name":"Segnaposto","alt":"Segnaposto","position":0}],"attributes":[],"default_attributes":[],"variations":[],"grouped_products":[],"menu_order":0,"meta_data":[{"id":744,"key":"_vc_post_settings","value":{"vc_grid_id":[]}},{"id":751,"key":"_uncode_featured_media_display","value":"carousel"},{"id":780,"key":"_subscription_payment_sync_date","value":"0"},{"id":781,"key":"_uncode_specific_menu_opaque","value":"off"},{"id":782,"key":"_uncode_specific_menu_no_shadow","value":"off"},{"id":783,"key":"_uncode_blocks_list","value":"104"},{"id":784,"key":"_uncode_revslider_list","value":"HomeHeader"},{"id":785,"key":"_uncode_header_full_width","value":"on"},{"id":786,"key":"_uncode_header_height","value":["50","%"]},{"id":787,"key":"_uncode_header_title","value":"on"},{"id":788,"key":"_uncode_header_title_custom","value":"off"},{"id":789,"key":"_uncode_header_style","value":"dark"},{"id":790,"key":"_uncode_header_content_width","value":"off"},{"id":791,"key":"_uncode_header_custom_width","value":"100"},{"id":792,"key":"_uncode_header_align","value":"left"},{"id":793,"key":"_uncode_header_position","value":"header-center header-middle"},{"id":794,"key":"_uncode_header_title_size","value":"h1"},{"id":795,"key":"_uncode_header_title_italic","value":"off"},{"id":796,"key":"_uncode_header_featured","value":"on"},{"id":797,"key":"_uncode_header_background","value":{"background-color":"color-wayh","background-repeat":"","background-attachment":"","background-position":"","background-size":"","background-image":""}},{"id":798,"key":"_uncode_header_parallax","value":"off"},{"id":799,"key":"_uncode_header_kburns","value":"off"},{"id":800,"key":"_uncode_header_overlay_color_alpha","value":"100"},{"id":801,"key":"_uncode_header_scroll_opacity","value":"off"},{"id":802,"key":"_uncode_header_scrolldown","value":"off"},{"id":803,"key":"_uncode_menu_no_padding","value":"off"},{"id":804,"key":"_uncode_menu_no_padding_mobile","value":"off"},{"id":805,"key":"_uncode_product_media_size","value":"0"},{"id":806,"key":"_uncode_specific_navigation_hide","value":"off"},{"id":807,"key":"_uncode_fullpage_type","value":"curtain"},{"id":808,"key":"_uncode_fullpage_opacity","value":"off"},{"id":809,"key":"_uncode_scroll_dots","value":"off"},{"id":810,"key":"_uncode_empty_dots","value":"off"},{"id":811,"key":"_uncode_scroll_history","value":"off"},{"id":812,"key":"_uncode_scroll_safe_padding","value":"on"},{"id":813,"key":"_uncode_scroll_additional_padding","value":"0"},{"id":814,"key":"_uncode_fullpage_mobile","value":"off"},{"id":815,"key":"slide_template","value":"default"},{"id":816,"key":"_yoast_wpseo_primary_product_cat","value":""},{"id":817,"key":"_subscription_price","value":""},{"id":818,"key":"_subscription_trial_length","value":"0"},{"id":819,"key":"_subscription_sign_up_fee","value":""},{"id":820,"key":"_subscription_period","value":"month"},{"id":821,"key":"_subscription_period_interval","value":"1"},{"id":822,"key":"_subscription_length","value":"0"},{"id":823,"key":"_subscription_trial_period","value":"day"},{"id":824,"key":"_subscription_limit","value":"no"},{"id":825,"key":"_subscription_one_time_shipping","value":"no"},{"id":826,"key":"_yoast_wpseo_content_score","value":"30"}]}'''
signature = 'a6iGSJgi/P5wx+6vEZAOfFvOmnSkRmgF2U3a5fRxUhk='
def test_1(self):
self.assertTrue(Verifier1.run(self.signature, self.secret, self.body))
def test_2(self):
self.assertTrue(Verifier2.run(self.signature, self.secret, self.body))
class TestCase2(TestCase):
"""
body as returned from requestbin service (https://requestb.in)
"""
body = '''{"id":155,"name":"deleteme asap (subscription)","slug":"deleteme-asap-subscription","permalink":"https:\/\/www.colouree.com\/product\/deleteme-asap-subscription\/","date_created":"2018-02-27T10:10:18","date_created_gmt":"2018-02-27T10:10:18","date_modified":"2018-02-27T15:33:07","date_modified_gmt":"2018-02-27T15:33:07","type":"subscription","status":"publish","featured":false,"catalog_visibility":"visible","description":"<p>test 1<\/p>\n","short_description":"","sku":"","price":"","regular_price":"","sale_price":"","date_on_sale_from":null,"date_on_sale_from_gmt":null,"date_on_sale_to":null,"date_on_sale_to_gmt":null,"price_html":"<ins class=\"h2\"><\/ins> <span class=\"subscription-details\"> \/ month<\/span>","on_sale":false,"purchasable":false,"total_sales":0,"virtual":false,"downloadable":false,"downloads":[],"download_limit":-1,"download_expiry":-1,"external_url":"","button_text":"","tax_status":"taxable","tax_class":"","manage_stock":false,"stock_quantity":null,"in_stock":true,"backorders":"no","backorders_allowed":false,"backordered":false,"sold_individually":false,"weight":"","dimensions":{"length":"","width":"","height":""},"shipping_required":true,"shipping_taxable":true,"shipping_class":"","shipping_class_id":0,"reviews_allowed":false,"average_rating":"0.00","rating_count":0,"related_ids":[143,151,153],"upsell_ids":[],"cross_sell_ids":[],"parent_id":0,"purchase_note":"","categories":[{"id":15,"name":"Uncategorized","slug":"uncategorized"}],"tags":[],"images":[{"id":0,"date_created":"2018-02-27T15:33:17","date_created_gmt":"2018-02-27T15:33:17","date_modified":"2018-02-27T15:33:17","date_modified_gmt":"2018-02-27T15:33:17","src":"https:\/\/www.colouree.com\/wp-content\/plugins\/woocommerce\/assets\/images\/placeholder.png","name":"Segnaposto","alt":"Segnaposto","position":0}],"attributes":[],"default_attributes":[],"variations":[],"grouped_products":[],"menu_order":0,"meta_data":[{"id":744,"key":"_vc_post_settings","value":{"vc_grid_id":[]}},{"id":751,"key":"_uncode_featured_media_display","value":"carousel"},{"id":780,"key":"_subscription_payment_sync_date","value":"0"},{"id":781,"key":"_uncode_specific_menu_opaque","value":"off"},{"id":782,"key":"_uncode_specific_menu_no_shadow","value":"off"},{"id":783,"key":"_uncode_blocks_list","value":"104"},{"id":784,"key":"_uncode_revslider_list","value":"HomeHeader"},{"id":785,"key":"_uncode_header_full_width","value":"on"},{"id":786,"key":"_uncode_header_height","value":["50","%"]},{"id":787,"key":"_uncode_header_title","value":"on"},{"id":788,"key":"_uncode_header_title_custom","value":"off"},{"id":789,"key":"_uncode_header_style","value":"dark"},{"id":790,"key":"_uncode_header_content_width","value":"off"},{"id":791,"key":"_uncode_header_custom_width","value":"100"},{"id":792,"key":"_uncode_header_align","value":"left"},{"id":793,"key":"_uncode_header_position","value":"header-center header-middle"},{"id":794,"key":"_uncode_header_title_size","value":"h1"},{"id":795,"key":"_uncode_header_title_italic","value":"off"},{"id":796,"key":"_uncode_header_featured","value":"on"},{"id":797,"key":"_uncode_header_background","value":{"background-color":"color-wayh","background-repeat":"","background-attachment":"","background-position":"","background-size":"","background-image":""}},{"id":798,"key":"_uncode_header_parallax","value":"off"},{"id":799,"key":"_uncode_header_kburns","value":"off"},{"id":800,"key":"_uncode_header_overlay_color_alpha","value":"100"},{"id":801,"key":"_uncode_header_scroll_opacity","value":"off"},{"id":802,"key":"_uncode_header_scrolldown","value":"off"},{"id":803,"key":"_uncode_menu_no_padding","value":"off"},{"id":804,"key":"_uncode_menu_no_padding_mobile","value":"off"},{"id":805,"key":"_uncode_product_media_size","value":"0"},{"id":806,"key":"_uncode_specific_navigation_hide","value":"off"},{"id":807,"key":"_uncode_fullpage_type","value":"curtain"},{"id":808,"key":"_uncode_fullpage_opacity","value":"off"},{"id":809,"key":"_uncode_scroll_dots","value":"off"},{"id":810,"key":"_uncode_empty_dots","value":"off"},{"id":811,"key":"_uncode_scroll_history","value":"off"},{"id":812,"key":"_uncode_scroll_safe_padding","value":"on"},{"id":813,"key":"_uncode_scroll_additional_padding","value":"0"},{"id":814,"key":"_uncode_fullpage_mobile","value":"off"},{"id":815,"key":"slide_template","value":"default"},{"id":816,"key":"_yoast_wpseo_primary_product_cat","value":""},{"id":817,"key":"_subscription_price","value":""},{"id":818,"key":"_subscription_trial_length","value":"0"},{"id":819,"key":"_subscription_sign_up_fee","value":""},{"id":820,"key":"_subscription_period","value":"month"},{"id":821,"key":"_subscription_period_interval","value":"1"},{"id":822,"key":"_subscription_length","value":"0"},{"id":823,"key":"_subscription_trial_period","value":"day"},{"id":824,"key":"_subscription_limit","value":"no"},{"id":825,"key":"_subscription_one_time_shipping","value":"no"},{"id":826,"key":"_yoast_wpseo_content_score","value":"30"}]}'''
signature = '+BdsMOyi+ryYTnB8bEm2wY6HZ8J4X1Z5g1E++uU0UQs='
if __name__ == '__main__':
unittest.main(argv=sys.argv[:1])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment