80 lines
2.5 KiB
Python
Executable File
80 lines
2.5 KiB
Python
Executable File
"""
|
|
NAS API Authentication
|
|
Handle OTP login and authentication.
|
|
"""
|
|
|
|
import requests
|
|
from typing import Tuple, Optional
|
|
|
|
from .config import BASE_URL, USERNAME, PASSWORD, session, logger
|
|
from .session import save_sid
|
|
from .exceptions import NASAuthenticationError, NASConnectionError
|
|
|
|
|
|
def login_with_otp(otp_code: str) -> str:
|
|
"""
|
|
Login to NAS with OTP code.
|
|
Returns the session ID (SID) on success.
|
|
Raises NASAuthenticationError on failure.
|
|
"""
|
|
try:
|
|
auth_url = f"{BASE_URL}/auth.cgi"
|
|
auth_params = {
|
|
"api": "SYNO.API.Auth",
|
|
"version": "6",
|
|
"method": "login",
|
|
"account": USERNAME,
|
|
"passwd": PASSWORD,
|
|
"session": "FileStation",
|
|
"format": "sid",
|
|
"otp_code": otp_code
|
|
}
|
|
|
|
resp = session.get(auth_url, params=auth_params,
|
|
verify=False, timeout=30)
|
|
resp.raise_for_status()
|
|
|
|
data = resp.json()
|
|
if data.get("success"):
|
|
sid = data["data"]["sid"]
|
|
save_sid(sid)
|
|
logger.debug("NAS login successful")
|
|
return sid
|
|
else:
|
|
error_msg = data.get("error", {})
|
|
logger.error(f"NAS login failed: {error_msg}")
|
|
raise NASAuthenticationError(
|
|
f"Đăng nhập NAS thất bại: {error_msg}")
|
|
|
|
except requests.exceptions.RequestException as e:
|
|
logger.error(f"Network error during NAS login: {e}")
|
|
raise NASConnectionError(f"Lỗi kết nối NAS: {e}")
|
|
except Exception as e:
|
|
logger.error(f"Unexpected error during NAS login: {e}")
|
|
raise NASAuthenticationError(f"Lỗi đăng nhập NAS: {e}")
|
|
|
|
|
|
def authenticate_with_otp(otp_code: str) -> Tuple[str, Optional[str]]:
|
|
"""
|
|
Authenticate with OTP and save session.
|
|
|
|
Args:
|
|
otp_code: The OTP code from user
|
|
|
|
Returns:
|
|
Tuple[str, Optional[str]]:
|
|
- status: "success" or "error"
|
|
- message: Success message or error description
|
|
"""
|
|
try:
|
|
sid = login_with_otp(otp_code)
|
|
return "success", "Đăng nhập thành công"
|
|
|
|
except NASAuthenticationError as e:
|
|
return "error", str(e)
|
|
except NASConnectionError as e:
|
|
return "error", str(e)
|
|
except Exception as e:
|
|
logger.error(f"Unexpected error during OTP authentication: {e}")
|
|
return "error", f"Lỗi đăng nhập: {e}"
|