UNPKG

w-web-sso

Version:
1,351 lines (1,020 loc) 35.7 kB
import path from 'path' import fs from 'fs' import ot from 'dayjs' import get from 'lodash-es/get.js' import each from 'lodash-es/each.js' import map from 'lodash-es/map.js' import size from 'lodash-es/size.js' import keys from 'lodash-es/keys.js' import filter from 'lodash-es/filter.js' import iseobj from 'wsemi/src/iseobj.mjs' import isestr from 'wsemi/src/isestr.mjs' import ispint from 'wsemi/src/ispint.mjs' import isearr from 'wsemi/src/isearr.mjs' import ispnum from 'wsemi/src/ispnum.mjs' import isbol from 'wsemi/src/isbol.mjs' import istimemsTZ from 'wsemi/src/istimemsTZ.mjs' import isfun from 'wsemi/src/isfun.mjs' import ispm from 'wsemi/src/ispm.mjs' import cint from 'wsemi/src/cint.mjs' import j2o from 'wsemi/src/j2o.mjs' import strleft from 'wsemi/src/strleft.mjs' import strright from 'wsemi/src/strright.mjs' import strdelright from 'wsemi/src/strdelright.mjs' import ltdtDiffByKey from 'wsemi/src/ltdtDiffByKey.mjs' import ltdtmapping from 'wsemi/src/ltdtmapping.mjs' import haskey from 'wsemi/src/haskey.mjs' import arrHas from 'wsemi/src/arrHas.mjs' import pm2resolve from 'wsemi/src/pm2resolve.mjs' import pmSeries from 'wsemi/src/pmSeries.mjs' import waitFun from 'wsemi/src/waitFun.mjs' import delay from 'wsemi/src/delay.mjs' import cache from 'wsemi/src/cache.mjs' import ds from '../src/schema/index.mjs' import * as s from '../src/plugins/mShare.mjs' import hashPassword from './hashPassword.mjs' import srlog from './srlog.mjs' function proc(woItems, procOrm, { salt, minExpired }) { //_getGenUserByKV let _getGenUserByKV = async(keyUser, valueUser, opt = {}) => { let errTemp = null //deletePassword let deletePassword = get(opt, 'deletePassword') if (!isbol(deletePassword)) { deletePassword = true } //us let us = await woItems.users.select({ [keyUser]: valueUser, isActive: 'y' }) .catch((err) => { errTemp = err }) //console.log(`...users.select`) //check if (errTemp) { console.log(errTemp) console.log('keyUser', keyUser) console.log('valueUser', valueUser) console.log(`failed to find user`) return Promise.reject(`failed to find user`) } //delete password, 無錯誤取得後即先刪除, 避免調整程式時意外洩漏hash後密碼 if (deletePassword) { us = map(us, (u) => { delete u.password return u }) } //nus let nus = size(us) //check if (nus === 0) { console.log('keyUser', keyUser) console.log('valueUser', valueUser) console.log(`can not find the user by ${keyUser}`) return Promise.reject(`can not find the user by ${keyUser}`) } //check if (nus >= 2) { console.log('keyUser', keyUser) console.log('valueUser', valueUser) console.log(`duplicate ${keyUser}`) return Promise.reject(`duplicate ${keyUser}`) } //u let u = us[0] //get(us, 0, null) 前面已檢測故一定有[0] // console.log('u', u) return u } //getGenUserByKV let getGenUserByKV = async(keyUser, valueUser) => { //u let u = await _getGenUserByKV(keyUser, valueUser) return u } //getGenUserByUserId let getGenUserByUserId = async(userId, opt = {}) => { //u let u = await getGenUserByKV('id', userId, opt) // //check, 不用檢測, 若resolve必定有u, 若reject則由外部處理 // if (!iseobj(u)) { // return null // } return u } //getGenUserByAccount let getGenUserByAccount = async(account, opt = {}) => { //u let u = await getGenUserByKV('account', account, opt) // //check, 不用檢測, 若resolve必定有u, 若reject則由外部處理 // if (!iseobj(u)) { // return null // } return u } //getTokenByKV let getTokenByKV = async(keyToken, valueToken) => { let errTemp = null //ts let ts = await woItems.tokens.select({ [keyToken]: valueToken }) .catch((err) => { errTemp = err }) //console.log(`...tokens.select`) //check if (errTemp) { console.log(errTemp) console.log('keyToken', keyToken) console.log('valueToken', valueToken) console.log(`failed to find token`) return Promise.reject(`failed to find token`) } //nts let nts = size(ts) //check if (nts === 0) { // console.log('keyToken', keyToken) // console.log('valueToken', valueToken) // console.log(`can not find the token by keyToken[${keyToken}]`) return Promise.reject(`can not find the token by keyToken[${keyToken}]`) } //check if (nts >= 2) { console.log('keyToken', keyToken) console.log('valueToken', valueToken) console.log(`duplicate token by keyToken[${keyToken}]`) return Promise.reject(`duplicate token by keyToken[${keyToken}]`) } //t let t = ts[0] //get(ts, 0, null) 前面已檢測故一定有[0] // console.log('t', t) return t } //getIpByKV let getIpByKV = async(keyIp, valueIp) => { let errTemp = null //oips let oips = await woItems.ips.select({ [keyIp]: valueIp }) .catch((err) => { errTemp = err }) //console.log(`...ips.select`) //check if (errTemp) { console.log(errTemp) console.log('keyIp', keyIp) console.log('valueIp', valueIp) console.log(`failed to find ip`) return Promise.reject(`failed to find ip`) } //noips let noips = size(oips) //check if (noips === 0) { // console.log('keyIp', keyIp) // console.log('valueIp', valueIp) // console.log(`can not find the ip by keyIp[${keyIp}]`) return Promise.reject(`can not find the ip by keyIp[${keyIp}]`) } //check if (noips >= 2) { console.log('keyIp', keyIp) console.log('valueIp', valueIp) console.log(`duplicate ip by keyIp[${keyIp}]`) return Promise.reject(`duplicate ip by keyIp[${keyIp}]`) } //oip let oip = oips[0] //get(oips, 0, null) 前面已檢測故一定有[0] // console.log('oip', oip) return oip } //loginByAccountAndPassword let loginByAccountAndPassword = async(account, password) => { //hashPassword let passwordTest = hashPassword(password, salt) // console.log('password', password, 'salt', salt) // console.log('passwordTest', passwordTest) //getGenUserByAccount let u = await _getGenUserByKV('account', account, { deletePassword: false }) //不能使用getGenUserByAccount, 會刪除密碼無法比對 // console.log('u', u) // //check, 不用檢測, 若resolve必定有u, 若reject則由外部處理 // if (!iseobj(u)) { // console.log(`account`, account) // console.log(`can not find the user from account`) // return Promise.reject(`can not find the user from account`) // } //passwordTrue let passwordTrue = get(u, 'password', '') // console.log('passwordTrue', passwordTrue) //check if (passwordTest !== passwordTrue) { return Promise.reject(`incorrect user account or password`) } //userId let userId = get(u, 'id', '') // console.log('userId', userId) //createToken let token = await createToken(userId) // console.log('token', token) //r let r = { id: u.id, account: u.account, name: u.name, email: u.email, description: u.description, from: u.from, redir: u.redir, isAdmin: u.isAdmin, isActive: u.isActive, token, } return r } //createToken let createToken = async (userId) => { let errTemp = null //check if (!ispnum(minExpired)) { console.log(`minExpired`, minExpired) console.log(`invalid minExpired`) return Promise.reject(`invalid minExpired`) } //t let t = ds.tokens.funNew({ userId, }) // console.log('funNew', t) //timeEnd, 依照minExpired(min)更新到期時間 t.timeEnd = ot().add(minExpired, 'minute').format('YYYY-MM-DDTHH:mm:ss.SSSZ') // console.log('timeEnd', t.timeEnd) //token let token = get(t, 'token', '') //insert await woItems.tokens.insert(t) .catch((err) => { errTemp = err }) //check if (errTemp) { console.log(errTemp) console.log(`token`, token) console.log(`can not create a token from userId`) return Promise.reject(`can not create a token from userId`) } return token } //_checkTokenByObj let _checkTokenByObj = async (tk, opt = {}) => { //timeEnd let timeEnd = get(tk, 'timeEnd', '') //check if (!istimemsTZ(timeEnd)) { console.log(`tk`, tk) console.log(`timeEnd`, timeEnd) console.log(`invalid timeEnd`) return Promise.reject(`invalid timeEnd`) } //isApp let isApp = get(tk, 'isApp', '') // console.log('isApp', isApp) //fun let fun = get(opt, 'fun', null) //tn let tn = ot().format('YYYY-MM-DDTHH:mm:ss.SSSZ') // console.log('tn ', tn) // console.log('timeEnd', timeEnd) // console.log('tn < timeEnd', tn < timeEnd) let b1 = tn < timeEnd //現在時間<到期時間, 代表尚未到期 let b2 = true if (isApp !== 'y') { //token來自使用者 if (isfun(fun)) { //有給定驗證fun才執行取得使用者資訊供驗證 //userId let userId = get(tk, 'userId', '') //getGenUserByUserId let u = await getGenUserByUserId(userId) //fun b2 = fun(tk, u) if (ispm(b2)) { b2 = await b2 } } } else { //token來自應用系統, 因無使用者資訊即便有給fun也略過 } let b = b1 && b2 return b } //_checkToken let _checkToken = async (token, opt = {}) => { //tks let tks = await woItems.tokens.select({ token }) //console.log(`...tokens.select`) // console.log('tks', tks) //ntks let ntks = size(tks) //check if (ntks === 0) { console.log(`token`, token) console.log(`invalid token`) return Promise.reject(`invalid token`) } //check if (ntks >= 2) { console.log(`token`, token) console.log(`duplicate tokens`) return Promise.reject(`duplicate tokens`) } //tk let tk = get(tks, 0, '') // console.log('tk', tk) //userId let userId = get(tk, 'userId', '') //_checkTokenByObj let b = await _checkTokenByObj(tk, opt) //info srlog.info({ event: 'fun-checkToken', token, userId, res: b }) //logshow if (!b) { console.log(`block token[${token}]`) //[tag:測試:顯示被封鎖token] } return b } //checkTokenByObj let checkTokenByObj = async (tk, opt = {}) => { let errTemp = null //_checkTokenByObj await _checkTokenByObj(tk, opt) .then((res) => { if (res === false) { errTemp = 'token expired' } }) .catch((err) => { errTemp = err }) //check if (errTemp !== null) { return Promise.reject(errTemp) } return true //resolve只回傳true, reject代表無效tk.token與錯誤 } //checkToken let checkToken = async (token, opt = {}) => { let errTemp = null //_checkToken await _checkToken(token, opt) .then((res) => { if (res === false) { errTemp = 'token expired' } }) .catch((err) => { errTemp = err }) //check if (errTemp !== null) { return Promise.reject(errTemp) } return true //resolve只回傳true, reject代表無效token與錯誤 } //refreshToken let refreshToken = async (token) => { let errTemp = null //tks let tks = await woItems.tokens.select({ token }) //console.log(`...tokens.select`) //ntks let ntks = size(tks) //check if (ntks === 0) { console.log(`token`, token) console.log(`invalid token`) return Promise.reject(`invalid token`) } //check if (ntks >= 2) { console.log(`token`, token) console.log(`duplicate tokens`) return Promise.reject(`duplicate tokens`) } //tk let tk = get(tks, 0, '') // console.log('tk', tk) //timeEnd let timeEnd = get(tk, 'timeEnd', '') //check if (!istimemsTZ(timeEnd)) { console.log(`token`, token) console.log(`timeEnd`, timeEnd) console.log(`invalid timeEnd`) return Promise.reject(`invalid timeEnd`) } //tn let tn = ot().format('YYYY-MM-DDTHH:mm:ss.SSSZ') //check if (tn >= timeEnd) { //現在時間>=到期時間, 代表已到期, 禁止更新token console.log(`token`, token) console.log(`tn`, tn) console.log(`timeEnd`, timeEnd) console.log(`token expired`) return Promise.reject(`token expired`) } //timeEndNew, 依照minExpired(min)更新到期時間 let timeEndNew = ot().add(minExpired, 'minute').format('YYYY-MM-DDTHH:mm:ss.SSSZ') // console.log('timeEndNew', timeEndNew) //timeUpdate let timeUpdate = ot().format('YYYY-MM-DDTHH:mm:ss.SSSZ') //save await woItems.tokens.save({ id: tk.id, timeEnd: timeEndNew, timeUpdate, }) .catch((err) => { errTemp = err }) //check if (errTemp) { console.log(errTemp) console.log(`token`, token) console.log(`can not update timeEnd for token`) return Promise.reject(`can not update timeEnd for token`) } return timeEndNew } //logoutByToken let logoutByToken = async(token) => { let errTemp = null //tks let tks = await woItems.tokens.select({ token }) //console.log(`...tokens.select`) //ntks let ntks = size(tks) //check if (ntks === 0) { console.log(`token`, token) console.log(`invalid token`) return Promise.reject(`invalid token`) } //check if (ntks >= 2) { console.log(`token`, token) console.log(`duplicate tokens`) return Promise.reject(`duplicate tokens`) } //tk let tk = get(tks, 0, '') // console.log('tk', tk) //userId let userId = get(tk, 'userId', '') // console.log('userId', userId) //del let r = await woItems.tokens.del({ id: tk.id }) .catch((err) => { errTemp = err }) // console.log('r', r) //check if (errTemp) { console.log(errTemp) console.log(`token`, token) console.log(`failed to delete token`) return Promise.reject(`failed to delete token`) } //check r = get(r, '0.nDeleted', 0) if (r !== 1) { console.log(`token`, token) console.log(`can not delete the token`) return Promise.reject(`can not delete the token`) } //info srlog.info({ event: 'fun-logout', token, userId }) return true } //createUser let createUser = async () => { //bbb 待開發createUser } //modifyUser let modifyUser = async () => { //bbb 待開發 modifyUser } //deleteUser let deleteUser = async () => { //bbb 待開發 deleteUser } //emailUser let emailUser = async () => { //bbb 待開發 emailUser } //updateTabItems let updateTabItems = async (woName, rows, keyDetect, opt = {}) => { // console.log('updateTabItems', woName, rows.length, keyDetect) //resetOrder let resetOrder = get(opt, 'resetOrder') if (!isbol(resetOrder)) { resetOrder = false } //ltdtmapping rows = ltdtmapping(rows, ds[woName].keys) // console.log('ltdtmapping rows', rows) //重給order if (resetOrder) { rows = map(rows, (r, k) => { r.order = k + 1 return r }) } //ckKey let ckKey = (rows, key) => { let err = null //check let kp = {} each(rows, (v, k) => { //value let value = get(v, key, '') //check if (!isestr(value)) { err = `rows[${k}].${key} is not an effective string` return false //跳出 } //check if (haskey(kp, value)) { err = `rows[${k}].${key}[${value}] is duplicate` return false //跳出 } //kp kp[value] = true }) return err } //偵測未給予或重複 let err = null if (true) { if (arrHas(woName, ['users'])) { //users可重複name err = ckKey(rows, 'id') if (err !== null) { return Promise.reject(err) } err = ckKey(rows, 'email') if (err !== null) { return Promise.reject(err) } } } //ltdtDiffByKey let ltdtOld = await woItems[woName].select() //console.log(`...woName[${woName}].select`) let ltdtNew = rows let r = ltdtDiffByKey(ltdtOld, ltdtNew, keyDetect) // console.log('ltdtDiffByKey r', r) //del if (size(r.del) > 0) { await procOrm('', woName, 'del', r.del) //須使用procOrm才有辦法自動給予相關欄位, 且不使用外部給予userId // .catch((err) => { // console.log('woItems[woName].del err', err) // }) } //add if (size(r.add) > 0) { await procOrm('', woName, 'insert', r.add) //須使用procOrm才有辦法自動給予相關欄位, 且不使用外部給予userId // .catch((err) => { // console.log('woItems[woName].insert err', err) // }) } //diff if (size(r.diff) > 0) { await procOrm('', woName, 'save', r.diff) //須使用procOrm才有辦法自動給予相關欄位, 且不使用外部給予userId // .catch((err) => { // console.log('woItems[woName].save err', err) // }) } return ltdtNew } //getUserByToken let getUserByToken = async(token) => { //tks let tks = await woItems.tokens.select({ token }) //console.log(`...tokens.select`) //ntks let ntks = size(tks) //check if (ntks === 0) { console.log(`token`, token) console.log(`invalid token`) return Promise.reject(`invalid token`) } //check if (ntks >= 2) { console.log(`token`, token) console.log(`duplicate tokens`) return Promise.reject(`duplicate tokens`) } //tk let tk = get(tks, 0, null) // console.log('tk', tk) //isApp let isApp = get(tk, 'isApp', '') // console.log('isApp', isApp) //u let u = null if (isApp !== 'y') { //token來自使用者 //userId let userId = get(tk, 'userId', '') // console.log('userId', userId) //getGenUserByUserId u = await getGenUserByUserId(userId) } else { //token來自應用系統, 另外提供虛擬使用者資訊 //userId let userId = get(tk, 'userId', '') // console.log('userId', userId) //check if (!isestr(userId)) { console.log(`tk`, tk) console.log(`invalid userId from token`) return Promise.reject(`invalid userId from token`) } // //timeEnd // let timeEnd = get(tk, 'timeEnd', '') // // console.log('timeEnd', timeEnd) // //check // if (!istimemsTZ(timeEnd)) { // console.log(`timeEnd`, timeEnd) // console.log(`invalid timeEnd`) // return Promise.reject(`invalid timeEnd`) // } //u u = { id: userId, account: 'no account', name: 'no name', email: 'no email', description: 'no description', from: 'no from', redir: 'no redir', isAdmin: 'y', //應用系統代表為系統管理員 timeVerified: '2000-01-01T00:00:00.000+08:00', //應用系統代表為已驗證 timeExpired: '', timeBlocked: '', isActive: 'y', } } //uu let uu = { id: u.id, account: u.account, name: u.name, email: u.email, description: u.description, from: u.from, redir: u.redir, isApp: isApp === 'y' ? 'y' : 'n', isAdmin: u.isAdmin, timeVerified: u.timeVerified, timeExpired: u.timeExpired, timeBlocked: u.timeBlocked, isActive: u.isActive, } return uu } //checkTokenAndGetUserByToken let checkTokenAndGetUserByToken = async(tokenSelf, tokenTarget, opt = {}) => { //checkToken await checkToken(tokenSelf, opt) //resolve僅回傳true, reject代表無效token或檢測token發生錯誤 //getUserByToken let u = await getUserByToken(tokenTarget) return u } //getUserInfor let getUserInfor = async (key, value, opt = {}) => { //u let u = await getGenUserByKV(key, value, opt) //check if (!iseobj(u)) { return null } //r let r = { id: u.id, account: u.account, name: u.name, email: u.email, description: u.description, from: u.from, redir: u.redir, isAdmin: u.isAdmin, timeVerified: u.timeVerified, timeExpired: u.timeExpired, timeBlocked: u.timeBlocked, isActive: u.isActive, } return r } //checkTokenAndGetUserInfor let checkTokenAndGetUserInfor = async (token, key, value, opt = {}) => { //checkToken await checkToken(token, opt) //resolve僅回傳true, reject代表無效token或檢測token發生錯誤 //getUserInfor let r = await getUserInfor(key, value) return r } //getUsersList let getUsersList = async (opt = {}) => { //needActive let needActive = get(opt, 'needActive') if (!isbol(needActive)) { needActive = false } //deletePassword let deletePassword = get(opt, 'deletePassword') if (!isbol(deletePassword)) { deletePassword = true } //optSelect let optSelect = {} if (needActive) { optSelect = { isActive: 'y' } } //select let us = await woItems.users.select(optSelect) //console.log(`...users.select`) //delete password, 無錯誤取得後即先刪除, 避免調整程式時意外洩漏hash後密碼 if (deletePassword) { us = map(us, (u) => { delete u.password return u }) } return us } //getUsersListCache let ocGetUsersList = cache() let getUsersListCache = async () => { let r = await ocGetUsersList.getProxy('fun', { fun: getUsersList, inputs: null, timeExpired: 30 * 1000 }) //快取30秒 return r } //checkTokenAndGetUsersList let checkTokenAndGetUsersList = async (token, opt = {}) => { //checkToken await checkToken(token, opt) //resolve僅回傳true, reject代表無效token或檢測token發生錯誤 //getUsersList let us = await getUsersList(opt) return us } //checkTokenAndGetActiveUsersList let checkTokenAndGetActiveUsersList = async (token, opt = {}) => { //checkTokenAndGetUsersList let us = await checkTokenAndGetUsersList(token, { ...opt, needActive: true }) return us } //updateUsersList let updateUsersList = async (rows) => { //updateTabItems rows = await updateTabItems('users', rows, 'id', { resetOrder: true }) return rows } //checkTokenAndUpdateUsersList let checkTokenAndUpdateUsersList = async (token, rows, opt = {}) => { //checkToken await checkToken(token, opt) //resolve僅回傳true, reject代表無效token或檢測token發生錯誤 //updateUsersList rows = await updateUsersList(rows) return rows } // //cleanTokens // let cleanTokens = async (opt = {}) => { // //tks // let tks = await woItems.tokens.select() // //console.log(`...tokens.select`) // // console.log('tks', tks) // //tksDels // let tksDels = [] // await pmSeries(tks, async (tk) => { // //checkTokenByObj // let errTemp = null // await checkTokenByObj(tk, opt) // .catch((err) => { // // console.log('checkTokenByObj catch', err) // errTemp = err // }) // //check // if (errTemp) { // tksDels.push(tk) // } // }) // //check // if (size(tksDels) > 0) { // // console.log('tksDels', tksDels) // await pmSeries(tksDels, async (tk) => { // //del // await woItems.tokens.del({ id: tk.id }) // .catch((err) => { // console.log('tokens.del catch', err) // }) // }) // } // } //getTokensList let getTokensList = async () => { //select let ts = await woItems.tokens.select() //console.log(`...tokens.select`) // //needNoEnd // if (needNoEnd) { // //tn // let tn = ot().format('YYYY-MM-DDTHH:mm:ss.SSSZ') // // console.log('tn', tn) // //filter // ts = filter(ts, (v) => { // return v.timeEnd >= tn //tn<=到期時間, 代表有效 // }) // } return ts } //getTokensListCache let ocGetTokensList = cache() let getTokensListCache = async () => { let r = await ocGetTokensList.getProxy('fun', { fun: getTokensList, inputs: null, timeExpired: 30 * 1000 }) //快取30秒 return r } //checkTokenAndGetTokensList let checkTokenAndGetTokensList = async (token, opt = {}) => { //checkToken await checkToken(token, opt) //resolve僅回傳true, reject代表無效token或檢測token發生錯誤 //getTokensList let us = await getTokensList() return us } //updateTokensList let updateTokensList = async (rows) => { //updateTabItems rows = await updateTabItems('tokens', rows, 'id', { resetOrder: false }) return rows } //checkTokenAndUpdateTokensList let checkTokenAndUpdateTokensList = async (token, rows, opt = {}) => { //checkToken await checkToken(token, opt) //resolve僅回傳true, reject代表無效token或檢測token發生錯誤 //updateTokensList rows = await updateTokensList(rows) return rows } //getIpsList let getIpsList = async () => { //select let oips = await woItems.ips.select() //console.log(`...ips.select`) return oips } //getIpsListCache let ocGetIpsList = cache() let getIpsListCache = async () => { let r = await ocGetIpsList.getProxy('fun', { fun: getIpsList, inputs: null, timeExpired: 30 * 1000 }) //快取30秒 return r } //checkTokenAndGetIpsList let checkTokenAndGetIpsList = async (token, opt = {}) => { //checkToken await checkToken(token, opt) //resolve僅回傳true, reject代表無效token或檢測token發生錯誤 //getIpsList let oips = await getIpsList() return oips } //updateIpsList let updateIpsList = async (rows) => { //updateTabItems rows = await updateTabItems('ips', rows, 'id', { resetOrder: false }) return rows } //checkTokenAndUpdateIpsList let checkTokenAndUpdateIpsList = async (token, rows, opt = {}) => { //checkToken await checkToken(token, opt) //resolve僅回傳true, reject代表無效token或檢測token發生錯誤 //updateIpsList rows = await updateIpsList(rows) return rows } // //timer, 清除已過期(timeEnd)的token, 不使用避免無法展延金鑰 // let lockingForCleanTokens = false // setInterval(async() => { // //check // if (lockingForCleanTokens) { // return // } // lockingForCleanTokens = true // //cleanTokens // await cleanTokens() // .finally(() => { // lockingForCleanTokens = false // }) // }, 2000) //cleanUsers let cleanUsers = async() => { //getUsersList let us = await getUsersList({}) //clean await pmSeries(us, async(u) => { //b let b1 = !s.getIsBlocked(u) //未封鎖 let b2 = isestr(u.timeBlocked) //有值 let b = b1 && b2 //check if (!b) { return } //清除timeBlocked await woItems.users.save({ id: u.id, timeBlocked: '', }) }) } //timer, 清理user的timeBlocked let lockingForCleanUsers = false setInterval(async() => { //check if (lockingForCleanUsers) { return } lockingForCleanUsers = true //cleanUsers await cleanUsers() .finally(() => { lockingForCleanUsers = false }) }, 2000) //cleanIps let cleanIps = async() => { //getIpsList let oips = await getIpsList({}) //clean await pmSeries(oips, async(oip) => { //b let b1 = !s.getIsBlocked(oip) //未封鎖 let b2 = isestr(oip.timeBlocked) //有值 let b = b1 && b2 //check if (!b) { return } //清除timeBlocked await woItems.ips.save({ id: oip.id, timeBlocked: '', }) }) } //timer, 清理ip的timeBlocked let lockingForCleanIps = false setInterval(async() => { //check if (lockingForCleanIps) { return } lockingForCleanIps = true //cleanIps await cleanIps() .finally(() => { lockingForCleanIps = false }) }, 2000) //p let p = { getTokenByKV, getIpByKV, getGenUserByKV, getGenUserByUserId, getGenUserByAccount, loginByAccountAndPassword, logoutByToken, checkToken, refreshToken, getUserByToken, checkTokenAndGetUserByToken, getUserInfor, checkTokenAndGetUserInfor, getUsersList, getUsersListCache, checkTokenAndGetUsersList, checkTokenAndGetActiveUsersList, updateUsersList, checkTokenAndUpdateUsersList, getTokensList, getTokensListCache, checkTokenAndGetTokensList, checkTokenAndUpdateTokensList, getIpsList, getIpsListCache, checkTokenAndGetIpsList, checkTokenAndUpdateIpsList, } return p } export default proc