return self._returncode
-async def check_output(*args: str) -> tuple[int, bytes]:
+async def check_output(*args: str, env: dict[str, str] | None = None) -> tuple[int, bytes]:
"""Run subprocess and return returncode and output."""
proc = await asyncio.create_subprocess_exec(
- *args,
- stderr=asyncio.subprocess.STDOUT,
- stdout=asyncio.subprocess.PIPE,
+ *args, stderr=asyncio.subprocess.STDOUT, stdout=asyncio.subprocess.PIPE, env=env
)
stdout, _ = await proc.communicate()
return (proc.returncode, stdout)
subfolder = subfolder[:-1]
if platform.system() == "Darwin":
+ # NOTE: MacOS does not support special characters in the username/password
password_str = f":{password}" if password else ""
mount_cmd = [
"mount",
"-t",
"smbfs",
- f"//{username}:{password_str}@{server}/{share}{subfolder}",
+ f"//{username}{password_str}@{server}/{share}{subfolder}",
self.base_path,
]
elif platform.system() == "Linux":
- options = [
- "rw",
- f'username="{username}"',
- ]
- if password:
- options.append(f'password="{password}"')
+ options = ["rw"]
if mount_options := self.config.get_value(CONF_MOUNT_OPTIONS):
options += mount_options.split(",")
"Using mount command: %s",
[m.replace(password, "########") if password else m for m in mount_cmd],
)
+ env_vars = {
+ "USER": username,
+ }
+ if password:
+ env_vars["PASSWD"] = password
- returncode, output = await check_output(*mount_cmd)
+ returncode, output = await check_output(*mount_cmd, env=env_vars)
if returncode != 0:
msg = f"SMB mount failed with error: {output.decode()}"
raise LoginFailed(msg)