| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- 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 }
|