Token length increased to 255
[osm/LW-UI.git] / authosm / models.py
1 #
2 # Copyright 2018 EveryUP Srl
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 #
16 from __future__ import unicode_literals
17 from django.db import models
18 from django.utils.translation import ugettext_lazy as _
19 from django.contrib.auth.models import User, AbstractBaseUser, BaseUserManager, PermissionsMixin
20 from django.utils import timezone
21
22 from authosm.exceptions import OSMAuthException
23 from lib.osm.osmclient.clientv2 import Client
24 import utils
25
26
27 class OsmUserManager(BaseUserManager):
28 """Custom manager for OsmUser."""
29
30 def _create_user(self, username, password, is_staff, is_superuser, **extra_fields):
31 """Create and save a CustomUser with the given username and password. """
32 now = timezone.now()
33
34 if not username:
35 raise ValueError('The given username must be set')
36
37 is_active = extra_fields.pop("is_active", True)
38 user = self.model(username=username, is_staff=is_staff, is_active=is_active,
39 is_superuser=is_superuser, last_login=now,
40 date_joined=now, **extra_fields)
41 user.set_password(password)
42 user.save(using=self._db)
43 return user
44
45 """Create and save an OsmUser with the given username and password."""
46 def create_superuser(self, username, password, **extra_fields):
47 return self._create_user(username, password, True, True, is_admin=True,
48 **extra_fields)
49
50
51 class AbstractOsmUser(AbstractBaseUser, PermissionsMixin):
52 """Abstract User with the same behaviour as Django's default User.
53
54
55 Inherits from both the AbstractBaseUser and PermissionMixin.
56
57 The following attributes are inherited from the superclasses:
58 * password
59 * last_login
60 * is_superuser
61
62 """
63 username = models.CharField(_('username'), primary_key=True, max_length=255, unique=True, db_index=True)
64
65 is_admin = models.BooleanField(_('admin status'), default=False)
66 is_basic_user = models.BooleanField(_('basic_user status'), default=False)
67 current_project = models.CharField(_('project_id'), max_length=255)
68
69 psw = models.CharField(_('psw'), max_length=36)
70 token = models.CharField(_('token'), max_length=255)
71 project_id = models.CharField(_('project_id'), max_length=36)
72 token_expires = models.FloatField(_('token_expires'), max_length=36)
73
74 objects = OsmUserManager()
75
76 USERNAME_FIELD = 'username'
77 REQUIRED_FIELDS = []
78
79 @property
80 def is_authenticated(self):
81 """Checks for a valid authentication."""
82 if self.token is not None and utils.is_token_valid({'expires': self.token_expires}):
83 return True
84 else:
85 return False
86
87 def get_token(self):
88 if self.is_authenticated:
89 return {'id': self.token, 'expires': self.token_expires, 'project_id': self.project_id}
90 return None
91
92 def get_projects(self):
93 client = Client()
94 result = client.get_user_info(self.get_token(), self.username)
95 if 'error' in result and result['error'] is True:
96 return []
97 else:
98 return result['data']['projects']
99
100 def switch_project(self, project_id):
101 client = Client()
102 result = client.switch_project({'project_id': project_id, 'username': self.username, 'password': self.psw})
103 if 'error' in result and result['error'] is True:
104 raise OSMAuthException(result['data'])
105 else:
106 self.token = result['data']['id']
107 self.project_id = result['data']['project_id']
108 self.token_expires = result['data']['expires']
109 self.save()
110 return True
111 return False
112
113 class Meta:
114 verbose_name = _('custom user')
115 verbose_name_plural = _('custom users')
116 abstract = True
117
118
119 class OsmUser(AbstractOsmUser):
120 """
121 Concrete class of AbstractCustomUser.
122
123 Use this if you don't need to extend CustomUser.
124
125 """
126
127 class Meta(AbstractOsmUser.Meta):
128 swappable = 'AUTH_USER_MODEL'
129