Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 
 

139 rader
3.5 KiB

  1. import frappe
  2. import ldap, json
  3. from frappe.integration_broker.integration_controller import IntegrationController
  4. from frappe import _
  5. from frappe.utils import cstr, cint
  6. class Controller(IntegrationController):
  7. service_name = 'LDAP Auth'
  8. parameters_template = [
  9. {
  10. "label": "LDAP Server Url",
  11. "fieldname": "ldap_server_url",
  12. "reqd": 1,
  13. "fieldtype": "Data"
  14. },
  15. {
  16. "label": "Organizational Unit",
  17. "fieldname": "organizational_unit",
  18. "reqd": 1,
  19. "fieldtype": "Data"
  20. },
  21. {
  22. "label": "Base Distinguished Name (DN)",
  23. "fieldname": "base_dn",
  24. "reqd": 1,
  25. "fieldtype": "Data"
  26. },
  27. {
  28. "label": "Password for Base DN",
  29. "fieldname": "password",
  30. "reqd": 1,
  31. "fieldtype": "Password"
  32. },
  33. {
  34. "label": "Sync frequency from ldap to frappe",
  35. "fieldname": "sync_frequency",
  36. "reqd": 1,
  37. "fieldtype": "Select",
  38. "options": "\nDaily\nWeekly",
  39. }
  40. ]
  41. js = "assets/frappe/js/integrations/ldap_auth.js"
  42. def enable(self, parameters, use_test_account=0):
  43. self.parameters = parameters
  44. self.validate_ldap_credentails()
  45. def validate_ldap_credentails(self):
  46. ldap_settings = self.get_settings()
  47. try:
  48. conn = ldap.initialize(ldap_settings.get('ldap_server_url'))
  49. conn.simple_bind_s(ldap_settings.get("base_dn"), ldap_settings.get("password"))
  50. except ldap.LDAPError:
  51. conn.unbind_s()
  52. frappe.throw("Incorrect UserId or Password")
  53. def get_settings(self):
  54. return frappe._dict(self.parameters)
  55. def get_ldap_settings():
  56. try:
  57. doc = frappe.get_doc("Integration Service", "LDAP Auth")
  58. settings = json.loads(doc.custom_settings_json)
  59. settings.update({
  60. "enabled": cint(doc.enabled),
  61. "method": "frappe.integrations.ldap_auth.login"
  62. })
  63. return settings
  64. except Exception:
  65. # this will return blank settings
  66. return frappe._dict()
  67. @frappe.whitelist(allow_guest=True)
  68. def login():
  69. #### LDAP LOGIN LOGIC #####
  70. args = frappe.form_dict
  71. user = authenticate_ldap_user(args.usr, args.pwd)
  72. frappe.local.login_manager.user = user.name
  73. frappe.local.login_manager.post_login()
  74. # because of a GET request!
  75. frappe.db.commit()
  76. def authenticate_ldap_user(user=None, password=None):
  77. dn = None
  78. params = {}
  79. settings = get_ldap_settings()
  80. conn = ldap.initialize(settings.get('ldap_server_url'))
  81. print settings
  82. try:
  83. # simple_bind_s is synchronous binding to server, it takes two param DN and password
  84. conn.simple_bind_s(settings.get("base_dn"), settings.get("password"))
  85. print "here"
  86. #search for surnames beginning with a
  87. #available options for how deep a search you want.
  88. #LDAP_SCOPE_BASE, LDAP_SCOPE_ONELEVEL,LDAP_SCOPE_SUBTREE,
  89. result = conn.search_s(settings.get("organizational_unit"), ldap.SCOPE_SUBTREE,
  90. "uid=*{0}".format(user))
  91. print result
  92. for dn, r in result:
  93. dn = cstr(dn)
  94. params["email"] = cstr(r['mail'][0])
  95. params["username"] = cstr(r['uid'][0])
  96. params["first_name"] = cstr(r['cn'][0])
  97. if dn:
  98. conn.simple_bind_s(dn, password)
  99. return create_user(params)
  100. else:
  101. frappe.throw(_("Not a valid LDAP user"))
  102. except ldap.LDAPError:
  103. conn.unbind_s()
  104. frappe.throw(_("Incorrect UserId or Password"))
  105. def create_user(params):
  106. if frappe.db.exists("User", params["email"]):
  107. return frappe.get_doc("User", params["email"])
  108. else:
  109. params.update({
  110. "doctype": "User",
  111. "send_welcome_email": 0,
  112. "language": "",
  113. "user_type": "System User",
  114. "user_roles": [{
  115. "role": _("Blogger")
  116. }]
  117. })
  118. user = frappe.get_doc(params).insert(ignore_permissions=True)
  119. frappe.db.commit()
  120. return user