fix double encoding of passwords in camera wizard

This commit is contained in:
Josh Hawkins 2026-01-13 13:01:01 -06:00
parent 4b034644d2
commit 66bbe62ffb
2 changed files with 9 additions and 7 deletions

View File

@ -848,9 +848,10 @@ async def onvif_probe(
try: try:
if isinstance(uri, str) and uri.startswith("rtsp://"): if isinstance(uri, str) and uri.startswith("rtsp://"):
if username and password and "@" not in uri: if username and password and "@" not in uri:
# Inject URL-encoded credentials and add only the # Inject raw credentials and add only the
# authenticated version. # authenticated version. The credentials will be encoded
cred = f"{quote_plus(username)}:{quote_plus(password)}@" # later by ffprobe_stream or the config system.
cred = f"{username}:{password}@"
injected = uri.replace( injected = uri.replace(
"rtsp://", f"rtsp://{cred}", 1 "rtsp://", f"rtsp://{cred}", 1
) )
@ -903,9 +904,9 @@ async def onvif_probe(
"/cam/realmonitor?channel=1&subtype=0", "/cam/realmonitor?channel=1&subtype=0",
"/11", "/11",
] ]
# Use URL-encoded credentials for pattern fallback URIs when provided # Use raw credentials for pattern fallback URIs when provided
auth_str = ( auth_str = (
f"{quote_plus(username)}:{quote_plus(password)}@" f"{username}:{password}@"
if username and password if username and password
else "" else ""
) )
@ -930,7 +931,7 @@ async def onvif_probe(
and uri.startswith("rtsp://") and uri.startswith("rtsp://")
and "@" not in uri and "@" not in uri
): ):
cred = f"{quote_plus(username)}:{quote_plus(password)}@" cred = f"{username}:{password}@"
cred_uri = uri.replace("rtsp://", f"rtsp://{cred}", 1) cred_uri = uri.replace("rtsp://", f"rtsp://{cred}", 1)
if cred_uri not in to_test: if cred_uri not in to_test:
to_test.append(cred_uri) to_test.append(cred_uri)

View File

@ -81,7 +81,8 @@ export async function detectReolinkCamera(
export function maskUri(uri: string): string { export function maskUri(uri: string): string {
try { try {
// Handle RTSP URLs with user:pass@host format // Handle RTSP URLs with user:pass@host format
const rtspMatch = uri.match(/rtsp:\/\/([^:]+):([^@]+)@(.+)/); // Use greedy match for password to handle passwords with @
const rtspMatch = uri.match(/rtsp:\/\/([^:]+):(.+)@(.+)/);
if (rtspMatch) { if (rtspMatch) {
return `rtsp://${rtspMatch[1]}:${"*".repeat(4)}@${rtspMatch[3]}`; return `rtsp://${rtspMatch[1]}:${"*".repeat(4)}@${rtspMatch[3]}`;
} }