88from codecov_auth .models import Owner
99from codecov_auth .views .bitbucket import BitbucketLoginView
1010from shared .torngit .bitbucket import Bitbucket
11- from shared .torngit .exceptions import (
12- TorngitClientGeneralError ,
13- )
11+ from shared .torngit .exceptions import TorngitServer5xxCodeError
12+ from utils .encryption import encryptor
1413
1514
1615def test_get_bitbucket_redirect (client , settings , mocker ):
17- mocked_generate = mocker .patch .object (
16+ mocked_get = mocker .patch .object (
1817 Bitbucket ,
19- "generate_redirect_url" ,
20- return_value = "https://bitbucket.org/site/oauth2/authorize?client_id=testqmo19ebdkseoby&response_type=code&redirect_uri=http%3A%2F%2Flocalhost&state=teststate" ,
18+ "generate_request_token" ,
19+ return_value = {
20+ "oauth_token" : "testy6r2of6ajkmrub" ,
21+ "oauth_token_secret" : "testzibw5q01scpl8qeeupzh8u9yu8hz" ,
22+ },
2123 )
2224 settings .BITBUCKET_REDIRECT_URI = "http://localhost"
2325 settings .BITBUCKET_CLIENT_ID = "testqmo19ebdkseoby"
@@ -26,33 +28,30 @@ def test_get_bitbucket_redirect(client, settings, mocker):
2628 res = client .get (url , SERVER_NAME = "localhost:8000" )
2729 assert res .status_code == 302
2830
29- assert "_bb_oauth_state " in res .cookies
30- cookie = res .cookies ["_bb_oauth_state " ]
31+ assert "_oauth_request_token " in res .cookies
32+ cookie = res .cookies ["_oauth_request_token " ]
3133 assert cookie .value
3234 assert cookie .get ("domain" ) == settings .COOKIES_DOMAIN
33- assert cookie .get ("secure" )
34- assert cookie .get ("samesite" ) == settings .COOKIE_SAME_SITE
35- assert cookie .get ("max-age" ) == 300
36- assert mocked_generate .call_count == 1
37- # state kwarg was passed through
38- _ , kwargs = mocked_generate .call_args
39- assert kwargs .get ("state" ) is not None
35+ assert (
36+ res .url
37+ == "https://bitbucket.org/api/1.0/oauth/authenticate?oauth_token=testy6r2of6ajkmrub"
38+ )
39+ mocked_get .assert_called_with (settings .BITBUCKET_REDIRECT_URI )
4040
4141
42- def test_get_bitbucket_redirect_bitbucket_error (client , settings , mocker ):
43- mocker .patch .object (
44- Bitbucket ,
45- "generate_redirect_url" ,
46- side_effect = TorngitClientGeneralError (400 , {}, "bad request" ),
42+ def test_get_bitbucket_redirect_bitbucket_unavailable (client , settings , mocker ):
43+ mocked_get = mocker .patch .object (
44+ Bitbucket , "generate_request_token" , side_effect = TorngitServer5xxCodeError ()
4745 )
4846 settings .BITBUCKET_REDIRECT_URI = "http://localhost"
4947 settings .BITBUCKET_CLIENT_ID = "testqmo19ebdkseoby"
5048 settings .BITBUCKET_CLIENT_SECRET = "testfi8hzehvz453qj8mhv21ca4rf83f"
5149 url = reverse ("bitbucket-login" )
5250 res = client .get (url , SERVER_NAME = "localhost:8000" )
5351 assert res .status_code == 302
54- assert "_bb_oauth_state " not in res .cookies
52+ assert "_oauth_request_token " not in res .cookies
5553 assert res .url == url
54+ mocked_get .assert_called_with (settings .BITBUCKET_REDIRECT_URI )
5655
5756
5857async def fake_get_authenticated_user ():
@@ -111,22 +110,23 @@ async def fake_list_teams():
111110 "generate_access_token" ,
112111 return_value = {
113112 "key" : "test6tl3evq7c8vuyn" ,
114- "secret" : "testrefreshtoken " ,
113+ "secret" : "testdm61tppb5x0tam7nae3qajhcepzz " ,
115114 },
116115 )
117116 settings .BITBUCKET_REDIRECT_URI = "http://localhost"
118117 settings .BITBUCKET_CLIENT_ID = "testqmo19ebdkseoby"
119118 settings .BITBUCKET_CLIENT_SECRET = "testfi8hzehvz453qj8mhv21ca4rf83f"
120119 settings .CODECOV_DASHBOARD_URL = "dashboard.value"
121120 settings .COOKIE_SECRET = "aaaaa"
122-
123- state = "test_state_value_abc123"
124121 url = reverse ("bitbucket-login" )
122+ oauth_request_token = (
123+ "dGVzdDZ0bDNldnE3Yzh2dXlu|dGVzdGRtNjF0cHBiNXgwdGFtN25hZTNxYWpoY2Vweno="
124+ )
125125 client .cookies = SimpleCookie (
126126 {
127- "_bb_oauth_state " : signing .get_cookie_signer ( salt = "_bb_oauth_state" ). sign (
128- state
129- )
127+ "_oauth_request_token " : signing .get_cookie_signer (
128+ salt = "_oauth_request_token"
129+ ). sign ( encryptor . encode ( oauth_request_token ). decode ())
130130 }
131131 )
132132 mock_create_user_onboarding_metric = mocker .patch (
@@ -135,17 +135,17 @@ async def fake_list_teams():
135135
136136 res = client .get (
137137 url ,
138- {"code " : "auth_code_from_bitbucket" , "state " : state },
138+ {"oauth_verifier " : 8519288973 , "oauth_token " : "test1daxl4jnhegoh4" },
139139 SERVER_NAME = "localhost:8000" ,
140140 )
141141 assert res .status_code == 302
142142 assert res .url == "dashboard.value/bb"
143- assert "_bb_oauth_state " in res .cookies
144- cookie = res .cookies ["_bb_oauth_state " ]
143+ assert "_oauth_request_token " in res .cookies
144+ cookie = res .cookies ["_oauth_request_token " ]
145145 assert cookie .value == ""
146146 assert cookie .get ("domain" ) == settings .COOKIES_DOMAIN
147147 mocked_get .assert_called_with (
148- "auth_code_from_bitbucket " , settings . BITBUCKET_REDIRECT_URI
148+ "test6tl3evq7c8vuyn " , "testdm61tppb5x0tam7nae3qajhcepzz" , "8519288973"
149149 )
150150 owner = Owner .objects .get (username = "ThiagoCodecov" , service = "bitbucket" )
151151 expected_call = call (
@@ -155,8 +155,13 @@ async def fake_list_teams():
155155 )
156156 assert mock_create_user_onboarding_metric .call_args_list == [expected_call ]
157157
158+ assert (
159+ encryptor .decode (owner .oauth_token )
160+ == "test6tl3evq7c8vuyn:testdm61tppb5x0tam7nae3qajhcepzz"
161+ )
158162
159- def test_get_bitbucket_already_token_no_state_cookie (
163+
164+ def test_get_bitbucket_already_token_no_cookie (
160165 client , settings , mocker , db , mock_redis
161166):
162167 mocker .patch (
@@ -170,7 +175,7 @@ def test_get_bitbucket_already_token_no_state_cookie(
170175 "generate_access_token" ,
171176 return_value = {
172177 "key" : "test6tl3evq7c8vuyn" ,
173- "secret" : "testrefreshtoken " ,
178+ "secret" : "testdm61tppb5x0tam7nae3qajhcepzz " ,
174179 },
175180 )
176181 settings .BITBUCKET_REDIRECT_URI = "http://localhost"
@@ -179,39 +184,7 @@ def test_get_bitbucket_already_token_no_state_cookie(
179184 url = reverse ("bitbucket-login" )
180185 res = client .get (
181186 url ,
182- {"code" : "auth_code_from_bitbucket" , "state" : "some_state" },
183- SERVER_NAME = "localhost:8000" ,
184- )
185- assert res .status_code == 302
186- assert res .url == "/login/bitbucket"
187- assert not mocked_get .called
188-
189-
190- def test_get_bitbucket_state_mismatch (client , settings , mocker , db , mock_redis ):
191- mocked_get = mocker .patch .object (
192- Bitbucket ,
193- "generate_access_token" ,
194- return_value = {
195- "key" : "test6tl3evq7c8vuyn" ,
196- "secret" : "testrefreshtoken" ,
197- },
198- )
199- settings .BITBUCKET_REDIRECT_URI = "http://localhost"
200- settings .BITBUCKET_CLIENT_ID = "testqmo19ebdkseoby"
201- settings .BITBUCKET_CLIENT_SECRET = "testfi8hzehvz453qj8mhv21ca4rf83f"
202- settings .COOKIE_SECRET = "aaaaa"
203-
204- url = reverse ("bitbucket-login" )
205- client .cookies = SimpleCookie (
206- {
207- "_bb_oauth_state" : signing .get_cookie_signer (salt = "_bb_oauth_state" ).sign (
208- "legit_state"
209- )
210- }
211- )
212- res = client .get (
213- url ,
214- {"code" : "auth_code_from_bitbucket" , "state" : "attacker_injected_state" },
187+ {"oauth_verifier" : 8519288973 , "oauth_token" : "test1daxl4jnhegoh4" },
215188 SERVER_NAME = "localhost:8000" ,
216189 )
217190 assert res .status_code == 302
0 commit comments