auth: 邮箱注册/登录补全 Linux 账号创建
registerByEmail / loginByEmail 漏掉 ensureLinuxAccount,开 CLAW_ENABLE_LINUX_ACCOUNTS=1 时邮箱用户既不会建 Linux 账号、createAccountDirectories 的 chown 也会失败。 照搬 username 路径的位置补上即可。同时删掉后端 server.py 里同逻辑的 dead code (_XIAOMI_EMAIL_RE / _account_id_from_email),实际拆分发生在 TS 层。
This commit is contained in:
@@ -4556,28 +4556,6 @@ def _safe_account_id(account_id: str | None) -> str:
|
||||
return normalized[:80] or 'default'
|
||||
|
||||
|
||||
_XIAOMI_EMAIL_RE = re.compile(r'^([\w.-]+)@xiaomi\.com$', re.IGNORECASE)
|
||||
_EMAIL_ACCOUNT_ID_RE = re.compile(r'^[a-z0-9._-]{2,40}$')
|
||||
|
||||
|
||||
def _account_id_from_email(email: str | None) -> str | None:
|
||||
"""Validate a Xiaomi email and return its prefix as account_id.
|
||||
|
||||
The prefix is lowercased and must satisfy the platform account_id rule:
|
||||
only lowercase letters / digits / dot / underscore / dash, length 2-40.
|
||||
Returns None if the email or prefix is invalid (caller must reject).
|
||||
"""
|
||||
if not isinstance(email, str):
|
||||
return None
|
||||
match = _XIAOMI_EMAIL_RE.match(email.strip())
|
||||
if not match:
|
||||
return None
|
||||
prefix = match.group(1).lower()
|
||||
if not _EMAIL_ACCOUNT_ID_RE.match(prefix):
|
||||
return None
|
||||
return prefix
|
||||
|
||||
|
||||
def _linux_accounts_enabled() -> bool:
|
||||
return os.environ.get(LINUX_ACCOUNT_ENV, '').strip().lower() in {
|
||||
'1',
|
||||
|
||||
@@ -103,6 +103,7 @@ export async function registerByEmail(email: string, password: string) {
|
||||
createdAt: new Date().toISOString(),
|
||||
};
|
||||
usersFile.users.push(account);
|
||||
await ensureLinuxAccount(account.id, password);
|
||||
await writeUsers(usersFile);
|
||||
await createAccountDirectories(account.id);
|
||||
return createSession(account);
|
||||
@@ -121,6 +122,7 @@ export async function loginByEmail(email: string, password: string) {
|
||||
if (!verifyPassword(password, account.passwordHash)) {
|
||||
throw new Error("邮箱或密码错误");
|
||||
}
|
||||
await ensureLinuxAccount(account.id, password);
|
||||
await createAccountDirectories(account.id);
|
||||
return createSession(account);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user