Skip to content

Commit c9b4b07

Browse files
waprinJon Wayne Parrott
authored and
Jon Wayne Parrott
committed
Switch django models from pickle to jsonpickle (googleapis#614)
1 parent c6b30bf commit c9b4b07

File tree

3 files changed

+16
-11
lines changed

3 files changed

+16
-11
lines changed

oauth2client/contrib/django_util/views.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@
2222
import hashlib
2323
import json
2424
import os
25-
import pickle
2625

2726
from django import http
2827
from django import shortcuts
2928
from django.conf import settings
3029
from django.core import urlresolvers
3130
from django.shortcuts import redirect
31+
import jsonpickle
3232
from six.moves.urllib import parse
3333

3434
from oauth2client import client
@@ -71,7 +71,7 @@ def _make_flow(request, scopes, return_url=None):
7171
urlresolvers.reverse("google_oauth:callback")))
7272

7373
flow_key = _FLOW_KEY.format(csrf_token)
74-
request.session[flow_key] = pickle.dumps(flow)
74+
request.session[flow_key] = jsonpickle.encode(flow)
7575
return flow
7676

7777

@@ -89,7 +89,7 @@ def _get_flow_for_token(csrf_token, request):
8989
CSRF token.
9090
"""
9191
flow_pickle = request.session.get(_FLOW_KEY.format(csrf_token), None)
92-
return None if flow_pickle is None else pickle.loads(flow_pickle)
92+
return None if flow_pickle is None else jsonpickle.decode(flow_pickle)
9393

9494

9595
def oauth2_callback(request):

tests/contrib/django_util/test_views.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,8 @@ def setUp(self):
152152
self.user = django_models.User.objects.create_user(
153153
username='bill', email='[email protected]', password='hunter2')
154154

155-
@mock.patch('oauth2client.contrib.django_util.views.pickle')
156-
def test_callback_works(self, pickle):
155+
@mock.patch('oauth2client.contrib.django_util.views.jsonpickle')
156+
def test_callback_works(self, jsonpickle_mock):
157157
request = self.factory.get('oauth2/oauth2callback', data={
158158
'state': json.dumps(self.fake_state),
159159
'code': 123
@@ -169,9 +169,10 @@ def test_callback_works(self, pickle):
169169
redirect_uri=request.build_absolute_uri("oauth2/oauth2callback"))
170170

171171
name = 'google_oauth2_flow_{0}'.format(self.CSRF_TOKEN)
172-
self.session[name] = pickle.dumps(flow)
172+
pickled_flow = object()
173+
self.session[name] = pickled_flow
173174
flow.step2_exchange = mock.Mock()
174-
pickle.loads.return_value = flow
175+
jsonpickle_mock.decode.return_value = flow
175176

176177
request.session = self.session
177178
request.user = self.user
@@ -180,9 +181,10 @@ def test_callback_works(self, pickle):
180181
self.assertEqual(
181182
response.status_code, django.http.HttpResponseRedirect.status_code)
182183
self.assertEqual(response['Location'], self.RETURN_URL)
184+
jsonpickle_mock.decode.assert_called_once_with(pickled_flow)
183185

184-
@mock.patch('oauth2client.contrib.django_util.views.pickle')
185-
def test_callback_handles_bad_flow_exchange(self, pickle):
186+
@mock.patch('oauth2client.contrib.django_util.views.jsonpickle')
187+
def test_callback_handles_bad_flow_exchange(self, jsonpickle_mock):
186188
request = self.factory.get('oauth2/oauth2callback', data={
187189
"state": json.dumps(self.fake_state),
188190
"code": 123
@@ -198,17 +200,19 @@ def test_callback_handles_bad_flow_exchange(self, pickle):
198200
redirect_uri=request.build_absolute_uri('oauth2/oauth2callback'))
199201

200202
session_key = 'google_oauth2_flow_{0}'.format(self.CSRF_TOKEN)
201-
self.session[session_key] = pickle.dumps(flow)
203+
pickled_flow = object()
204+
self.session[session_key] = pickled_flow
202205

203206
def local_throws(code):
204207
raise client.FlowExchangeError('test')
205208

206209
flow.step2_exchange = local_throws
207-
pickle.loads.return_value = flow
210+
jsonpickle_mock.decode.return_value = flow
208211

209212
request.session = self.session
210213
response = views.oauth2_callback(request)
211214
self.assertIsInstance(response, http.HttpResponseBadRequest)
215+
jsonpickle_mock.decode.assert_called_once_with(pickled_flow)
212216

213217
def test_error_returns_bad_request(self):
214218
request = self.factory.get('oauth2/oauth2callback', data={

tox.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ basedeps = mock>=1.3.0
1414
deps = {[testenv]basedeps}
1515
django
1616
keyring
17+
jsonpickle
1718
setenv =
1819
pypy: with_gmp=no
1920
DJANGO_SETTINGS_MODULE=tests.contrib.django_util.settings

0 commit comments

Comments
 (0)