diff --git a/sso/cron.py b/sso/cron.py index 4ba3180..fe48e58 100644 --- a/sso/cron.py +++ b/sso/cron.py @@ -24,30 +24,6 @@ class RemoveInvalidUsers(): # For each user, update access list based on Corp details user.get_profile().update_access() -class ValidateDisabledUsers(): - """ - Cycles through all users, and disables any Service Account of disabled - users. - """ - - # run daily - run_every = 84600 - - @property - def _logger(self): - if not hasattr(self, '__logger'): - self.__logger = logging.getLogger(__name__) - return self.__logger - - def job(self): - for servacc in ServiceAccount.objects.filter(active=0): - self._logger.info('Checking %s' % servacc) - api = servacc.service.api_class - api.settings = servacc.service.settings - if not api.disable_user(servacc.service_uid): - self._logger.error('Error disabling %s on %s' % (servacc, servacc.service)) - - class UpdateServiceGroups(): """ Cycles through all service accounts and updates group access. diff --git a/sso/models.py b/sso/models.py index d79fac5..3653ef6 100644 --- a/sso/models.py +++ b/sso/models.py @@ -112,8 +112,7 @@ class SSOUser(models.Model): def update_service_groups(sender, instance, created, **kwargs): if not created: for acc in instance.serviceaccount_set.all(): - cls = acc.service.api_class - cls.update_groups(acc.service_uid, instance.groups.all()) + acc.service.api_class.update_groups(acc.service_uid, instance.groups.all()) signals.post_save.connect(SSOUser.create_user_profile, sender=User) #signals.post_save.connect(SSOUser.update_service_groups, sender=User) @@ -217,50 +216,20 @@ class ServiceAccount(models.Model): return "%s: %s (%s)" % (self.service.name, self.user.username, self.service_uid) def save(self): - """ Override default save to setup accounts as needed """ + if self.id: + org = ServiceAccount.object.get(id=self.pk) - # Grab the API class and load the settings - api = self.service.api_class - - if not self.service_uid: - # Create a account if we've not got a UID - if self.active: - # Force username to be the same as their selected character - # Fix unicode first of all - name = unicodedata.normalize('NFKD', self.character.name).encode('ASCII', 'ignore') - - # Remove spaces and non-acceptable characters - self.username = re.sub('[^a-zA-Z0-9_-]+', '', name) - - if not api.check_user(self.username): - eveapi = None - for eacc in EVEAccount.objects.filter(user=self.user): - if self.character in eacc.characters.all(): - eveapi = eacc - break - - reddit = RedditAccount.objects.filter(user=self.user) - d = api.add_user(self.username, self.password, user=self.user, character=self.character) - if not d: - raise ServiceError('Error occured while trying to create the Service Account, please try again later') - else: - self.service_uid = d['username'] + if org.active != self.active and self.service_uid: + if self.active: + self.service.api_class.enable_user(self.service_uid) else: - raise ExistingUser('Username %s has already been took' % self.username) - else: - return + self.service.api_class.disable_user(self.service_uid) - # Disable account marked as inactive - if self.service_uid and not self.active: - api.disable_user(self.service_uid) - - # All went OK, save to the DB - return models.Model.save(self) + models.Model.save(self) @staticmethod def pre_delete_listener( **kwargs ): - api = kwargs['instance'].service.api_class - if not api.delete_user(kwargs['instance'].service_uid): + if not kwargs['instance'].service.api_class.delete_user(kwargs['instance'].service_uid): raise ServiceError('Unable to delete account on related service') signals.pre_delete.connect(ServiceAccount.pre_delete_listener, sender=ServiceAccount) diff --git a/sso/views.py b/sso/views.py index d163856..df9590f 100644 --- a/sso/views.py +++ b/sso/views.py @@ -134,26 +134,36 @@ def service_add(request): if request.method == 'POST': form = clsform(request.POST) if form.is_valid(): - + acc = ServiceAccount() acc.user = request.user acc.service = form.cleaned_data['service'] acc.character = form.cleaned_data['character'] - if settings.GENERATE_SERVICE_PASSWORD: - acc.password = hashlib.sha1('%s%s%s' % (form.cleaned_data['character'].name, settings.SECRET_KEY, random.randint(0, 2147483647))).hexdigest() - else: - acc.password = form.cleaned_data['password'] - try: - acc.save() - except ExistingUser: - error = "User by this name already exists, your account has not been created" - except ServiceError: - error = "A error occured while trying to create the Service Account, please try again later" + if acc.service.settings['require_password']: + if settings.GENERATE_SERVICE_PASSWORD: + acc.password = hashlib.sha1('%s%s%s' % (form.cleaned_data['character'].name, settings.SECRET_KEY, random.randint(0, 2147483647))).hexdigest() + else: + acc.password = form.cleaned_data['password'] else: - error = None + acc.password = None + + # Decode unicode and remove invalid characters + username = re.sub('[^a-zA-Z0-9_-]+', '', unicodedata.normalize('NFKD', self.character.name).encode('ASCII', 'ignore')) + + if acc.service.api_class.check_user(username): + error = "Username already exists on the target service, please contact an admin." + else: + ret = acc.service.api_class.add_user(username, acc.password, user=request.user, character=acc.character) + if ret: + acc.service_uid = ret['username'] + acc.save() + error = None + else: + error = "Error creating account on the service, please retry or contact an admin if the error persists." return render_to_response('sso/serviceaccount/created.html', locals(), context_instance=RequestContext(request)) + else: availserv = Service.objects.filter(groups__in=request.user.groups.all()).exclude(id__in=ServiceAccount.objects.filter(user=request.user).values('service')) if len(availserv) == 0: diff --git a/templates/sso/serviceaccount/created.html b/templates/sso/serviceaccount/created.html index 6140f71..e22d77c 100644 --- a/templates/sso/serviceaccount/created.html +++ b/templates/sso/serviceaccount/created.html @@ -14,8 +14,9 @@ this is incorrect please raise a bug on the tracker.
| Service: | {{ acc.service.name }} |
| Service URL: | {{ acc.service.url }} |
| Username: | {{ acc.service_uid }} |
| Password: | {{ acc.password }} |
| {{ key }}: | {{ value }} |