Changeset 518
- Timestamp:
- 08/16/05 17:54:05 (3 years ago)
- Files:
-
- django/trunk/django/bin/daily_cleanup.py (modified) (1 diff)
- django/trunk/django/conf/global_settings.py (modified) (3 diffs)
- django/trunk/django/contrib/comments/views/comments.py (modified) (2 diffs)
- django/trunk/django/core/handlers/modpython.py (modified) (2 diffs)
- django/trunk/django/core/handlers/wsgi.py (modified) (2 diffs)
- django/trunk/django/middleware/admin.py (modified) (5 diffs)
- django/trunk/django/middleware/sessions.py (added)
- django/trunk/django/models/auth.py (modified) (2 diffs)
- django/trunk/django/models/core.py (modified) (1 diff)
- django/trunk/django/parts/auth/anonymoususers.py (modified) (2 diffs)
- django/trunk/django/parts/auth/formfields.py (modified) (2 diffs)
- django/trunk/django/views/auth/login.py (modified) (3 diffs)
- django/trunk/docs/faq.txt (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/trunk/django/bin/daily_cleanup.py
r3 r518 8 8 # Clean up old database records 9 9 cursor = db.cursor() 10 cursor.execute("DELETE FROM auth_sessions WHERE start_time < NOW() - INTERVAL '2 weeks'")10 cursor.execute("DELETE FROM core_sessions WHERE expire_date < NOW()") 11 11 cursor.execute("DELETE FROM registration_challenges WHERE request_date < NOW() - INTERVAL '1 week'") 12 12 db.commit() django/trunk/django/conf/global_settings.py
r376 r518 48 48 # Host for sending e-mail. 49 49 EMAIL_HOST = 'localhost' 50 51 # Name of the session cookie. This can be whatever you want.52 AUTH_SESSION_COOKIE = 'rizzo'53 50 54 51 # List of locations of the template source files, in search order. … … 114 111 ) 115 112 113 ############ 114 # SESSIONS # 115 ############ 116 117 SESSION_COOKIE_NAME = 'hotclub' # Cookie name. This can be whatever you want. 118 SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 # Age of cookie, in seconds (default: 2 weeks). 119 SESSION_COOKIE_DOMAIN = None # A string like ".lawrence.com", or None for standard domain cookie. 120 116 121 ######### 117 122 # CACHE # … … 121 126 # possible values. 122 127 CACHE_BACKEND = 'simple://' 123 124 # Set to a string like ".lawrence.com", or None for a standard domain cookie.125 REGISTRATION_COOKIE_DOMAIN = None126 128 127 129 #################### django/trunk/django/contrib/comments/views/comments.py
r316 r518 3 3 from django.core.exceptions import Http404, ObjectDoesNotExist 4 4 from django.core.extensions import DjangoContext as Context 5 from django.models.auth import sessions5 from django.models.auth import users 6 6 from django.models.comments import comments, freecomments 7 7 from django.models.core import contenttypes … … 216 216 # so they don't have to enter a username/password again. 217 217 if manipulator.get_user() and new_data.has_key('password') and manipulator.get_user().check_password(new_data['password']): 218 sessions.start_web_session(manipulator.get_user_id(), request, response)218 request.session[users.SESSION_KEY] = manipulator.get_user_id() 219 219 if errors or request.POST.has_key('preview'): 220 220 class CommentFormWrapper(formfields.FormWrapper): django/trunk/django/core/handlers/modpython.py
r511 r518 96 96 return self._raw_post_data 97 97 98 def _load_session_and_user(self):99 from django.models.auth import sessions100 from django.conf.settings import AUTH_SESSION_COOKIE101 session_cookie = self.COOKIES.get(AUTH_SESSION_COOKIE, '')102 try:103 self._session = sessions.get_session_from_cookie(session_cookie)104 self._user = self._session.get_user()105 except sessions.SessionDoesNotExist:106 from django.parts.auth import anonymoususers107 self._session = None108 self._user = anonymoususers.AnonymousUser()109 110 def _get_session(self):111 if not hasattr(self, '_session'):112 self._load_session_and_user()113 return self._session114 115 def _set_session(self, session):116 self._session = session117 118 98 def _get_user(self): 119 99 if not hasattr(self, '_user'): 120 self._load_session_and_user() 100 from django.models.auth import users 101 try: 102 user_id = self.session[users.SESSION_KEY] 103 if not user_id: 104 raise ValueError 105 self._user = users.get_object(pk=user_id) 106 except (AttributeError, KeyError, ValueError, users.UserDoesNotExist): 107 from django.parts.auth import anonymoususers 108 self._user = anonymoususers.AnonymousUser() 121 109 return self._user 122 110 … … 131 119 REQUEST = property(_get_request) 132 120 raw_post_data = property(_get_raw_post_data) 133 session = property(_get_session, _set_session)134 121 user = property(_get_user, _set_user) 135 122 django/trunk/django/core/handlers/wsgi.py
r511 r518 77 77 return self._raw_post_data 78 78 79 def _load_session_and_user(self):80 from django.models.auth import sessions81 from django.conf.settings import AUTH_SESSION_COOKIE82 session_cookie = self.COOKIES.get(AUTH_SESSION_COOKIE, '')83 try:84 self._session = sessions.get_session_from_cookie(session_cookie)85 self._user = self._session.get_user()86 except sessions.SessionDoesNotExist:87 from django.parts.auth import anonymoususers88 self._session = None89 self._user = anonymoususers.AnonymousUser()90 91 def _get_session(self):92 if not hasattr(self, '_session'):93 self._load_session_and_user()94 return self._session95 96 def _set_session(self, session):97 self._session = session98 99 79 def _get_user(self): 100 80 if not hasattr(self, '_user'): 101 self._load_session_and_user() 81 from django.models.auth import users 82 try: 83 user_id = self.session[users.SESSION_KEY] 84 if not user_id: 85 raise ValueError 86 self._user = users.get_object(pk=user_id) 87 except (AttributeError, KeyError, ValueError, users.UserDoesNotExist): 88 from django.parts.auth import anonymoususers 89 self._user = anonymoususers.AnonymousUser() 102 90 return self._user 103 91 … … 111 99 REQUEST = property(_get_request) 112 100 raw_post_data = property(_get_raw_post_data) 113 session = property(_get_session, _set_session)114 101 user = property(_get_user, _set_user) 115 102 django/trunk/django/middleware/admin.py
r325 r518 2 2 from django.core import template_loader 3 3 from django.core.extensions import DjangoContext as Context 4 from django.models.auth import sessions,users4 from django.models.auth import users 5 5 from django.views.registration import passwords 6 6 from django.views.auth.login import logout … … 30 30 # conf, which is a little uglier than this. Same goes for the logout 31 31 # view. 32 32 33 if view_func in (passwords.password_reset, passwords.password_reset_done, logout): 33 34 return 35 36 assert hasattr(request, 'session'), "The admin requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.middleware.sessions.SessionMiddleware' before %r." % self.__class__.__name__ 34 37 35 38 # Check for a logged in, valid user … … 37 40 return 38 41 39 # If this isn't alrea y the login page, display it42 # If this isn't already the login page, display it 40 43 if not request.POST.has_key('this_is_the_login_form'): 41 44 if request.POST: … … 65 68 else: 66 69 if self.authenticate_user(user, request.POST.get('password', '')): 70 request.session[users.SESSION_KEY] = user.id 67 71 if request.POST.has_key('post_data'): 68 72 post_data = decode_post_data(request.POST['post_data']) … … 71 75 request.POST = post_data 72 76 request.user = user 73 request.session = sessions.create_session(user.id)74 77 return 75 78 else: 76 response = httpwrappers.HttpResponseRedirect(request.path) 77 sessions.start_web_session(user.id, request, response) 78 return response 79 return httpwrappers.HttpResponseRedirect(request.path) 79 80 else: 80 81 return self.display_login_form(request, ERROR_MESSAGE) django/trunk/django/models/auth.py
r469 r518 45 45 meta.ManyToManyField(Permission, name='user_permissions', blank=True, filter_interface=meta.HORIZONTAL), 46 46 ) 47 module_constants = { 48 'SESSION_KEY': '_auth_user_id', 49 } 47 50 ordering = ('username',) 48 51 exceptions = ('SiteProfileNotAvailable',) … … 173 176 return ''.join([choice(allowed_chars) for i in range(length)]) 174 177 175 class Session(meta.Model):176 fields = (177 meta.ForeignKey(User),178 meta.CharField('session_md5', maxlength=32),179 meta.DateTimeField('start_time', auto_now=True),180 )181 module_constants = {182 'TEST_COOKIE_NAME': 'testcookie',183 'TEST_COOKIE_VALUE': 'worked',184 }185 186 def __repr__(self):187 return "session started at %s" % self.start_time188 189 def get_cookie(self):190 "Returns a tuple of the cookie name and value for this session."191 from django.conf.settings import AUTH_SESSION_COOKIE, SECRET_KEY192 import md5193 return AUTH_SESSION_COOKIE, self.session_md5 + md5.new(self.session_md5 + SECRET_KEY + 'auth').hexdigest()194 195 def _module_create_session(user_id):196 "Registers a session and returns the session_md5."197 from django.conf.settings import SECRET_KEY198 import md5, random, sys199 # The random module is seeded when this Apache child is created.200 # Use person_id and SECRET_KEY as added salt.201 session_md5 = md5.new(str(random.randint(user_id, sys.maxint - 1)) + SECRET_KEY).hexdigest()202 s = Session(None, user_id, session_md5, None)203 s.save()204 return s205 206 def _module_get_session_from_cookie(session_cookie_string):207 from django.conf.settings import SECRET_KEY208 import md5209 if not session_cookie_string:210 raise SessionDoesNotExist211 session_md5, tamper_check = session_cookie_string[:32], session_cookie_string[32:]212 if md5.new(session_md5 + SECRET_KEY + 'auth').hexdigest() != tamper_check:213 raise SessionDoesNotExist214 return get_object(session_md5__exact=session_md5, select_related=True)215 216 def _module_destroy_all_sessions(user_id):217 "Destroys all sessions for a user, logging out all computers."218 for session in get_list(user_id__exact=user_id):219 session.delete()220 221 def _module_start_web_session(user_id, request, response):222 "Sets the necessary cookie in the given HttpResponse object, also updates last login time for user."223 from django.models.auth import users224 from django.conf.settings import REGISTRATION_COOKIE_DOMAIN225 user = users.get_object(pk=user_id)226 user.last_login = datetime.datetime.now()227 user.save()228 session = create_session(user_id)229 key, value = session.get_cookie()230 cookie_domain = REGISTRATION_COOKIE_DOMAIN or None231 response.set_cookie(key, value, domain=cookie_domain)232 233 178 class Message(meta.Model): 234 179 fields = ( django/trunk/django/models/core.py
r477 r518 104 104 def get_absolute_url(self): 105 105 return self.url 106 107 import base64, md5, random, sys 108 import cPickle as pickle 109 110 class Session(meta.Model): 111 fields = ( 112 meta.CharField('session_key', maxlength=40, primary_key=True), 113 meta.TextField('session_data'), 114 meta.DateTimeField('expire_date'), 115 ) 116 module_constants = { 117 'base64': base64, 118 'md5': md5, 119 'pickle': pickle, 120 'random': random, 121 'sys': sys, 122 } 123 124 def get_decoded(self): 125 from django.conf.settings import SECRET_KEY 126 encoded_data = base64.decodestring(self.session_data) 127 pickled, tamper_check = encoded_data[:-32], encoded_data[-32:] 128 if md5.new(pickled + SECRET_KEY).hexdigest() != tamper_check: 129 from django.core.exceptions import SuspiciousOperation 130 raise SuspiciousOperation, "User tampered with session cookie." 131 return pickle.loads(pickled) 132 133 def _module_encode(session_dict): 134 "Returns the given session dictionary pickled and encoded as a string." 135 from django.conf.settings import SECRET_KEY 136 pickled = pickle.dumps(session_dict) 137 pickled_md5 = md5.new(pickled + SECRET_KEY).hexdigest() 138 return base64.encodestring(pickled + pickled_md5) 139 140 def _module_get_new_session_key(): 141 "Returns session key that isn't being used." 142 from django.conf.settings import SECRET_KEY 143 # The random module is seeded when this Apache child is created. 144 # Use person_id and SECRET_KEY as added salt. 145 while 1: 146 session_key = md5.new(str(random.randint(0, sys.maxint - 1)) + SECRET_KEY).hexdigest() 147 try: 148 get_object(session_key__exact=session_key) 149 except SessionDoesNotExist: 150 break 151 return session_key 152 153 def _module_save(session_key, session_dict, expire_date): 154 s = Session(session_key, encode(session_dict), expire_date) 155 if session_dict: 156 s.save() 157 else: 158 s.delete() # Clear sessions with no data. 159 return s django/trunk/django/parts/auth/anonymoususers.py
r9 r518 1 """2 Anonymous users3 """4 5 1 class AnonymousUser: 6 7 2 def __init__(self): 8 3 pass … … 41 36 return [] 42 37 43 def add_session(self, session_md5, start_time):44 "Creates Session for this User, saves it, and returns the new object"45 raise NotImplementedError46 47 38 def is_anonymous(self): 48 39 return True django/trunk/django/parts/auth/formfields.py
r3 r518 1 from django.models.auth import sessions,users1 from django.models.auth import users 2 2 from django.core import formfields, validators 3 3 … … 24 24 25 25 def hasCookiesEnabled(self, field_data, all_data): 26 if self.request and (not self.request.COOKIES.has_key(sessions.TEST_COOKIE_NAME) or self.request.COOKIES[sessions.TEST_COOKIE_NAME] != sessions.TEST_COOKIE_VALUE):26 if self.request and not self.request.test_cookie_worked(): 27 27 raise validators.ValidationError, "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in." 28 28 django/trunk/django/views/auth/login.py
r515 r518 2 2 from django.core import formfields, template_loader 3 3 from django.core.extensions import DjangoContext as Context 4 from django.models.auth import sessions4 from django.models.auth import users 5 5 from django.models.core import sites 6 6 from django.utils.httpwrappers import HttpResponse, HttpResponseRedirect … … 18 18 if not redirect_to or '://' in redirect_to or ' ' in redirect_to: 19 19 redirect_to = '/accounts/profile/' 20 response = HttpResponseRedirect(redirect_to) 21 sessions.start_web_session(manipulator.get_user_id(), request, response) 22 return response 20 request.session[users.SESSION_KEY] = manipulator.get_user_id() 21 return HttpResponseRedirect(redirect_to) 23 22 else: 24 23 errors = {} 25 24 response = HttpResponse() 26 # Set this cookie as a test to see whether the user accepts cookies 27 response.set_cookie(sessions.TEST_COOKIE_NAME, sessions.TEST_COOKIE_VALUE) 25 response.session.set_test_cookie() 28 26 t = template_loader.get_template('registration/login') 29 27 c = Context(request, { … … 35 33 return response 36 34 37 def logout(request ):35 def logout(request, next_page=None): 38 36 "Logs out the user and displays 'You are logged out' message." 39 if request.session: 40 # Do a redirect to this page until the session has been cleared. 41 response = HttpResponseRedirect(request.path) 42 # Delete the cookie by setting a cookie with an empty value and max_age=0 43 response.set_cookie(request.session.get_cookie()[0], '', max_age=0) 44 request.session.delete() 45 return response 46 else: 37 try: 38 del request.session[users.SESSION_KEY] 39 except KeyError: 47 40 t = template_loader.get_template('registration/logged_out') 48 41 c = Context(request) 49 42 return HttpResponse(t.render(c)) 43 else: 44 # Do a redirect to this page until the session has been cleared. 45 return HttpResponseRedirect(next_page or request.path) 50 46 51 47 def logout_then_login(request): 52 48 "Logs out the user if he is logged in. Then redirects to the log-in page." 53 response = HttpResponseRedirect('/accounts/login/') 54 if request.session: 55 # Delete the cookie by setting a cookie with an empty value and max_age=0 56 response.set_cookie(request.session.get_cookie()[0], '', max_age=0) 57 request.session.delete() 58 return response 49 return logout(request, '/accounts/login/') 59 50 60 51 def redirect_to_login(next): django/trunk/docs/faq.txt
r394 r518 311 311 things: 312 312 313 * Set the `` REGISTRATION_COOKIE_DOMAIN`` setting in your admin config file313 * Set the ``SESSION_COOKIE_DOMAIN`` setting in your admin config file 314 314 to match your domain. For example, if you're going to 315 315 "http://www.mysite.com/admin/" in your browser, in 316 "myproject.settings.admin" you should set `` REGISTRATION_COOKIE_DOMAIN =316 "myproject.settings.admin" you should set ``SESSION_COOKIE_DOMAIN = 317 317 'www.mysite.com'``. 318 318 … … 321 321 or another domain that doesn't have a dot in it, try going to 322 322 "localhost.localdomain" or "127.0.0.1". And set 323 `` REGISTRATION_COOKIE_DOMAIN`` accordingly.323 ``SESSION_COOKIE_DOMAIN`` accordingly. 324 324 325 325 I can't log in. When I enter a valid username and password, it brings up the login page again, with a "Please enter a correct username and password" error.
