const db = require('../../plugin/DataBase/db') const { getWebVpnCookieHeader, invalidateWebVpnCookie, isWebVpnUnifiedAuthCredentialFailure, markLepaoUnifiedAuthFailed } = require('./webvpnCookie') const { syncLepaoStateViaBeforeRun } = require('./lepaoBeforeRunStateSync') async function syncAccountInfo({ studentNum, createUser, logger }) { if (!studentNum) { return { ok: false, msg: '缺少学号参数' } } const conditionSql = createUser ? 'student_num = ? AND create_user = ?' : 'student_num = ?' const queryParams = createUser ? [studentNum, createUser] : [studentNum] const rows = await db.query( `SELECT uid, token, school_id, userAgent, create_user FROM lepao_account WHERE ${conditionSql}`, queryParams ) if (!rows || rows.length !== 1) { return { ok: false, msg: '未找到该乐跑账号或无权限操作' } } const account = rows[0] const ownerUuid = account.create_user || createUser if (!ownerUuid) { return { ok: false, msg: '账号未绑定用户,无法同步' } } let webvpnCookie try { webvpnCookie = await getWebVpnCookieHeader(ownerUuid, studentNum, { skipPostWebVpnLepaoSync: true, logger }) } catch (e) { logger?.error?.(`统一身份认证登录失败 ${studentNum}: ${e.stack || e}`) if (isWebVpnUnifiedAuthCredentialFailure(e)) { try { await markLepaoUnifiedAuthFailed(studentNum, ownerUuid, studentNum) } catch (markErr) { logger?.error?.(`标记统一认证失败 state=3 失败 ${studentNum}: ${markErr.stack || markErr}`) } } return { ok: false, msg: e.message || 'WebVPN 登录失败,请检查统一认证账号密码' } } try { return await syncLepaoStateViaBeforeRun({ studentNum, ownerUuid, webvpnCookie, account, conditionSql, queryParams, invalidateWebVpn: () => invalidateWebVpnCookie(ownerUuid, studentNum), refreshWebVpnCookie: async () => { try { return await getWebVpnCookieHeader(ownerUuid, studentNum, { skipCache: true, skipPostWebVpnLepaoSync: true, logger }) } catch (e) { if (isWebVpnUnifiedAuthCredentialFailure(e)) { try { await markLepaoUnifiedAuthFailed(studentNum, ownerUuid, studentNum) } catch (_) { /* ignore */ } } throw e } }, logger }) } catch (error) { logger?.error?.(`同步乐跑账号失败 ${studentNum}: ${error.stack || error}`) return { ok: false, msg: '同步失败,请稍后再试' } } } module.exports = { syncAccountInfo }