tkserver 1.7.14 → 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.
Files changed (3) hide show
  1. package/index.js +39 -2
  2. package/mongo.js +39 -2
  3. 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.14",
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.14",
34
+ "twikoo-func": "1.7.15",
35
35
  "uuid": "^8.3.2"
36
36
  }
37
37
  }