Skip to content

Commit 5166f26

Browse files
committed
Revert "fix for multi-valued parameters. they must be flattened into multiple k/v pairs rather than a single k to array pair"
This reverts commit 5dd09fd.
1 parent 5dd09fd commit 5166f26

File tree

2 files changed

+48
-75
lines changed

2 files changed

+48
-75
lines changed

oauth2/__init__.py

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import hmac
3030
import binascii
3131
import httplib2
32-
from types import ListType
3332

3433
try:
3534
from urlparse import parse_qs, parse_qsl
@@ -310,7 +309,7 @@ def to_header(self, realm=''):
310309

311310
def to_postdata(self):
312311
"""Serialize as post data for a POST request."""
313-
return urllib.urlencode(self.get_parameter_list())
312+
return urllib.urlencode(self)
314313

315314
def to_url(self):
316315
"""Serialize as a URL for a GET request."""
@@ -323,22 +322,9 @@ def get_parameter(self, parameter):
323322

324323
return ret
325324

326-
def get_parameter_list(self):
327-
"""
328-
Get the request parameters as a tuple list (flattening out embedded lists),
329-
dict causes issues with urllib Request
330-
"""
331-
items = []
332-
for (k,v) in self.iteritems():
333-
if type(v) != ListType:
334-
items.append((k,v))
335-
else:
336-
items.extend([(k,x) for x in v])
337-
return items
338-
339325
def get_normalized_parameters(self):
340326
"""Return a string that contains the parameters that must be signed."""
341-
items = [(k,v) for k,v in self.get_parameter_list() if k != 'oauth_signature']
327+
items = [(k, v) for k, v in self.items() if k != 'oauth_signature']
342328
encoded_str = urllib.urlencode(sorted(items))
343329
# Encode signature parameters per Oauth Core 1.0 protocol
344330
# spec draft 7, section 3.6

tests/test_oauth.py

Lines changed: 46 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
"""
22
The MIT License
3-
3+
44
Copyright (c) 2009 Vic Fryzel
5-
5+
66
Permission is hereby granted, free of charge, to any person obtaining a copy
77
of this software and associated documentation files (the "Software"), to deal
88
in the Software without restriction, including without limitation the rights
99
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
1010
copies of the Software, and to permit persons to whom the Software is
1111
furnished to do so, subject to the following conditions:
12-
12+
1313
The above copyright notice and this permission notice shall be included in
1414
all copies or substantial portions of the Software.
15-
15+
1616
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1717
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1818
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -61,7 +61,7 @@ def test_build_auth_header(self):
6161
self.assertEqual(header['WWW-Authenticate'], 'OAuth realm="%s"' %
6262
realm)
6363
self.assertEqual(len(header), 1)
64-
64+
6565
def test_escape(self):
6666
string = 'http://whatever.com/~someuser/?test=test&other=other'
6767
self.assert_('~' in oauth.escape(string))
@@ -83,7 +83,7 @@ def test_gen_verifier(self):
8383
def test_gen_timestamp(self):
8484
exp = int(time.time())
8585
now = oauth.generate_timestamp()
86-
self.assertEqual(exp, now)
86+
self.assertEqual(exp, now)
8787

8888
class TestConsumer(unittest.TestCase):
8989
def setUp(self):
@@ -252,7 +252,7 @@ def test_url(self):
252252

253253
req = oauth.Request(method, url1)
254254
self.assertEquals(req.url, exp1)
255-
255+
256256
req = oauth.Request(method, url2)
257257
self.assertEquals(req.url, exp2)
258258

@@ -270,11 +270,10 @@ def test_get_nonoauth_parameters(self):
270270
oauth_params = {
271271
'oauth_consumer': 'asdfasdfasdf'
272272
}
273-
273+
274274
other_params = {
275275
'foo': 'baz',
276-
'bar': 'foo',
277-
'multi': ['FOO','BAR']
276+
'bar': 'foo'
278277
}
279278

280279
params = oauth_params
@@ -302,10 +301,10 @@ def test_to_header(self):
302301
parts = value.split('OAuth ')
303302
vars = parts[1].split(', ')
304303
self.assertTrue(len(vars), (len(params) + 1))
305-
304+
306305
res = {}
307306
for v in vars:
308-
var, val = v.split('=')
307+
var, val = v.split('=')
309308
res[var] = urllib.unquote(val.strip('"'))
310309

311310
self.assertEquals(realm, res['realm'])
@@ -320,7 +319,6 @@ def test_to_postdata(self):
320319
realm = "http://sp.example.com/"
321320

322321
params = {
323-
'multi': ['FOO','BAR'],
324322
'oauth_version': "1.0",
325323
'oauth_nonce': "4572616e48616d6d65724c61686176",
326324
'oauth_timestamp': "137131200",
@@ -331,11 +329,8 @@ def test_to_postdata(self):
331329
}
332330

333331
req = oauth.Request("GET", realm, params)
334-
335-
flat = [('multi','FOO'),('multi','BAR')]
336-
del params['multi']
337-
flat.extend(params.items())
338-
self.assertEquals(flat, parse_qsl(req.to_postdata()))
332+
333+
self.assertEquals(params, dict(parse_qsl(req.to_postdata())))
339334

340335
def test_to_url(self):
341336
url = "http://sp.example.com/"
@@ -353,13 +348,13 @@ def test_to_url(self):
353348
req = oauth.Request("GET", url, params)
354349
exp = urlparse.urlparse("%s?%s" % (url, urllib.urlencode(params)))
355350
res = urlparse.urlparse(req.to_url())
356-
self.assertEquals(exp.scheme, res.scheme)
357-
self.assertEquals(exp.netloc, res.netloc)
358-
self.assertEquals(exp.path, res.path)
351+
self.assertEquals(exp.scheme, res.scheme)
352+
self.assertEquals(exp.netloc, res.netloc)
353+
self.assertEquals(exp.path, res.path)
359354

360355
a = parse_qs(exp.query)
361356
b = parse_qs(res.query)
362-
self.assertEquals(a, b)
357+
self.assertEquals(a, b)
363358

364359
def test_get_normalized_parameters(self):
365360
url = "http://sp.example.com/"
@@ -431,7 +426,7 @@ def test_sign_request(self):
431426
req = oauth.Request(method="GET", url=url, parameters=params)
432427

433428
methods = {
434-
'TQ6vGQ5A6IZn8dmeGB4+/Jl3EMI=': oauth.SignatureMethod_HMAC_SHA1(),
429+
'TQ6vGQ5A6IZn8dmeGB4+/Jl3EMI=': oauth.SignatureMethod_HMAC_SHA1(),
435430
'con-test-secret&tok-test-secret': oauth.SignatureMethod_PLAINTEXT()
436431
}
437432

@@ -452,17 +447,17 @@ def test_from_request(self):
452447
'oauth_token': "ad180jjd733klru7",
453448
'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
454449
}
455-
450+
456451
req = oauth.Request("GET", url, params)
457452
headers = req.to_header()
458453

459454
# Test from the headers
460455
req = oauth.Request.from_request("GET", url, headers)
461456
self.assertEquals(req.method, "GET")
462457
self.assertEquals(req.url, url)
463-
458+
464459
self.assertEquals(params, req.copy())
465-
460+
466461
# Test with bad OAuth headers
467462
bad_headers = {
468463
'Authorization' : 'OAuth this is a bad header'
@@ -474,7 +469,7 @@ def test_from_request(self):
474469
# Test getting from query string
475470
qs = urllib.urlencode(params)
476471
req = oauth.Request.from_request("GET", url, query_string=qs)
477-
472+
478473
exp = parse_qs(qs, keep_blank_values=False)
479474
for k, v in exp.iteritems():
480475
exp[k] = urllib.unquote(v[0])
@@ -497,7 +492,7 @@ def test_from_token_and_callback(self):
497492
'oauth_token': "ad180jjd733klru7",
498493
'oauth_signature': "wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",
499494
}
500-
495+
501496
tok = oauth.Token(key="tok-test-key", secret="tok-test-secret")
502497
req = oauth.Request.from_token_and_callback(tok)
503498
self.assertFalse('oauth_callback' in req)
@@ -512,7 +507,7 @@ def test_from_consumer_and_token(self):
512507

513508
tok = oauth.Token(key="tok-test-key", secret="tok-test-secret")
514509
con = oauth.Consumer(key="con-test-key", secret="con-test-secret")
515-
req = oauth.Request.from_consumer_and_token(con, token=tok,
510+
req = oauth.Request.from_consumer_and_token(con, token=tok,
516511
http_method="GET", http_url=url)
517512

518513
self.assertEquals(req['oauth_token'], tok.key)
@@ -537,11 +532,10 @@ def setUp(self):
537532
'oauth_nonce': "4572616e48616d6d65724c61686176",
538533
'oauth_timestamp': int(time.time()),
539534
'bar': 'blerg',
540-
'multi': ['FOO','BAR'],
541535
'foo': 59
542536
}
543537

544-
self.consumer = oauth.Consumer(key="consumer-key",
538+
self.consumer = oauth.Consumer(key="consumer-key",
545539
secret="consumer-secret")
546540
self.token = oauth.Token(key="token-key", secret="token-secret")
547541

@@ -555,7 +549,7 @@ def setUp(self):
555549
def test_init(self):
556550
server = oauth.Server(signature_methods={'HMAC-SHA1' : oauth.SignatureMethod_HMAC_SHA1()})
557551
self.assertTrue('HMAC-SHA1' in server.signature_methods)
558-
self.assertTrue(isinstance(server.signature_methods['HMAC-SHA1'],
552+
self.assertTrue(isinstance(server.signature_methods['HMAC-SHA1'],
559553
oauth.SignatureMethod_HMAC_SHA1))
560554

561555
server = oauth.Server()
@@ -564,15 +558,15 @@ def test_init(self):
564558
def test_add_signature_method(self):
565559
server = oauth.Server()
566560
res = server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
567-
self.assertTrue(len(res) == 1)
561+
self.assertTrue(len(res) == 1)
568562
self.assertTrue('HMAC-SHA1' in res)
569-
self.assertTrue(isinstance(res['HMAC-SHA1'],
563+
self.assertTrue(isinstance(res['HMAC-SHA1'],
570564
oauth.SignatureMethod_HMAC_SHA1))
571565

572566
res = server.add_signature_method(oauth.SignatureMethod_PLAINTEXT())
573-
self.assertTrue(len(res) == 2)
567+
self.assertTrue(len(res) == 2)
574568
self.assertTrue('PLAINTEXT' in res)
575-
self.assertTrue(isinstance(res['PLAINTEXT'],
569+
self.assertTrue(isinstance(res['PLAINTEXT'],
576570
oauth.SignatureMethod_PLAINTEXT))
577571

578572
def test_verify_request(self):
@@ -584,10 +578,8 @@ def test_verify_request(self):
584578

585579
self.assertTrue('bar' in parameters)
586580
self.assertTrue('foo' in parameters)
587-
self.assertTrue('multi' in parameters)
588581
self.assertEquals(parameters['bar'], 'blerg')
589582
self.assertEquals(parameters['foo'], 59)
590-
self.assertEquals(parameters['multi'], ['FOO','BAR'])
591583

592584
def test_no_version(self):
593585
url = "http://sp.example.com/"
@@ -596,11 +588,10 @@ def test_no_version(self):
596588
'oauth_nonce': "4572616e48616d6d65724c61686176",
597589
'oauth_timestamp': int(time.time()),
598590
'bar': 'blerg',
599-
'multi': ['FOO','BAR'],
600591
'foo': 59
601592
}
602593

603-
self.consumer = oauth.Consumer(key="consumer-key",
594+
self.consumer = oauth.Consumer(key="consumer-key",
604595
secret="consumer-secret")
605596
self.token = oauth.Token(key="token-key", secret="token-secret")
606597

@@ -625,11 +616,10 @@ def test_invalid_version(self):
625616
'oauth_nonce': "4572616e48616d6d65724c61686176",
626617
'oauth_timestamp': int(time.time()),
627618
'bar': 'blerg',
628-
'multi': ['foo','bar'],
629619
'foo': 59
630620
}
631621

632-
consumer = oauth.Consumer(key="consumer-key",
622+
consumer = oauth.Consumer(key="consumer-key",
633623
secret="consumer-secret")
634624
token = oauth.Token(key="token-key", secret="token-secret")
635625

@@ -643,7 +633,7 @@ def test_invalid_version(self):
643633
server = oauth.Server()
644634
server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
645635

646-
self.assertRaises(oauth.Error, server.verify_request, request,
636+
self.assertRaises(oauth.Error, server.verify_request, request,
647637
consumer, token)
648638

649639
def test_invalid_signature_method(self):
@@ -654,11 +644,10 @@ def test_invalid_signature_method(self):
654644
'oauth_nonce': "4572616e48616d6d65724c61686176",
655645
'oauth_timestamp': int(time.time()),
656646
'bar': 'blerg',
657-
'multi': ['FOO','BAR'],
658647
'foo': 59
659648
}
660649

661-
consumer = oauth.Consumer(key="consumer-key",
650+
consumer = oauth.Consumer(key="consumer-key",
662651
secret="consumer-secret")
663652
token = oauth.Token(key="token-key", secret="token-secret")
664653

@@ -672,7 +661,7 @@ def test_invalid_signature_method(self):
672661
server = oauth.Server()
673662
server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
674663

675-
self.assertRaises(oauth.Error, server.verify_request, request,
664+
self.assertRaises(oauth.Error, server.verify_request, request,
676665
consumer, token)
677666

678667
def test_missing_signature(self):
@@ -683,11 +672,10 @@ def test_missing_signature(self):
683672
'oauth_nonce': "4572616e48616d6d65724c61686176",
684673
'oauth_timestamp': int(time.time()),
685674
'bar': 'blerg',
686-
'multi': ['FOO','BAR'],
687675
'foo': 59
688676
}
689677

690-
consumer = oauth.Consumer(key="consumer-key",
678+
consumer = oauth.Consumer(key="consumer-key",
691679
secret="consumer-secret")
692680
token = oauth.Token(key="token-key", secret="token-secret")
693681

@@ -702,15 +690,15 @@ def test_missing_signature(self):
702690
server = oauth.Server()
703691
server.add_signature_method(oauth.SignatureMethod_HMAC_SHA1())
704692

705-
self.assertRaises(oauth.MissingSignature, server.verify_request,
693+
self.assertRaises(oauth.MissingSignature, server.verify_request,
706694
request, consumer, token)
707695

708696

709-
# Request Token: http://oauth-sandbox.sevengoslings.net/request_token
710-
# Auth: http://oauth-sandbox.sevengoslings.net/authorize
711-
# Access Token: http://oauth-sandbox.sevengoslings.net/access_token
712-
# Two-legged: http://oauth-sandbox.sevengoslings.net/two_legged
713-
# Three-legged: http://oauth-sandbox.sevengoslings.net/three_legged
697+
# Request Token: http://oauth-sandbox.sevengoslings.net/request_token
698+
# Auth: http://oauth-sandbox.sevengoslings.net/authorize
699+
# Access Token: http://oauth-sandbox.sevengoslings.net/access_token
700+
# Two-legged: http://oauth-sandbox.sevengoslings.net/two_legged
701+
# Three-legged: http://oauth-sandbox.sevengoslings.net/three_legged
714702
# Key: bd37aed57e15df53
715703
# Secret: 0e9e6413a9ef49510a4f68ed02cd
716704
class TestClient(unittest.TestCase):
@@ -726,19 +714,18 @@ class TestClient(unittest.TestCase):
726714
'two_legged': '/two_legged',
727715
'three_legged': '/three_legged'
728716
}
729-
717+
730718
consumer_key = 'bd37aed57e15df53'
731719
consumer_secret = '0e9e6413a9ef49510a4f68ed02cd'
732720
host = 'http://oauth-sandbox.sevengoslings.net'
733721

734722
def setUp(self):
735-
self.consumer = oauth.Consumer(key=self.consumer_key,
723+
self.consumer = oauth.Consumer(key=self.consumer_key,
736724
secret=self.consumer_secret)
737725

738726
self.body = {
739727
'foo': 'bar',
740728
'bar': 'foo',
741-
'multi': ['FOO','BAR'],
742729
'blah': 599999
743730
}
744731

@@ -748,7 +735,7 @@ def _uri(self, type):
748735
raise KeyError("%s is not a valid OAuth URI type." % type)
749736

750737
return "%s%s" % (self.host, uri)
751-
738+
752739
def test_access_token_get(self):
753740
"""Test getting an access token via GET."""
754741
client = oauth.Client(self.consumer, None)
@@ -770,7 +757,7 @@ def test_access_token_post(self):
770757
def _two_legged(self, method):
771758
client = oauth.Client(self.consumer, None)
772759

773-
return client.request(self._uri('two_legged'), method,
760+
return client.request(self._uri('two_legged'), method,
774761
body=urllib.urlencode(self.body))
775762

776763
def test_two_legged_post(self):

0 commit comments

Comments
 (0)