blob: b52c3fc2a877742ce4260097783c25f022f2bc52 [file] [log] [blame]
Chillar Anand915b3432021-09-02 16:44:59 +05301import base64
2import hashlib
3import hmac
4
Saurabhd60c0f22018-05-16 11:33:47 +05305import frappe
6from frappe import _
Saurabhd60c0f22018-05-16 11:33:47 +05307from six.moves.urllib.parse import urlparse
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
Saurabhd60c0f22018-05-16 11:33:47 +053012def validate_webhooks_request(doctype, hmac_key, secret_key='secret'):
13 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(
18 hmac.new(
19 settings.get(secret_key).encode('utf8'),
20 frappe.request.data,
21 hashlib.sha256
22 ).digest()
23 )
24
25 if frappe.request.data and \
26 frappe.get_request_header(hmac_key) and \
27 not sig == bytes(frappe.get_request_header(hmac_key).encode()):
28 frappe.throw(_("Unverified Webhook Data"))
29 frappe.set_user(settings.modified_by)
30
31 return fn
32
33 return innerfn
34
Ankush Menate28165e2021-05-07 20:27:51 +053035def get_webhook_address(connector_name, method, exclude_uri=False, force_https=False):
Saurabhd60c0f22018-05-16 11:33:47 +053036 endpoint = "erpnext.erpnext_integrations.connectors.{0}.{1}".format(connector_name, method)
37
38 if exclude_uri:
39 return endpoint
40
41 try:
42 url = frappe.request.url
43 except RuntimeError:
hrwx5aa87432019-09-13 17:04:01 +000044 url = "http://localhost:8000"
Saurabhd60c0f22018-05-16 11:33:47 +053045
Ankush Menate28165e2021-05-07 20:27:51 +053046 url_data = urlparse(url)
47 scheme = "https" if force_https else url_data.scheme
48 netloc = url_data.netloc
49
50 server_url = f"{scheme}://{netloc}/api/method/{endpoint}"
Saurabhd60c0f22018-05-16 11:33:47 +053051
hrwx5aa87432019-09-13 17:04:01 +000052 return server_url
Mangesh-Khairnar27f81e02020-09-15 14:38:06 +053053
Mangesh-Khairnar1bef6a52020-10-04 13:01:11 +053054def create_mode_of_payment(gateway, payment_type="General"):
Mangesh-Khairnar27f81e02020-09-15 14:38:06 +053055 payment_gateway_account = frappe.db.get_value("Payment Gateway Account", {
56 "payment_gateway": gateway
57 }, ['payment_account'])
58
Ankush Menat4551d7d2021-08-19 13:41:10 +053059 mode_of_payment = frappe.db.exists("Mode of Payment", gateway)
Deepesh Gargb2af6b42021-07-05 13:46:03 +053060 if not mode_of_payment and payment_gateway_account:
Mangesh-Khairnar27f81e02020-09-15 14:38:06 +053061 mode_of_payment = frappe.get_doc({
62 "doctype": "Mode of Payment",
63 "mode_of_payment": gateway,
64 "enabled": 1,
Mangesh-Khairnar1bef6a52020-10-04 13:01:11 +053065 "type": payment_type,
66 "accounts": [{
Mangesh-Khairnar27f81e02020-09-15 14:38:06 +053067 "doctype": "Mode of Payment Account",
68 "company": get_default_company(),
69 "default_account": payment_gateway_account
Mangesh-Khairnar1bef6a52020-10-04 13:01:11 +053070 }]
Mangesh-Khairnar27f81e02020-09-15 14:38:06 +053071 })
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
jbienesdev1c9410e2020-07-13 16:25:09 +080078def get_tracking_url(carrier, tracking_number):
79 # Return the formatted Tracking URL.
80 tracking_url = ''
81 url_reference = frappe.get_value('Parcel Service', carrier, 'url_reference')
82 if url_reference:
83 tracking_url = frappe.render_template(url_reference, {'tracking_number': tracking_number})
jbienesdev1c9410e2020-07-13 16:25:09 +080084 return tracking_url