mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-11-27 14:51:18 +00:00
Removing scheme from block urls. Fixes #4656
This commit is contained in:
parent
0eaf8d33e7
commit
c692741be4
1 changed files with 41 additions and 19 deletions
|
@ -309,21 +309,39 @@ pub fn is_url_blocked(url: &Option<Url>, blocklist: &RegexSet) -> LemmyResult<()
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Check that urls are valid, and also remove the scheme, and uniques
|
||||||
pub fn check_urls_are_valid(urls: &Vec<String>) -> LemmyResult<Vec<String>> {
|
pub fn check_urls_are_valid(urls: &Vec<String>) -> LemmyResult<Vec<String>> {
|
||||||
let mut parsed_urls = vec![];
|
let mut parsed_urls = vec![];
|
||||||
for url in urls {
|
for url in urls {
|
||||||
let url = Url::parse(url).or_else(|e| {
|
parsed_urls.push(build_url_str_without_scheme(url)?);
|
||||||
if e == ParseError::RelativeUrlWithoutBase {
|
|
||||||
Url::parse(&format!("https://{url}"))
|
|
||||||
} else {
|
|
||||||
Err(e)
|
|
||||||
}
|
|
||||||
})?;
|
|
||||||
|
|
||||||
parsed_urls.push(url.to_string());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(parsed_urls)
|
let unique_urls = parsed_urls.into_iter().unique().collect();
|
||||||
|
Ok(unique_urls)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn build_url_str_without_scheme(url_str: &str) -> LemmyResult<String> {
|
||||||
|
// Parse and check for errors
|
||||||
|
let mut url = Url::parse(url_str).or_else(|e| {
|
||||||
|
if e == ParseError::RelativeUrlWithoutBase {
|
||||||
|
Url::parse(&format!("http://{url_str}"))
|
||||||
|
} else {
|
||||||
|
Err(e)
|
||||||
|
}
|
||||||
|
})?;
|
||||||
|
|
||||||
|
// Set the scheme to https, then remove the http:// part
|
||||||
|
url
|
||||||
|
.set_scheme("http")
|
||||||
|
.map_err(|_| LemmyErrorType::InvalidUrl)?;
|
||||||
|
|
||||||
|
Ok(
|
||||||
|
url
|
||||||
|
.to_string()
|
||||||
|
.get(7..)
|
||||||
|
.ok_or(LemmyErrorType::InvalidUrl)?
|
||||||
|
.to_string(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -600,17 +618,21 @@ mod tests {
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_url_parsed() {
|
fn test_url_parsed() {
|
||||||
|
// Make sure the scheme is removed, and uniques also
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
vec![String::from("https://example.com/")],
|
&check_urls_are_valid(&vec![
|
||||||
check_urls_are_valid(&vec![String::from("example.com")]).unwrap()
|
"example.com".to_string(),
|
||||||
|
"http://example.com".to_string(),
|
||||||
|
"https://example.com".to_string(),
|
||||||
|
"https://example.blog/test?q=test2&q2=test3#test4".to_string(),
|
||||||
|
])
|
||||||
|
.unwrap(),
|
||||||
|
&vec![
|
||||||
|
"example.com/".to_string(),
|
||||||
|
"example.blog/test?q=test2&q2=test3#test4".to_string()
|
||||||
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
assert!(check_urls_are_valid(&vec![
|
assert!(check_urls_are_valid(&vec!["https://example .com".to_string()]).is_err());
|
||||||
String::from("example.com"),
|
|
||||||
String::from("https://example.blog")
|
|
||||||
])
|
|
||||||
.is_ok());
|
|
||||||
|
|
||||||
assert!(check_urls_are_valid(&vec![String::from("https://example .com"),]).is_err());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue