@@ -333,6 +333,13 @@ def test_localization(self):
333333
334334
335335class AdminURLWidgetTest (SimpleTestCase ):
336+ def test_get_context_validates_url (self ):
337+ w = widgets .AdminURLFieldWidget ()
338+ for invalid in ['' , '/not/a/full/url/' , 'javascript:alert("Danger XSS!")' ]:
339+ with self .subTest (url = invalid ):
340+ self .assertFalse (w .get_context ('name' , invalid , {})['url_valid' ])
341+ self .assertTrue (w .get_context ('name' , 'http://example.com' , {})['url_valid' ])
342+
336343 def test_render (self ):
337344 w = widgets .AdminURLFieldWidget ()
338345 self .assertHTMLEqual (
@@ -366,31 +373,31 @@ def test_render_quoting(self):
366373 VALUE_RE = re .compile ('value="([^"]+)"' )
367374 TEXT_RE = re .compile ('<a[^>]+>([^>]+)</a>' )
368375 w = widgets .AdminURLFieldWidget ()
369- output = w .render ('test' , 'http://example.com/<sometag>some text</sometag>' )
376+ output = w .render ('test' , 'http://example.com/<sometag>some- text</sometag>' )
370377 self .assertEqual (
371378 HREF_RE .search (output ).groups ()[0 ],
372- 'http://example.com/%3Csometag%3Esome%20text %3C/sometag%3E' ,
379+ 'http://example.com/%3Csometag%3Esome-text %3C/sometag%3E' ,
373380 )
374381 self .assertEqual (
375382 TEXT_RE .search (output ).groups ()[0 ],
376- 'http://example.com/<sometag>some text</sometag>' ,
383+ 'http://example.com/<sometag>some- text</sometag>' ,
377384 )
378385 self .assertEqual (
379386 VALUE_RE .search (output ).groups ()[0 ],
380- 'http://example.com/<sometag>some text</sometag>' ,
387+ 'http://example.com/<sometag>some- text</sometag>' ,
381388 )
382- output = w .render ('test' , 'http://example-äüö.com/<sometag>some text</sometag>' )
389+ output = w .render ('test' , 'http://example-äüö.com/<sometag>some- text</sometag>' )
383390 self .assertEqual (
384391 HREF_RE .search (output ).groups ()[0 ],
385- 'http://xn--example--7za4pnc.com/%3Csometag%3Esome%20text %3C/sometag%3E' ,
392+ 'http://xn--example--7za4pnc.com/%3Csometag%3Esome-text %3C/sometag%3E' ,
386393 )
387394 self .assertEqual (
388395 TEXT_RE .search (output ).groups ()[0 ],
389- 'http://example-äüö.com/<sometag>some text</sometag>' ,
396+ 'http://example-äüö.com/<sometag>some- text</sometag>' ,
390397 )
391398 self .assertEqual (
392399 VALUE_RE .search (output ).groups ()[0 ],
393- 'http://example-äüö.com/<sometag>some text</sometag>' ,
400+ 'http://example-äüö.com/<sometag>some- text</sometag>' ,
394401 )
395402 output = w .render ('test' , 'http://www.example.com/%C3%A4"><script>alert("XSS!")</script>"' )
396403 self .assertEqual (
0 commit comments