diff --git a/.gitignore b/.gitignore index 67dc653..306b853 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,6 @@ django/ registration/ dbsettings.py +django_cron +django_evolution +piston diff --git a/api/__init__.py b/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/handlers.py b/api/handlers.py new file mode 100644 index 0000000..7333436 --- /dev/null +++ b/api/handlers.py @@ -0,0 +1,96 @@ +import re + +from piston.handler import BaseHandler +from piston.utils import rc, throttle + +from django.contrib.auth.models import User +from sso.models import ServiceAccount + +class UserHandler(BaseHandler): + allowed_methods = ('GET') + fields = ('id', 'username', 'password' ) + model = User + + def read(self, request, user=None, id=None, sid=None, suid=None): + + if user: + try: + user = User.objects.get(username=user) + except User.DoesNotExist: + return rc.NOT_HERE + if id: + try: + user = User.objects.get(id=id) + except (User.DoesNotExist, ValueError): + return rc.NOT_HERE + if sid: + try: + sa = ServiceAccount.objects.get(service_id=sid, service_uid=suid) + except ServiceAccount.DoesNotExist: + return rc.NOT_HERE + user = sa.user + + enctype, salt, passwd = user.password.split("$") + return { 'id': user.id, 'username': user.username, 'type': enctype, 'salt': salt } + + +class LoginHandler(BaseHandler): + allowed_methods = ('GET') + fields = ('id', 'username', 'password' ) + model = User + + def read(self, request): + if 'hash' not in request.GET: + return rc.BAD_REQUEST + else: + hash = request.GET['hash'] + + if 'username' in request.GET: + try: + user = User.objects.get(username=request.GET['username']) + except (User.DoesNotExist, ValueError): + return rc.NOT_HERE + elif 'id' in request.GET: + try: + user = User.objects.get(id=request.GET['id']) + except (User.DoesNotExist, ValueError): + return rc.NOT_HERE + elif 'suid' in request.GET: + if 'sid' not in request.GET: + return rc.BAD_REQUEST + try: + sa = ServiceAccount.objects.get(service_uid=request.GET['suid'], service=request.GET['sid']) + user = sa.user + except (ServiceAccount.DoesNotExist, ValueError): + return rc.NOT_HERE + else: + return rc.BAD_REQUEST + + enctype, salt, passwd = user.password.split("$") + + if hash == passwd: + return { 'auth': 'ok', 'id': user.id, 'username': user.username } + else: + return { 'auth': 'fail' } + + +class ServiceAccountHandler(BaseHandler): + allowed_methods = ('GET') + fields = ('id', 'user_id', 'service_uid' ) + model = ServiceAccount + + def read(self, request, id=None): + if id: + try: + account = ServiceAccount.objects.get(id=id) + except (ServiceAccount.DoesNotExist, ValueError): + return rc.NOT_HERE + else: + if request.GET['serviceuid']: + try: + account = ServiceAccount.objects.get(service_uid=request.GET['serviceuid']) + except (ServiceAccount.DoesNotExist, ValueError): + return rc.NOT_HERE + + return account + diff --git a/api/urls.py b/api/urls.py new file mode 100644 index 0000000..679206e --- /dev/null +++ b/api/urls.py @@ -0,0 +1,21 @@ +from django.conf.urls.defaults import * +from piston.resource import Resource +from piston.authentication import HttpBasicAuthentication + +from api.handlers import * + +auth = HttpBasicAuthentication(realm="My Realm") +#ad = { 'authentication': auth } +ad = {} + +user_resource = Resource(handler=UserHandler, **ad) +serviceaccount_resource = Resource(handler=ServiceAccountHandler, **ad) +login_resource = Resource(handler=LoginHandler, **ad) + +urlpatterns = patterns('', + url(r'^login/$', login_resource), + url(r'^user/$', user_resource), + url(r'^user/(?P\d+)/$', user_resource), + url(r'^serviceaccount/$', serviceaccount_resource), + url(r'^serviceaccount/(?P\d+)/$', serviceaccount_resource), +) diff --git a/init.sh b/init.sh index 0836fc1..d02b61e 100755 --- a/init.sh +++ b/init.sh @@ -3,3 +3,6 @@ svn checkout http://django-registration.googlecode.com/svn/trunk/registration svn co http://code.djangoproject.com/svn/django/branches/releases/1.1.X/django django svn co http://django-evolution.googlecode.com/svn/trunk/django_evolution +hg clone http://bitbucket.org/jespern/django-piston/ +mv django-piston/piston ./ +rm -rf django-piston diff --git a/settings.py b/settings.py index 6f0a0f0..b6651ba 100644 --- a/settings.py +++ b/settings.py @@ -81,6 +81,7 @@ INSTALLED_APPS = ( 'mumble', 'reddit', 'sso', + 'api', ) # Disable the service API, used for data imports diff --git a/urls.py b/urls.py index f78e3e4..24a6905 100644 --- a/urls.py +++ b/urls.py @@ -16,6 +16,7 @@ urlpatterns = patterns('', ('', include('registration.urls')), ('', include('sso.urls')), (r'^eveapi/', include('eve_proxy.urls')), + (r'^api/', include('api.urls')), ) urlpatterns += patterns('',