mirror of
https://github.com/nikdoof/test-auth.git
synced 2025-12-14 14:52:15 +00:00
Various changes to several aspects of the model base.
* Added SSOUser extension profile for auth * Now checks for Corp membership and executes required commands * Various small fixups
This commit is contained in:
@@ -78,12 +78,10 @@ INSTALLED_APPS = (
|
|||||||
'django.contrib.sessions',
|
'django.contrib.sessions',
|
||||||
'django.contrib.sites',
|
'django.contrib.sites',
|
||||||
'registration',
|
'registration',
|
||||||
'eve_proxy',
|
|
||||||
'eve_api',
|
|
||||||
'sso',
|
'sso',
|
||||||
)
|
)
|
||||||
|
|
||||||
AUTH_PROFILE_MODULE = 'sso.UserProfile'
|
AUTH_PROFILE_MODULE = 'sso.SSOUser'
|
||||||
|
|
||||||
### Jabber Service Settings
|
### Jabber Service Settings
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
Admin interface models. Automatically detected by admin.autodiscover().
|
Admin interface models. Automatically detected by admin.autodiscover().
|
||||||
"""
|
"""
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from sso.models import *
|
from sso.models import Service, ServiceAccount
|
||||||
|
|
||||||
admin.site.register(sso.models.Service)
|
admin.site.register(Service)
|
||||||
|
admin.site.register(ServiceAccount)
|
||||||
|
|||||||
@@ -1,40 +1,80 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
from django.db.models import signals
|
from django.db.models import signals
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User, UserManager
|
||||||
|
|
||||||
from sso.service import get_api
|
from services import get_api
|
||||||
|
|
||||||
|
## Exceptions
|
||||||
|
|
||||||
|
class CorporateOnlyService(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
## Models
|
||||||
|
|
||||||
|
class SSOUser(User):
|
||||||
|
""" Extended SSO User Profile options """
|
||||||
|
|
||||||
|
user = models.ForeignKey(User, unique=True, related_name='profile')
|
||||||
|
|
||||||
|
default_service_passwd = models.CharField(max_length=200)
|
||||||
|
default_service_username = models.CharField(max_length=200)
|
||||||
|
|
||||||
|
website = models.CharField(max_length=200)
|
||||||
|
aim = models.CharField(max_length=64)
|
||||||
|
msn = models.CharField(max_length=200)
|
||||||
|
icq = models.CharField(max_length=15)
|
||||||
|
xmpp = models.CharField(max_length=200)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.user
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def create_user_profile(sender, instance, created, **kwargs):
|
||||||
|
if created:
|
||||||
|
profile, created = SSOUser.objects.get_or_create(user=instance)
|
||||||
|
|
||||||
|
signals.post_save.connect(SSOUser.create_user_profile, sender=User)
|
||||||
|
|
||||||
class Service(models.Model):
|
class Service(models.Model):
|
||||||
|
name = models.CharField(max_length=200)
|
||||||
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)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "%s: %s" % (self.name, self.api)
|
||||||
|
|
||||||
class ServiceAccount(models.Model):
|
class ServiceAccount(models.Model):
|
||||||
user = models.ForeignKey(User,blank=False)
|
user = models.ForeignKey(User, blank=False)
|
||||||
service = models.ForeignKey(Service,blank=False)
|
service = models.ForeignKey(Service, blank=False)
|
||||||
username = models.CharField(max_length=200,blank=False)
|
username = models.CharField(max_length=200, blank=False)
|
||||||
|
password = models.CharField(max_length=200, blank=False)
|
||||||
active = models.BooleanField()
|
active = models.BooleanField()
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "%s: %s (%s)" % (self.service.name, self.user.username, self.username)
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
""" Override default save to setup accounts as needed """
|
""" 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:
|
if not self.username:
|
||||||
self.username = self.user.name
|
self.username = self.user.username
|
||||||
|
|
||||||
api = get_api(self.service.api)
|
api = get_api(self.service.api)
|
||||||
|
|
||||||
|
if api.corp_only:
|
||||||
|
if not self.user.get_profile().corp_user:
|
||||||
|
raise CorporateOnlyService()
|
||||||
|
|
||||||
if self.active:
|
if self.active:
|
||||||
if not api.check_user(self.username):
|
if not api.check_user(self.username):
|
||||||
api.add_user(self.username, self.password)
|
api.add_user(self.username, self.password)
|
||||||
else:
|
else:
|
||||||
if api.check_user(self.username):
|
if api.check_user(self.username):
|
||||||
api.del_user(self.username)
|
api.delete_user(self.username)
|
||||||
|
|
||||||
|
if self.user.get_profile().corp_user:
|
||||||
|
api.set_corp(self.username)
|
||||||
|
|
||||||
# All went OK, save to the DB
|
# All went OK, save to the DB
|
||||||
return models.Model.save(self)
|
return models.Model.save(self)
|
||||||
@@ -43,6 +83,6 @@ class ServiceAccount(models.Model):
|
|||||||
def pre_delete_listener( **kwargs ):
|
def pre_delete_listener( **kwargs ):
|
||||||
api = get_api(kwargs['instance'].service.api)
|
api = get_api(kwargs['instance'].service.api)
|
||||||
if api.check_user(kwargs['instance'].username):
|
if api.check_user(kwargs['instance'].username):
|
||||||
api.del_user(kwargs['instance'].username)
|
api.delete_user(kwargs['instance'].username)
|
||||||
|
|
||||||
signals.pre_delete.connect(ServiceAccount.pre_delete_listener, sender=ServiceAccount)
|
signals.pre_delete.connect(ServiceAccount.pre_delete_listener, sender=ServiceAccount)
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
|
|
||||||
def get_api(api):
|
def get_api(api):
|
||||||
try:
|
try:
|
||||||
mod = __import__(self.service.api)
|
mod = __import__(api)
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise DoesNotExist('Error creating service')
|
raise DoesNotExist('Error creating service')
|
||||||
|
|
||||||
for i in self.service.api.spit(".")[1:]:
|
for i in api.split(".")[1:]:
|
||||||
mod = getattr(mod, i)
|
mod = getattr(mod, i)
|
||||||
|
|
||||||
return getattr(mod, mod.ServiceClass)()
|
return getattr(mod, mod.ServiceClass)()
|
||||||
@@ -33,7 +33,7 @@ class BaseService():
|
|||||||
""" Disable a user """
|
""" Disable a user """
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def enable_user(self, username):
|
def enable_user(self, username, password):
|
||||||
""" Enable a user """
|
""" Enable a user """
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|||||||
@@ -4,16 +4,18 @@ import settings
|
|||||||
|
|
||||||
class JabberService(BaseService):
|
class JabberService(BaseService):
|
||||||
|
|
||||||
|
corp_only = True
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.ejctl = eJabberdCtl(sudo=settings.JABBER_SUDO)
|
self.ejctl = eJabberdCtl(sudo=settings.JABBER_SUDO)
|
||||||
|
|
||||||
def add_user(username, password):
|
def add_user(self, username, password):
|
||||||
""" Add user to service """
|
""" Add user to service """
|
||||||
return self.ejctl.register(username, settings.JABBER_SERVER, password)
|
return self.ejctl.register(username, settings.JABBER_SERVER, password)
|
||||||
|
|
||||||
def set_corp(self, username):
|
def set_corp(self, username):
|
||||||
""" User is in corp, enable extra privs """
|
""" User is in corp, enable extra privs """
|
||||||
return self.ejctl.srg_user_add(username, settings.JABBER_SERVER, settings.JABBER_GROUP)
|
pass
|
||||||
|
|
||||||
def delete_user(self, username):
|
def delete_user(self, username):
|
||||||
""" Delete a user """
|
""" Delete a user """
|
||||||
@@ -25,7 +27,7 @@ class JabberService(BaseService):
|
|||||||
|
|
||||||
def enable_user(self, username):
|
def enable_user(self, username):
|
||||||
""" Enable a user """
|
""" Enable a user """
|
||||||
|
return self.ejctl.enable_user(settings.JABBER_SERVER, username, password)
|
||||||
|
|
||||||
def check_user(self, username):
|
def check_user(self, username):
|
||||||
""" Check if the username exists """
|
""" Check if the username exists """
|
||||||
|
|||||||
@@ -23,9 +23,12 @@ class eJabberdCtl():
|
|||||||
|
|
||||||
args = []
|
args = []
|
||||||
args.extend(self.ejctl)
|
args.extend(self.ejctl)
|
||||||
args.extend(shlex.split(commandline))
|
args.extend(shlex.split(commandline.encode('ascii')))
|
||||||
|
|
||||||
print args
|
# Convert all arguments to ascii first
|
||||||
|
#args = map(lambda x: x.encode('ascii'), args)
|
||||||
|
|
||||||
|
print 'Executing: %s' % " ".join(args)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
proc = subprocess.Popen(args, stdout=subprocess.PIPE)
|
proc = subprocess.Popen(args, stdout=subprocess.PIPE)
|
||||||
@@ -61,7 +64,7 @@ class eJabberdCtl():
|
|||||||
def register(self, user, server, password):
|
def register(self, user, server, password):
|
||||||
""" Adds a user to a vhost """
|
""" Adds a user to a vhost """
|
||||||
|
|
||||||
cmd = "register %s %s %s" % (user, server, password)
|
cmd = 'register %s %s %s' % (user, server, password)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self._execute(cmd)
|
self._execute(cmd)
|
||||||
|
|||||||
5
sso/urls.py
Normal file
5
sso/urls.py
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
from django.conf.urls.defaults import *
|
||||||
|
|
||||||
|
urlpatterns = patterns('',
|
||||||
|
(r'^profile/' 'views.profile'),
|
||||||
|
)
|
||||||
16
sso/views.py
16
sso/views.py
@@ -1 +1,17 @@
|
|||||||
# Create your views here.
|
# Create your views here.
|
||||||
|
|
||||||
|
|
||||||
|
def index(request):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def profile(request):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def service_add(request):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def service_del(request):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
2
test.py
2
test.py
@@ -1,7 +1,7 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
|
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
|
||||||
|
|
||||||
|
from sso.models import Service
|
||||||
from sso.services.jabber import JabberService
|
from sso.services.jabber import JabberService
|
||||||
|
|
||||||
b = JabberService()
|
b = JabberService()
|
||||||
|
|||||||
3
urls.py
3
urls.py
@@ -5,7 +5,6 @@ from django.contrib import admin
|
|||||||
admin.autodiscover()
|
admin.autodiscover()
|
||||||
|
|
||||||
urlpatterns = patterns('',
|
urlpatterns = patterns('',
|
||||||
#(r'^login/', include('django.contrib.auth.views.login')),
|
|
||||||
|
|
||||||
(r'^admin/', include(admin.site.urls)),
|
(r'^admin/', include(admin.site.urls)),
|
||||||
|
(r'^sso/', include('sso.urls')),
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user