您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

256 行
7.4 KiB

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