Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions create_default_data.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
from oauth_provider.models import Resource,Consumer
from oauth_provider.models import Resource, Consumer
from oauth_provider.consts import ACCEPTED



default_consumer = Consumer(name="Tomboy default consumer",
description="Tomboy default consumer",
key_ = 'anyone',
secret = 'anyone',
status = ACCEPTED
)
default_consumer = Consumer(
name="Tomboy default consumer",
description="Tomboy default consumer",
key_='anyone',
secret='anyone',
status=ACCEPTED
)
default_consumer.put()

default_resource = Resource(name="default")
Expand Down
24 changes: 13 additions & 11 deletions oauth_provider/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,21 @@
from utils import initialize_server_request, send_oauth_error
from consts import OAUTH_PARAMETERS_NAMES


def oauth_required(method):
def wrapper(self,*args,**kwargs):
def wrapper(self, *args, **kwargs):
if is_valid_request(self.request):
try:
consumer, token, parameters = validate_token(self.request)
consumer, token, parameters = validate_token(self.request)
if consumer and token:
return method(self,*args,**kwargs)
return method(self, *args, **kwargs)
except oauth.OAuthError, e:
send_oauth_error(e,self.response)
return
send_oauth_error(e, self.response)
return

send_oauth_error(oauth.OAuthError("Invalid OAuth parameters"),self.response)
return
send_oauth_error(oauth.OAuthError(
"Invalid OAuth parameters"), self.response)
return
return wrapper


Expand All @@ -32,15 +34,15 @@ def is_valid_request(request):

try:
auth_params = request.headers["Authorization"]
except KeyError,e:
except KeyError, e:
auth_params = []

parameters = dict([(argument_name,request.get(argument_name)) for argument_name in request.arguments()])

parameters = dict([(argument_name, request.get(argument_name)) for
argument_name in request.arguments()])

return is_in(auth_params) or is_in(parameters)


def validate_token(request):
oauth_server, oauth_request = initialize_server_request(request)
return oauth_server.verify_request(oauth_request)

108 changes: 59 additions & 49 deletions oauth_provider/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

from google.appengine.ext import db

from consts import KEY_SIZE, SECRET_SIZE, CONSUMER_KEY_SIZE, CONSUMER_STATES,\
PENDING, ACCEPTED, VERIFIER_SIZE, MAX_URL_LENGTH
from consts import (KEY_SIZE, SECRET_SIZE, CONSUMER_KEY_SIZE,
CONSUMER_STATES, PENDING, ACCEPTED, VERIFIER_SIZE,
MAX_URL_LENGTH)


def generate_random(length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789'):
"Generates a random password with the given length and given allowed_chars"
Expand All @@ -12,91 +14,97 @@ def generate_random(length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKL
from random import choice
return ''.join([choice(allowed_chars) for i in range(length)])


class Nonce(db.Model):
token_key = db.StringProperty()
consumer_key = db.StringProperty()
key_ = db.StringProperty()

def __unicode__(self):
return u"Nonce %s for %s" % (self.key, self.consumer_key)

#need to determine what this is for

class Resource(db.Model):
name = db.StringProperty( )
name = db.StringProperty()
url = db.TextProperty()
is_readonly = db.BooleanProperty(default=True)

def __unicode__(self):
return u"Resource %s with url %s" % (self.name, self.url)


class Consumer(db.Model):
name = db.StringProperty()
description = db.TextProperty()

key_ = db.StringProperty()
secret = db.StringProperty()

status = db.IntegerProperty(choices=[state[0] for state in CONSUMER_STATES], default=PENDING)
status = db.IntegerProperty(choices=[state[0] for state
in CONSUMER_STATES], default=PENDING)
user = db.UserProperty(required=False)
#user = models.ForeignKey(User, null=True, blank=True, related_name='consumers')

#objects = ConsumerManager()

def __unicode__(self):
return u"Consumer %s with key %s" % (self.name, self.key)

def generate_random_codes(self):

key = generate_random(length=KEY_SIZE)
secret = generate_random(length=SECRET_SIZE)

while Consumer.all().filter('key =',key).filter('secret =',secret).count():
key = generate_random(length=KEY_SIZE)
secret = generate_random(length=SECRET_SIZE)
while Consumer.all().filter(
'key =', key).filter('secret =', secret).count():
key = generate_random(length=KEY_SIZE)
secret = generate_random(length=SECRET_SIZE)

self.key = key
self.secret = secret
self.put()


class Token(db.Model):
REQUEST = 1
ACCESS = 2
TOKEN_TYPES = (REQUEST, ACCESS)

key_ = db.StringProperty()
secret = db.StringProperty()
token_type = db.IntegerProperty(choices=TOKEN_TYPES)
timestamp = db.IntegerProperty()
is_approved = db.BooleanProperty(default=False)

user = db.UserProperty(required=False)
consumer = db.ReferenceProperty(Consumer, collection_name="tokens")
resource = db.ReferenceProperty(Resource, collection_name="resources")

## OAuth 1.0a stuff
verifier = db.StringProperty()
callback = db.StringProperty(required=False)
callback_confirmed = db.BooleanProperty(default=False)



def __unicode__(self):
return u"%s Token %s for %s" % (self.get_token_type_display(), self.key_, self.consumer)
return u"%s Token %s for %s" % (self.get_token_type_display(),
self.key_, self.consumer)

def to_string(self, only_key=False):
token_dict = {
'oauth_token': self.key_,
'oauth_token': self.key_,
'oauth_token_secret': self.secret
}

if self.callback_confirmed:
token_dict.update({'oauth_callback_confirmed': 'true'})

if self.verifier:
token_dict.update({ 'oauth_verifier': self.verifier })
token_dict.update({'oauth_verifier': self.verifier})

if only_key:
del token_dict['oauth_token_secret']
if token_dict.has_key('oauth_callback_confirmed'):
if 'oauth_callback_confirmed' in token_dict:
del token_dict['oauth_callback_confirmed']

return urllib.urlencode(token_dict)
Expand All @@ -106,14 +114,15 @@ def generate_random_codes(self):
key = generate_random(length=KEY_SIZE)
secret = generate_random(length=SECRET_SIZE)

while Token.all().filter('key_ =',key).filter('secret =',secret).count():
key = generate_random(length=KEY_SIZE)
secret = generate_random(length=SECRET_SIZE)

while Token.all().filter('key_ =', key).filter(
'secret =', secret).count():
key = generate_random(length=KEY_SIZE)
secret = generate_random(length=SECRET_SIZE)

self.key_ = key
self.secret = secret
self.put()

def get_callback_url(self):
"""
OAuth 1.0a, append the oauth_verifier.
Expand All @@ -128,41 +137,42 @@ def get_callback_url(self):
return urlparse.urlunparse((scheme, netloc, path, params,
query, fragment))
return self.callback
def create_token(cls, consumer, token_type, timestamp, resource,

def create_token(cls, consumer, token_type, timestamp, resource,
user=None, callback=None, callback_confirmed=False):
"""Shortcut to create a token with random key/secret."""
tokens = Token.all()\
.filter('consumer =',consumer)\
.filter('token_type =',token_type)\
.filter('timestamp =',timestamp)\
.filter('resource =',resource)\
.filter('user =',user)\
.filter('callback =',callback)\
.filter('callback_confirmed =',callback_confirmed).fetch(1000)

.filter('consumer =', consumer)\
.filter('token_type =', token_type)\
.filter('timestamp =', timestamp)\
.filter('resource =', resource)\
.filter('user =', user)\
.filter('callback =', callback)\
.filter('callback_confirmed =',
callback_confirmed).fetch(1000)

if len(tokens) == 1:
token = tokens[0]
elif len(tokens) == 0:
#create a nonce
token = Token(consumer=consumer,
token_type=token_type,
timestamp=timestamp,
resource=resource,
user=user,
callback=callback,
callback_confirmed=callback_confirmed)
token = Token(consumer=consumer,
token_type=token_type,
timestamp=timestamp,
resource=resource,
user=user,
callback=callback,
callback_confirmed=callback_confirmed)
token.generate_random_codes()
token.put()
else:
raise Exception('More then one token matches consumer_key "%s", \
token_type "%s", timestamp "%s", resource "%s", user "%s" \
callback "%s", callback_confirmed "%s"'\
%(consumer.key,token_type, timestamp, resource, user, callback,\
callback_confirmed))
callback "%s", callback_confirmed "%s"'
% (consumer.key, token_type, timestamp, resource, user,
callback, callback_confirmed))

return token
create_token = classmethod(create_token)


#admin.site.register(Token)
Loading