Merge lp:~canonical-isd-hackers/canonical-identity-provider/remove-oauth-backend into lp:canonical-identity-provider/release

Proposed by Łukasz Czyżykowski
Status: Merged
Approved by: Ricardo Kirkner
Approved revision: no longer in the source branch.
Merged at revision: 125
Proposed branch: lp:~canonical-isd-hackers/canonical-identity-provider/remove-oauth-backend
Merge into: lp:canonical-identity-provider/release
Prerequisite: lp:~canonical-isd-hackers/canonical-identity-provider/split-oauth
Diff against target: 315 lines (+3/-280)
4 files modified
debian/control (+2/-1)
oauth_backend/models.py (+0/-181)
oauth_backend/tests.py (+0/-98)
requirements.txt (+1/-0)
To merge this branch: bzr merge lp:~canonical-isd-hackers/canonical-identity-provider/remove-oauth-backend
Reviewer Review Type Date Requested Status
Michael Nelson (community) Approve
Ricardo Kirkner (community) Needs Fixing
Review via email: mp+45834@code.launchpad.net

Commit message

Removed oauth_backend code from the project.

Description of the change

Removed oauth_backend code from the project. This branch also updates debian package dependencies for SSO.

To post a comment you must log in.
Revision history for this message
Ricardo Kirkner (ricardokirkner) wrote :

Also needs to add django-oauth-backend to the requirements.txt file.

review: Needs Fixing
Revision history for this message
Michael Nelson (michael.nelson) wrote :

Assuming there wasn't anything else that Ricardo thought needs fixing (other than the requirements.txt which you updated)... thanks!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'debian/control'
2--- debian/control 2010-09-13 15:45:15 +0000
3+++ debian/control 2011-01-12 08:53:59 +0000
4@@ -26,6 +26,7 @@
5 python-restrictedpython,
6 python-schemaconfig (>= 0.1.3.dev1),
7 python-simplejson,
8- python-lazr.uri
9+ python-lazr.uri,
10+ python-django-oauth-backend
11 Conflicts: python-lazr.restful (>= 0.9.22)
12 Description: Canonical OpenID provider
13
14=== removed directory 'oauth_backend'
15=== removed file 'oauth_backend/__init__.py'
16=== removed file 'oauth_backend/models.py'
17--- oauth_backend/models.py 2011-01-10 15:02:53 +0000
18+++ oauth_backend/models.py 1970-01-01 00:00:00 +0000
19@@ -1,181 +0,0 @@
20-# Copyright 2010 Canonical Ltd. This software is licensed under the
21-# GNU Affero General Public License version 3 (see the file LICENSE).
22-
23-import random
24-import struct
25-import string
26-import os.path
27-
28-from oauth.oauth import OAuthToken, OAuthDataStore, OAuthConsumer
29-
30-from functools import partial
31-from django.db import models
32-from django.conf import settings
33-from django.contrib.auth.models import User
34-
35-
36-__all__ = [
37- 'Token',
38- 'Consumer',
39- 'Nonce',
40- 'DataStore',
41-]
42-
43-
44-TOKEN_LENGTH = getattr(settings, 'OAUTH_TOKEN_LENGTH', 50)
45-TOKEN_SECRET_LENGTH = getattr(settings, 'OAUTH_TOKEN_SECRET_LENGTH', 50)
46-CONSUMER_SECRET_LENGTH = getattr(settings, 'OAUTH_CONSUMER_SECRET_LENGTH', 30)
47-
48-
49-def _set_seed():
50- if (not hasattr(_set_seed, 'seed') and
51- os.path.exists("/dev/random")):
52-
53- data = open("/dev/random").read(struct.calcsize('Q'))
54- random.seed(struct.unpack('Q', data))
55- _set_seed.seed = True
56-
57-
58-def generate_random_string(length):
59- _set_seed()
60- return ''.join(random.choice(string.ascii_letters)
61- for x in range(length))
62-
63-
64-class Token(models.Model):
65- consumer = models.ForeignKey('Consumer')
66-
67- token = models.CharField(
68- max_length=TOKEN_LENGTH,
69- default=partial(generate_random_string, TOKEN_LENGTH),
70- primary_key=True)
71-
72- token_secret = models.CharField(
73- max_length=TOKEN_SECRET_LENGTH,
74- default=partial(generate_random_string, TOKEN_SECRET_LENGTH))
75-
76- name = models.CharField(max_length=255, blank=True)
77-
78- created_at = models.DateTimeField(auto_now_add=True)
79- updated_at = models.DateTimeField(auto_now=True)
80-
81- def oauth_token(self):
82- """Return OAuthToken with information contained in this model"""
83- return OAuthToken(self.token, self.token_secret)
84-
85- def serialize(self):
86- return {
87- 'consumer_key': self.consumer.key,
88- 'consumer_secret': self.consumer.secret,
89- 'token': self.token,
90- 'token_secret': self.token_secret,
91- 'name': self.name
92- }
93-
94- def __unicode__(self):
95- return self.token
96-
97- class Meta:
98- db_table = 'oauth_token'
99-
100-
101-class Consumer(models.Model):
102- user = models.OneToOneField(User, related_name='oauth_consumer')
103-
104- @property
105- def key(self):
106- return self.user.username
107-
108- secret = models.CharField(
109- max_length=255,
110- blank=True,
111- null=False,
112- default=partial(generate_random_string, CONSUMER_SECRET_LENGTH)
113- )
114-
115- created_at = models.DateTimeField(auto_now_add=True)
116- updated_at = models.DateTimeField(auto_now=True)
117-
118- def __unicode__(self):
119- return self.key
120-
121- def oauth_consumer(self):
122- """Return OAuthConsumer based on information contained in this model"""
123- return OAuthConsumer(self.key, self.secret)
124-
125- class Meta:
126- db_table = 'oauth_consumer'
127-
128-
129-class Nonce(models.Model):
130- token = models.ForeignKey(Token)
131- consumer = models.ForeignKey(Consumer)
132-
133- nonce = models.CharField(max_length=255,
134- unique=True, editable=False)
135- created_at = models.DateTimeField(auto_now_add=True)
136-
137- @classmethod
138- def create(cls, consumer_key, token_value, nonce):
139- """
140- Create new nonce object linked to given consumer and token
141- """
142- consumer = Consumer.objects.get(
143- user__username=consumer_key)
144- token = consumer.token_set.get(token=token_value)
145- return consumer.nonce_set.create(token=token, nonce=nonce)
146-
147- class Meta:
148- db_table = 'oauth_nonce'
149-
150-
151-class DataStore(OAuthDataStore):
152-
153- def lookup_token(self, token_type, token_field):
154- """
155- :param token_type: type of token to lookup
156- :param token_field: token to look up
157-
158- :note: token_type should always be 'access' as only such tokens are
159- stored in database
160-
161- :returns: OAuthToken object
162- """
163- assert token_type == 'access'
164-
165- try:
166- token = Token.objects.get(token=token_field)
167- return OAuthToken(token.token, token.token_secret)
168- except Token.DoesNotExist:
169- return None
170-
171- def lookup_consumer(self, consumer_key):
172- """
173- :param consumer_key: consumer key to lookup
174-
175- :returns: OAuthConsumer object
176- """
177- try:
178- consumer = Consumer.objects.get(
179- user__username=consumer_key)
180- return consumer.oauth_consumer()
181- except Consumer.DoesNotExist:
182- return None
183-
184- def lookup_nonce(self, consumer, token, nonce):
185- """
186- :param consumer: OAuthConsumer object
187- :param token: OAuthToken object
188- :param nonce: nonce to check
189-
190- """
191- count = Nonce.objects.filter(
192- consumer__user__username=consumer.key,
193- token__token=token.key,
194- nonce=nonce).count()
195- if count > 0:
196- return True
197- else:
198- Nonce.create(consumer.key, token.key, nonce)
199- return False
200-
201
202=== removed file 'oauth_backend/tests.py'
203--- oauth_backend/tests.py 2011-01-10 12:30:22 +0000
204+++ oauth_backend/tests.py 1970-01-01 00:00:00 +0000
205@@ -1,98 +0,0 @@
206-# Copyright 2010 Canonical Ltd. This software is licensed under the
207-# GNU Affero General Public License version 3 (see the file LICENSE).
208-
209-from django.test import TestCase
210-from django.contrib.auth.models import User
211-
212-from .models import Consumer, DataStore, Nonce, Token, OAuthToken
213-
214-
215-class BaseTestCase(TestCase):
216-
217- @property
218- def user(self):
219- if not hasattr(self, '_user'):
220- self._user = User.objects.create_user(
221- 'test_username', 'test@canonical.com', 'password'
222- )
223- return self._user
224-
225-
226-class TokenTestCase(BaseTestCase):
227-
228- def setUp(self):
229- self.consumer, _ = Consumer.objects.get_or_create(user=self.user)
230- self.token = Token(consumer=self.consumer, token='token',
231- token_secret='secret', name='name')
232- def test_unicode(self):
233- self.assertEqual(unicode(self.token), u'token')
234-
235- def test_serialize(self):
236- expected = {'consumer_key': self.consumer.key,
237- 'consumer_secret': self.consumer.secret,
238- 'token': 'token',
239- 'token_secret': 'secret',
240- 'name': 'name'}
241- self.assertEqual(self.token.serialize(), expected)
242-
243-
244-class ConsumerTestCase(BaseTestCase):
245-
246- def test_unicode(self):
247- consumer, _ = Consumer.objects.get_or_create(user=self.user)
248- self.assertEqual(unicode(consumer),
249- unicode(self.user.username))
250-
251- def test_one_to_one_relationship_with_user(self):
252- consumer, _ = Consumer.objects.get_or_create(user=self.user)
253-
254- self.assertEquals(self.user.id, consumer.user.id)
255- self.assertEquals(consumer.id, self.user.oauth_consumer.id)
256-
257-
258-class DataStoreTestCase(BaseTestCase):
259-
260- def setUp(self):
261- self.ds = DataStore()
262- self.consumer, _ = Consumer.objects.get_or_create(user=self.user)
263- self.token, _ = Token.objects.get_or_create(consumer=self.consumer,
264- token='token', token_secret='secret', name='name')
265- self.nonce, _ = Nonce.objects.get_or_create(consumer=self.consumer,
266- token=self.token, nonce='nonce')
267-
268- def test_lookup_token_wrong_type(self):
269- self.assertRaises(AssertionError, self.ds.lookup_token, 'value',
270- 'token')
271-
272- def test_lookup_token_exists(self):
273- # create a token
274- token = self.ds.lookup_token('access', 'token')
275- self.assertEqual(token.key, 'token')
276- self.assertEqual(token.secret, 'secret')
277-
278- def test_lookup_token_not_exists(self):
279- self.token.delete()
280- token = self.ds.lookup_token('access', 'token')
281- self.assertEqual(token, None)
282-
283- def test_lookup_consumer_exists(self):
284- consumer_key = self.consumer.key
285- result = self.ds.lookup_consumer(consumer_key)
286- self.assertEqual(result.key, self.consumer.key)
287- self.assertEqual(result.secret, self.consumer.secret)
288-
289- def test_lookup_consumer_not_exists(self):
290- consumer_key = 'foo'
291- consumer = self.ds.lookup_consumer(consumer_key)
292- self.assertEqual(consumer, None)
293-
294- def test_lookup_nonce_exists(self):
295- otoken = OAuthToken(self.token.token, self.token.token_secret)
296- r = self.ds.lookup_nonce(self.consumer, otoken, 'nonce')
297- self.assertTrue(r)
298-
299- def test_lookup_nonce_not_exists(self):
300- self.nonce.delete()
301- otoken = OAuthToken(self.token.token, self.token.token_secret)
302- r = self.ds.lookup_nonce(self.consumer, otoken, 'nonce')
303- self.assertFalse(r)
304
305=== modified file 'requirements.txt'
306--- requirements.txt 2010-11-03 16:44:21 +0000
307+++ requirements.txt 2011-01-12 08:53:59 +0000
308@@ -75,6 +75,7 @@
309 wsgi-intercept==0.4
310 zc.lockfile==1.0.0
311 zdaemon==2.0.4
312+django-oauth-backend
313 zope.app.pagetemplate==3.10.1
314 zope.authentication==3.7.0
315 zope.browser==1.2