blob: 981486eb3094ea1cb6d34f66350eb303d8bf4cfd [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
Mangesh-Khairnar27f81e02020-09-15 14:38:06 +05309from erpnext import get_default_company
Saurabhd60c0f22018-05-16 11:33:47 +053010
Chillar Anand915b3432021-09-02 16:44:59 +053011
Ankush Menat494bd9e2022-03-28 18:52:46 +053012def validate_webhooks_request(doctype, hmac_key, secret_key="secret"):
Saurabhd60c0f22018-05-16 11:33:47 +053013 def innerfn(fn):
14 settings = frappe.get_doc(doctype)
15
16 if frappe.request and settings and settings.get(secret_key) and not frappe.flags.in_test:
17 sig = base64.b64encode(
Ankush Menat494bd9e2022-03-28 18:52:46 +053018 hmac.new(settings.get(secret_key).encode("utf8"), frappe.request.data, hashlib.sha256).digest()
Saurabhd60c0f22018-05-16 11:33:47 +053019 )
20
Ankush Menat494bd9e2022-03-28 18:52:46 +053021 if frappe.request.data and not sig == bytes(frappe.get_request_header(hmac_key).encode()):
22 frappe.throw(_("Unverified Webhook Data"))
Saurabhd60c0f22018-05-16 11:33:47 +053023 frappe.set_user(settings.modified_by)
24
25 return fn
26
27 return innerfn
28
Ankush Menat494bd9e2022-03-28 18:52:46 +053029
Ankush Menate28165e2021-05-07 20:27:51 +053030def get_webhook_address(connector_name, method, exclude_uri=False, force_https=False):
Saurabhd60c0f22018-05-16 11:33:47 +053031 endpoint = "erpnext.erpnext_integrations.connectors.{0}.{1}".format(connector_name, method)
32
33 if exclude_uri:
34 return endpoint
35
36 try:
37 url = frappe.request.url
38 except RuntimeError:
hrwx5aa87432019-09-13 17:04:01 +000039 url = "http://localhost:8000"
Saurabhd60c0f22018-05-16 11:33:47 +053040
Ankush Menate28165e2021-05-07 20:27:51 +053041 url_data = urlparse(url)
42 scheme = "https" if force_https else url_data.scheme
43 netloc = url_data.netloc
44
45 server_url = f"{scheme}://{netloc}/api/method/{endpoint}"
Saurabhd60c0f22018-05-16 11:33:47 +053046
hrwx5aa87432019-09-13 17:04:01 +000047 return server_url
Mangesh-Khairnar27f81e02020-09-15 14:38:06 +053048
Ankush Menat494bd9e2022-03-28 18:52:46 +053049
Mangesh-Khairnar1bef6a52020-10-04 13:01:11 +053050def create_mode_of_payment(gateway, payment_type="General"):
Ankush Menat494bd9e2022-03-28 18:52:46 +053051 payment_gateway_account = frappe.db.get_value(
52 "Payment Gateway Account", {"payment_gateway": gateway}, ["payment_account"]
53 )
Mangesh-Khairnar27f81e02020-09-15 14:38:06 +053054
Ankush Menat4551d7d2021-08-19 13:41:10 +053055 mode_of_payment = frappe.db.exists("Mode of Payment", gateway)
Deepesh Gargb2af6b42021-07-05 13:46:03 +053056 if not mode_of_payment and payment_gateway_account:
Ankush Menat494bd9e2022-03-28 18:52:46 +053057 mode_of_payment = frappe.get_doc(
58 {
59 "doctype": "Mode of Payment",
60 "mode_of_payment": gateway,
61 "enabled": 1,
62 "type": payment_type,
63 "accounts": [
64 {
65 "doctype": "Mode of Payment Account",
66 "company": get_default_company(),
67 "default_account": payment_gateway_account,
68 }
69 ],
70 }
71 )
jbienesdev1c9410e2020-07-13 16:25:09 +080072 mode_of_payment.insert(ignore_permissions=True)
73
Deepesh Gargb2af6b42021-07-05 13:46:03 +053074 return mode_of_payment
Deepesh Garg3ef394c2021-07-05 14:45:33 +053075 elif mode_of_payment:
Deepesh Gargb2af6b42021-07-05 13:46:03 +053076 return frappe.get_doc("Mode of Payment", mode_of_payment)
77
Ankush Menat494bd9e2022-03-28 18:52:46 +053078
jbienesdev1c9410e2020-07-13 16:25:09 +080079def get_tracking_url(carrier, tracking_number):
80 # Return the formatted Tracking URL.
Ankush Menat494bd9e2022-03-28 18:52:46 +053081 tracking_url = ""
82 url_reference = frappe.get_value("Parcel Service", carrier, "url_reference")
jbienesdev1c9410e2020-07-13 16:25:09 +080083 if url_reference:
Ankush Menat494bd9e2022-03-28 18:52:46 +053084 tracking_url = frappe.render_template(url_reference, {"tracking_number": tracking_number})
jbienesdev1c9410e2020-07-13 16:25:09 +080085 return tracking_url