mirror of
https://github.com/nikdoof/test-auth.git
synced 2025-12-14 06:42:16 +00:00
Various work on services api and models
This commit is contained in:
11
settings.py
11
settings.py
@@ -84,3 +84,14 @@ INSTALLED_APPS = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
AUTH_PROFILE_MODULE = 'sso.UserProfile'
|
AUTH_PROFILE_MODULE = 'sso.UserProfile'
|
||||||
|
|
||||||
|
### Jabber Service Settings
|
||||||
|
|
||||||
|
# Vhost to add users to
|
||||||
|
JABBER_SERVER = 'dredd.it'
|
||||||
|
|
||||||
|
# Group to add authed people to
|
||||||
|
JABBER_GROUP = 'dreddit'
|
||||||
|
|
||||||
|
# Use sudo?
|
||||||
|
JABBER_SUDO = True
|
||||||
|
|||||||
7
sso/admin.py
Normal file
7
sso/admin.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
"""
|
||||||
|
Admin interface models. Automatically detected by admin.autodiscover().
|
||||||
|
"""
|
||||||
|
from django.contrib import admin
|
||||||
|
from sso.models import *
|
||||||
|
|
||||||
|
admin.site.register(sso.models.Service)
|
||||||
@@ -1,14 +1,48 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.db.models import signals
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
|
|
||||||
|
from sso.service import get_api
|
||||||
|
|
||||||
class Service(models.Model):
|
class Service(models.Model):
|
||||||
url = models.CharField(max_length=200)
|
url = models.CharField(max_length=200)
|
||||||
active = models.BooleanField()
|
active = models.BooleanField()
|
||||||
api = models.CharField(max_length=200)
|
api = models.CharField(max_length=200)
|
||||||
|
|
||||||
class ServiceAccount(models.Model):
|
class ServiceAccount(models.Model):
|
||||||
user = models.ForeignKey(User)
|
user = models.ForeignKey(User,blank=False)
|
||||||
service = models.ForeignKey(Service)
|
service = models.ForeignKey(Service,blank=False)
|
||||||
username = models.CharField(max_length=200)
|
username = models.CharField(max_length=200,blank=False)
|
||||||
active = models.BooleanField()
|
active = models.BooleanField()
|
||||||
|
|
||||||
|
def save(self):
|
||||||
|
""" Override default save to setup accounts as needed """
|
||||||
|
|
||||||
|
if not self.service:
|
||||||
|
raise DoesNotExist('No Service set on this account!')
|
||||||
|
|
||||||
|
if not self.user:
|
||||||
|
raise DoesNotExist('No User set on this account!')
|
||||||
|
|
||||||
|
if not self.username:
|
||||||
|
self.username = self.user.name
|
||||||
|
|
||||||
|
api = get_api(self.service.api)
|
||||||
|
|
||||||
|
if self.active:
|
||||||
|
if not api.check_user(self.username):
|
||||||
|
api.add_user(self.username, self.password)
|
||||||
|
else:
|
||||||
|
if api.check_user(self.username):
|
||||||
|
api.del_user(self.username)
|
||||||
|
|
||||||
|
# All went OK, save to the DB
|
||||||
|
return models.Model.save(self)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def pre_delete_listener( **kwargs ):
|
||||||
|
api = get_api(kwargs['instance'].service.api)
|
||||||
|
if api.check_user(kwargs['instance'].username):
|
||||||
|
api.del_user(kwargs['instance'].username)
|
||||||
|
|
||||||
|
signals.pre_delete.connect(ServiceAccount.pre_delete_listener, sender=ServiceAccount)
|
||||||
|
|||||||
@@ -1,4 +1,16 @@
|
|||||||
|
|
||||||
|
def get_api(api):
|
||||||
|
try:
|
||||||
|
mod = __import__(self.service.api)
|
||||||
|
except ImportError:
|
||||||
|
raise DoesNotExist('Error creating service')
|
||||||
|
|
||||||
|
for i in self.service.api.spit(".")[1:]:
|
||||||
|
mod = getattr(mod, i)
|
||||||
|
|
||||||
|
return getattr(mod, mod.ServiceClass)()
|
||||||
|
|
||||||
|
|
||||||
class BaseService():
|
class BaseService():
|
||||||
"""
|
"""
|
||||||
Base Service class, all service classes should inherit from this
|
Base Service class, all service classes should inherit from this
|
||||||
|
|||||||
37
sso/services/jabber/__init__.py
Normal file
37
sso/services/jabber/__init__.py
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
from sso.services import BaseService
|
||||||
|
from sso.services.jabber.ejabberdctl import eJabberdCtl
|
||||||
|
import settings
|
||||||
|
|
||||||
|
class JabberService(BaseService):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.ejctl = eJabberdCtl(sudo=settings.JABBER_SUDO)
|
||||||
|
|
||||||
|
def add_user(username, password):
|
||||||
|
""" Add user to service """
|
||||||
|
return self.ejctl.register(username, settings.JABBER_SERVER, password)
|
||||||
|
|
||||||
|
def set_corp(self, username):
|
||||||
|
""" User is in corp, enable extra privs """
|
||||||
|
return self.ejctl.srg_user_add(username, settings.JABBER_SERVER, settings.JABBER_GROUP)
|
||||||
|
|
||||||
|
def delete_user(self, username):
|
||||||
|
""" Delete a user """
|
||||||
|
return self.ejctl.unregister(username, settings.JABBER_SERVER)
|
||||||
|
|
||||||
|
def disable_user(self, username):
|
||||||
|
""" Disable a user """
|
||||||
|
return self.ejctl.ban_user(settings.JABBER_SERVER, username)
|
||||||
|
|
||||||
|
def enable_user(self, username):
|
||||||
|
""" Enable a user """
|
||||||
|
|
||||||
|
|
||||||
|
def check_user(self, username):
|
||||||
|
""" Check if the username exists """
|
||||||
|
if username not in self.ejctl.get_users(settings.JABBER_SERVER):
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
|
ServiceClass = 'JabberService'
|
||||||
@@ -12,21 +12,27 @@ class CommandError():
|
|||||||
class eJabberdCtl():
|
class eJabberdCtl():
|
||||||
""" Python abstraction of ejabberdctl """
|
""" Python abstraction of ejabberdctl """
|
||||||
|
|
||||||
def __init__(self, ejctl='/usr/sbin/ejabberdctl'):
|
def __init__(self, sudo=False, ejctl='/usr/sbin/ejabberdctl'):
|
||||||
self.ejctl = ejctl
|
if sudo:
|
||||||
|
self.ejctl = ['sudo',ejctl]
|
||||||
|
else:
|
||||||
|
self.ejctl = [ejctl]
|
||||||
|
|
||||||
def _execute(self, commandline):
|
def _execute(self, commandline):
|
||||||
""" Execute a ejabberd command """
|
""" Execute a ejabberd command """
|
||||||
|
|
||||||
args = [self.ejctl]
|
args = []
|
||||||
|
args.extend(self.ejctl)
|
||||||
args.extend(shlex.split(commandline))
|
args.extend(shlex.split(commandline))
|
||||||
|
|
||||||
|
print args
|
||||||
|
|
||||||
try:
|
try:
|
||||||
proc = subprocess.Popen(args, stdout=subprocess.PIPE)
|
proc = subprocess.Popen(args, stdout=subprocess.PIPE)
|
||||||
proc.wait()
|
proc.wait()
|
||||||
out = proc.communicate()
|
out = proc.communicate()
|
||||||
ret = proc.returncode
|
ret = proc.returncode
|
||||||
print "%d: %s" % (ret, out)
|
#print "%d: %s" % (ret, out)
|
||||||
except OSError, e:
|
except OSError, e:
|
||||||
raise CommandError('Error encountered during execution: %s' % e)
|
raise CommandError('Error encountered during execution: %s' % e)
|
||||||
if ret > 0:
|
if ret > 0:
|
||||||
@@ -184,11 +190,10 @@ class eJabberdCtl():
|
|||||||
""" Gets a list of users for a specific vhost """
|
""" Gets a list of users for a specific vhost """
|
||||||
|
|
||||||
cmd = "vhost %s registered-users" % server
|
cmd = "vhost %s registered-users" % server
|
||||||
|
|
||||||
try:
|
try:
|
||||||
out = self._execute(cmd)
|
out = self._execute(cmd)
|
||||||
except CommandError, e:
|
except CommandError, e:
|
||||||
return 0
|
return []
|
||||||
else:
|
else:
|
||||||
return out[:-1].split('\n')
|
return out[:-1].split('\n')
|
||||||
|
|
||||||
@@ -218,7 +223,7 @@ class eJabberdCtl():
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
b = eJabberdCtl()
|
b = eJabberdCtl(sudo=True)
|
||||||
|
|
||||||
print b.register('test88','dredd.it','bleh')
|
print b.register('test88','dredd.it','bleh')
|
||||||
print b.is_online('matalok', 'dredd.it')
|
print b.is_online('matalok', 'dredd.it')
|
||||||
Reference in New Issue
Block a user