in components/logins/src/login.rs [375:423]
fn validate_and_fixup_origin(origin: &str) -> Result<Option<String>> {
// Check we can parse the origin, then use the normalized version of it.
match Url::parse(origin) {
Ok(mut u) => {
// Presumably this is a faster path than always setting?
if u.path() != "/"
|| u.fragment().is_some()
|| u.query().is_some()
|| u.username() != "/"
|| u.password().is_some()
{
// Not identical - we only want the origin part, so kill
// any other parts which may exist.
// But first special case `file://` URLs which always
// resolve to `file://`
if u.scheme() == "file" {
return Ok(if origin == "file://" {
None
} else {
Some("file://".into())
});
}
u.set_path("");
u.set_fragment(None);
u.set_query(None);
let _ = u.set_username("");
let _ = u.set_password(None);
let mut href = String::from(u);
// We always store without the trailing "/" which Urls have.
if href.ends_with('/') {
href.pop().expect("url must have a length");
}
if origin != href {
// Needs to be fixed up.
return Ok(Some(href));
}
}
Ok(None)
}
Err(e) => {
breadcrumb!(
"Error parsing login origin: {e:?} ({})",
error_support::redact_url(origin)
);
// We can't fixup completely invalid records, so always throw.
Err(InvalidLogin::IllegalOrigin.into())
}
}
}