Changeset 6

Show
Ignore:
Timestamp:
01/03/07 11:45:59 (5 years ago)
Author:
nicolast
Message:

It's working. Now time for fixing bugs, refactoring, attribute support, better templates,...

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/djangoid/server/models.py

    r2 r6  
    11from django.db import models 
    22 
     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" 
    35class OidStoreNonce(models.Model): 
    46        nonce = models.CharField(maxlength = 8, primary_key = True) 
     
    2022 
    2123        class Meta: 
     24                #Django got no multi-column primary keys 
    2225                unique_together = (("server_url", "handle"),) 
    2326 
  • trunk/djangoid/server/views.py

    r5 r6  
    44from django.conf import settings 
    55from django.shortcuts import render_to_response 
    6 from users.models import DjangoidUser 
     6from djangoid.users.models import DjangoidUser 
    77import re 
    88 
     9#Regex to extract username out of identity delegate URI, like 
     10#       http://id.nicolast.be/nicolas/ 
     11#                             ^^^^^^^ 
     12#Watch the trailing / 
    913_identityRe = re.compile(settings.BASE_URL + "(?P<uid>[^/]+)/$") 
    1014 
     15#Global OpenID server instance, using a DjangoidStore object as container 
    1116openidserver = server.Server(DjangoidStore()) 
    1217 
    13 def _convertOpenidServerResponse(response): 
     18#Convert an OpenID server response to a Django-compatible HttpResponse: 
     19#copy HTTP headers, and payload 
     20def convertOpenidServerResponse(response): 
    1421        try: 
    1522                webresponse = openidserver.encodeResponse(response) 
     
    2431        return r 
    2532 
    26 def _getDjangoidUserFromIdentity(identity): 
     33#Get a DjangoidUser object, based on a delegate URI 
     34def getDjangoidUserFromIdentity(identity): 
    2735        uid = _identityRe.match(identity).groupdict()["uid"] 
    28         print "Found uid: ", uid 
    2936        user = DjangoidUser.objects.filter(djangouser = uid) 
    3037        if not len(user) == 0: 
    3138                return user[0] 
    32         return None 
     39        else: 
     40                raise Exception, "User " + uid + " unknown" 
    3341 
     42#Server endpoint. URI: http://id.nicolast.be/ 
    3443def endpoint(request): 
     44        #If this is (most likely) a YADIS request, handle it using the YADIS view function 
    3545        if request.META.has_key("HTTP_ACCEPT"): 
    3646                ct = request.META["HTTP_ACCEPT"] 
     
    3848                        return serveryadis(request) 
    3949 
     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. 
    4053        query = {} 
    4154        for i in request.REQUEST.items(): 
     
    4659                raise 
    4760 
     61        #If the request wasnt a valid OpenID server request, render some static page. 
     62        #TODO: use render_to_response("about.html") 
    4863        if r is None: 
    4964                return HttpResponse("about") 
    5065 
     66        #Check whether we got to do anything... 
    5167        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. 
    5888                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 :-) 
    6091        else: 
    6192                response = openidserver.handleRequest(r) 
    6293 
    63         return _convertOpenidServerResponse(response) 
     94        return convertOpenidServerResponse(response) 
    6495 
     96#A server YADIS document is requested. I don't think this is widely used yet, but well... Let's just return it. 
    6597def serveryadis(request): 
    6698        res = render_to_response("server/yadis.xrds", {"server_url": settings.BASE_URL}) 
  • trunk/djangoid/urls.py

    r5 r6  
    88    (r'^admin/', include('django.contrib.admin.urls')), 
    99    (r'^login/$', 'djangoid.users.views.login'), 
     10    (r'^accept/$', 'djangoid.users.views.accept'), 
    1011    (r'^(?P<uid>[^/]+)/yadis/$', 'djangoid.users.views.useryadis'), 
    1112    (r'^(?P<uid>[^/]+)/$', 'djangoid.users.views.userpage'), 
  • trunk/djangoid/users/models.py

    r5 r6  
    22from django.contrib import auth 
    33 
     4#Represent one trusted root URI. Can be shared between several users. 
    45class TrustedRoot(models.Model): 
    56        root = models.URLField(primary_key = True) 
     
    1112                pass 
    1213 
     14#Represent one system user, based on Django's internal user system. 
    1315class DjangoidUser(models.Model): 
    1416        #This seems not to work: 
     
    3436                pass 
    3537 
     38#Identities can have attributes. These items represent one possible attribute. 
    3639class IdentityAttribute(models.Model): 
    3740        name = models.CharField(maxlength = 128) 
     
    4851                unique_together = (("name", "namespace"),) 
    4952 
     53#This maps an attribute to a user, including a value, obviously 
    5054class UserAttribute(models.Model): 
    5155        user = models.ForeignKey(DjangoidUser) 
    5256        attribute = models.ForeignKey(IdentityAttribute) 
    5357        value = models.TextField() 
     58        #True if this attribute's value may be displayed to all trust roots 
    5459        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 
    5562        public_for = models.ManyToManyField(TrustedRoot, blank = True, null = True) 
    5663 
     
    6269 
    6370        class Meta: 
     71                #Only store an attribute once for every user 
    6472                unique_together = (("user", "attribute"),) 
  • trunk/djangoid/users/views.py

    r5 r6  
    11from django.shortcuts import render_to_response 
     2from django.http import HttpResponse 
    23from django.conf import settings 
     4from openid.server import server 
     5 
     6from djangoid.server.views import openidserver, convertOpenidServerResponse, getDjangoidUserFromIdentity 
     7from djangoid.users.models import TrustedRoot 
    38 
    49def useryadis(request, uid): 
     
    2126def testid(request): 
    2227        return userpage(request, "nicolas") 
     28 
     29def 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