tkserver 1.7.13 → 1.7.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +39 -2
- package/mongo.js +39 -2
- package/package.json +2 -2
package/index.js
CHANGED
|
@@ -43,6 +43,13 @@ const {
|
|
|
43
43
|
checkCommentOwnership,
|
|
44
44
|
isValidEmail
|
|
45
45
|
} = require('twikoo-func/utils')
|
|
46
|
+
const {
|
|
47
|
+
createCap,
|
|
48
|
+
lokiStorage,
|
|
49
|
+
createChallenge,
|
|
50
|
+
redeemChallenge,
|
|
51
|
+
isBuiltinCap
|
|
52
|
+
} = require('twikoo-func/utils/cap')
|
|
46
53
|
const {
|
|
47
54
|
jsonParse,
|
|
48
55
|
commentImportValine,
|
|
@@ -157,6 +164,12 @@ module.exports = async (request, response) => {
|
|
|
157
164
|
case 'COMMENT_EXPORT_FOR_ADMIN': // >= 1.6.13
|
|
158
165
|
res = await commentExportForAdmin(event)
|
|
159
166
|
break
|
|
167
|
+
case 'CAP_CHALLENGE':
|
|
168
|
+
res = await capChallenge()
|
|
169
|
+
break
|
|
170
|
+
case 'CAP_REDEEM':
|
|
171
|
+
res = await capRedeem(event)
|
|
172
|
+
break
|
|
160
173
|
default:
|
|
161
174
|
if (event.event) {
|
|
162
175
|
res.code = RES_CODE.EVENT_NOT_EXIST
|
|
@@ -801,6 +814,14 @@ async function checkCaptcha (comment, request) {
|
|
|
801
814
|
geeTestPassToken: comment.geeTestPassToken,
|
|
802
815
|
geeTestGenTime: comment.geeTestGenTime
|
|
803
816
|
})
|
|
817
|
+
} else if (provider === 'Cap' && isBuiltinCap(config)) {
|
|
818
|
+
if (!comment.capToken) {
|
|
819
|
+
throw new Error('验证码 token 缺失,请刷新页面重试')
|
|
820
|
+
}
|
|
821
|
+
await checkCapCaptcha({
|
|
822
|
+
capToken: comment.capToken,
|
|
823
|
+
cap: createCap(lokiStorage(db))
|
|
824
|
+
})
|
|
804
825
|
} else if (provider === 'Cap' && config.CAP_API_ENDPOINT && config.CAP_SECRET_KEY) {
|
|
805
826
|
if (!comment.capToken) {
|
|
806
827
|
throw new Error('验证码 token 缺失,请刷新页面重试')
|
|
@@ -811,7 +832,7 @@ async function checkCaptcha (comment, request) {
|
|
|
811
832
|
capApiEndpoint: config.CAP_API_ENDPOINT
|
|
812
833
|
})
|
|
813
834
|
} else if (provider === 'Cap') {
|
|
814
|
-
throw new Error('Cap
|
|
835
|
+
throw new Error('Cap 验证码配置不完整:内嵌模式无需额外配置,外部模式需填写 CAP_API_ENDPOINT 与 CAP_SECRET_KEY')
|
|
815
836
|
} else if (provider) {
|
|
816
837
|
throw new Error(`不支持的验证码类型: ${provider}`)
|
|
817
838
|
}
|
|
@@ -1047,7 +1068,7 @@ function isAdmin (accessToken) {
|
|
|
1047
1068
|
|
|
1048
1069
|
// 建立数据库 collections
|
|
1049
1070
|
async function createCollections () {
|
|
1050
|
-
const collections = ['comment', 'config', 'counter']
|
|
1071
|
+
const collections = ['comment', 'config', 'counter', 'cap_challenges', 'cap_tokens']
|
|
1051
1072
|
const res = {}
|
|
1052
1073
|
for (const collection of collections) {
|
|
1053
1074
|
if (db.getCollection(collection) === null) {
|
|
@@ -1057,6 +1078,22 @@ async function createCollections () {
|
|
|
1057
1078
|
return res
|
|
1058
1079
|
}
|
|
1059
1080
|
|
|
1081
|
+
async function capChallenge () {
|
|
1082
|
+
if (!isBuiltinCap(config)) {
|
|
1083
|
+
return { code: RES_CODE.FAIL, message: '内嵌 Cap 未启用' }
|
|
1084
|
+
}
|
|
1085
|
+
const data = await createChallenge(createCap(lokiStorage(db)))
|
|
1086
|
+
return { code: RES_CODE.SUCCESS, ...data }
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
async function capRedeem (event) {
|
|
1090
|
+
if (!isBuiltinCap(config)) {
|
|
1091
|
+
return { code: RES_CODE.FAIL, message: '内嵌 Cap 未启用' }
|
|
1092
|
+
}
|
|
1093
|
+
const data = await redeemChallenge(createCap(lokiStorage(db)), event)
|
|
1094
|
+
return { code: RES_CODE.SUCCESS, ...data }
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1060
1097
|
function getIp (request) {
|
|
1061
1098
|
try {
|
|
1062
1099
|
const { TWIKOO_IP_HEADERS } = process.env
|
package/mongo.js
CHANGED
|
@@ -39,6 +39,13 @@ const {
|
|
|
39
39
|
validate,
|
|
40
40
|
checkCommentOwnership
|
|
41
41
|
} = require('twikoo-func/utils')
|
|
42
|
+
const {
|
|
43
|
+
createCap,
|
|
44
|
+
mongoStorage,
|
|
45
|
+
createChallenge,
|
|
46
|
+
redeemChallenge,
|
|
47
|
+
isBuiltinCap
|
|
48
|
+
} = require('twikoo-func/utils/cap')
|
|
42
49
|
const {
|
|
43
50
|
jsonParse,
|
|
44
51
|
commentImportValine,
|
|
@@ -150,6 +157,12 @@ module.exports = async (request, response) => {
|
|
|
150
157
|
case 'COMMENT_EXPORT_FOR_ADMIN': // >= 1.6.13
|
|
151
158
|
res = await commentExportForAdmin(event)
|
|
152
159
|
break
|
|
160
|
+
case 'CAP_CHALLENGE':
|
|
161
|
+
res = await capChallenge()
|
|
162
|
+
break
|
|
163
|
+
case 'CAP_REDEEM':
|
|
164
|
+
res = await capRedeem(event)
|
|
165
|
+
break
|
|
153
166
|
default:
|
|
154
167
|
if (event.event) {
|
|
155
168
|
res.code = RES_CODE.EVENT_NOT_EXIST
|
|
@@ -777,6 +790,14 @@ async function checkCaptcha (comment, request) {
|
|
|
777
790
|
geeTestPassToken: comment.geeTestPassToken,
|
|
778
791
|
geeTestGenTime: comment.geeTestGenTime
|
|
779
792
|
})
|
|
793
|
+
} else if (provider === 'Cap' && isBuiltinCap(config)) {
|
|
794
|
+
if (!comment.capToken) {
|
|
795
|
+
throw new Error('验证码 token 缺失,请刷新页面重试')
|
|
796
|
+
}
|
|
797
|
+
await checkCapCaptcha({
|
|
798
|
+
capToken: comment.capToken,
|
|
799
|
+
cap: createCap(mongoStorage(db))
|
|
800
|
+
})
|
|
780
801
|
} else if (provider === 'Cap' && config.CAP_API_ENDPOINT && config.CAP_SECRET_KEY) {
|
|
781
802
|
if (!comment.capToken) {
|
|
782
803
|
throw new Error('验证码 token 缺失,请刷新页面重试')
|
|
@@ -787,7 +808,7 @@ async function checkCaptcha (comment, request) {
|
|
|
787
808
|
capApiEndpoint: config.CAP_API_ENDPOINT
|
|
788
809
|
})
|
|
789
810
|
} else if (provider === 'Cap') {
|
|
790
|
-
throw new Error('Cap
|
|
811
|
+
throw new Error('Cap 验证码配置不完整:内嵌模式无需额外配置,外部模式需填写 CAP_API_ENDPOINT 与 CAP_SECRET_KEY')
|
|
791
812
|
} else if (provider) {
|
|
792
813
|
throw new Error(`不支持的验证码类型: ${provider}`)
|
|
793
814
|
}
|
|
@@ -1016,7 +1037,7 @@ function isAdmin (accessToken) {
|
|
|
1016
1037
|
|
|
1017
1038
|
// 建立数据库 collections
|
|
1018
1039
|
async function createCollections () {
|
|
1019
|
-
const collections = ['comment', 'config', 'counter']
|
|
1040
|
+
const collections = ['comment', 'config', 'counter', 'cap_challenges', 'cap_tokens']
|
|
1020
1041
|
const res = {}
|
|
1021
1042
|
for (const collection of collections) {
|
|
1022
1043
|
try {
|
|
@@ -1028,6 +1049,22 @@ async function createCollections () {
|
|
|
1028
1049
|
return res
|
|
1029
1050
|
}
|
|
1030
1051
|
|
|
1052
|
+
async function capChallenge () {
|
|
1053
|
+
if (!isBuiltinCap(config)) {
|
|
1054
|
+
return { code: RES_CODE.FAIL, message: '内嵌 Cap 未启用' }
|
|
1055
|
+
}
|
|
1056
|
+
const data = await createChallenge(createCap(mongoStorage(db)))
|
|
1057
|
+
return { code: RES_CODE.SUCCESS, ...data }
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
async function capRedeem (event) {
|
|
1061
|
+
if (!isBuiltinCap(config)) {
|
|
1062
|
+
return { code: RES_CODE.FAIL, message: '内嵌 Cap 未启用' }
|
|
1063
|
+
}
|
|
1064
|
+
const data = await redeemChallenge(createCap(mongoStorage(db)), event)
|
|
1065
|
+
return { code: RES_CODE.SUCCESS, ...data }
|
|
1066
|
+
}
|
|
1067
|
+
|
|
1031
1068
|
function getIp (request) {
|
|
1032
1069
|
try {
|
|
1033
1070
|
const { TWIKOO_IP_HEADERS } = process.env
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tkserver",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.15",
|
|
4
4
|
"description": "A simple comment system.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"twikoo",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"get-user-ip": "^1.0.1",
|
|
32
32
|
"lokijs": "^1.5.12",
|
|
33
33
|
"mongodb": "^6.3.0",
|
|
34
|
-
"twikoo-func": "1.7.
|
|
34
|
+
"twikoo-func": "1.7.15",
|
|
35
35
|
"uuid": "^8.3.2"
|
|
36
36
|
}
|
|
37
37
|
}
|