|
3 | 3 | import pytest |
4 | 4 |
|
5 | 5 | from app.models import ServiceCallbackApi, ServiceInboundApi |
| 6 | +from app.service.callback_rest import _validate_not_localhost |
6 | 7 | from tests.app.db import create_service_callback_api, create_service_inbound_api |
7 | 8 |
|
8 | 9 |
|
@@ -217,3 +218,85 @@ def test_suspend_callback_api(self, admin_request, sample_service, suspend_unsus |
217 | 218 | callback = ServiceCallbackApi.query.get(service_callback_api.id) |
218 | 219 | assert callback.is_suspended is suspend_unsuspend |
219 | 220 | assert callback.updated_by_id == sample_service.users[0].id |
| 221 | + |
| 222 | + |
| 223 | +@pytest.mark.parametrize( |
| 224 | + "url", |
| 225 | + [ |
| 226 | + "https://localhost/callback", |
| 227 | + "https://localhost./callback", |
| 228 | + "https://localhost:8080/callback", |
| 229 | + "https://127.0.0.1/callback", |
| 230 | + "https://127.0.0.2/callback", |
| 231 | + "https://127.255.255.255/callback", |
| 232 | + "https://127.0.0.1:443/callback", |
| 233 | + "https://[::1]/callback", |
| 234 | + "https://[0:0:0:0:0:0:0:1]/callback", |
| 235 | + "https://sub.localhost/callback", |
| 236 | + ], |
| 237 | +) |
| 238 | +def test_validate_not_localhost_rejects_localhost_urls(url): |
| 239 | + from app.errors import InvalidRequest |
| 240 | + |
| 241 | + with pytest.raises(InvalidRequest): |
| 242 | + _validate_not_localhost(url) |
| 243 | + |
| 244 | + |
| 245 | +@pytest.mark.parametrize( |
| 246 | + "url", |
| 247 | + [ |
| 248 | + "https://example.com/callback", |
| 249 | + "https://my-service.gc.ca/callback", |
| 250 | + None, |
| 251 | + ], |
| 252 | +) |
| 253 | +def test_validate_not_localhost_allows_valid_urls(url): |
| 254 | + _validate_not_localhost(url) # should not raise |
| 255 | + |
| 256 | + |
| 257 | +@pytest.mark.parametrize( |
| 258 | + "url", |
| 259 | + [ |
| 260 | + "https://localhost/callback", |
| 261 | + "https://127.0.0.1/callback", |
| 262 | + "https://127.0.0.2/callback", |
| 263 | + "https://[::1]/callback", |
| 264 | + ], |
| 265 | +) |
| 266 | +def test_create_inbound_api_rejects_localhost(admin_request, sample_service, url): |
| 267 | + data = { |
| 268 | + "url": url, |
| 269 | + "bearer_token": "some-unique-string", |
| 270 | + "updated_by_id": str(sample_service.users[0].id), |
| 271 | + } |
| 272 | + resp_json = admin_request.post( |
| 273 | + "service_callback.create_service_inbound_api", |
| 274 | + service_id=sample_service.id, |
| 275 | + _data=data, |
| 276 | + _expected_status=400, |
| 277 | + ) |
| 278 | + assert "localhost" in resp_json["message"].lower() |
| 279 | + |
| 280 | + |
| 281 | +@pytest.mark.parametrize( |
| 282 | + "url", |
| 283 | + [ |
| 284 | + "https://localhost/callback", |
| 285 | + "https://127.0.0.1/callback", |
| 286 | + "https://127.0.0.2/callback", |
| 287 | + "https://[::1]/callback", |
| 288 | + ], |
| 289 | +) |
| 290 | +def test_create_callback_api_rejects_localhost(admin_request, sample_service, url): |
| 291 | + data = { |
| 292 | + "url": url, |
| 293 | + "bearer_token": "some-unique-string", |
| 294 | + "updated_by_id": str(sample_service.users[0].id), |
| 295 | + } |
| 296 | + resp_json = admin_request.post( |
| 297 | + "service_callback.create_service_callback_api", |
| 298 | + service_id=sample_service.id, |
| 299 | + _data=data, |
| 300 | + _expected_status=400, |
| 301 | + ) |
| 302 | + assert "localhost" in resp_json["message"].lower() |
0 commit comments