blob: 1924ffb50b6a5068f7a866ec91e6399beeb3f2f4 [file] [log] [blame]
Chillar Anand915b3432021-09-02 16:44:59 +05301import base64
2import hashlib
3import hmac
Ankush Menatb05287d2022-01-27 20:08:05 +05304from urllib.parse import urlparse
Chillar Anand915b3432021-09-02 16:44:59 +05305
Saurabhd60c0f22018-05-16 11:33:47 +05306import frappe
7from frappe import _
Chillar Anand915b3432021-09-02 16:44:59 +05308
Chillar Anand915b3432021-09-02 16:44:59 +05309
Ankush Menat494bd9e2022-03-28 18:52:46 +053010def validate_webhooks_request(doctype, hmac_key, secret_key="secret"):
Saurabhd60c0f22018-05-16 11:33:47 +053011 def innerfn(fn):
12 settings = frappe.get_doc(doctype)
13
14 if frappe.request and settings and settings.get(secret_key) and not frappe.flags.in_test:
15 sig = base64.b64encode(
Ankush Menat494bd9e2022-03-28 18:52:46 +053016 hmac.new(settings.get(secret_key).encode("utf8"), frappe.request.data, hashlib.sha256).digest()
Saurabhd60c0f22018-05-16 11:33:47 +053017 )
18
barredterraeb9ee3f2023-12-05 11:22:55 +010019 if frappe.request.data and sig != bytes(frappe.get_request_header(hmac_key).encode()):
Ankush Menat494bd9e2022-03-28 18:52:46 +053020 frappe.throw(_("Unverified Webhook Data"))
Saurabhd60c0f22018-05-16 11:33:47 +053021 frappe.set_user(settings.modified_by)
22
23 return fn
24
25 return innerfn
26
Ankush Menat494bd9e2022-03-28 18:52:46 +053027
Ankush Menate28165e2021-05-07 20:27:51 +053028def get_webhook_address(connector_name, method, exclude_uri=False, force_https=False):
Saurabhd60c0f22018-05-16 11:33:47 +053029 endpoint = "erpnext.erpnext_integrations.connectors.{0}.{1}".format(connector_name, method)
30
31 if exclude_uri:
32 return endpoint
33
34 try:
35 url = frappe.request.url
36 except RuntimeError:
hrwx5aa87432019-09-13 17:04:01 +000037 url = "http://localhost:8000"
Saurabhd60c0f22018-05-16 11:33:47 +053038
Ankush Menate28165e2021-05-07 20:27:51 +053039 url_data = urlparse(url)
40 scheme = "https" if force_https else url_data.scheme
41 netloc = url_data.netloc
42
43 server_url = f"{scheme}://{netloc}/api/method/{endpoint}"
Saurabhd60c0f22018-05-16 11:33:47 +053044
hrwx5aa87432019-09-13 17:04:01 +000045 return server_url
Mangesh-Khairnar27f81e02020-09-15 14:38:06 +053046
Ankush Menat494bd9e2022-03-28 18:52:46 +053047
jbienesdev1c9410e2020-07-13 16:25:09 +080048def get_tracking_url(carrier, tracking_number):
49 # Return the formatted Tracking URL.
Ankush Menat494bd9e2022-03-28 18:52:46 +053050 tracking_url = ""
51 url_reference = frappe.get_value("Parcel Service", carrier, "url_reference")
jbienesdev1c9410e2020-07-13 16:25:09 +080052 if url_reference:
Ankush Menat494bd9e2022-03-28 18:52:46 +053053 tracking_url = frappe.render_template(url_reference, {"tracking_number": tracking_number})
jbienesdev1c9410e2020-07-13 16:25:09 +080054 return tracking_url