n20-common-lib 2.9.13 → 2.9.14

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 (130) hide show
  1. package/nstc-g6/components/NstcCharts/NstcCharts.vue +16 -8
  2. package/package.json +8 -5
  3. package/src/assets/css/approve-card.scss +1 -1
  4. package/src/assets/css/date-quarter.scss +8 -0
  5. package/src/assets/css/expandable-pane.scss +7 -0
  6. package/src/assets/css/file-upload-table.scss +2 -3
  7. package/src/assets/css/font-icon.scss +3 -1
  8. package/src/assets/css/message.scss +6 -6
  9. package/src/assets/css/normalize.scss +4 -1
  10. package/src/assets/css/table.scss +16 -11
  11. package/src/assets/iconFont/SIMSUN.ttf +0 -0
  12. package/src/assets/iconFont/font.css +4 -0
  13. package/src/components/AIButton/index.vue +101 -0
  14. package/src/components/AdvancedFilter/formItemRender.vue +7 -4
  15. package/src/components/AdvancedFilter/index.vue +6 -7
  16. package/src/components/Anchor/index.vue +1 -0
  17. package/src/components/ApprovalButtons/index.vue +404 -82
  18. package/src/components/ApprovalButtons/indexApp.vue +1102 -0
  19. package/src/components/ApprovalButtons/selectSpr.vue +128 -0
  20. package/src/components/ApprovalButtons/setCarboncopyProp.vue +1 -1
  21. package/src/components/ApprovalButtons/setRejectToProp.vue +45 -5
  22. package/src/components/ApprovalButtons/showAppOpi.vue +265 -8
  23. package/src/components/ApprovalButtons/showOtherAttrNew.vue +161 -0
  24. package/src/components/ApprovalCard/index.vue +190 -44
  25. package/src/components/ApprovalCard/indexApp.vue +592 -0
  26. package/src/components/ApprovalRecord/approvalImgPro/child.vue +1 -1
  27. package/src/components/ApprovalRecord/approvalImgPro/index.vue +42 -5
  28. package/src/components/ApprovalRecord/index.vue +23 -6
  29. package/src/components/ApprovalRecord/indexApp.vue +79 -0
  30. package/src/components/AttachmentPass/index.vue +286 -0
  31. package/src/components/Button/button-group.vue +3 -1
  32. package/src/components/CascaderArea/index.vue +5 -6
  33. package/src/components/DatePicker/por.vue +31 -1
  34. package/src/components/DateSelect/quarterDatePicker.vue +23 -1
  35. package/src/components/Descriptions/index.vue +7 -3
  36. package/src/components/Dialog/index.vue +4 -0
  37. package/src/components/Diff/index.vue +4 -2
  38. package/src/components/DynamicField/DynamicField.vue +29 -6
  39. package/src/components/DynamicField/DynamicFieldMixin.js +13 -5
  40. package/src/components/DynamicField/DynamicFieldOptions.vue +135 -62
  41. package/src/components/DynamicField/DynamicTable.vue +11 -1
  42. package/src/components/DynamicField/contentPop.vue +110 -0
  43. package/src/components/DynamicField/tableList.vue +5 -1
  44. package/src/components/DynamicField/tableView.vue +143 -0
  45. package/src/components/ECharts/index.vue +15 -9
  46. package/src/components/Expandable/main.vue +17 -2
  47. package/src/components/FileImport/index.vue +4 -5
  48. package/src/components/FileUploadTable/FileUploadTableV3.vue +937 -0
  49. package/src/components/FileUploadTable/aiCheckDialog.vue +139 -0
  50. package/src/components/FileUploadTable/index.vue +251 -33
  51. package/src/components/FileUploadTable/jytg.svg +6 -0
  52. package/src/components/FileUploadTable/wsc.svg +3 -0
  53. package/src/components/FileUploadTable/ysc.svg +3 -0
  54. package/src/components/HandlingAdvice/index.vue +191 -0
  55. package/src/components/InputAccount/index.vue +105 -0
  56. package/src/components/InputNumber/index.vue +16 -4
  57. package/src/components/InputNumber/numberRange.vue +14 -0
  58. package/src/components/InputSearch/index.vue +8 -0
  59. package/src/components/Layout/HeaderWrap/changePwd.vue +50 -23
  60. package/src/components/Layout/HeaderWrap/index.vue +2 -2
  61. package/src/components/Layout/HeaderWrap/indexN.vue +296 -119
  62. package/src/components/Layout/SubContent/index.vue +45 -14
  63. package/src/components/Layout/indexN.vue +26 -5
  64. package/src/components/LoginTemporary/form.vue +126 -34
  65. package/src/components/LoginTemporary/index.vue +14 -3
  66. package/src/components/LoginTemporary/indexN.vue +35 -13
  67. package/src/components/Preview/index.vue +199 -0
  68. package/src/components/SelectDatePickerPro/customDatePicker.vue +7 -0
  69. package/src/components/SelectDatePickerPro/halfYearPicker.vue +165 -0
  70. package/src/components/SelectDatePickerPro/index.vue +44 -4
  71. package/src/components/SelectDatePickerPro/quarterDatePicker.vue +32 -10
  72. package/src/components/SelectTree/index.vue +10 -4
  73. package/src/components/SelectTree/pro.vue +3 -0
  74. package/src/components/ShowColumn/index copy 2.vue +545 -0
  75. package/src/components/ShowColumn/index copy.vue +566 -0
  76. package/src/components/ShowColumn/index.vue +11 -7
  77. package/src/components/Statis/statisItem.vue +8 -7
  78. package/src/components/Table/filters.js +13 -0
  79. package/src/components/Table/index.vue +4 -4
  80. package/src/components/TablePro/filterContent.vue +18 -8
  81. package/src/components/TablePro/index.js +41 -1
  82. package/src/components/TablePro/index.vue +117 -6
  83. package/src/components/TableProOperateColumn/OperateBtns.vue +11 -53
  84. package/src/components/TableProOperateColumn/OperateBtns_copy.vue +141 -0
  85. package/src/components/TableProOperateColumn/childrenOperateBtn.vue +108 -0
  86. package/src/components/TableProOperateColumn/index.vue +3 -6
  87. package/src/components/TableSetSize/index.vue +1 -1
  88. package/src/components/Tree/index.vue +21 -5
  89. package/src/components/Upload/index.vue +25 -10
  90. package/src/components/Upload/uploadMsg.vue +30 -25
  91. package/src/components/operatingStatus/index.vue +3 -4
  92. package/src/directives/VTitle/index.js +15 -5
  93. package/src/directives/watermark/index.js +140 -56
  94. package/src/i18n.json +146 -18
  95. package/src/index.js +31 -3
  96. package/src/plugins/Sign/CaMap.js +47 -8
  97. package/src/plugins/Sign/Itrus/index.js +1 -1
  98. package/src/plugins/Sign/Itrus/sign_3720.js +2 -1
  99. package/src/plugins/Sign/NetSM3/index.js +20 -11
  100. package/src/plugins/Sign/NetV3/index.js +163 -22
  101. package/src/plugins/Sign/SkfSign/index.js +55 -52
  102. package/src/plugins/Sign/bjca/index.js +229 -9
  103. package/src/plugins/Sign/hnca/index.js +5064 -0
  104. package/src/plugins/Sign/index.js +155 -103
  105. package/src/plugins/Sign/kySign/base64.js +160 -0
  106. package/src/plugins/Sign/kySign/hex.js +92 -0
  107. package/src/plugins/Sign/kySign/index.js +186 -0
  108. package/src/plugins/Sign/kySign/skf.js +937 -0
  109. package/src/plugins/Sign/kySign/test.html +463 -0
  110. package/src/plugins/Sign/sdca/index.js +73 -0
  111. package/src/plugins/Sign/sign.js +72 -52
  112. package/src/plugins/Sign/signV3/InfosecNetSignCNGAgent.min.js +1 -0
  113. package/src/plugins/Sign/signV3/sign.js +187 -0
  114. package/src/plugins/Sign/sign_back.js +172 -0
  115. package/src/utils/accountFormat.js +7 -0
  116. package/src/utils/asyncGetRelaNos.js +79 -46
  117. package/src/utils/axios.js +3 -5
  118. package/src/utils/i18n/index.js +1 -1
  119. package/src/utils/importGlobal.js +23 -12
  120. package/style/fonts/SIMSUN.5e0c362c.ttf +0 -0
  121. package/style/index.css +2 -2
  122. package/theme/blue.css +2 -2
  123. package/theme/cctcRed.css +2 -2
  124. package/theme/fonts/SIMSUN.5e0c362c.ttf +0 -0
  125. package/theme/green.css +2 -2
  126. package/theme/lightBlue.css +2 -2
  127. package/theme/orange.css +2 -2
  128. package/theme/purple.css +2 -2
  129. package/theme/red.css +2 -2
  130. package/theme/yellow.css +2 -2
@@ -1,4 +1,4 @@
1
- import { Message } from 'element-ui'
1
+ import { Message, MessageBox } from 'element-ui'
2
2
  import axios from '../../../utils/axios.js'
3
3
  import { IWSAgent } from './InfosecNetSignCNGAgent.min.js'
4
4
  let {
@@ -8,8 +8,18 @@ let {
8
8
  IWSASetAsyncMode, // 设置通讯方式 同步/异步
9
9
  IWSA_rsa_csp_genContainerP10,
10
10
  IWSA_rsa_csp_AdvgenContainerP10,
11
+ IWSA_rsa_csp_importSignX509Cert,
11
12
  IWSA_rsa_csp_AdvImportSignEncCert,
12
- IWSA_rsa_csp_importSignP7Cert
13
+ IWSA_rsa_csp_importSignP7Cert,
14
+ IWSA_sm2_skf_getProviderList,
15
+ IWSA_sm2_skf_genContainerP10,
16
+ IWSA_sm2_skf_importSignX509Cert,
17
+ IWSA_sm2_skf_getApplicationList,
18
+ IWSA_sm2_skf_setDevice,
19
+ IWSA_sm2_skf_getDeviceList,
20
+ IWSA_rsa_csp_getCountOfCert,
21
+ IWSA_rsa_csp_getCertInfo,
22
+ IWSA_rsa_csp_deleteContainer
13
23
  } = new IWSAgent()
14
24
 
15
25
  IWSASetTimeOut(6000)
@@ -47,27 +57,43 @@ function getDnCertBase64(dn, res) {
47
57
  }
48
58
 
49
59
  function getUserCert(uno) {
50
- try {
51
- axios.post(`/bems/prod_1.0/dssc/sign/updateCert_direct/${uno}`).then(({ code, data }) => {
52
- if (code === 200) {
60
+ uno = uno || sessionStorage.getItem('userNo')
61
+ axios.post(`/bems/prod_1.0/dssc/sign/updateCert_direct/${uno}`).then(async ({ code, data }) => {
62
+ if (code === 200) {
63
+ // 非国密
64
+ if (data.alg !== 'SM2') {
53
65
  // 设置提供者 Microsoft Base Cryptographic Provider v1.0
54
66
  IWSA_rsa_csp_setProvider('Microsoft Base Cryptographic Provider v1.0')
55
67
  // 设置同步模式
56
68
  IWSASetAsyncMode(false)
57
- let alg = data.alg === 'RSA_1024' ? '1024' : ata.alg === 'RSA_2048' ? '2048' : '1024'
58
- let dn = getDN()
59
- let sd = data.sd === 'd'
60
-
61
- const res = IWSA_rsa_csp_genContainerP10(alg, data.subjectDN || dn, sd)
69
+ let alg = data.alg === 'RSA_1024' ? '1024' : data.alg === 'RSA_2048' ? '2048' : '1024'
70
+ /**
71
+ * (方法 RSA)生成 P10 包,新容器
72
+ * 参数一:签名密钥或加密密钥标识,”true”/”false”
73
+ * 参数二:密钥长度 512,1024, 2048,4096
74
+ * 参数三:主题 DN,空值 DN 请赋值””空串
75
+ * 参数四:摘要算法 OID,使用默认值请赋值””空串
76
+ * 参数五:公钥算法 OID,,使用默认值请赋值””空串
77
+ * 参数六:签名算法 OID,,使用默认值请赋值””空串
78
+ * 参数七:私钥是否可导出,”true”/”false”
79
+ * 参数八:是否启用增强密钥保护,”true”/”false”
80
+ */
81
+ const res = IWSA_rsa_csp_genContainerP10('true', alg, '', '', '', '', 'false', 'false')
62
82
  if (res[0] === '0') {
63
83
  let dto = {
64
84
  ...data,
65
- publicKey: res[1],
66
- tmpPubKey: res[2] || ''
85
+ publicKey: res[2],
86
+ tmpPubKey: res[1] || ''
67
87
  }
68
88
  axios.post(`/bems/prod_1.0/dssc/sign/getRadsCert`, dto).then(({ code, data }) => {
69
89
  if (code === 200) {
70
- const certData = IWSA_rsa_csp_importSignP7Cert(res[1], data.signCer)
90
+ /**
91
+ * (方法 RSA)导入签名证书 X509
92
+ * 参数一:容器名,支持””:使用产生 P10 时的容器
93
+ * 参数二:X509 证书,Base64 编码
94
+ */
95
+
96
+ const certData = IWSA_rsa_csp_importSignX509Cert(res[1], data.signCer)
71
97
  if (certData[0] === '0') {
72
98
  Message.success('证书导入成功')
73
99
  } else {
@@ -78,11 +104,66 @@ function getUserCert(uno) {
78
104
  } else {
79
105
  Message.error('产生 P10失败,错误码::' + data[0])
80
106
  }
107
+ // 国密
108
+ } else {
109
+ /**
110
+ * (方法 SM2)生成 P10 包,新容器
111
+ * 参数y一:主题 DN,空值 DN 请赋值””空串
112
+ */
113
+ // 设置同步模式
114
+ IWSASetAsyncMode(false)
115
+ const roviderList = IWSA_sm2_skf_getProviderList()
116
+ console.log(roviderList)
117
+ if (roviderList.length === 0) {
118
+ Message.error('请检查ukey是否正常')
119
+ return
120
+ }
121
+ const providerList = IWSA_sm2_skf_getDeviceList(roviderList[0].Provider)
122
+ if (providerList.length === 0) {
123
+ Message.error('未获取到SM2设备')
124
+ return
125
+ }
126
+ const applicationList = IWSA_sm2_skf_getApplicationList(roviderList[0].Provider, providerList[0].Device)
127
+ if (applicationList.length === 0) {
128
+ Message.error('未获取到SM2应用')
129
+ return
130
+ }
131
+ IWSA_sm2_skf_setDevice(roviderList[0].Provider, providerList[0].Device, applicationList[0].Application)
132
+ await MessageBox.prompt('请输入PIN码', '提示', {
133
+ confirmButtonText: '确定',
134
+ cancelButtonText: '取消',
135
+ closeOnClickModal: false,
136
+ inputType: 'password'
137
+ }).then(({ value }) => {
138
+ const res = IWSA_sm2_skf_genContainerP10(value, '', '', 'true')
139
+ if (res[0] === '0') {
140
+ let dto = {
141
+ ...data,
142
+ publicKey: res[2],
143
+ tmpPubKey: res[1] || ''
144
+ }
145
+ axios.post(`/bems/prod_1.0/dssc/sign/getRadsCert`, dto).then(({ code, data }) => {
146
+ if (code === 200) {
147
+ /**
148
+ * (方法 RSA)导入签名证书 X509
149
+ * 参数一:容器名,支持””:使用产生 P10 时的容器
150
+ * 参数二:X509 证书,Base64 编码
151
+ */
152
+ const certData = IWSA_sm2_skf_importSignX509Cert(value, res[1], data.signCer)
153
+ if (certData[0] === '0') {
154
+ Message.success('证书导入成功')
155
+ } else {
156
+ Message.error('导入证书失败,错误码::' + certData[0])
157
+ }
158
+ }
159
+ })
160
+ } else {
161
+ Message.error('产生 P10失败,错误码::' + data[0])
162
+ }
163
+ })
81
164
  }
82
- })
83
- } catch (error) {
84
- console.error(error)
85
- }
165
+ }
166
+ })
86
167
  }
87
168
 
88
169
  /**
@@ -90,17 +171,68 @@ function getUserCert(uno) {
90
171
  * @param {*} cspName
91
172
  * @returns
92
173
  */
93
- export function updateCert(cspName) {
174
+ export function updateCert(cspName, onSuccess, dnInfo) {
175
+ let oldContainer = ''
94
176
  // 设置提供者 'ArgusKey CSP For BEHFC v1.0'
95
177
  IWSA_rsa_csp_setProvider(cspName)
96
178
  // 设置同步模式
97
179
  IWSASetAsyncMode(false)
98
- let dn = getDN()
180
+ let dn = dnInfo || getDN()
99
181
  if (!dn) {
100
- return Message.error('未获取到Dn信息')
182
+ Message.error('未获取到Dn信息')
183
+ return
184
+ }
185
+ //获取当前证书的容器
186
+ IWSA_rsa_csp_getCountOfCert((res) => {
187
+ if (res > 0) {
188
+ for (let i = 0; i < res; i++) {
189
+ //获取证书详情
190
+ IWSA_rsa_csp_getCertInfo(i, (res, Provider, Container, certDN) => {
191
+ if (res == 0 && compareDN(certDN, dn)) {
192
+ oldContainer = Container
193
+ }
194
+ })
195
+ }
196
+ }
197
+ })
198
+ //生成新容器并下载证书
199
+ let res = IWSA_rsa_csp_genContainerP10('true', window.updateCertSize || '1024', dn, '', '', '', 'false', 'false')
200
+ if (res[0] === '0') {
201
+ axios
202
+ .post(`/bems/prod_1.0/dssc/sign/getDnCertBase64`, {
203
+ userDn: dn,
204
+ p10: res[2]
205
+ })
206
+ .then(({ data }) => {
207
+ if (data) {
208
+ let list = JSON.parse(data)
209
+ if (list[0]?.errNum === '0') {
210
+ let code = IWSA_rsa_csp_importSignP7Cert(res[1], list[0]?.cert)
211
+ if (code === '0') {
212
+ //删除旧证书
213
+ if (oldContainer != '') {
214
+ IWSA_rsa_csp_deleteContainer(oldContainer)
215
+ }
216
+ Message.success('证书导入成功')
217
+ if (typeof onSuccess === 'function') {
218
+ onSuccess()
219
+ }
220
+ } else {
221
+ IWSA_rsa_csp_deleteContainer(res[1])
222
+ Message.error('证书导入失败,请联系管理员,错误码为' + code)
223
+ }
224
+ } else {
225
+ IWSA_rsa_csp_deleteContainer(res[1])
226
+ Message.error('证书下载失败,请联系管理员,错误码为' + list[0]?.errNum)
227
+ }
228
+ } else {
229
+ IWSA_rsa_csp_deleteContainer(res[1])
230
+ Message.error('证书下载服务出错,请重试或联系管理员')
231
+ }
232
+ })
233
+ } else {
234
+ Message.error('容器生成失败,请联系管理员,错误码为' + res[0])
101
235
  }
102
- let data = IWSA_rsa_csp_genContainerP10('true', '1024', dn, '', '', '', 'false', 'false')
103
- GetDateNotAfter(data, dn)
104
236
  }
105
237
  function GetDateNotAfter(res, dn) {
106
238
  if (res[0] === '0') {
@@ -116,3 +248,12 @@ function GetDateNotAfter(res, dn) {
116
248
  export function updateCertHG(uno) {
117
249
  getUserCert(uno)
118
250
  }
251
+
252
+ function compareDN(dn1, dn2) {
253
+ let dn1Arr = dn1.split(',').map((c) => c.trim())
254
+ let dn2Arr = dn2.split(',').map((c) => c.trim())
255
+ if (dn1Arr.every((dnAttr) => dn2Arr.includes(dnAttr))) {
256
+ return true
257
+ }
258
+ return false
259
+ }
@@ -29,7 +29,7 @@ function getDN() {
29
29
 
30
30
  /* 检测本地签名端口是否可用 */
31
31
  export function availableSign(fn, url) {
32
- available = IWSAGetAvailable()
32
+ let available = IWSAGetAvailable()
33
33
  if (available) {
34
34
  fn && fn(available)
35
35
  } else {
@@ -41,7 +41,7 @@ export function availableSign(fn, url) {
41
41
  }
42
42
 
43
43
  function checkAvailable(fn, url, count) {
44
- available = IWSAGetAvailable()
44
+ let available = IWSAGetAvailable()
45
45
  let name = window.NetSignDownloadName || 'NetSignCNG签名助手'
46
46
  if (available) {
47
47
  fn && fn(available)
@@ -84,53 +84,44 @@ function verifyDn(dnList, dn) {
84
84
  }
85
85
 
86
86
  // 签名
87
- export async function getSign(plain, dn) {
88
- if (dn === undefined) {
89
- dn = getDN()
90
- }
87
+ export async function getSign(plain, dn = getDN()) {
88
+ // 验证DN参数
91
89
  if (!dn) {
92
90
  Message.error('签名参数DN错误!')
93
91
  return false
94
92
  }
95
93
 
96
- let plainText = ''
97
- if (typeof plain === 'object') {
98
- plainText = JSON.stringify(plain)
99
- } else {
100
- plainText = plain
101
- }
94
+ // 处理签名文本
95
+ const plainText = typeof plain === 'object' ? JSON.stringify(plain) : plain
96
+
97
+ // 获取并验证证书信息
102
98
  const checkRes = await getCertInfo(dn)
103
99
 
104
- if (checkRes === -1 || ['dnListEmpty', 'dnIsEmpty', 'Empty'].includes(checkRes)) {
105
- switch (checkRes) {
106
- case 'dnListEmpty':
107
- Message.warning('没有匹配到证书!')
108
- break
109
- case 'dnIsEmpty':
110
- Message.warning('DN参数为空!')
111
- break
112
- case 'Empty':
113
- Message.warning('当前Ukey不匹配!')
114
- break
115
- default:
116
- Message.warning('没有匹配到证书!')
117
- }
100
+ // 证书验证错误处理
101
+ const errorMessages = {
102
+ dnListEmpty: '没有匹配到证书!',
103
+ dnIsEmpty: 'DN参数为空!',
104
+ Empty: '当前Ukey不匹配!'
105
+ }
106
+
107
+ if (checkRes === -1 || Object.keys(errorMessages).includes(checkRes)) {
108
+ Message.warning(errorMessages[checkRes] || '没有匹配到证书!')
118
109
  return ''
119
110
  }
120
- let answer
121
- await MessageBox.prompt('请输入PIN码', '提示', {
122
- confirmButtonText: '确定',
123
- cancelButtonText: '取消',
124
- closeOnClickModal: false,
125
- inputType: 'password'
126
- }).then(({ value }) => {
127
- return performSign(plainText, value).then((signedData) => {
128
- answer = signedData
111
+
112
+ // 获取PIN码并执行签名
113
+ try {
114
+ const { value: pin } = await MessageBox.prompt('请输入PIN码', '提示', {
115
+ confirmButtonText: '确定',
116
+ cancelButtonText: '取消',
117
+ closeOnClickModal: false,
118
+ inputType: 'password'
129
119
  })
130
- })
131
- // 签名
132
120
 
133
- return answer
121
+ return await performSign(plainText, pin)
122
+ } catch (error) {
123
+ return Promise.reject(error)
124
+ }
134
125
  }
135
126
 
136
127
  /**
@@ -140,19 +131,28 @@ export async function getSign(plain, dn) {
140
131
  */
141
132
  export async function getCertInfo(dn) {
142
133
  return new Promise((resolve, reject) => {
134
+ let arg
135
+ if (
136
+ navigator.platform.toLowerCase().includes('linux') ||
137
+ navigator.userAgent.toLowerCase().includes('linux') ||
138
+ // 检查是否为银河麒麟特有的环境变量或特征
139
+ typeof window.KylinOS !== 'undefined' ||
140
+ document.documentElement.dataset.osType === 'kylin'
141
+ ) {
142
+ arg = window.VUE_APP_NetSign_ARG_Linux
143
+ } else {
144
+ arg = process.env.VUE_APP_NetSign_ARG || window.VUE_APP_NetSign_ARG || 'WTSKFInterface.dll'
145
+ }
143
146
  // 获取证书列表
144
- IWSASkfGetCertList(
145
- process.env.VUE_APP_NetSign_ARG || window.VUE_APP_NetSign_ARG || 'WTSKFInterface.dll',
146
- (CertListData, errorCode) => {
147
- if (errorCode) {
148
- Message.error(codeDate[errorCode])
149
- reject()
150
- } else {
151
- const checkRes = verifyDn(CertListData, dn)
152
- resolve(checkRes)
153
- }
147
+ IWSASkfGetCertList(arg, (CertListData, errorCode) => {
148
+ if (errorCode) {
149
+ Message.error(codeDate[errorCode])
150
+ reject()
151
+ } else {
152
+ const checkRes = verifyDn(CertListData, dn)
153
+ resolve(checkRes)
154
154
  }
155
- )
155
+ })
156
156
  })
157
157
  }
158
158
 
@@ -164,15 +164,18 @@ export async function getCertInfo(dn) {
164
164
  */
165
165
  async function performSign(plainText, value) {
166
166
  return new Promise((resolve, reject) => {
167
- IWSASkfSignData(plainText, 0, value, 'SM3', (errorCode, signedData) => {
167
+ let code = 'SM3'
168
+ // 有色信创国产系统 需要传入SHA1
169
+ if (window.VUE_APP_NetSign_ARG === '/opt/apps/cn.win-trust.usertool/files/bin/libSKFInterface.so') {
170
+ code = 'SHA1'
171
+ }
172
+ IWSASkfSignData(plainText, 0, value, code, (errorCode, signedData) => {
168
173
  if (errorCode === 0 || errorCode === '0') {
169
174
  resolve(signedData)
170
175
  } else {
171
176
  Message.error(codeDate[errorCode])
172
177
  reject()
173
178
  }
174
- }).catch(() => {
175
- resolve()
176
179
  })
177
180
  })
178
181
  }
@@ -11,7 +11,8 @@ function getDN() {
11
11
  }
12
12
 
13
13
  /* 给对象或字符串签名 */
14
- export async function getSign(plain, dn) {
14
+ export async function getSign(plain, dn, word) {
15
+ console.log('getSign', plain, dn, word)
15
16
  let errMsg
16
17
  let plainText
17
18
  await new Promise((resolve, reject) => {
@@ -87,10 +88,10 @@ export async function getSign(plain, dn) {
87
88
  await new Promise((resolve, reject) => {
88
89
  for (let i = 0; i < r_retVal.length; i++) {
89
90
  const val = r_retVal[i].retVal
90
- window.SOF_GetCertInfoByOid(
91
- val,
92
- process.env.VUE_APP_NetSign_ARG || window.VUE_APP_NetSign_ARG || '1.2.156.112562.2.1.1.23',
93
- (s) => {
91
+
92
+ if (window.VUE_APP_NetSign_TYPE === 'DN') {
93
+ //新版本,比较DN
94
+ window.SOF_GetCertInfo(val, 33, (s) => {
94
95
  if (s.retVal) {
95
96
  s_retVal.push({ certId: r_retVal[i].certId, retVal: s.retVal })
96
97
  resolve()
@@ -99,16 +100,83 @@ export async function getSign(plain, dn) {
99
100
  Message.error(errMsg)
100
101
  reject(errMsg)
101
102
  }
102
- }
103
- )
103
+ })
104
+ } else {
105
+ //原始版本,比较SN
106
+ window.SOF_GetCertInfoByOid(
107
+ val,
108
+ process.env.VUE_APP_NetSign_ARG || window.VUE_APP_NetSign_ARG || '1.2.156.112562.2.1.1.23',
109
+ (s) => {
110
+ if (s.retVal) {
111
+ s_retVal.push({ certId: r_retVal[i].certId, retVal: s.retVal })
112
+ resolve()
113
+ } else {
114
+ errMsg = '证书信息获取失败!'
115
+ Message.error(errMsg)
116
+ reject(errMsg)
117
+ }
118
+ }
119
+ )
120
+ }
104
121
  }
105
122
  })
106
123
 
124
+ /**
125
+ * 从Dn中获取CN
126
+ * @param {string} dn 要解析的Dn
127
+ * @returns {string} 解析后的CN
128
+ */
129
+ function parseCA(dn) {
130
+ const mark = /^CN=/
131
+ let CN = dn.split(',').find((b) => mark.test(b))
132
+ return CN ? CN.replace(mark, '') : ''
133
+ }
134
+
135
+ function compareDN(dn1, dn2) {
136
+ if (dn1 === dn2) {
137
+ return true
138
+ }
139
+ const pdn1 = parseCA(dn1)
140
+ const pdn2 = parseCA(dn2)
141
+ if (!pdn1 || !pdn2) {
142
+ return false
143
+ }
144
+ if (pdn1 === pdn2) {
145
+ return true
146
+ }
147
+ return false
148
+ }
149
+
107
150
  /**
108
151
  * 签名
109
152
  */
110
153
  let v_retVal, cert
111
- let val = s_retVal.filter((v) => v.retVal === dn)
154
+ let val = s_retVal.filter((v) => compareDN(v.retVal, dn))
155
+ await new Promise((resolve, reject) => {
156
+ // 如果未传入pin码 则不校验直接调取验签接口 通过原生pin输入框校验
157
+ if (!word) {
158
+ resolve()
159
+ } else {
160
+ // 校验证书是否被锁
161
+ window.SOF_GetPinRetryCount(val[0].certId, (v) => {
162
+ if (v && v.retVal > 0) {
163
+ window.SOF_Login(val[0].certId, word, (v) => {
164
+ if (v && v.retVal === true) {
165
+ resolve()
166
+ } else {
167
+ errMsg = 'pin码错误!'
168
+ window.alert(errMsg)
169
+ reject(errMsg)
170
+ }
171
+ })
172
+ } else {
173
+ errMsg = '证书口令已被锁死,必须解锁后才能使用!'
174
+ window.alert(errMsg)
175
+ reject(errMsg)
176
+ }
177
+ })
178
+ }
179
+ })
112
180
  if (val.length > 0) {
113
181
  cert = r_retVal.filter((s) => s.certId === val[0].certId)
114
182
  await new Promise((resolve, reject) => {
@@ -118,7 +186,7 @@ export async function getSign(plain, dn) {
118
186
  resolve()
119
187
  } else {
120
188
  errMsg = '签名失败!'
121
- Message.error(errMsg)
189
+ window.alert(errMsg)
122
190
  reject(errMsg)
123
191
  }
124
192
  })
@@ -126,6 +194,158 @@ export async function getSign(plain, dn) {
126
194
  return Promise.resolve(v_retVal + '@@@' + cert[0].retVal)
127
195
  } else {
128
196
  errMsg = '参数dn信息不匹配!'
197
+ window.alert(errMsg)
198
+ return Promise.reject(errMsg)
199
+ }
200
+ }
201
+
202
+ export async function getCert(dn) {
203
+ console.log(dn)
204
+ debugger
205
+ let errMsg
206
+ await new Promise((resolve, reject) => {
207
+ window._bjca_init_(
208
+ () => resolve(),
209
+ () => {
210
+ errMsg = '没有检测到签名驱动!'
211
+ Message.error(errMsg)
212
+ reject(errMsg)
213
+ }
214
+ )
215
+ })
216
+
217
+ if (dn === undefined) {
218
+ dn = getDN()
219
+ }
220
+ if (!dn) {
221
+ errMsg = '签名参数DN错误!'
222
+ Message.error(errMsg)
223
+ return Promise.reject(errMsg)
224
+ }
225
+
226
+ /**
227
+ * 获取证书列表
228
+ */
229
+ let CertIdList = []
230
+ await new Promise((resolve, reject) => {
231
+ window.SOF_GetUserList((l) => {
232
+ if (l.retVal) {
233
+ CertIdList = l.retVal
234
+ .replace(/&&&$/, '')
235
+ .split('&&&')
236
+ .map((s) => s.split('||')[1])
237
+ resolve()
238
+ } else {
239
+ Message.error('证书获取失败')
240
+ resolve()
241
+ }
242
+ })
243
+ })
244
+
245
+ /**
246
+ * 获取证书
247
+ */
248
+
249
+ let r_retVal = []
250
+ await new Promise((resolve, reject) => {
251
+ for (let i = 0; i < CertIdList.length; i++) {
252
+ const item = CertIdList[i]
253
+ window.SOF_ExportUserCert(item, (r) => {
254
+ if (r.retVal) {
255
+ r_retVal.push({ certId: CertIdList[i], retVal: r.retVal })
256
+ resolve()
257
+ } else {
258
+ errMsg = '证书获取失败!'
259
+ Message.error(errMsg)
260
+ reject(errMsg)
261
+ }
262
+ })
263
+ }
264
+ })
265
+
266
+ /**
267
+ * 根据OID获取证书信息
268
+ */
269
+ let s_retVal = []
270
+ await new Promise((resolve, reject) => {
271
+ for (let i = 0; i < r_retVal.length; i++) {
272
+ const val = r_retVal[i].retVal
273
+
274
+ if (window.VUE_APP_NetSign_TYPE === 'DN') {
275
+ //新版本,比较DN
276
+ window.SOF_GetCertInfo(val, 33, (s) => {
277
+ if (s.retVal) {
278
+ s_retVal.push({ certId: r_retVal[i].certId, retVal: s.retVal })
279
+ resolve()
280
+ } else {
281
+ errMsg = '证书信息获取失败!'
282
+ Message.error(errMsg)
283
+ reject(errMsg)
284
+ }
285
+ })
286
+ } else {
287
+ //原始版本,比较SN
288
+ window.SOF_GetCertInfoByOid(
289
+ val,
290
+ process.env.VUE_APP_NetSign_ARG || window.VUE_APP_NetSign_ARG || '1.2.156.112562.2.1.1.23',
291
+ (s) => {
292
+ if (s.retVal) {
293
+ s_retVal.push({ certId: r_retVal[i].certId, retVal: s.retVal })
294
+ resolve()
295
+ } else {
296
+ errMsg = '证书信息获取失败!'
297
+ Message.error(errMsg)
298
+ reject(errMsg)
299
+ }
300
+ }
301
+ )
302
+ }
303
+ }
304
+ })
305
+
306
+ /**
307
+ * 从Dn中获取CN
308
+ * @param {string} dn 要解析的Dn
309
+ * @returns {string} 解析后的CN
310
+ */
311
+ function parseCA(dn) {
312
+ const mark = /^CN=/
313
+ let CN = dn.split(',').find((b) => mark.test(b))
314
+ return CN ? CN.replace(mark, '') : ''
315
+ }
316
+
317
+ function compareDN(dn1, dn2) {
318
+ if (dn1 === dn2) {
319
+ return true
320
+ }
321
+ const pdn1 = parseCA(dn1)
322
+ const pdn2 = parseCA(dn2)
323
+
324
+ if (!pdn1 || !pdn2) {
325
+ return false
326
+ }
327
+ if (pdn1 === pdn2) {
328
+ return true
329
+ }
330
+
331
+ return false
332
+ }
333
+
334
+ /**
335
+ * 签名
336
+ */
337
+ let cert
338
+
339
+ let val = s_retVal.filter((v) => compareDN(v.retVal, dn))
340
+ if (val.length > 0) {
341
+ cert = r_retVal.filter((s) => s.certId === val[0].certId)
342
+ return
343
+ } else {
344
+ if (s_retVal[0] && s_retVal[0].retVal && dn) {
345
+ errMsg = `用户CN值为:CN=${parseCA(dn)},数字证书CN值为:CN=${parseCA(s_retVal[0].retVal)}.不匹配`
346
+ } else {
347
+ errMsg = '参数dn信息不匹配!'
348
+ }
129
349
  Message.error(errMsg)
130
350
  return Promise.reject(errMsg)
131
351
  }