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.
- package/nstc-g6/components/NstcCharts/NstcCharts.vue +16 -8
- package/package.json +8 -5
- package/src/assets/css/approve-card.scss +1 -1
- package/src/assets/css/date-quarter.scss +8 -0
- package/src/assets/css/expandable-pane.scss +7 -0
- package/src/assets/css/file-upload-table.scss +2 -3
- package/src/assets/css/font-icon.scss +3 -1
- package/src/assets/css/message.scss +6 -6
- package/src/assets/css/normalize.scss +4 -1
- package/src/assets/css/table.scss +16 -11
- package/src/assets/iconFont/SIMSUN.ttf +0 -0
- package/src/assets/iconFont/font.css +4 -0
- package/src/components/AIButton/index.vue +101 -0
- package/src/components/AdvancedFilter/formItemRender.vue +7 -4
- package/src/components/AdvancedFilter/index.vue +6 -7
- package/src/components/Anchor/index.vue +1 -0
- package/src/components/ApprovalButtons/index.vue +404 -82
- package/src/components/ApprovalButtons/indexApp.vue +1102 -0
- package/src/components/ApprovalButtons/selectSpr.vue +128 -0
- package/src/components/ApprovalButtons/setCarboncopyProp.vue +1 -1
- package/src/components/ApprovalButtons/setRejectToProp.vue +45 -5
- package/src/components/ApprovalButtons/showAppOpi.vue +265 -8
- package/src/components/ApprovalButtons/showOtherAttrNew.vue +161 -0
- package/src/components/ApprovalCard/index.vue +190 -44
- package/src/components/ApprovalCard/indexApp.vue +592 -0
- package/src/components/ApprovalRecord/approvalImgPro/child.vue +1 -1
- package/src/components/ApprovalRecord/approvalImgPro/index.vue +42 -5
- package/src/components/ApprovalRecord/index.vue +23 -6
- package/src/components/ApprovalRecord/indexApp.vue +79 -0
- package/src/components/AttachmentPass/index.vue +286 -0
- package/src/components/Button/button-group.vue +3 -1
- package/src/components/CascaderArea/index.vue +5 -6
- package/src/components/DatePicker/por.vue +31 -1
- package/src/components/DateSelect/quarterDatePicker.vue +23 -1
- package/src/components/Descriptions/index.vue +7 -3
- package/src/components/Dialog/index.vue +4 -0
- package/src/components/Diff/index.vue +4 -2
- package/src/components/DynamicField/DynamicField.vue +29 -6
- package/src/components/DynamicField/DynamicFieldMixin.js +13 -5
- package/src/components/DynamicField/DynamicFieldOptions.vue +135 -62
- package/src/components/DynamicField/DynamicTable.vue +11 -1
- package/src/components/DynamicField/contentPop.vue +110 -0
- package/src/components/DynamicField/tableList.vue +5 -1
- package/src/components/DynamicField/tableView.vue +143 -0
- package/src/components/ECharts/index.vue +15 -9
- package/src/components/Expandable/main.vue +17 -2
- package/src/components/FileImport/index.vue +4 -5
- package/src/components/FileUploadTable/FileUploadTableV3.vue +937 -0
- package/src/components/FileUploadTable/aiCheckDialog.vue +139 -0
- package/src/components/FileUploadTable/index.vue +251 -33
- package/src/components/FileUploadTable/jytg.svg +6 -0
- package/src/components/FileUploadTable/wsc.svg +3 -0
- package/src/components/FileUploadTable/ysc.svg +3 -0
- package/src/components/HandlingAdvice/index.vue +191 -0
- package/src/components/InputAccount/index.vue +105 -0
- package/src/components/InputNumber/index.vue +16 -4
- package/src/components/InputNumber/numberRange.vue +14 -0
- package/src/components/InputSearch/index.vue +8 -0
- package/src/components/Layout/HeaderWrap/changePwd.vue +50 -23
- package/src/components/Layout/HeaderWrap/index.vue +2 -2
- package/src/components/Layout/HeaderWrap/indexN.vue +296 -119
- package/src/components/Layout/SubContent/index.vue +45 -14
- package/src/components/Layout/indexN.vue +26 -5
- package/src/components/LoginTemporary/form.vue +126 -34
- package/src/components/LoginTemporary/index.vue +14 -3
- package/src/components/LoginTemporary/indexN.vue +35 -13
- package/src/components/Preview/index.vue +199 -0
- package/src/components/SelectDatePickerPro/customDatePicker.vue +7 -0
- package/src/components/SelectDatePickerPro/halfYearPicker.vue +165 -0
- package/src/components/SelectDatePickerPro/index.vue +44 -4
- package/src/components/SelectDatePickerPro/quarterDatePicker.vue +32 -10
- package/src/components/SelectTree/index.vue +10 -4
- package/src/components/SelectTree/pro.vue +3 -0
- package/src/components/ShowColumn/index copy 2.vue +545 -0
- package/src/components/ShowColumn/index copy.vue +566 -0
- package/src/components/ShowColumn/index.vue +11 -7
- package/src/components/Statis/statisItem.vue +8 -7
- package/src/components/Table/filters.js +13 -0
- package/src/components/Table/index.vue +4 -4
- package/src/components/TablePro/filterContent.vue +18 -8
- package/src/components/TablePro/index.js +41 -1
- package/src/components/TablePro/index.vue +117 -6
- package/src/components/TableProOperateColumn/OperateBtns.vue +11 -53
- package/src/components/TableProOperateColumn/OperateBtns_copy.vue +141 -0
- package/src/components/TableProOperateColumn/childrenOperateBtn.vue +108 -0
- package/src/components/TableProOperateColumn/index.vue +3 -6
- package/src/components/TableSetSize/index.vue +1 -1
- package/src/components/Tree/index.vue +21 -5
- package/src/components/Upload/index.vue +25 -10
- package/src/components/Upload/uploadMsg.vue +30 -25
- package/src/components/operatingStatus/index.vue +3 -4
- package/src/directives/VTitle/index.js +15 -5
- package/src/directives/watermark/index.js +140 -56
- package/src/i18n.json +146 -18
- package/src/index.js +31 -3
- package/src/plugins/Sign/CaMap.js +47 -8
- package/src/plugins/Sign/Itrus/index.js +1 -1
- package/src/plugins/Sign/Itrus/sign_3720.js +2 -1
- package/src/plugins/Sign/NetSM3/index.js +20 -11
- package/src/plugins/Sign/NetV3/index.js +163 -22
- package/src/plugins/Sign/SkfSign/index.js +55 -52
- package/src/plugins/Sign/bjca/index.js +229 -9
- package/src/plugins/Sign/hnca/index.js +5064 -0
- package/src/plugins/Sign/index.js +155 -103
- package/src/plugins/Sign/kySign/base64.js +160 -0
- package/src/plugins/Sign/kySign/hex.js +92 -0
- package/src/plugins/Sign/kySign/index.js +186 -0
- package/src/plugins/Sign/kySign/skf.js +937 -0
- package/src/plugins/Sign/kySign/test.html +463 -0
- package/src/plugins/Sign/sdca/index.js +73 -0
- package/src/plugins/Sign/sign.js +72 -52
- package/src/plugins/Sign/signV3/InfosecNetSignCNGAgent.min.js +1 -0
- package/src/plugins/Sign/signV3/sign.js +187 -0
- package/src/plugins/Sign/sign_back.js +172 -0
- package/src/utils/accountFormat.js +7 -0
- package/src/utils/asyncGetRelaNos.js +79 -46
- package/src/utils/axios.js +3 -5
- package/src/utils/i18n/index.js +1 -1
- package/src/utils/importGlobal.js +23 -12
- package/style/fonts/SIMSUN.5e0c362c.ttf +0 -0
- package/style/index.css +2 -2
- package/theme/blue.css +2 -2
- package/theme/cctcRed.css +2 -2
- package/theme/fonts/SIMSUN.5e0c362c.ttf +0 -0
- package/theme/green.css +2 -2
- package/theme/lightBlue.css +2 -2
- package/theme/orange.css +2 -2
- package/theme/purple.css +2 -2
- package/theme/red.css +2 -2
- 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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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' :
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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[
|
|
66
|
-
tmpPubKey: res[
|
|
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
|
-
|
|
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
|
-
}
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
|
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
|
-
|
|
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
|
}
|