进程退出插件测试通过

This commit is contained in:
Cheney
2025-02-01 10:19:10 +08:00
parent e099ff08ba
commit 6892d6ed17
7 changed files with 5 additions and 3 deletions
+275
View File
@@ -0,0 +1,275 @@
const config = require("./Config")
const fs = require("fs")
const path = require("path");
function listFakeUKeys(){
let ukeyDir = config.getFakeUKeyDir();
return fs.readdirSync(ukeyDir);
}
function checkFakeUKey(name){
let ukeyDir = config.getFakeUKeyDir();
return fs.existsSync(path.resolve(ukeyDir, name))
}
function checkUKeyPIN(dev, pin) {
let ukeyDir = config.getFakeUKeyDir();
let ppin = fs.readFileSync(path.resolve(ukeyDir, dev, "pin.txt"), "utf-8")
return pin === ppin
}
module.exports = {
// 枚举设备
"01000005" : function () {
let nameList = listFakeUKeys()
return {
"EnumDeviceNameList": nameList.join("|"),
"fakeList" : nameList
}
},
// 打开设备
"01000004" : function (params) {
let ukey = params.devSerial
if ( checkFakeUKey( ukey ) ) {
return {"hdev": ukey}
} else {
throw "找不到设备"
}
},
// PIN 登录
"01000027" : function (params) {
let ukey = params.hdevice
let pin = params.pin
if ( checkUKeyPIN(ukey, pin) ) {
return {"huser":"", "count":0, "rev":0}
} else {
throw "PIN 验证错误"
}
},
// 文件系统初始化
"01000031" : function (params) {
let ukey = params.hdevice
if ( fs.existsSync(path.resolve(config.getFakeUKeyDir(), ukey, "root")) ) {
return {};
}
throw "目录损坏"
},
// 创建目录
"01000032" : function (params) {
let ukey = params.hdevice
let dir = params.dir
// let acc = params.acc
if ( dir.startsWith("\\root\\") ) {
dir = dir.substring(6);
fs.mkdirSync(path.resolve(config.getFakeUKeyDir(), ukey, "root", dir), { recursive: true });
return {}
} else {
throw "目录不合法"
}
},
// 创建文件
"01000034" : function (params) {
let ukey = params.hdevice
let dir = params.dir
let file = params.file
// let size = params.size
// let acc = params.acc
if ( dir.startsWith("\\root\\") ) {
dir = dir.substring(6);
if ( fs.existsSync(path.resolve(config.getFakeUKeyDir(), ukey, "root", dir, file)) ) {
// throw "文件已存在"
return {}
}
// 文件无需创建,直接写入即可。
} else {
throw "目录不合法"
}
},
// 读取文件
"01000035" : function (params) {
let ukey = params.hdevice
let dir = params.dir
let file = params.file
let size = parseInt(params.size, 10)
let offset = parseInt(params.offset, 10)
if ( dir.startsWith("\\root\\") ) {
dir = dir.substring(6);
let f = path.resolve(config.getFakeUKeyDir(), ukey, "root\\", dir, file)
let buffer = fs.readFileSync(f);
return {
data : buffer.slice(offset, offset + size).toString("HEX").toUpperCase()
}
} else {
throw "目录不合法"
}
},
// 写入文件
"01000036" : function (params) {
let ukey = params.hdevice
let dir = params.dir
let file = params.file
// let size = params.size
let offset = parseInt(params.offset, 10)
let input = params.input
if ( dir.startsWith("\\root\\") ) {
dir = dir.substring(6);
let f = path.resolve(config.getFakeUKeyDir(), ukey, "root\\", dir, file)
let buffer = null;
if ( offset === 0 ) {
buffer = Buffer.from(input, 'hex');
} else {
if ( fs.existsSync( f ) ) {
buffer = fs.readFileSync(f);
buffer = buffer.slice(0, offset);
} else {
buffer = Buffer.alloc(offset);
}
buffer = Buffer.concat([buffer, Buffer.from(input, 'hex')])
}
fs.writeFileSync(f, buffer)
return {}
} else {
throw "目录不合法"
}
},
// 删除文件
"01000037" : function (params) {
let ukey = params.hdevice
let dir = params.dir
let file = params.file
if ( ! dir.startsWith("\\root\\") ) {
throw "目录不合法"
}
dir = dir.substring(6);
let f = path.resolve(config.getFakeUKeyDir(), ukey, "root\\", dir, file)
fs.unlinkSync( f )
return {}
},
// 枚举文件夹
"01000038" : function (params) {
let ukey = params.hdevice
let dir = params.dir
if ( ! dir.startsWith("\\root\\") ) {
throw "目录不合法"
}
dir = dir.substring(6);
let f = path.resolve(config.getFakeUKeyDir(), ukey, "root\\", dir)
let list = fs.readdirSync(f)
let files = []
for ( let fname of list ) {
let p = path.resolve(f, fname)
if ( fs.statSync( p ).isFile() ) {
files.push( fname )
}
}
return {
data : files.join("|")
}
},
// 枚举文件
"01000039" : function (params) {
let ukey = params.hdevice
let dir = params.dir
if ( ! dir.startsWith("\\root\\") ) {
throw "目录不合法"
}
dir = dir.substring(6);
let f = path.resolve(config.getFakeUKeyDir(), ukey, "root\\", dir)
let list = fs.readdirSync(f)
let files = []
for ( let fname of list ) {
let p = path.resolve(f, fname)
if ( ! fs.statSync( p ).isFile() ) {
files.push( fname )
}
}
return {
data : files.join("|")
}
},
// 生成密钥对
"01000040" : function (params) {
let ukey = params.hdevice
let alg = params.alg
let keyNum = params.keyNum
let keyLen = params.keyLen
console.log("genKeypair", alg, keyLen)
const sm2 = require('sm-crypto').sm2
let keypair = sm2.generateKeyPairHex()
let ukeyDir = config.getFakeUKeyDir();
fs.writeFileSync(path.resolve(ukeyDir, ukey, keyNum + ".key"), JSON.stringify(keypair, null, 4))
return {}
},
// 导出公钥
"01000043" : function (params) {
let ukey = params.hdevice
let keyNum = params.keyNum
let ukeyDir = config.getFakeUKeyDir();
let keyJson = fs.readFileSync(path.resolve(ukeyDir, ukey, keyNum + ".key"), "UTF-8")
let key = JSON.parse(keyJson)
let pubkey = Buffer.from(key.publicKey, "hex").toString("base64")
return {
keyData : "-----BEGIN ECDSA PUBLIC KEY-----" + pubkey + "-----END ECDSA PUBLIC KEY-----"
}
},
// 签名
"01000046" : function (params) {
let ukey = params.hdevice
let keyNum = params.keyNum
let inData = params.inData
let ukeyDir = config.getFakeUKeyDir();
let keyJson = fs.readFileSync(path.resolve(ukeyDir, ukey, keyNum + ".key"), "UTF-8")
let key = JSON.parse(keyJson)
let sigValueHex = sm2.doSignature(Buffer.from(inData, "base64"), key.privateKey) // 签名
return {
sigData : Buffer.from(sigValueHex, "HEX").toString("base64")
}
}
}
+47
View File
@@ -0,0 +1,47 @@
const http = require('http');
const querystring = require('querystring');
const base = {
hostname: '127.0.0.1',
port: 8090,
path: '/do',
method: 'POST'
};
async function call(form){
const postData = querystring.stringify(form);
const options = Object.assign(base, {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData)
}
})
return new Promise((cbok, cberr)=>{
const req = http.request(options, (res) => {
let data = '';
res.on('error', (e)=>{
cberr(e)
})
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(data);
cbok(data)
});
});
req.write(postData);
req.end();
})
}
export default {
call
}
+1
View File
@@ -0,0 +1 @@
export const version = "0.1"
+100
View File
@@ -0,0 +1,100 @@
const express = require('express');
const bodyParser = require('body-parser');
const ukey = require("./FakeUKey")
const cors = require('cors');
const Proxy = require("./Proxy")
const Config = require("./Config")
const Version = require("./Version")
const app = express();
// const port = 3000;
const port = 18090;
// 使用body-parser中间件来解析urlencoded格式的请求体
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors());
app.all("/", (req, res) => {
res.json({
server : "Fake UKey",
version : Version.version,
"rev": 0
})
})
/**
* 新建 FakeUKey
*/
app.post("/fakeUkey/add", (req, res) => {
Config.newFakeUKey();
res.json({
"rev": 0
})
})
/**
* 删除 FakeUKey
*/
app.post("/fakeUkey/del", (req, res) => {
Config.delFakeUKey(req.body.name);
res.json({
"rev": 0
})
})
app.post('/do', (req, res) => {
// 先尝试代理
let pd = null
try {
pd = Proxy.call(req.body)
}catch (e) {
console.error("proxy error", pd)
}
// 获取请求体中的数据
let requestData = {
"rev": -1
};
let func = ukey[ req.body.order ]
if ( func ){
try {
let ret = func(req.body, pd)
requestData = Object.assign(ret, {
"rev": 0
})
} catch ( e ) {
console.error( e )
requestData.msg = e;
}
}
// 设置响应类型为application/x-json
res.setHeader('Content-Type', 'application/x-json'); // 注意application/x-json不是标准MIME类型,通常使用application/json
// 将请求的数据返回为json格式的响应体
res.json(requestData);
});
(async () => {
// long running process running on a given port(s), e.g. a http-server
// takes a number, number[], string or string[]
// single port
// await killPortProcess(8090);
app.listen(port, "127.0.0.1", () => {
console.log(`Server is running on port ${port}`);
}).on('error', (err) => {
if (err.code === 'ECONNREFUSED') {
console.log('端口监听失败。');
}
});
})();