Changeset 5

Show
Ignore:
Timestamp:
12/28/06 14:13:36 (5 years ago)
Author:
nicolast
Message:

Yadis handling fixed, user account models added

Files:

Legend:

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

    r2 r5  
    1 from django.http import HttpResponse 
     1from django.http import HttpResponse, HttpResponseRedirect 
    22from openid.server import server 
    33from djangoid.server.djangoidstore import DjangoidStore 
    44from django.conf import settings 
    55from django.shortcuts import render_to_response 
     6from users.models import DjangoidUser 
     7import re 
     8 
     9_identityRe = re.compile(settings.BASE_URL + "(?P<uid>[^/]+)/$") 
    610 
    711openidserver = server.Server(DjangoidStore()) 
     
    2024        return r 
    2125 
     26def _getDjangoidUserFromIdentity(identity): 
     27        uid = _identityRe.match(identity).groupdict()["uid"] 
     28        print "Found uid: ", uid 
     29        user = DjangoidUser.objects.filter(djangouser = uid) 
     30        if not len(user) == 0: 
     31                return user[0] 
     32        return None 
     33 
    2234def endpoint(request): 
     35        if request.META.has_key("HTTP_ACCEPT"): 
     36                ct = request.META["HTTP_ACCEPT"] 
     37                if ct.startswith("application/xrds+xml"): 
     38                        return serveryadis(request) 
     39 
    2340        query = {} 
    2441        for i in request.REQUEST.items(): 
     
    3350 
    3451        if r.mode in ["checkid_immediate", "checkid_setup"]: 
    35                 if True: #user logged in 
    36                         response = r.answer(True) 
     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) 
     58                else: 
     59                        return HttpResponseRedirect(r.encodeToURL(settings.BASE_URL + "login/")) 
    3760        else: 
    3861                response = openidserver.handleRequest(r) 
  • trunk/djangoid/settings.py

    r3 r5  
    7171    'django.contrib.sessions', 
    7272    'django.contrib.sites', 
     73    'django.contrib.admin', 
    7374    'djangoid.server', 
    7475    'djangoid.users', 
  • trunk/djangoid/templates/users/yadis.xrds

    r2 r5  
    22<xrds:XRDS 
    33    xmlns:xrds="xri://$xrds" 
    4     xmlns:openid="http://openid.net/xmlns/2.0" 
     4    xmlns:openid="http://openid.net/xmlns/1.0" 
    55    xmlns="xri://$xrd*($v*2.0)"> 
    66  <XRD> 
    77    <Service priority="0"> 
    8       <Type>http://openid.net/signon/1.0</Type> 
     8      <Type>http://openid.net/signon/1.2</Type> 
    99      <URI>{{ server_url }}</URI> 
    1010      <openid:Delegate>{{ server_url }}{{ uid }}/</openid:Delegate> 
  • trunk/djangoid/urls.py

    r4 r5  
    44    # Example: 
    55    # (r'^djangoid/', include('djangoid.apps.foo.urls.foo')), 
     6    (r'^testid/$', 'djangoid.users.views.testid'), 
    67    (r'^yadis/$', 'djangoid.server.views.serveryadis'), 
    78    (r'^admin/', include('django.contrib.admin.urls')), 
     9    (r'^login/$', 'djangoid.users.views.login'), 
    810    (r'^(?P<uid>[^/]+)/yadis/$', 'djangoid.users.views.useryadis'), 
    911    (r'^(?P<uid>[^/]+)/$', 'djangoid.users.views.userpage'), 
  • trunk/djangoid/users/models.py

    r2 r5  
    11from django.db import models 
     2from django.contrib import auth 
    23 
    3 # Create your models here. 
     4class TrustedRoot(models.Model): 
     5        root = models.URLField(primary_key = True) 
     6 
     7        def __str__(self): 
     8                return self.root 
     9 
     10        class Admin: 
     11                pass 
     12 
     13class DjangoidUser(models.Model): 
     14        #This seems not to work: 
     15        #djangouser = models.ForeignKey(auth.models.User, primary_key = True) 
     16        #So using an ugly hack... TODO: Fixme! 
     17        djangouser = models.CharField('username', maxlength = 30, primary_key = True) 
     18        trusted_roots = models.ManyToManyField(TrustedRoot, blank = True, null = True) 
     19 
     20        def __str__(self): 
     21                return self.djangouser 
     22 
     23        def authenticate(self, root): 
     24                r = TrustedRoot.objects.filter(root = root) 
     25                if len(r) == 0: #Certainly not trusted 
     26                        TrustedRoot(root = root).save() 
     27                else: 
     28                        for mr in self.trusted_roots.all(): 
     29                                if root == mr.root: 
     30                                        return True 
     31                return False 
     32 
     33        class Admin: 
     34                pass 
     35 
     36class IdentityAttribute(models.Model): 
     37        name = models.CharField(maxlength = 128) 
     38        namespace = models.CharField(maxlength = 32) 
     39        description = models.TextField(blank = True) 
     40 
     41        def __str__(self): 
     42                return self.namespace + "." + self.name 
     43 
     44        class Admin: 
     45                pass 
     46 
     47        class Meta: 
     48                unique_together = (("name", "namespace"),) 
     49 
     50class UserAttribute(models.Model): 
     51        user = models.ForeignKey(DjangoidUser) 
     52        attribute = models.ForeignKey(IdentityAttribute) 
     53        value = models.TextField() 
     54        public = models.BooleanField() 
     55        public_for = models.ManyToManyField(TrustedRoot, blank = True, null = True) 
     56 
     57        def __str__(self): 
     58                return str(self.user) + ": " + str(self.attribute) 
     59 
     60        class Admin: 
     61                pass 
     62 
     63        class Meta: 
     64                unique_together = (("user", "attribute"),) 
  • trunk/djangoid/users/views.py

    r2 r5  
    99 
    1010def userpage(request, uid): 
     11        #Check whether this is a YADIS request 
     12        if request.META.has_key("HTTP_ACCEPT"): 
     13                ct = request.META["HTTP_ACCEPT"] 
     14                if ct.startswith("application/xrds+xml"): 
     15                        return useryadis(request, uid) 
     16 
    1117        res = render_to_response("users/userpage.html", {"server_url": settings.BASE_URL, "uid": uid}) 
    1218        res["X-XRDS-Location"] = settings.BASE_URL + uid + "/yadis/" 
    1319        return res 
     20 
     21def testid(request): 
     22        return userpage(request, "nicolas")