@@ -1907,6 +1907,45 @@ def test_rejects_non_dict_entry(self):
19071907 self .assertEqual (accepted , [])
19081908 self .assertEqual (rejected , 4 )
19091909
1910+ def test_rejects_url_with_control_chars (self ):
1911+ """URLs mit C0-Controls (\\ n, \\ r, \\ t, NUL, ...) muessen bereits
1912+ im Schema-Validator verworfen werden, nicht erst durch urllib's
1913+ InvalidURL beim Fetch. Defense-in-Depth: falls jemand mal den
1914+ Fetcher tauscht (requests/httpx) ist der CRLF-Schutz von urllib
1915+ nicht garantiert.
1916+ """
1917+ bad_urls = [
1918+ "https://example.com\n Host: evil.com" ,
1919+ "https://example.com\r \n X-Injected: 1" ,
1920+ "https://example.com\t with-tab" ,
1921+ "https://example.com\x00 null-byte" ,
1922+ "https://example.com\x1b escape" ,
1923+ "https://example.com\x7f del" ,
1924+ ]
1925+ for bad in bad_urls :
1926+ data = {"feeds" : [{"name" : "ctrl" , "url" : bad }]}
1927+ accepted , rejected = validate_auto_feeds (data )
1928+ self .assertEqual (accepted , [], f"akzeptiert wurde: { bad !r} " )
1929+ self .assertEqual (rejected , 1 , f"falsche reject-Zahl fuer { bad !r} " )
1930+
1931+ def test_accepts_url_with_printable_special_chars (self ):
1932+ """Nicht jedes Sonderzeichen ist Control-Zeichen. Druckbare ASCII-
1933+ Zeichen (Query-Strings, Pfad-Encoding, Fragment) muessen durch
1934+ den Filter unveraendert durchkommen, sonst zerschiessen wir
1935+ legitime Feed-URLs."""
1936+ ok_urls = [
1937+ "https://example.com/path?a=1&b=2" ,
1938+ "https://example.com/path%20with%20space" ,
1939+ "https://example.com/path#frag" ,
1940+ "https://user:pass@example.com/feed" , # Auth-Teil ok, fetch_url filtert spaeter
1941+ "https://example.com:8443/secure" ,
1942+ ]
1943+ for good in ok_urls :
1944+ data = {"feeds" : [{"name" : "ok" , "url" : good }]}
1945+ accepted , rejected = validate_auto_feeds (data )
1946+ self .assertEqual (len (accepted ), 1 , f"verworfen wurde: { good !r} " )
1947+ self .assertEqual (rejected , 0 , f"falsche reject-Zahl fuer { good !r} " )
1948+
19101949 def test_mixed_good_and_bad_partial_accept (self ):
19111950 """Bei Mischung: gute Eintraege akzeptieren, schlechte zaehlen."""
19121951 data = {"feeds" : [
0 commit comments