Changeset 6
- Timestamp:
- 01/03/07 11:45:59 (5 years ago)
- Files:
-
- trunk/djangoid/server/models.py (modified) (2 diffs)
- trunk/djangoid/server/views.py (modified) (4 diffs)
- trunk/djangoid/urls.py (modified) (1 diff)
- trunk/djangoid/users/models.py (modified) (5 diffs)
- trunk/djangoid/users/views.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/djangoid/server/models.py
r2 r6 1 1 from django.db import models 2 2 3 #These are some dumb mappings of the original OpenID store tables as used by the SQLStore implemenation(s). 4 #They're used by "DjangoidStore" 3 5 class OidStoreNonce(models.Model): 4 6 nonce = models.CharField(maxlength = 8, primary_key = True) … … 20 22 21 23 class Meta: 24 #Django got no multi-column primary keys 22 25 unique_together = (("server_url", "handle"),) 23 26 trunk/djangoid/server/views.py
r5 r6 4 4 from django.conf import settings 5 5 from django.shortcuts import render_to_response 6 from users.models import DjangoidUser6 from djangoid.users.models import DjangoidUser 7 7 import re 8 8 9 #Regex to extract username out of identity delegate URI, like 10 # http://id.nicolast.be/nicolas/ 11 # ^^^^^^^ 12 #Watch the trailing / 9 13 _identityRe = re.compile(settings.BASE_URL + "(?P<uid>[^/]+)/$") 10 14 15 #Global OpenID server instance, using a DjangoidStore object as container 11 16 openidserver = server.Server(DjangoidStore()) 12 17 13 def _convertOpenidServerResponse(response): 18 #Convert an OpenID server response to a Django-compatible HttpResponse: 19 #copy HTTP headers, and payload 20 def convertOpenidServerResponse(response): 14 21 try: 15 22 webresponse = openidserver.encodeResponse(response) … … 24 31 return r 25 32 26 def _getDjangoidUserFromIdentity(identity): 33 #Get a DjangoidUser object, based on a delegate URI 34 def getDjangoidUserFromIdentity(identity): 27 35 uid = _identityRe.match(identity).groupdict()["uid"] 28 print "Found uid: ", uid29 36 user = DjangoidUser.objects.filter(djangouser = uid) 30 37 if not len(user) == 0: 31 38 return user[0] 32 return None 39 else: 40 raise Exception, "User " + uid + " unknown" 33 41 42 #Server endpoint. URI: http://id.nicolast.be/ 34 43 def endpoint(request): 44 #If this is (most likely) a YADIS request, handle it using the YADIS view function 35 45 if request.META.has_key("HTTP_ACCEPT"): 36 46 ct = request.META["HTTP_ACCEPT"] … … 38 48 return serveryadis(request) 39 49 50 #Copy over all query (GET and POST) key-value pairs, so we can pass them to out OpenID server. 51 #request.REQUEST.copy() seems not to work, as openidserver.decodeRequest seems to use some function 52 #on the passed object that's not implemented in the copied object. 40 53 query = {} 41 54 for i in request.REQUEST.items(): … … 46 59 raise 47 60 61 #If the request wasnt a valid OpenID server request, render some static page. 62 #TODO: use render_to_response("about.html") 48 63 if r is None: 49 64 return HttpResponse("about") 50 65 66 #Check whether we got to do anything... 51 67 if r.mode in ["checkid_immediate", "checkid_setup"]: 52 user = _getDjangoidUserFromIdentity(r.identity) 53 if not user == None: 54 if user.authenticate(r.trust_root): #user logged in (using r.identity and r.trust_root) 55 response = r.answer(True) 56 elif r.immediate: 57 response = r.answer(False, settings.BASE_URL) 68 #Get a DjangoidUser, based on the identity URI 69 user = getDjangoidUserFromIdentity(r.identity) 70 #If the user is not in our database yet, or he's not authenticated (or authenticated using some other 71 #username), redirect to the login page. This is part of the "users" application. 72 #Make sure we pass all OpenID related information in the URL 73 if not request.user or request.user.is_authenticated() == False: 74 return HttpResponseRedirect(r.encodeToURL(settings.BASE_URL + "login/")) 75 if not request.user.username == user.djangouser: 76 raise Exception, "Logged in as " + request.user.username + " while expecting " + user.djangouser 77 78 #Is the user authenticated, and does he trust this trust_root? 79 if user.authenticate(r.trust_root): #user logged in (using r.identity and r.trust_root) 80 response = r.answer(True) 81 #User is logged in, but hasnt added this trust_root to his list of permanently trusted roots. 82 #If this is an immediate request, we can't ask the user now though. Reply with a failure, passing the 83 #URI to which a second request (non-immediate) should be made. This is this same view. 84 elif r.immediate: 85 response = r.answer(False, settings.BASE_URL) 86 #Right, we got to ask the user whether he trusts this trust_root, and whether he wants to add it to his 87 #list of permanently trusted roots. This is handled in the "users" application. 58 88 else: 59 return HttpResponseRedirect(r.encodeToURL(settings.BASE_URL + "login/")) 89 return HttpResponseRedirect(r.encodeToURL(settings.BASE_URL + "accept/")) 90 #If not, let the OpenID server do everything for us :-) 60 91 else: 61 92 response = openidserver.handleRequest(r) 62 93 63 return _convertOpenidServerResponse(response)94 return convertOpenidServerResponse(response) 64 95 96 #A server YADIS document is requested. I don't think this is widely used yet, but well... Let's just return it. 65 97 def serveryadis(request): 66 98 res = render_to_response("server/yadis.xrds", {"server_url": settings.BASE_URL}) trunk/djangoid/urls.py
r5 r6 8 8 (r'^admin/', include('django.contrib.admin.urls')), 9 9 (r'^login/$', 'djangoid.users.views.login'), 10 (r'^accept/$', 'djangoid.users.views.accept'), 10 11 (r'^(?P<uid>[^/]+)/yadis/$', 'djangoid.users.views.useryadis'), 11 12 (r'^(?P<uid>[^/]+)/$', 'djangoid.users.views.userpage'), trunk/djangoid/users/models.py
r5 r6 2 2 from django.contrib import auth 3 3 4 #Represent one trusted root URI. Can be shared between several users. 4 5 class TrustedRoot(models.Model): 5 6 root = models.URLField(primary_key = True) … … 11 12 pass 12 13 14 #Represent one system user, based on Django's internal user system. 13 15 class DjangoidUser(models.Model): 14 16 #This seems not to work: … … 34 36 pass 35 37 38 #Identities can have attributes. These items represent one possible attribute. 36 39 class IdentityAttribute(models.Model): 37 40 name = models.CharField(maxlength = 128) … … 48 51 unique_together = (("name", "namespace"),) 49 52 53 #This maps an attribute to a user, including a value, obviously 50 54 class UserAttribute(models.Model): 51 55 user = models.ForeignKey(DjangoidUser) 52 56 attribute = models.ForeignKey(IdentityAttribute) 53 57 value = models.TextField() 58 #True if this attribute's value may be displayed to all trust roots 54 59 public = models.BooleanField() 60 #List of specific trust roots this attribute may be displayed to. 61 #If "public" is True, this got no meaning at all 55 62 public_for = models.ManyToManyField(TrustedRoot, blank = True, null = True) 56 63 … … 62 69 63 70 class Meta: 71 #Only store an attribute once for every user 64 72 unique_together = (("user", "attribute"),) trunk/djangoid/users/views.py
r5 r6 1 1 from django.shortcuts import render_to_response 2 from django.http import HttpResponse 2 3 from django.conf import settings 4 from openid.server import server 5 6 from djangoid.server.views import openidserver, convertOpenidServerResponse, getDjangoidUserFromIdentity 7 from djangoid.users.models import TrustedRoot 3 8 4 9 def useryadis(request, uid): … … 21 26 def testid(request): 22 27 return userpage(request, "nicolas") 28 29 def accept(request): 30 #Copy over all query (GET and POST) key-value pairs, so we can pass them to out OpenID server. 31 #request.REQUEST.copy() seems not to work, as openidserver.decodeRequest seems to use some function 32 #on the passed object that's not implemented in the copied object. 33 query = {} 34 for i in request.REQUEST.items(): 35 query[i[0]] = i[1] 36 try: 37 r = openidserver.decodeRequest(query) 38 except server.ProtocolError, why: 39 raise 40 41 if r is None: 42 return HttpResponse("Nothing here") 43 44 if request.method == "GET": 45 return render_to_response("users/accept_root.html", {"openid_request": r}) 46 47 if request.method == "POST": 48 if request.POST.has_key("cancel"): 49 return convertOpenidServerResponse(r.answer(False)) 50 if request.POST.has_key("remember"): 51 user = getDjangoidUserFromIdentity(r.identity) 52 root = TrustedRoot.objects.get(root = r.trust_root) 53 user.trusted_roots.add(root) 54 return convertOpenidServerResponse(r.answer(True)) 55
