syncAccountInfo.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. const db = require('../../plugin/DataBase/db')
  2. const {
  3. getWebVpnCookieHeader,
  4. invalidateWebVpnCookie,
  5. isWebVpnUnifiedAuthCredentialFailure,
  6. markLepaoUnifiedAuthFailed
  7. } = require('./webvpnCookie')
  8. const { syncLepaoStateViaBeforeRun } = require('./lepaoBeforeRunStateSync')
  9. async function syncAccountInfo({ studentNum, createUser, logger }) {
  10. if (!studentNum) {
  11. return { ok: false, msg: '缺少学号参数' }
  12. }
  13. const conditionSql = createUser ? 'student_num = ? AND create_user = ?' : 'student_num = ?'
  14. const queryParams = createUser ? [studentNum, createUser] : [studentNum]
  15. const rows = await db.query(
  16. `SELECT uid, token, school_id, userAgent, create_user FROM lepao_account WHERE ${conditionSql}`,
  17. queryParams
  18. )
  19. if (!rows || rows.length !== 1) {
  20. return { ok: false, msg: '未找到该乐跑账号或无权限操作' }
  21. }
  22. const account = rows[0]
  23. const ownerUuid = account.create_user || createUser
  24. if (!ownerUuid) {
  25. return { ok: false, msg: '账号未绑定用户,无法同步' }
  26. }
  27. let webvpnCookie
  28. try {
  29. webvpnCookie = await getWebVpnCookieHeader(ownerUuid, studentNum, {
  30. skipPostWebVpnLepaoSync: true,
  31. logger
  32. })
  33. } catch (e) {
  34. logger?.error?.(`统一身份认证登录失败 ${studentNum}: ${e.stack || e}`)
  35. if (isWebVpnUnifiedAuthCredentialFailure(e)) {
  36. try {
  37. await markLepaoUnifiedAuthFailed(studentNum, ownerUuid, studentNum)
  38. } catch (markErr) {
  39. logger?.error?.(`标记统一认证失败 state=3 失败 ${studentNum}: ${markErr.stack || markErr}`)
  40. }
  41. }
  42. return { ok: false, msg: e.message || 'WebVPN 登录失败,请检查统一认证账号密码' }
  43. }
  44. try {
  45. return await syncLepaoStateViaBeforeRun({
  46. studentNum,
  47. ownerUuid,
  48. webvpnCookie,
  49. account,
  50. conditionSql,
  51. queryParams,
  52. invalidateWebVpn: () => invalidateWebVpnCookie(ownerUuid, studentNum),
  53. refreshWebVpnCookie: async () => {
  54. try {
  55. return await getWebVpnCookieHeader(ownerUuid, studentNum, {
  56. skipCache: true,
  57. skipPostWebVpnLepaoSync: true,
  58. logger
  59. })
  60. } catch (e) {
  61. if (isWebVpnUnifiedAuthCredentialFailure(e)) {
  62. try {
  63. await markLepaoUnifiedAuthFailed(studentNum, ownerUuid, studentNum)
  64. } catch (_) {
  65. /* ignore */
  66. }
  67. }
  68. throw e
  69. }
  70. },
  71. logger
  72. })
  73. } catch (error) {
  74. logger?.error?.(`同步乐跑账号失败 ${studentNum}: ${error.stack || error}`)
  75. return { ok: false, msg: '同步失败,请稍后再试' }
  76. }
  77. }
  78. module.exports = { syncAccountInfo }