diff --git a/AUTHORS b/AUTHORS index 68b3ecf4..112b7f36 100644 --- a/AUTHORS +++ b/AUTHORS @@ -98,4 +98,4 @@ that much better: * Chris Williams * Robert Kajic * Jacob Peddicord - * Adam Parrish + * Nils Hasenbanck \ No newline at end of file diff --git a/docs/changelog.rst b/docs/changelog.rst index a458be8b..0c962cd1 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -2,8 +2,9 @@ Changelog ========= -Changes in 0.6.X +Changes in 0.6.3 ================ +- Updated sessions for Django 1.4 - Bug fix for updates where listfields contain embedded documents - Bug fix for collection naming and mixins diff --git a/docs/django.rst b/docs/django.rst index 4478b94f..144baab5 100644 --- a/docs/django.rst +++ b/docs/django.rst @@ -2,19 +2,21 @@ Using MongoEngine with Django ============================= +.. note :: Updated to support Django 1.4 + Connecting ========== In your **settings.py** file, ignore the standard database settings (unless you -also plan to use the ORM in your project), and instead call +also plan to use the ORM in your project), and instead call :func:`~mongoengine.connect` somewhere in the settings module. Authentication ============== MongoEngine includes a Django authentication backend, which uses MongoDB. The -:class:`~mongoengine.django.auth.User` model is a MongoEngine -:class:`~mongoengine.Document`, but implements most of the methods and +:class:`~mongoengine.django.auth.User` model is a MongoEngine +:class:`~mongoengine.Document`, but implements most of the methods and attributes that the standard Django :class:`User` model does - so the two are -moderately compatible. Using this backend will allow you to store users in +moderately compatible. Using this backend will allow you to store users in MongoDB but still use many of the Django authentication infrastucture (such as the :func:`login_required` decorator and the :func:`authenticate` function). To enable the MongoEngine auth backend, add the following to you **settings.py** @@ -24,7 +26,7 @@ file:: 'mongoengine.django.auth.MongoEngineBackend', ) -The :mod:`~mongoengine.django.auth` module also contains a +The :mod:`~mongoengine.django.auth` module also contains a :func:`~mongoengine.django.auth.get_user` helper function, that takes a user's :attr:`id` and returns a :class:`~mongoengine.django.auth.User` object. @@ -49,9 +51,9 @@ Storage ======= With MongoEngine's support for GridFS via the :class:`~mongoengine.FileField`, it is useful to have a Django file storage backend that wraps this. The new -storage module is called :class:`~mongoengine.django.storage.GridFSStorage`. +storage module is called :class:`~mongoengine.django.storage.GridFSStorage`. Using it is very similar to using the default FileSystemStorage.:: - + from mongoengine.django.storage import GridFSStorage fs = GridFSStorage() diff --git a/mongoengine/__init__.py b/mongoengine/__init__.py index 0cc74a42..9d0a7571 100644 --- a/mongoengine/__init__.py +++ b/mongoengine/__init__.py @@ -12,7 +12,7 @@ from signals import * __all__ = (document.__all__ + fields.__all__ + connection.__all__ + queryset.__all__ + signals.__all__) -VERSION = (0, 6, 2) +VERSION = (0, 6, 3) def get_version(): diff --git a/mongoengine/django/auth.py b/mongoengine/django/auth.py index 38370cc5..156daf74 100644 --- a/mongoengine/django/auth.py +++ b/mongoengine/django/auth.py @@ -1,23 +1,14 @@ from mongoengine import * -from django.utils.hashcompat import md5_constructor, sha_constructor from django.utils.encoding import smart_str from django.contrib.auth.models import AnonymousUser +from django.contrib.auth.hashers import check_password, make_password from django.utils.translation import ugettext_lazy as _ import datetime REDIRECT_FIELD_NAME = 'next' -def get_hexdigest(algorithm, salt, raw_password): - raw_password, salt = smart_str(raw_password), smart_str(salt) - if algorithm == 'md5': - return md5_constructor(salt + raw_password).hexdigest() - elif algorithm == 'sha1': - return sha_constructor(salt + raw_password).hexdigest() - raise ValueError('Got unknown password algorithm type in password') - - class User(Document): """A User document that aims to mirror most of the API specified by Django at http://docs.djangoproject.com/en/dev/topics/auth/#users @@ -34,7 +25,7 @@ class User(Document): email = EmailField(verbose_name=_('e-mail address')) password = StringField(max_length=128, verbose_name=_('password'), - help_text=_("Use '[algo]$[salt]$[hexdigest]' or use the change password form.")) + help_text=_("Use '[algo]$[iterations]$[salt]$[hexdigest]' or use the change password form.")) is_staff = BooleanField(default=False, verbose_name=_('staff status'), help_text=_("Designates whether the user can log into this admin site.")) @@ -75,11 +66,7 @@ class User(Document): assigning to :attr:`~mongoengine.django.auth.User.password` as the password is hashed before storage. """ - from random import random - algo = 'sha1' - salt = get_hexdigest(algo, str(random()), str(random()))[:5] - hash = get_hexdigest(algo, salt, raw_password) - self.password = '%s$%s$%s' % (algo, salt, hash) + self.password = make_password(raw_password) self.save() return self @@ -89,8 +76,7 @@ class User(Document): :attr:`~mongoengine.django.auth.User.password` as the password is hashed before storage. """ - algo, salt, hash = self.password.split('$') - return hash == get_hexdigest(algo, salt, raw_password) + return check_password(raw_password, self.password) @classmethod def create_user(cls, username, password, email=None): diff --git a/mongoengine/django/sessions.py b/mongoengine/django/sessions.py index 2f0e17fb..ca35962a 100644 --- a/mongoengine/django/sessions.py +++ b/mongoengine/django/sessions.py @@ -41,7 +41,7 @@ class SessionStore(SessionBase): def create(self): while True: - self.session_key = self._get_new_session_key() + self._session_key = self._get_new_session_key() try: self.save(must_create=True) except CreateError: @@ -51,7 +51,9 @@ class SessionStore(SessionBase): return def save(self, must_create=False): - s = MongoSession(session_key=self.session_key) + if self._session_key is None: + self.create() + s = MongoSession(session_key=self._session_key) s.session_data = self.encode(self._get_session(no_load=must_create)) s.expire_date = self.get_expiry_date() try: diff --git a/python-mongoengine.spec b/python-mongoengine.spec index 106243a4..164f5af5 100644 --- a/python-mongoengine.spec +++ b/python-mongoengine.spec @@ -5,7 +5,7 @@ %define srcname mongoengine Name: python-%{srcname} -Version: 0.6.2 +Version: 0.6.3 Release: 1%{?dist} Summary: A Python Document-Object Mapper for working with MongoDB