Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 
 
 

263 řádky
8.0 KiB

  1. # Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. import webnotes
  5. import webnotes.db
  6. import webnotes.utils
  7. import webnotes.profile
  8. from webnotes import conf
  9. from webnotes.sessions import Session
  10. class HTTPRequest:
  11. def __init__(self):
  12. # Get Environment variables
  13. self.domain = webnotes.request.host
  14. if self.domain and self.domain.startswith('www.'):
  15. self.domain = self.domain[4:]
  16. # language
  17. self.set_lang(webnotes.get_request_header('HTTP_ACCEPT_LANGUAGE'))
  18. # load cookies
  19. webnotes.local.cookie_manager = CookieManager()
  20. # override request method. All request to be of type POST, but if _type == "POST" then commit
  21. if webnotes.form_dict.get("_type"):
  22. webnotes.local.request_method = webnotes.form_dict.get("_type")
  23. del webnotes.form_dict["_type"]
  24. # set db
  25. self.connect()
  26. # login
  27. webnotes.local.login_manager = LoginManager()
  28. # check status
  29. if webnotes.conn.get_global("__session_status")=='stop':
  30. webnotes.msgprint(webnotes.conn.get_global("__session_status_message"))
  31. raise webnotes.SessionStopped('Session Stopped')
  32. # load profile
  33. self.setup_profile()
  34. # run login triggers
  35. if webnotes.form_dict.get('cmd')=='login':
  36. webnotes.local.login_manager.run_trigger('on_session_creation')
  37. def set_lang(self, lang):
  38. import translate
  39. lang_list = translate.get_all_languages() or []
  40. if not lang:
  41. return
  42. if ";" in lang: # not considering weightage
  43. lang = lang.split(";")[0]
  44. if "," in lang:
  45. lang = lang.split(",")
  46. else:
  47. lang = [lang]
  48. for l in lang:
  49. code = l.strip()
  50. if code in lang_list:
  51. webnotes.local.lang = code
  52. return
  53. # check if parent language (pt) is setup, if variant (pt-BR)
  54. if "-" in code:
  55. code = code.split("-")[0]
  56. if code in lang_list:
  57. webnotes.local.lang = code
  58. return
  59. def setup_profile(self):
  60. webnotes.local.user = webnotes.profile.Profile()
  61. def get_db_name(self):
  62. """get database name from conf"""
  63. return conf.db_name
  64. def connect(self, ac_name = None):
  65. """connect to db, from ac_name or db_name"""
  66. webnotes.local.conn = webnotes.db.Database(user = self.get_db_name(), \
  67. password = getattr(conf,'db_password', ''))
  68. class LoginManager:
  69. def __init__(self):
  70. self.user = None
  71. if webnotes.local.form_dict.get('cmd')=='login' or webnotes.local.request.path=="/api/method/login":
  72. self.login()
  73. else:
  74. self.make_session(resume=True)
  75. def login(self):
  76. # clear cache
  77. webnotes.clear_cache(user = webnotes.form_dict.get('usr'))
  78. self.authenticate()
  79. self.post_login()
  80. def post_login(self):
  81. self.run_trigger('on_login')
  82. self.validate_ip_address()
  83. self.validate_hour()
  84. self.make_session()
  85. self.set_user_info()
  86. def set_user_info(self):
  87. info = webnotes.conn.get_value("Profile", self.user,
  88. ["user_type", "first_name", "last_name", "user_image"], as_dict=1)
  89. if info.user_type=="Website User":
  90. webnotes.local._response.set_cookie("system_user", "no")
  91. webnotes.local.response["message"] = "No App"
  92. else:
  93. webnotes.local._response.set_cookie("system_user", "yes")
  94. webnotes.local.response['message'] = 'Logged In'
  95. full_name = " ".join(filter(None, [info.first_name, info.last_name]))
  96. webnotes.response["full_name"] = full_name
  97. webnotes._response.set_cookie("full_name", full_name)
  98. webnotes._response.set_cookie("user_id", self.user)
  99. webnotes._response.set_cookie("user_image", info.user_image or "")
  100. def make_session(self, resume=False):
  101. # start session
  102. webnotes.local.session_obj = Session(user=self.user, resume=resume)
  103. # reset user if changed to Guest
  104. self.user = webnotes.local.session_obj.user
  105. webnotes.local.session = webnotes.local.session_obj.data
  106. def authenticate(self, user=None, pwd=None):
  107. if not (user and pwd):
  108. user, pwd = webnotes.form_dict.get('usr'), webnotes.form_dict.get('pwd')
  109. if not (user and pwd):
  110. self.fail('Incomplete login details')
  111. self.check_if_enabled(user)
  112. self.user = self.check_password(user, pwd)
  113. def check_if_enabled(self, user):
  114. """raise exception if user not enabled"""
  115. from webnotes.utils import cint
  116. if user=='Administrator': return
  117. if not cint(webnotes.conn.get_value('Profile', user, 'enabled')):
  118. self.fail('User disabled or missing')
  119. def check_password(self, user, pwd):
  120. """check password"""
  121. user = webnotes.conn.sql("""select `user` from __Auth where `user`=%s
  122. and `password`=password(%s)""", (user, pwd))
  123. if not user:
  124. self.fail('Incorrect password')
  125. else:
  126. return user[0][0] # in correct case
  127. def fail(self, message):
  128. webnotes.local.response['message'] = message
  129. raise webnotes.AuthenticationError
  130. def run_trigger(self, method='on_login'):
  131. for method in webnotes.get_hooks().get("method", []):
  132. webnotes.get_attr(method)(self)
  133. def validate_ip_address(self):
  134. """check if IP Address is valid"""
  135. ip_list = webnotes.conn.get_value('Profile', self.user, 'restrict_ip', ignore=True)
  136. if not ip_list:
  137. return
  138. ip_list = ip_list.replace(",", "\n").split('\n')
  139. ip_list = [i.strip() for i in ip_list]
  140. for ip in ip_list:
  141. if webnotes.get_request_header('REMOTE_ADDR', '').startswith(ip) or webnotes.get_request_header('X-Forwarded-For', '').startswith(ip):
  142. return
  143. webnotes.msgprint('Not allowed from this IP Address')
  144. raise webnotes.AuthenticationError
  145. def validate_hour(self):
  146. """check if user is logging in during restricted hours"""
  147. login_before = int(webnotes.conn.get_value('Profile', self.user, 'login_before', ignore=True) or 0)
  148. login_after = int(webnotes.conn.get_value('Profile', self.user, 'login_after', ignore=True) or 0)
  149. if not (login_before or login_after):
  150. return
  151. from webnotes.utils import now_datetime
  152. current_hour = int(now_datetime().strftime('%H'))
  153. if login_before and current_hour > login_before:
  154. webnotes.msgprint('Not allowed to login after restricted hour', raise_exception=1)
  155. if login_after and current_hour < login_after:
  156. webnotes.msgprint('Not allowed to login before restricted hour', raise_exception=1)
  157. def login_as_guest(self):
  158. """login as guest"""
  159. self.user = 'Guest'
  160. self.post_login()
  161. def logout(self, arg='', user=None):
  162. if not user: user = webnotes.session.user
  163. self.run_trigger('on_logout')
  164. if user in ['demo@erpnext.com', 'Administrator']:
  165. webnotes.conn.sql('delete from tabSessions where sid=%s', webnotes.session.get('sid'))
  166. webnotes.cache().delete_value("session:" + webnotes.session.get("sid"))
  167. else:
  168. from webnotes.sessions import clear_sessions
  169. clear_sessions(user)
  170. if user == webnotes.session.user:
  171. webnotes.session.sid = ""
  172. webnotes.local._response.delete_cookie("full_name")
  173. webnotes.local._response.delete_cookie("user_id")
  174. webnotes.local._response.delete_cookie("sid")
  175. webnotes.local._response.set_cookie("full_name", "")
  176. webnotes.local._response.set_cookie("user_id", "")
  177. webnotes.local._response.set_cookie("sid", "")
  178. class CookieManager:
  179. def __init__(self):
  180. pass
  181. def set_cookies(self):
  182. if not webnotes.local.session.get('sid'): return
  183. import datetime
  184. # sid expires in 3 days
  185. expires = datetime.datetime.now() + datetime.timedelta(days=3)
  186. if webnotes.session.sid:
  187. webnotes.local._response.set_cookie("sid", webnotes.session.sid, expires = expires)
  188. if webnotes.session.session_country:
  189. webnotes.local._response.set_cookie('country', webnotes.session.get("session_country"))
  190. def set_remember_me(self):
  191. from webnotes.utils import cint
  192. if not cint(webnotes.form_dict.get('remember_me')): return
  193. remember_days = webnotes.conn.get_value('Control Panel', None,
  194. 'remember_for_days') or 7
  195. import datetime
  196. expires = datetime.datetime.now() + \
  197. datetime.timedelta(days=remember_days)
  198. webnotes.local._response.set_cookie["remember_me"] = 1
  199. def _update_password(user, password):
  200. webnotes.conn.sql("""insert into __Auth (user, `password`)
  201. values (%s, password(%s))
  202. on duplicate key update `password`=password(%s)""", (user,
  203. password, password))
  204. @webnotes.whitelist()
  205. def get_logged_user():
  206. return webnotes.session.user