Projet

Général

Profil

0001-encrypt-user-credentials-9534.patch

Josué Kouka, 11 janvier 2016 13:00

Télécharger (3,98 ko)

Voir les différences:

Subject: [PATCH] encrypt user credentials (#9534)

 debian/control              |  1 +
 mandayejs/mandaye/models.py | 51 +++++++++++++++++++++++++++++++++++++++++++--
 mandayejs/mandaye/utils.py  |  8 +++++++
 mandayejs/mandaye/views.py  |  1 +
 4 files changed, 59 insertions(+), 2 deletions(-)
debian/control
13 13
    python-gadjo,
14 14
    python-django-jsonfield,
15 15
    python-ldap,
16
    python-crypto
16 17
Recommends: python-django-mellon
17 18
Description: Authentication Reverse Proxy
18 19

  
mandayejs/mandaye/models.py
14 14
# You should have received a copy of the GNU Affero General Public License
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17
import base64
18
from Crypto.Cipher import AES
17 19

  
18 20
from django.db import models
19
from jsonfield import JSONField
21
from django.conf import settings
20 22
from django.utils.translation import ugettext_lazy as _
21 23

  
24
from jsonfield import JSONField
25

  
26
from mandayejs.mandaye.utils import get_password_field
27

  
22 28

  
23 29
class UserCredentials(models.Model):
24 30
    user = models.ForeignKey('auth.User')
......
33 39
            or self.user.email \
34 40
            or self.user.username
35 41

  
36
    def to_login_info(self):
42
    def save(self, *args, **kwargs):
43
        self.encrypt()
44
        super(UserCredentials, self).save(*args, **kwargs)
45

  
46
    def _get_secret_key(self):
47
        """Return secret key under 32 characters
48
        """
49
        return settings.SECRET_KEY[0:-(len(settings.SECRET_KEY)-32)]
50

  
51
    def _get_cipher(self):
52
        """Return cipher object
53
        """
54
        return AES.new(self._get_secret_key(), AES.MODE_CFB, "0000000000000000")
55

  
56
    def encrypt(self,):
57
        """Encrypt password
58
        """
59
        password_field_name = get_password_field()
60
        cipher = self._get_cipher()
61
        self.locators[password_field_name] = \
62
           base64.b64encode(cipher.encrypt(
63
               self.locators.get(password_field_name,'')
64
            )) 
65

  
66
        return self.locators
67

  
68
    def decrypt(self,):
69
        """Decrypt password
70
        """
71
        password_field_name = get_password_field()
72
        cipher = self._get_cipher()
73
        self.locators[password_field_name] = \
74
            cipher.decrypt(
75
                base64.b64decode(
76
                    self.locators.get(password_field_name,'')
77
            ))
78

  
79
        return self.locators
80

  
81
    def to_login_info(self, decrypt=False):
82
        if decrypt:
83
            self.decrypt()
37 84
        return {'#'+k : v for k,v in self.locators.items() }
38 85

  
mandayejs/mandaye/utils.py
51 51
    url = url._replace(netloc=settings.SITE_DOMAIN)
52 52
    return url.path
53 53

  
54
def get_password_field():
55
    """Return name of the password field
56
    """
57
    try:
58
        field_name = [ field.get('name') for field in settings.SITE_LOCATORS if field.get('kind') == 'password' ]
59
        return field_name[0]
60
    except (IndexError,):
61
        return None
54 62

  
mandayejs/mandaye/views.py
153 153
        'auth_checker': os.path.join(site_static_root, site_auth_checker)
154 154
    }
155 155
    logger.debug(login_info)
156
    login_info['locators'] = [ credentials.to_login_info(decrypt=True)]
156 157
    result = exec_phantom(login_info)
157 158
    logger.debug(result)
158 159

  
159
-