Compare commits
3
Commits
d5cb96d713
...
ec5fcf1ee7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec5fcf1ee7 | ||
|
|
127f58bd36 | ||
|
|
08e7820f37 |
No files matched your search
+6
-4
@@ -11,10 +11,12 @@
|
|||||||
<script type="module" src="/src/main.js"></script>
|
<script type="module" src="/src/main.js"></script>
|
||||||
<style>
|
<style>
|
||||||
html,body,#app{
|
html,body,#app{
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
display: flex;
|
width:100%;
|
||||||
|
max-width: 100%;
|
||||||
|
display: flex;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"PORT":17057
|
||||||
|
}
|
||||||
Generated
+106
-17
@@ -9,21 +9,26 @@
|
|||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"aes-js": "^3.1.2",
|
"aes-js": "^3.1.2",
|
||||||
"better-sqlite3": "^8.7.0",
|
"crypto-js": "^4.2.0",
|
||||||
"cors": "^2.8.5",
|
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
"file-saver": "^2.0.5",
|
"file-saver": "^2.0.5",
|
||||||
"js-base64": "^3.7.6",
|
"js-base64": "^3.7.6",
|
||||||
"pinia": "^2.1.7",
|
"pinia": "^2.1.7",
|
||||||
"sm-crypto": "^0.3.13",
|
"sm-crypto": "^0.3.13",
|
||||||
|
"uuid": "^9.0.1",
|
||||||
"vicons": "^0.0.1",
|
"vicons": "^0.0.1",
|
||||||
"vue": "^3.4.15",
|
"vue": "^3.4.15",
|
||||||
"vue-clipboard3": "^2.0.0",
|
"vue-clipboard3": "^2.0.0",
|
||||||
"vue-router": "^4.2.5"
|
"vue-router": "^4.2.5",
|
||||||
|
"websocket-heartbeat-js": "^1.1.3",
|
||||||
|
"ws": "^8.16.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@vicons/ionicons5": "^0.12.0",
|
||||||
"@vitejs/plugin-vue": "^5.0.3",
|
"@vitejs/plugin-vue": "^5.0.3",
|
||||||
|
"better-sqlite3": "^8.7.0",
|
||||||
"concurrently": "^8.2.2",
|
"concurrently": "^8.2.2",
|
||||||
|
"cors": "^2.8.5",
|
||||||
"naive-ui": "^2.37.3",
|
"naive-ui": "^2.37.3",
|
||||||
"vfonts": "^0.0.3",
|
"vfonts": "^0.0.3",
|
||||||
"vite": "^5.0.11"
|
"vite": "^5.0.11"
|
||||||
@@ -651,6 +656,12 @@
|
|||||||
"@types/lodash": "*"
|
"@types/lodash": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@vicons/ionicons5": {
|
||||||
|
"version": "0.12.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@vicons/ionicons5/-/ionicons5-0.12.0.tgz",
|
||||||
|
"integrity": "sha512-Iy1EUVRpX0WWxeu1VIReR1zsZLMc4fqpt223czR+Rpnrwu7pt46nbnC2ycO7ItI/uqDLJxnbcMC7FujKs9IfFA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"node_modules/@vitejs/plugin-vue": {
|
"node_modules/@vitejs/plugin-vue": {
|
||||||
"version": "5.0.3",
|
"version": "5.0.3",
|
||||||
"resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.0.3.tgz",
|
"resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.0.3.tgz",
|
||||||
@@ -811,12 +822,14 @@
|
|||||||
"node_modules/base64-js": {
|
"node_modules/base64-js": {
|
||||||
"version": "1.5.1",
|
"version": "1.5.1",
|
||||||
"resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
|
"resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
|
||||||
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
|
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/better-sqlite3": {
|
"node_modules/better-sqlite3": {
|
||||||
"version": "8.7.0",
|
"version": "8.7.0",
|
||||||
"resolved": "https://registry.npmmirror.com/better-sqlite3/-/better-sqlite3-8.7.0.tgz",
|
"resolved": "https://registry.npmmirror.com/better-sqlite3/-/better-sqlite3-8.7.0.tgz",
|
||||||
"integrity": "sha512-99jZU4le+f3G6aIl6PmmV0cxUIWqKieHxsiF7G34CVFiE+/UabpYqkU0NJIkY/96mQKikHeBjtR27vFfs5JpEw==",
|
"integrity": "sha512-99jZU4le+f3G6aIl6PmmV0cxUIWqKieHxsiF7G34CVFiE+/UabpYqkU0NJIkY/96mQKikHeBjtR27vFfs5JpEw==",
|
||||||
|
"dev": true,
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bindings": "^1.5.0",
|
"bindings": "^1.5.0",
|
||||||
@@ -827,6 +840,7 @@
|
|||||||
"version": "1.5.0",
|
"version": "1.5.0",
|
||||||
"resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz",
|
"resolved": "https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz",
|
||||||
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
|
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"file-uri-to-path": "1.0.0"
|
"file-uri-to-path": "1.0.0"
|
||||||
}
|
}
|
||||||
@@ -835,6 +849,7 @@
|
|||||||
"version": "4.1.0",
|
"version": "4.1.0",
|
||||||
"resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz",
|
"resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz",
|
||||||
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
|
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"buffer": "^5.5.0",
|
"buffer": "^5.5.0",
|
||||||
"inherits": "^2.0.4",
|
"inherits": "^2.0.4",
|
||||||
@@ -868,6 +883,7 @@
|
|||||||
"version": "5.7.1",
|
"version": "5.7.1",
|
||||||
"resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz",
|
"resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz",
|
||||||
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
|
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"base64-js": "^1.3.1",
|
"base64-js": "^1.3.1",
|
||||||
"ieee754": "^1.1.13"
|
"ieee754": "^1.1.13"
|
||||||
@@ -923,7 +939,8 @@
|
|||||||
"node_modules/chownr": {
|
"node_modules/chownr": {
|
||||||
"version": "1.1.4",
|
"version": "1.1.4",
|
||||||
"resolved": "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz",
|
"resolved": "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz",
|
||||||
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
|
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/clipboard": {
|
"node_modules/clipboard": {
|
||||||
"version": "2.0.11",
|
"version": "2.0.11",
|
||||||
@@ -1027,6 +1044,7 @@
|
|||||||
"version": "2.8.5",
|
"version": "2.8.5",
|
||||||
"resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz",
|
"resolved": "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz",
|
||||||
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
|
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"object-assign": "^4",
|
"object-assign": "^4",
|
||||||
"vary": "^1"
|
"vary": "^1"
|
||||||
@@ -1035,6 +1053,11 @@
|
|||||||
"node": ">= 0.10"
|
"node": ">= 0.10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/crypto-js": {
|
||||||
|
"version": "4.2.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
|
||||||
|
"integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
|
||||||
|
},
|
||||||
"node_modules/css-render": {
|
"node_modules/css-render": {
|
||||||
"version": "0.15.12",
|
"version": "0.15.12",
|
||||||
"resolved": "https://registry.npmmirror.com/css-render/-/css-render-0.15.12.tgz",
|
"resolved": "https://registry.npmmirror.com/css-render/-/css-render-0.15.12.tgz",
|
||||||
@@ -1089,6 +1112,7 @@
|
|||||||
"version": "6.0.0",
|
"version": "6.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz",
|
||||||
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
|
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"mimic-response": "^3.1.0"
|
"mimic-response": "^3.1.0"
|
||||||
},
|
},
|
||||||
@@ -1100,6 +1124,7 @@
|
|||||||
"version": "0.6.0",
|
"version": "0.6.0",
|
||||||
"resolved": "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz",
|
"resolved": "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz",
|
||||||
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
|
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
|
||||||
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=4.0.0"
|
"node": ">=4.0.0"
|
||||||
}
|
}
|
||||||
@@ -1144,6 +1169,7 @@
|
|||||||
"version": "2.0.2",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.2.tgz",
|
"resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.2.tgz",
|
||||||
"integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
|
"integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
|
||||||
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
@@ -1171,6 +1197,7 @@
|
|||||||
"version": "1.4.4",
|
"version": "1.4.4",
|
||||||
"resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
|
"resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
|
||||||
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
|
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"once": "^1.4.0"
|
"once": "^1.4.0"
|
||||||
}
|
}
|
||||||
@@ -1266,6 +1293,7 @@
|
|||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"resolved": "https://registry.npmmirror.com/expand-template/-/expand-template-2.0.3.tgz",
|
"resolved": "https://registry.npmmirror.com/expand-template/-/expand-template-2.0.3.tgz",
|
||||||
"integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
|
"integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
|
||||||
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
}
|
}
|
||||||
@@ -1319,7 +1347,8 @@
|
|||||||
"node_modules/file-uri-to-path": {
|
"node_modules/file-uri-to-path": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
|
||||||
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
|
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/finalhandler": {
|
"node_modules/finalhandler": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
@@ -1357,7 +1386,8 @@
|
|||||||
"node_modules/fs-constants": {
|
"node_modules/fs-constants": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz",
|
||||||
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
|
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/fsevents": {
|
"node_modules/fsevents": {
|
||||||
"version": "2.3.3",
|
"version": "2.3.3",
|
||||||
@@ -1405,7 +1435,8 @@
|
|||||||
"node_modules/github-from-package": {
|
"node_modules/github-from-package": {
|
||||||
"version": "0.0.0",
|
"version": "0.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/github-from-package/-/github-from-package-0.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/github-from-package/-/github-from-package-0.0.0.tgz",
|
||||||
"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="
|
"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/good-listener": {
|
"node_modules/good-listener": {
|
||||||
"version": "1.2.2",
|
"version": "1.2.2",
|
||||||
@@ -1505,7 +1536,8 @@
|
|||||||
"node_modules/ieee754": {
|
"node_modules/ieee754": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
|
"resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
|
||||||
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
|
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/inherits": {
|
"node_modules/inherits": {
|
||||||
"version": "2.0.4",
|
"version": "2.0.4",
|
||||||
@@ -1515,7 +1547,8 @@
|
|||||||
"node_modules/ini": {
|
"node_modules/ini": {
|
||||||
"version": "1.3.8",
|
"version": "1.3.8",
|
||||||
"resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz",
|
"resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz",
|
||||||
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
|
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/ipaddr.js": {
|
"node_modules/ipaddr.js": {
|
||||||
"version": "1.9.1",
|
"version": "1.9.1",
|
||||||
@@ -1560,6 +1593,7 @@
|
|||||||
"version": "6.0.0",
|
"version": "6.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz",
|
||||||
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
|
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"yallist": "^4.0.0"
|
"yallist": "^4.0.0"
|
||||||
},
|
},
|
||||||
@@ -1633,6 +1667,7 @@
|
|||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz",
|
"resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz",
|
||||||
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
|
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
|
||||||
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
}
|
}
|
||||||
@@ -1640,12 +1675,14 @@
|
|||||||
"node_modules/minimist": {
|
"node_modules/minimist": {
|
||||||
"version": "1.2.8",
|
"version": "1.2.8",
|
||||||
"resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
|
"resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
|
||||||
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
|
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/mkdirp-classic": {
|
"node_modules/mkdirp-classic": {
|
||||||
"version": "0.5.3",
|
"version": "0.5.3",
|
||||||
"resolved": "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
|
"resolved": "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
|
||||||
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
|
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/ms": {
|
"node_modules/ms": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
@@ -1696,7 +1733,8 @@
|
|||||||
"node_modules/napi-build-utils": {
|
"node_modules/napi-build-utils": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmmirror.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
|
"resolved": "https://registry.npmmirror.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
|
||||||
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
|
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/negotiator": {
|
"node_modules/negotiator": {
|
||||||
"version": "0.6.3",
|
"version": "0.6.3",
|
||||||
@@ -1710,6 +1748,7 @@
|
|||||||
"version": "3.54.0",
|
"version": "3.54.0",
|
||||||
"resolved": "https://registry.npmmirror.com/node-abi/-/node-abi-3.54.0.tgz",
|
"resolved": "https://registry.npmmirror.com/node-abi/-/node-abi-3.54.0.tgz",
|
||||||
"integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==",
|
"integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"semver": "^7.3.5"
|
"semver": "^7.3.5"
|
||||||
},
|
},
|
||||||
@@ -1721,6 +1760,7 @@
|
|||||||
"version": "4.1.1",
|
"version": "4.1.1",
|
||||||
"resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz",
|
"resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz",
|
||||||
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
|
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
|
||||||
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
@@ -1745,6 +1785,7 @@
|
|||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
"resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
|
"resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
|
||||||
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"wrappy": "1"
|
"wrappy": "1"
|
||||||
}
|
}
|
||||||
@@ -1828,6 +1869,7 @@
|
|||||||
"version": "7.1.1",
|
"version": "7.1.1",
|
||||||
"resolved": "https://registry.npmmirror.com/prebuild-install/-/prebuild-install-7.1.1.tgz",
|
"resolved": "https://registry.npmmirror.com/prebuild-install/-/prebuild-install-7.1.1.tgz",
|
||||||
"integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==",
|
"integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"detect-libc": "^2.0.0",
|
"detect-libc": "^2.0.0",
|
||||||
"expand-template": "^2.0.3",
|
"expand-template": "^2.0.3",
|
||||||
@@ -1865,6 +1907,7 @@
|
|||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz",
|
||||||
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
|
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"end-of-stream": "^1.1.0",
|
"end-of-stream": "^1.1.0",
|
||||||
"once": "^1.3.1"
|
"once": "^1.3.1"
|
||||||
@@ -1907,6 +1950,7 @@
|
|||||||
"version": "1.2.8",
|
"version": "1.2.8",
|
||||||
"resolved": "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz",
|
"resolved": "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz",
|
||||||
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
|
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"deep-extend": "^0.6.0",
|
"deep-extend": "^0.6.0",
|
||||||
"ini": "~1.3.0",
|
"ini": "~1.3.0",
|
||||||
@@ -1921,6 +1965,7 @@
|
|||||||
"version": "3.6.2",
|
"version": "3.6.2",
|
||||||
"resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz",
|
"resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz",
|
||||||
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
|
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"inherits": "^2.0.3",
|
"inherits": "^2.0.3",
|
||||||
"string_decoder": "^1.1.1",
|
"string_decoder": "^1.1.1",
|
||||||
@@ -2011,6 +2056,7 @@
|
|||||||
"version": "7.6.0",
|
"version": "7.6.0",
|
||||||
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz",
|
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz",
|
||||||
"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
|
"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"lru-cache": "^6.0.0"
|
"lru-cache": "^6.0.0"
|
||||||
},
|
},
|
||||||
@@ -2107,12 +2153,14 @@
|
|||||||
"node_modules/simple-concat": {
|
"node_modules/simple-concat": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"resolved": "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz",
|
"resolved": "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz",
|
||||||
"integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
|
"integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/simple-get": {
|
"node_modules/simple-get": {
|
||||||
"version": "4.0.1",
|
"version": "4.0.1",
|
||||||
"resolved": "https://registry.npmmirror.com/simple-get/-/simple-get-4.0.1.tgz",
|
"resolved": "https://registry.npmmirror.com/simple-get/-/simple-get-4.0.1.tgz",
|
||||||
"integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
|
"integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"decompress-response": "^6.0.0",
|
"decompress-response": "^6.0.0",
|
||||||
"once": "^1.3.1",
|
"once": "^1.3.1",
|
||||||
@@ -2153,6 +2201,7 @@
|
|||||||
"version": "1.3.0",
|
"version": "1.3.0",
|
||||||
"resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
|
"resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
|
||||||
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
|
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"safe-buffer": "~5.2.0"
|
"safe-buffer": "~5.2.0"
|
||||||
}
|
}
|
||||||
@@ -2187,6 +2236,7 @@
|
|||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
|
"resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
|
||||||
"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
|
"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
|
||||||
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
@@ -2207,6 +2257,7 @@
|
|||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmmirror.com/tar-fs/-/tar-fs-2.1.1.tgz",
|
"resolved": "https://registry.npmmirror.com/tar-fs/-/tar-fs-2.1.1.tgz",
|
||||||
"integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
|
"integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chownr": "^1.1.1",
|
"chownr": "^1.1.1",
|
||||||
"mkdirp-classic": "^0.5.2",
|
"mkdirp-classic": "^0.5.2",
|
||||||
@@ -2218,6 +2269,7 @@
|
|||||||
"version": "2.2.0",
|
"version": "2.2.0",
|
||||||
"resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz",
|
"resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz",
|
||||||
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
|
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bl": "^4.0.3",
|
"bl": "^4.0.3",
|
||||||
"end-of-stream": "^1.4.1",
|
"end-of-stream": "^1.4.1",
|
||||||
@@ -2267,6 +2319,7 @@
|
|||||||
"version": "0.6.0",
|
"version": "0.6.0",
|
||||||
"resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
"resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
||||||
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
|
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
|
||||||
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"safe-buffer": "^5.0.1"
|
"safe-buffer": "^5.0.1"
|
||||||
},
|
},
|
||||||
@@ -2297,7 +2350,8 @@
|
|||||||
"node_modules/util-deprecate": {
|
"node_modules/util-deprecate": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
"resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
|
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/utils-merge": {
|
"node_modules/utils-merge": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
@@ -2307,6 +2361,14 @@
|
|||||||
"node": ">= 0.4.0"
|
"node": ">= 0.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/uuid": {
|
||||||
|
"version": "9.0.1",
|
||||||
|
"resolved": "https://registry.npmmirror.com/uuid/-/uuid-9.0.1.tgz",
|
||||||
|
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
|
||||||
|
"bin": {
|
||||||
|
"uuid": "dist/bin/uuid"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/vary": {
|
"node_modules/vary": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
|
"resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
|
||||||
@@ -2462,6 +2524,11 @@
|
|||||||
"vue": "^3.0.11"
|
"vue": "^3.0.11"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/websocket-heartbeat-js": {
|
||||||
|
"version": "1.1.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/websocket-heartbeat-js/-/websocket-heartbeat-js-1.1.3.tgz",
|
||||||
|
"integrity": "sha512-wiCMVsWK7KflVCC5f+rSTyzILDZX88A7BJfdJXt5THNDut7uUNP83r5AvdZ1El/8yOwGujC7K3iuxj96CT4gbQ=="
|
||||||
|
},
|
||||||
"node_modules/wrap-ansi": {
|
"node_modules/wrap-ansi": {
|
||||||
"version": "7.0.0",
|
"version": "7.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
||||||
@@ -2479,7 +2546,28 @@
|
|||||||
"node_modules/wrappy": {
|
"node_modules/wrappy": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
|
"resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
|
||||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"node_modules/ws": {
|
||||||
|
"version": "8.16.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/ws/-/ws-8.16.0.tgz",
|
||||||
|
"integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"bufferutil": "^4.0.1",
|
||||||
|
"utf-8-validate": ">=5.0.2"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"bufferutil": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"utf-8-validate": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"node_modules/y18n": {
|
"node_modules/y18n": {
|
||||||
"version": "5.0.8",
|
"version": "5.0.8",
|
||||||
@@ -2493,7 +2581,8 @@
|
|||||||
"node_modules/yallist": {
|
"node_modules/yallist": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz",
|
||||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
|
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
|
||||||
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/yargs": {
|
"node_modules/yargs": {
|
||||||
"version": "17.7.2",
|
"version": "17.7.2",
|
||||||
|
|||||||
+11
-5
@@ -4,29 +4,35 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"vite": "vite",
|
||||||
"server": "concurrently \"node server.js\" \"node server_page.js\"",
|
"dev": "concurrently \"node server.js\" \"vite\"",
|
||||||
|
"server": "concurrently \"node server.js\"",
|
||||||
"miaoShare": "concurrently \"node server.js\" \"vite\"",
|
"miaoShare": "concurrently \"node server.js\" \"vite\"",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"preview": "vite preview"
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"aes-js": "^3.1.2",
|
"aes-js": "^3.1.2",
|
||||||
|
"crypto-js": "^4.2.0",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
"file-saver": "^2.0.5",
|
"file-saver": "^2.0.5",
|
||||||
"js-base64": "^3.7.6",
|
"js-base64": "^3.7.6",
|
||||||
"pinia": "^2.1.7",
|
"pinia": "^2.1.7",
|
||||||
"sm-crypto": "^0.3.13",
|
"sm-crypto": "^0.3.13",
|
||||||
|
"uuid": "^9.0.1",
|
||||||
"vicons": "^0.0.1",
|
"vicons": "^0.0.1",
|
||||||
"vue": "^3.4.15",
|
"vue": "^3.4.15",
|
||||||
"vue-clipboard3": "^2.0.0",
|
"vue-clipboard3": "^2.0.0",
|
||||||
"vue-router": "^4.2.5"
|
"vue-router": "^4.2.5",
|
||||||
|
"websocket-heartbeat-js": "^1.1.3",
|
||||||
|
"ws": "^8.16.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"better-sqlite3": "^8.7.0",
|
"@vicons/ionicons5": "^0.12.0",
|
||||||
"cors": "^2.8.5",
|
|
||||||
"@vitejs/plugin-vue": "^5.0.3",
|
"@vitejs/plugin-vue": "^5.0.3",
|
||||||
|
"better-sqlite3": "^8.7.0",
|
||||||
"concurrently": "^8.2.2",
|
"concurrently": "^8.2.2",
|
||||||
|
"cors": "^2.8.5",
|
||||||
"naive-ui": "^2.37.3",
|
"naive-ui": "^2.37.3",
|
||||||
"vfonts": "^0.0.3",
|
"vfonts": "^0.0.3",
|
||||||
"vite": "^5.0.11"
|
"vite": "^5.0.11"
|
||||||
|
|||||||
@@ -1,213 +1,419 @@
|
|||||||
import express from 'express'
|
import express from "express";
|
||||||
import cors from 'cors'
|
import cors from "cors";
|
||||||
import Database from 'better-sqlite3';
|
import Database from "better-sqlite3";
|
||||||
import fs from "fs"
|
import fs from "fs";
|
||||||
|
import { WebSocketServer } from "ws";
|
||||||
|
import http from "http";
|
||||||
|
import { v4 as uuid4 } from "uuid";
|
||||||
|
// import Config from "./miaoShareConfig.json"
|
||||||
|
|
||||||
|
const HOST = "0.0.0.0";
|
||||||
|
// const PORT = Config.PORT
|
||||||
const HOST = '0.0.0.0'
|
const PORT = 17057;
|
||||||
const PORT = '17058'
|
|
||||||
const fileDir = "./temp";
|
const fileDir = "./temp";
|
||||||
const dbPath = './miaoShare.db'
|
const dbPath = "./miaoShare.db";
|
||||||
|
const PATH = "./dist";
|
||||||
|
|
||||||
// 上传文件最大大小:200MB
|
// 上传文件最大大小:200MB
|
||||||
const uploadMaxSize=200*1024*1024
|
const uploadMaxSize = 200 * 1024 * 1024;
|
||||||
// 一天的毫秒数
|
// 一天的毫秒数
|
||||||
const millisecondsOfTheDay = parseInt(24*3600*1000)
|
const millisecondsOfOneDay = parseInt(24 * 3600 * 1000);
|
||||||
// 文件3天过期
|
// 文件3天过期
|
||||||
const LifeOfFile=millisecondsOfTheDay*3
|
const LifeOfFile = millisecondsOfOneDay * 3;
|
||||||
// const LifeOfFile=0
|
// const LifeOfFile=0
|
||||||
|
|
||||||
// 数据库相关
|
// 数据库相关
|
||||||
const db = new Database(dbPath, { verbose: null });
|
const db = new Database(dbPath, { verbose: null });
|
||||||
db.prepare(`CREATE TABLE IF NOT EXISTS id2fileName (
|
db.prepare(
|
||||||
|
`CREATE TABLE IF NOT EXISTS id2fileName (
|
||||||
id CHAR(8) PRIMARY KEY NOT NULL UNIQUE,
|
id CHAR(8) PRIMARY KEY NOT NULL UNIQUE,
|
||||||
fileName TEXT NOT NULL,
|
fileName TEXT NOT NULL,
|
||||||
timestamp INT NOT NULL,
|
timestamp INT NOT NULL,
|
||||||
freeze tinyint(1) NOT NULL,
|
freeze tinyint(1) NOT NULL,
|
||||||
downloadCredit INT NOT NULL
|
downloadCredit INT NOT NULL
|
||||||
);`).run()
|
);`
|
||||||
const stmt_getFileName = db.prepare(`SELECT fileName FROM id2fileName WHERE id = ?`)
|
).run();
|
||||||
const stmt_getTimestamp = db.prepare(`SELECT timestamp FROM id2fileName WHERE id = ?`)
|
const stmt_getFileName = db.prepare(`SELECT fileName FROM id2fileName WHERE id = ?`);
|
||||||
const stmt_getFreeze = db.prepare(`SELECT freeze FROM id2fileName WHERE id = ?`)
|
const stmt_getTimestamp = db.prepare(`SELECT timestamp FROM id2fileName WHERE id = ?`);
|
||||||
const stmt_getDownloadCredit = db.prepare(`SELECT downloadCredit FROM id2fileName WHERE id = ?`)
|
const stmt_getFreeze = db.prepare(`SELECT freeze FROM id2fileName WHERE id = ?`);
|
||||||
const stmt_getFreezenIDs = db.prepare(`SELECT id FROM id2fileName WHERE freeze = 1`)
|
const stmt_getDownloadCredit = db.prepare(`SELECT downloadCredit FROM id2fileName WHERE id = ?`);
|
||||||
const stmt_insertId2FileName = db.prepare(`INSERT INTO id2fileName (id, fileName, timestamp, freeze, downloadCredit) VALUES (?, ?, ?, ?, ?)`)
|
const stmt_getFreezenIDs = db.prepare(`SELECT id FROM id2fileName WHERE freeze = 1`);
|
||||||
const stmt_deleteExpireData = db.prepare(`DELETE FROM id2fileName WHERE freeze=1`)
|
const stmt_insertId2FileName = db.prepare(`INSERT INTO id2fileName (id, fileName, timestamp, freeze, downloadCredit) VALUES (?, ?, ?, ?, ?)`);
|
||||||
const stmt_freezeExpireData = db.prepare(`UPDATE id2fileName SET freeze=1 WHERE timestamp < ? OR downloadCredit < 1`)
|
const stmt_deleteExpireData = db.prepare(`DELETE FROM id2fileName WHERE freeze=1`);
|
||||||
const stmt_updateDownloadCredit = db.prepare(`UPDATE id2fileName SET downloadCredit=downloadCredit-1 WHERE id = ?`)
|
const stmt_freezeExpireData = db.prepare(`UPDATE id2fileName SET freeze=1 WHERE timestamp < ? OR downloadCredit < 1`);
|
||||||
|
const stmt_updateDownloadCredit = db.prepare(`UPDATE id2fileName SET downloadCredit=downloadCredit-1 WHERE id = ?`);
|
||||||
|
|
||||||
const db_insert = (id,fileName,downloadCredit)=>{
|
const db_insert = (id, fileName, downloadCredit) => {
|
||||||
stmt_insertId2FileName.run(id,fileName,parseInt(Date.now()),0,downloadCredit)
|
stmt_insertId2FileName.run(id, fileName, parseInt(Date.now()), 0, downloadCredit);
|
||||||
}
|
};
|
||||||
const db_getFileName = (id)=>{
|
const db_getFileName = id => {
|
||||||
try{
|
try {
|
||||||
if(stmt_getFreeze.get(id)['freeze'] == 1)return null
|
if (stmt_getFreeze.get(id)["freeze"] == 1) return null;
|
||||||
return stmt_getFileName.get(id)['fileName']
|
return stmt_getFileName.get(id)["fileName"];
|
||||||
}catch(e){
|
} catch (e) {
|
||||||
return null
|
return null;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
// 检查是否可下载
|
// 检查是否可下载
|
||||||
const db_downloadable = (id)=>{
|
const db_downloadable = id => {
|
||||||
try{
|
try {
|
||||||
// 懒
|
// 懒
|
||||||
if(stmt_getDownloadCredit.get(id)['downloadCredit'] < 1)return false
|
if (stmt_getDownloadCredit.get(id)["downloadCredit"] < 1) return false;
|
||||||
if(stmt_getFreeze.get(id)['freeze'] == 1)return false
|
if (stmt_getFreeze.get(id)["freeze"] == 1) return false;
|
||||||
return true
|
return true;
|
||||||
}catch(e){
|
} catch (e) {
|
||||||
return false
|
return false;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
const db_updateDownloadCredit = (id)=>{
|
const db_updateDownloadCredit = id => {
|
||||||
try{
|
try {
|
||||||
stmt_updateDownloadCredit.run(id)
|
stmt_updateDownloadCredit.run(id);
|
||||||
return true
|
return true;
|
||||||
}catch(e){
|
} catch (e) {
|
||||||
return false
|
return false;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
const db_getTimestamp = (id)=>{
|
const db_getTimestamp = id => {
|
||||||
return stmt_getTimestamp.get(id)['timestamp']
|
return stmt_getTimestamp.get(id)["timestamp"];
|
||||||
}
|
};
|
||||||
|
|
||||||
// 更新存储的文件,删除已经被冻结的文件以及相关记录,然后冻结过期文件
|
// 更新存储的文件,删除已经被冻结的文件以及相关记录,然后冻结过期文件
|
||||||
const updateFiles = ()=>{
|
const updateDBAndFiles = () => {
|
||||||
try{
|
try {
|
||||||
let rows = stmt_getFreezenIDs.all()
|
let rows = stmt_getFreezenIDs.all();
|
||||||
stmt_deleteExpireData.run()
|
stmt_deleteExpireData.run();
|
||||||
for(let row of rows){
|
for (let row of rows) {
|
||||||
let fileName = row['id']
|
let fileName = row["id"];
|
||||||
let path = fileDir + '/' + fileName
|
let path = fileDir + "/" + fileName;
|
||||||
try{
|
try {
|
||||||
fs.unlink(path,(e)=>{if(e)throw e})
|
fs.unlink(path, e => {
|
||||||
}catch(e){
|
if (e) throw e;
|
||||||
console.log(e)
|
});
|
||||||
continue
|
} catch (e) {
|
||||||
}
|
console.log(e);
|
||||||
}
|
continue;
|
||||||
stmt_freezeExpireData.run(parseInt(Date.now()) - LifeOfFile)
|
}
|
||||||
}catch(e){
|
}
|
||||||
console.log(e)
|
stmt_freezeExpireData.run(parseInt(Date.now()) - LifeOfFile);
|
||||||
return
|
} catch (e) {
|
||||||
}
|
console.log(e);
|
||||||
}
|
return;
|
||||||
updateFiles()
|
}
|
||||||
|
};
|
||||||
|
updateDBAndFiles();
|
||||||
// 3小时更新一次
|
// 3小时更新一次
|
||||||
setInterval(updateFiles,1000*3600*3)
|
setInterval(updateDBAndFiles, 1000 * 3600 * 3);
|
||||||
|
// // 测试环境一分钟更新一次,记得注释掉
|
||||||
|
// setInterval(updateDBAndFiles, 1000 * 60);
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
|
||||||
var app = express();
|
|
||||||
app.use(cors());
|
app.use(cors());
|
||||||
var tempMap = {}
|
app.options("*", cors());
|
||||||
|
// var tempMap = {}
|
||||||
|
|
||||||
if (!fs.existsSync(fileDir)) {
|
if (!fs.existsSync(fileDir)) {
|
||||||
fs.mkdirSync(fileDir);
|
fs.mkdirSync(fileDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
function generateId(){
|
function generateId(isGID) {
|
||||||
var returnStr = "",
|
var returnStr = "",
|
||||||
range = 8,
|
range = 8,
|
||||||
charStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
charStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||||
|
|
||||||
for(var i=0; i<range; i++){
|
for (var i = 0; i < range; i++) {
|
||||||
var index = Math.round(Math.random() * 35);
|
if (isGID === true && i == 0) {
|
||||||
returnStr += charStr.substring(index,index+1);
|
var index = parseInt(Math.random() * 26);
|
||||||
}
|
} else {
|
||||||
return returnStr;
|
var index = parseInt(Math.random() * 36);
|
||||||
|
}
|
||||||
|
returnStr += charStr.substring(index, index + 1);
|
||||||
|
}
|
||||||
|
return returnStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 上传文件接口
|
// 上传文件接口
|
||||||
function uploadFile(req, res, fileName, downloadCredit){
|
function uploadFile(req, res, fileName, downloadCredit) {
|
||||||
let id = generateId();
|
let id = generateId();
|
||||||
const fileStream = fs.createWriteStream(fileDir + '/' + id);
|
const fileStream = fs.createWriteStream(fileDir + "/" + id);
|
||||||
db_insert(id,fileName,downloadCredit)
|
db_insert(id, fileName, downloadCredit);
|
||||||
// tempMap[id] = fileName;
|
// tempMap[id] = fileName;
|
||||||
// console.log(tempMap);
|
// console.log(tempMap);
|
||||||
req.pipe(fileStream);
|
req.pipe(fileStream);
|
||||||
res.on('data',(c)=>{console.log(c)})
|
res.on("data", c => {
|
||||||
req.on("end", function () {
|
console.log(c);
|
||||||
fileStream.end();
|
});
|
||||||
res.statusCode = 200;
|
req.on("end", function () {
|
||||||
res.end(id);
|
fileStream.end();
|
||||||
});
|
res.statusCode = 200;
|
||||||
req.on("error", err => {
|
res.end(id);
|
||||||
fileStream.end();
|
});
|
||||||
res.statusCode = 500;
|
req.on("error", err => {
|
||||||
res.end("File save failed: " + err.message);
|
fileStream.end();
|
||||||
});
|
res.statusCode = 500;
|
||||||
|
res.end("File save failed: " + err.message);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function downloadFile(req, res, fileId){
|
function downloadFile(req, res, fileId) {
|
||||||
try {
|
try {
|
||||||
if(db_downloadable(fileId) == false){
|
if (db_downloadable(fileId) == false) {
|
||||||
res.writeHead(404);
|
res.writeHead(404);
|
||||||
res.end(null);
|
res.end(null);
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
db_updateDownloadCredit(fileId)
|
db_updateDownloadCredit(fileId);
|
||||||
var fileName = db_getFileName(fileId)
|
var fileName = db_getFileName(fileId);
|
||||||
if(fileName == null){
|
if (fileName == null) {
|
||||||
res.writeHead(404);
|
res.writeHead(404);
|
||||||
res.end(null);
|
res.end(null);
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
let data = fs.readFileSync(fileDir + '/' + fileId);
|
let data = fs.readFileSync(fileDir + "/" + fileId);
|
||||||
res.writeHead(200, {
|
res.writeHead(200, {
|
||||||
"Content-Type": "application/octet-stream ",
|
"Content-Type": "application/octet-stream ",
|
||||||
"File-Name": fileName,
|
"File-Name": fileName,
|
||||||
'Content-Length':data.length,
|
"Content-Length": data.length
|
||||||
});
|
});
|
||||||
res.end(data);
|
res.end(data);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log(err);
|
console.log(err);
|
||||||
res.writeHead(404);
|
res.writeHead(404);
|
||||||
res.end(null);
|
res.end(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置一些通用的中间件
|
app.use(express.static(PATH));
|
||||||
// app.use(bodyParser.json());
|
|
||||||
// app.use(bodyParser.urlencoded({extended: true}));
|
|
||||||
|
|
||||||
// app.all()
|
// app.all()
|
||||||
app.post('/file/upload', function(req, res){
|
app.post("/file/upload", function (req, res) {
|
||||||
res.header("Access-Control-Allow-Origin", "*");
|
res.header("Access-Control-Allow-Origin", "*");
|
||||||
res.header("Access-Control-Allow-Headers", "*");
|
res.header("Access-Control-Allow-Headers", "*");
|
||||||
res.header("Access-Control-Allow-Methods", "POST");
|
res.header("Access-Control-Allow-Methods", "POST");
|
||||||
res.header("Access-Control-Expose-Headers", "File-Name");
|
res.header("Access-Control-Expose-Headers", "File-Name");
|
||||||
var fileSize = parseInt(req.get('Content-Length'))
|
var fileSize = parseInt(req.get("Content-Length"));
|
||||||
var fileName = req.query.fileName;
|
var fileName = req.query.fileName;
|
||||||
var downloadCredit = parseInt(req.query.downloadCredit);
|
var downloadCredit = parseInt(req.query.downloadCredit);
|
||||||
if(downloadCredit == -1)downloadCredit = 2147483647
|
if (downloadCredit == -1) downloadCredit = 2147483647;
|
||||||
if(!fileName){
|
if (!fileName) {
|
||||||
res.statusCode = 500;
|
res.statusCode = 500;
|
||||||
res.end("FileName Not Found");
|
res.end("FileName Not Found");
|
||||||
}else if(fileSize > uploadMaxSize){
|
} else if (fileSize > uploadMaxSize) {
|
||||||
res.statusCode = 500;
|
res.statusCode = 500;
|
||||||
res.end("Maximum size limit exceeded");
|
res.end("Maximum size limit exceeded");
|
||||||
}
|
} else {
|
||||||
else{
|
uploadFile(req, res, fileName, downloadCredit);
|
||||||
uploadFile(req, res, fileName, downloadCredit);
|
}
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get('/file/download', function(req, res){
|
app.get("/file/download", function (req, res) {
|
||||||
res.header("Access-Control-Allow-Origin", "*");
|
res.header("Access-Control-Allow-Origin", "*");
|
||||||
res.header("Access-Control-Allow-Headers", "*");
|
res.header("Access-Control-Allow-Headers", "*");
|
||||||
res.header("Access-Control-Allow-Methods", "GET");
|
res.header("Access-Control-Allow-Methods", "GET");
|
||||||
res.header("Access-Control-Expose-Headers", "File-Name");
|
res.header("Access-Control-Expose-Headers", "File-Name");
|
||||||
var fileId = req.query.fileName;
|
var fileId = req.query.fileName;
|
||||||
if(!fileId){
|
if (!fileId) {
|
||||||
res.statusCode = 500;
|
res.statusCode = 500;
|
||||||
res.end("FileName Not Found");
|
res.end("FileName Not Found");
|
||||||
}else{
|
} else {
|
||||||
downloadFile(req, res, fileId);
|
downloadFile(req, res, fileId);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 启动服务器
|
// // 启动服务器
|
||||||
app.listen(PORT, HOST, function(){
|
// app.listen(PORT, HOST, function(){
|
||||||
// console.log('Example app listening on port ' + PORT + '.');
|
// console.log(app)
|
||||||
|
// // console.log(`miaoShare server listening on ${}`)
|
||||||
|
// });
|
||||||
|
|
||||||
|
const server = http.createServer(app);
|
||||||
|
const wss = new WebSocketServer({ server });
|
||||||
|
// 先实现最低限度功能,暂时不考虑身份认证
|
||||||
|
const groupsMap = {};
|
||||||
|
// 三天不活跃的群组将被清除
|
||||||
|
const LifeOfGroup = millisecondsOfOneDay * 3;
|
||||||
|
// const LifeOfGroup = 0;
|
||||||
|
// 根据uuid查询加入的群组
|
||||||
|
const uuid2Groups={}
|
||||||
|
|
||||||
|
db.exec(
|
||||||
|
`CREATE TABLE IF NOT EXISTS GROUPS (
|
||||||
|
gID CHAR(8) PRIMARY KEY UNIQUE NOT NULL,
|
||||||
|
verify TEXT NOT NULL,
|
||||||
|
activeTimestamp INT NOT NULL
|
||||||
|
);`
|
||||||
|
);
|
||||||
|
|
||||||
|
const stmt_getExpiredGroups = db.prepare(`SELECT gID FROM GROUPS WHERE activeTimestamp < ? `);
|
||||||
|
|
||||||
|
const stmt_getGroupVerify = db.prepare(`SELECT verify FROM GROUPS WHERE gID = ? `);
|
||||||
|
|
||||||
|
const stmt_insertGROUPS = db.prepare(`INSERT INTO GROUPS (gID,verify, activeTimestamp) VALUES (?, ?, ?)`);
|
||||||
|
|
||||||
|
const stmt_updateGROUPS_ActiveTimestamp = db.prepare(`UPDATE GROUPS SET activeTimestamp=? WHERE gID=?`);
|
||||||
|
|
||||||
|
const stmt_deleteGroup = db.prepare(`DELETE FROM GROUPS WHERE gID=?`);
|
||||||
|
|
||||||
|
const generateStmt_insertMessage_map = {};
|
||||||
|
|
||||||
|
const updateGROUPS = () => {
|
||||||
|
// console.log(1)
|
||||||
|
try {
|
||||||
|
let gIDs = stmt_getExpiredGroups.all(parseInt(Date.now()) - LifeOfGroup);
|
||||||
|
for (let row of gIDs) {
|
||||||
|
let gID = row.gID;
|
||||||
|
db.exec(`DROP TABLE IF EXISTS ${gID}`);
|
||||||
|
stmt_deleteGroup.run(gID);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
updateGROUPS();
|
||||||
|
setInterval(updateGROUPS, 1000 * 3600 * 3);
|
||||||
|
|
||||||
|
// 创建群组的数据库
|
||||||
|
function createGroupTableDB(gID, verify) {
|
||||||
|
db.exec(
|
||||||
|
`CREATE TABLE IF NOT EXISTS ${gID} (
|
||||||
|
message TEXT NOT NULL,
|
||||||
|
type TEXT NOT NULL,
|
||||||
|
sender TEXT NOT NULL,
|
||||||
|
timestamp INT NOT NULL
|
||||||
|
);`
|
||||||
|
);
|
||||||
|
stmt_insertGROUPS.run(gID, verify, parseInt(Date.now()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 插入信息
|
||||||
|
function insertMessageByGID(gID, msg, from) {
|
||||||
|
if (!generateStmt_insertMessage_map[gID]) {
|
||||||
|
generateStmt_insertMessage_map[gID] = db.prepare(`INSERT INTO ${gID} (message,type,sender, timestamp) VALUES (?, ?, ?, ?)`);
|
||||||
|
}
|
||||||
|
generateStmt_insertMessage_map[gID].run(msg, "gMsg", from, parseInt(Date.now()));
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateActiveTimestamp(gID) {
|
||||||
|
stmt_updateGROUPS_ActiveTimestamp.run(parseInt(Date.now()), gID);
|
||||||
|
}
|
||||||
|
|
||||||
|
function createGroup(verify) {
|
||||||
|
// 暂时不考虑id随机生成时重复的问题
|
||||||
|
let gID = generateId(true);
|
||||||
|
groupsMap[gID] = { verify, member: [], msgHistory: [] };
|
||||||
|
createGroupTableDB(gID, verify);
|
||||||
|
return gID;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getGroupVerify(gID) {
|
||||||
|
initMsgHistory(gID)
|
||||||
|
return groupsMap[gID].verify;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 正式加入群组
|
||||||
|
function joinGroup(socket, gID, callback) {
|
||||||
|
initMsgHistory(gID)
|
||||||
|
groupsMap[gID].member.push(socket);
|
||||||
|
updateActiveTimestamp(gID);
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 暂时这么写
|
||||||
|
function getHistory(gID) {
|
||||||
|
initMsgHistory(gID)
|
||||||
|
return groupsMap[gID].msgHistory;
|
||||||
|
}
|
||||||
|
|
||||||
|
function broadcastMsg(gID, msg, from) {
|
||||||
|
initMsgHistory(gID)
|
||||||
|
updateActiveTimestamp(gID);
|
||||||
|
insertMessageByGID(gID, msg, from);
|
||||||
|
|
||||||
|
let bmsg = JSON.stringify({ type: "gMsg", gID, msg });
|
||||||
|
groupsMap[gID].msgHistory.push({ type: "gMsg", msg, from });
|
||||||
|
for (let socket of groupsMap[gID].member) {
|
||||||
|
socket.send(bmsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function initMsgHistory(gID){
|
||||||
|
if (!groupsMap[gID]) {
|
||||||
|
let verify = stmt_getGroupVerify.get(gID).verify;
|
||||||
|
// 暂时这么写
|
||||||
|
let msgHistory = db
|
||||||
|
.prepare(`SELECT message,type FROM ${gID}`)
|
||||||
|
.all()
|
||||||
|
.map(v => {
|
||||||
|
return { msg: v.message, type: v.type };
|
||||||
|
});
|
||||||
|
// console.log(msgHistory)
|
||||||
|
groupsMap[gID] = { verify, member: [], msgHistory };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 灵车
|
||||||
|
wss.on("connection", socket => {
|
||||||
|
console.log("新的连接已建立");
|
||||||
|
const no = wss.clients.size;
|
||||||
|
const joinedGroup = [];
|
||||||
|
var uuid = uuid4();
|
||||||
|
function setUuid(new_uuid){
|
||||||
|
uuid = new_uuid
|
||||||
|
}
|
||||||
|
socket.on("message", message => {
|
||||||
|
try {
|
||||||
|
console.log(message.toString());
|
||||||
|
let msg = JSON.parse(message.toString());
|
||||||
|
if (msg.type) {
|
||||||
|
let type = msg.type;
|
||||||
|
// 创建群组
|
||||||
|
if (type === "create") {
|
||||||
|
socket.send(JSON.stringify({ type: "sMsg", type1: "create", gID: createGroup(msg.verify) }));
|
||||||
|
} else if (type === "join") {
|
||||||
|
// 加入群组——客端验证key
|
||||||
|
if (msg.type1 === "verify") {
|
||||||
|
// 已经加入则return
|
||||||
|
if (joinedGroup.includes(msg.gID)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
socket.send(JSON.stringify({ type: "sMsg", type1: "joinVerify", verify: getGroupVerify(msg.gID), gID: msg.gID }));
|
||||||
|
} else if (msg.type1 === "success") {
|
||||||
|
if (joinedGroup.includes(msg.gID)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 成功加入
|
||||||
|
joinGroup(socket, msg.gID, () => {
|
||||||
|
joinedGroup.push(msg.gID);
|
||||||
|
// 不考虑失败属于是
|
||||||
|
socket.send(JSON.stringify({ type: "sMsg", gID: msg.gID, type1: "history", history: JSON.stringify(getHistory(msg.gID)) }));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if (type === "message") {
|
||||||
|
let gID = msg.gID;
|
||||||
|
broadcastMsg(gID, msg.msg,uuid);
|
||||||
|
} else if (type === "heartbeat") {
|
||||||
|
socket.send(JSON.stringify({ type: "sMsg", type1: "heartbeat" }));
|
||||||
|
} else if (type === "uuid") {
|
||||||
|
if (msg.type1 === "get") {
|
||||||
|
socket.send(JSON.stringify({ type: "sMsg", type1: "uuid", uuid }));
|
||||||
|
} else if (msg.type1 === "set") {
|
||||||
|
uuid = msg.uuid
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on("close", () => {
|
||||||
|
for (let gID of joinedGroup) {
|
||||||
|
groupsMap[gID].member = groupsMap[gID].member.filter(v => v !== socket);
|
||||||
|
}
|
||||||
|
console.log(`No.${no} exit.`);
|
||||||
|
console.log(groupsMap);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
server.listen(PORT, HOST, () => {});
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
// 已废弃
|
||||||
|
|
||||||
import express from 'express'
|
import express from 'express'
|
||||||
|
|
||||||
const HOST = '0.0.0.0'
|
const HOST = '0.0.0.0'
|
||||||
|
|||||||
+87
-17
@@ -1,8 +1,50 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import uploadFileMiao from "./components/uploadFileMiao.vue";
|
import upload from "./views/uploadFileMiao.vue";
|
||||||
import downloadFileMiao from "./components/downloadFileMiao.vue";
|
import download from "./views/downloadFileMiao.vue";
|
||||||
import settingMiao from "./components/setting.vue";
|
import setting from "./views/setting.vue";
|
||||||
import {NNotificationProvider,NMessageProvider,NCard,NTabs,NTabPane} from 'naive-ui'
|
import chat from "./views/chat.vue";
|
||||||
|
import { NNotificationProvider, NMessageProvider, NCard, NMenu, NIcon } from 'naive-ui'
|
||||||
|
import { ref, watch, h ,shallowRef} from "vue";
|
||||||
|
// import { RouterView, useRouter } from "vue-router";
|
||||||
|
import {
|
||||||
|
ArrowUpCircleOutline as uploadIcon,
|
||||||
|
ArrowDownCircleOutline as downloadIcon,
|
||||||
|
ChatboxEllipsesOutline as chatIcon,
|
||||||
|
SettingsOutline as settingIcon
|
||||||
|
|
||||||
|
} from '@vicons/ionicons5'
|
||||||
|
|
||||||
|
const activePage = ref('upload')
|
||||||
|
const isComponent = shallowRef(upload)
|
||||||
|
watch(activePage, () => {
|
||||||
|
isComponent.value={upload,download,setting,chat}[activePage.value]
|
||||||
|
})
|
||||||
|
function renderIcon(icon) {
|
||||||
|
return () => h(NIcon, null, { default: () => h(icon) })
|
||||||
|
}
|
||||||
|
|
||||||
|
const menuOptions = [
|
||||||
|
{
|
||||||
|
label: '上传',
|
||||||
|
key: 'upload',
|
||||||
|
icon: renderIcon(uploadIcon),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '下载',
|
||||||
|
key: 'download',
|
||||||
|
icon: renderIcon(downloadIcon),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Chat',
|
||||||
|
key: 'chat',
|
||||||
|
icon: renderIcon(chatIcon),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '设置',
|
||||||
|
key: 'setting',
|
||||||
|
icon: renderIcon(settingIcon),
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
@@ -12,17 +54,35 @@ import {NNotificationProvider,NMessageProvider,NCard,NTabs,NTabPane} from 'naive
|
|||||||
<n-notification-provider placement="bottom-right" :max="3">
|
<n-notification-provider placement="bottom-right" :max="3">
|
||||||
<n-message-provider>
|
<n-message-provider>
|
||||||
<n-card content-style="padding: 0; margin:0;" id="theCard">
|
<n-card content-style="padding: 0; margin:0;" id="theCard">
|
||||||
<n-tabs type="line" size="large" :tabs-padding="20" pane-style="padding: 20px;">
|
<div id="menu">
|
||||||
<n-tab-pane name="上传文件">
|
<n-menu mode="horizontal" :responsive="true" v-model:value="activePage" :options="menuOptions" :icon-size="26"></n-menu>
|
||||||
<uploadFileMiao style />
|
</div>
|
||||||
</n-tab-pane>
|
|
||||||
<n-tab-pane name="下载文件">
|
<div style="padding: 20px;">
|
||||||
<downloadFileMiao style/>
|
<KeepAlive>
|
||||||
</n-tab-pane>
|
<component :is="isComponent"></component>
|
||||||
<n-tab-pane name="设置">
|
</KeepAlive>
|
||||||
<settingMiao style="max-width:100%" />
|
<!-- <router-view v-slot="{ Component }">
|
||||||
</n-tab-pane>
|
<keep-alive :include=['uploadFileMiao']>
|
||||||
</n-tabs>
|
<component :is="Component" :key="$route.fullPath"/>
|
||||||
|
</keep-alive>
|
||||||
|
</router-view> -->
|
||||||
|
</div>
|
||||||
|
<!-- <n-tabs type="line" size="large" :tabs-padding="20" pane-style="padding: 20px;"
|
||||||
|
display-directive="show">
|
||||||
|
<n-tab-pane name="上传文件">
|
||||||
|
<uploadFileMiao style />
|
||||||
|
</n-tab-pane>
|
||||||
|
<n-tab-pane name="下载文件">
|
||||||
|
<downloadFileMiao style />
|
||||||
|
</n-tab-pane>
|
||||||
|
<n-tab-pane name="miaoChat">
|
||||||
|
<chat style />
|
||||||
|
</n-tab-pane>
|
||||||
|
<n-tab-pane name="设置">
|
||||||
|
<settingMiao style="max-width:100%" />
|
||||||
|
</n-tab-pane>
|
||||||
|
</n-tabs> -->
|
||||||
</n-card>
|
</n-card>
|
||||||
</n-message-provider>
|
</n-message-provider>
|
||||||
</n-notification-provider>
|
</n-notification-provider>
|
||||||
@@ -39,9 +99,19 @@ import {NNotificationProvider,NMessageProvider,NCard,NTabs,NTabPane} from 'naive
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
#theCard {
|
#theCard {
|
||||||
width: 50%;
|
width: 40vw;
|
||||||
height: 80%;
|
height: 90vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
#menu{
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
/* background-color: blue; */
|
||||||
|
padding-top: 5px;
|
||||||
|
border-bottom: 1px solid rgb(60, 60, 60, 0.1);
|
||||||
|
user-select: none
|
||||||
}
|
}
|
||||||
@media screen and (max-width:768px) {
|
@media screen and (max-width:768px) {
|
||||||
#theCard {
|
#theCard {
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
import aesjs from "aes-js";
|
||||||
|
import { Base64 } from "js-base64";
|
||||||
|
import { saveAs } from "file-saver";
|
||||||
|
import { sm4 } from "sm-crypto";
|
||||||
|
|
||||||
|
const blob2Uint8Array = function (blob) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let reader = new FileReader();
|
||||||
|
reader.readAsArrayBuffer(blob);
|
||||||
|
reader.onload = function () {
|
||||||
|
let buffer = reader.result;
|
||||||
|
let uint8array = new Uint8Array(buffer);
|
||||||
|
resolve(uint8array);
|
||||||
|
};
|
||||||
|
reader.onerror = function () {
|
||||||
|
reject(reader.error);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
const decrypt = (key, data) => {
|
||||||
|
key = key.trim()
|
||||||
|
return blob2Uint8Array(data).then(data => {
|
||||||
|
// 无加密
|
||||||
|
if (key.length === 0) {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
// SM4
|
||||||
|
if (key.length === 19) {
|
||||||
|
key = [...aesjs.utils.utf8.toBytes(key.substring(3))];
|
||||||
|
// console.log([...data])
|
||||||
|
var decryptedBytes = new Uint8Array(sm4.decrypt([...data], key, { output: "array" }));
|
||||||
|
return decryptedBytes;
|
||||||
|
} else {
|
||||||
|
// AES
|
||||||
|
key = aesjs.utils.utf8.toBytes(key);
|
||||||
|
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
|
||||||
|
var decryptedBytes = aesCtr.decrypt(data);
|
||||||
|
return decryptedBytes;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
const decryptString = (key, str) => {
|
||||||
|
key = key.trim()
|
||||||
|
console.log(key.length)
|
||||||
|
// 无加密
|
||||||
|
if (key.length === 0) {
|
||||||
|
// return sm4.decrypt(str, "miaospringmiaospringmiaospringao");
|
||||||
|
return Base64.decode(str)
|
||||||
|
}
|
||||||
|
// SM4
|
||||||
|
// console.log(key,key.length)
|
||||||
|
if (key.length === 19) {
|
||||||
|
key = [...aesjs.utils.utf8.toBytes(key.substring(3))];
|
||||||
|
return sm4.decrypt(str, key);
|
||||||
|
}
|
||||||
|
// AES
|
||||||
|
var data = new Uint8Array(
|
||||||
|
Base64.decode(str)
|
||||||
|
.split(",")
|
||||||
|
.map(n => parseInt(n))
|
||||||
|
);
|
||||||
|
key = aesjs.utils.utf8.toBytes(key);
|
||||||
|
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
|
||||||
|
var decryptedBytes = aesCtr.decrypt(data);
|
||||||
|
var decryptedStr = aesjs.utils.utf8.fromBytes(decryptedBytes);
|
||||||
|
return decryptedStr;
|
||||||
|
};
|
||||||
|
|
||||||
|
const downloadFromUint8Array = (data, fileName) => {
|
||||||
|
let uint8Array = data;
|
||||||
|
let blob = new Blob([uint8Array], { type: "text/plain" });
|
||||||
|
// 使用file-saver.js
|
||||||
|
saveAs(blob, fileName);
|
||||||
|
};
|
||||||
|
|
||||||
|
export { blob2Uint8Array, decrypt, decryptString, downloadFromUint8Array };
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
import aesjs from "aes-js";
|
||||||
|
import { Base64 } from "js-base64";
|
||||||
|
import { sm4 } from 'sm-crypto'
|
||||||
|
|
||||||
|
// const setting = useSettingStore();
|
||||||
|
// const message = useMessage();
|
||||||
|
|
||||||
|
// 生成密钥
|
||||||
|
const generateKey = function(setting) {
|
||||||
|
if(setting.activeFuction === "不加密"){
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
var charMap = ""
|
||||||
|
for(let i of setting.activeKeyMap){
|
||||||
|
if(i === 'A-Z'){
|
||||||
|
charMap = charMap + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||||
|
}else if(i === "a-z"){
|
||||||
|
charMap = charMap + 'abcdefghijklmnopqrstuvwxyz'
|
||||||
|
}else if(i === '0-9'){
|
||||||
|
charMap = charMap + '0123456789'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var returnStr = "",
|
||||||
|
length = setting.activeFuction !== "AES256" ? 16 : 32
|
||||||
|
// charMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||||
|
|
||||||
|
for (var i = 0; i < length; i++) {
|
||||||
|
var index = parseInt(Math.random() * charMap.length);
|
||||||
|
returnStr += charMap.substring(index, index + 1);
|
||||||
|
}
|
||||||
|
if(setting.activeFuction === "SM4"){
|
||||||
|
returnStr = 'SM4' + returnStr
|
||||||
|
}
|
||||||
|
// console.log(returnStr,returnStr.length)
|
||||||
|
return returnStr;
|
||||||
|
};
|
||||||
|
const blob2Uint8Array = function(blob) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let reader = new FileReader();
|
||||||
|
reader.readAsArrayBuffer(blob);
|
||||||
|
reader.onload = function() {
|
||||||
|
let buffer = reader.result;
|
||||||
|
let uint8array = new Uint8Array(buffer);
|
||||||
|
resolve(uint8array);
|
||||||
|
};
|
||||||
|
reader.onerror = function() {
|
||||||
|
reject(reader.error);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
};
|
||||||
|
const AES = (key,data)=>{
|
||||||
|
key = aesjs.utils.utf8.toBytes(key);
|
||||||
|
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
|
||||||
|
var encryptedBytes = aesCtr.encrypt(data);
|
||||||
|
return encryptedBytes;
|
||||||
|
}
|
||||||
|
const SM4 = (key,data)=>{
|
||||||
|
// console.log(key)
|
||||||
|
var encryptedBytes = sm4.encrypt(data,key,{padding: 'pkcs#7',output:'array'});
|
||||||
|
// console.log(encryptedBytes, sm4.decrypt(encryptedBytes, key,{output:'array'}))
|
||||||
|
return new Uint8Array(encryptedBytes);
|
||||||
|
}
|
||||||
|
const encrypt = (key, data, fileName, setting, message) => {
|
||||||
|
// if(!encryptFunction){
|
||||||
|
// encryptFunction = setting.activeFuction
|
||||||
|
// }
|
||||||
|
let encryptFunction = {0:'不加密',16:'AES128',19:'SM4',32:'AES256'}[key.length]
|
||||||
|
return blob2Uint8Array(data).then(data => {
|
||||||
|
let encrypted_data = null
|
||||||
|
if(encryptFunction === "不加密"|| key === ''){
|
||||||
|
encrypted_data = data
|
||||||
|
// AES
|
||||||
|
}else if(encryptFunction != "SM4"){
|
||||||
|
message.info(`开始加密${fileName}`);
|
||||||
|
encrypted_data = AES(key,data)
|
||||||
|
message.info(`${fileName}加密完成`);
|
||||||
|
// SM4
|
||||||
|
}else{
|
||||||
|
message.info(`开始加密${fileName}`);
|
||||||
|
key = [...aesjs.utils.utf8.toBytes(key.substring(3))];
|
||||||
|
encrypted_data = SM4(key,data)
|
||||||
|
message.info(`${fileName}加密完成`);
|
||||||
|
}
|
||||||
|
return encrypted_data
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// setting为pinia存储的setting。。。
|
||||||
|
const encryptString = (key, str, setting) => {
|
||||||
|
// if(!encryptFunction){
|
||||||
|
// encryptFunction = setting.activeFuction
|
||||||
|
// }
|
||||||
|
// console.log(key,key.length)
|
||||||
|
let encryptFunction = {0:'不加密',16:'AES128',19:'SM4',32:'AES256'}[key.length]
|
||||||
|
if(encryptFunction === "不加密" || key === ''){
|
||||||
|
// return sm4.encrypt(str, 'miaospringmiaospringmiaospringao')
|
||||||
|
return Base64.encode(str)
|
||||||
|
}else if(encryptFunction !== "SM4"){
|
||||||
|
key = aesjs.utils.utf8.toBytes(key);
|
||||||
|
var data = aesjs.utils.utf8.toBytes(str);
|
||||||
|
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
|
||||||
|
var encryptedBytes = aesCtr.encrypt(data);
|
||||||
|
return Base64.encode(encryptedBytes);
|
||||||
|
}else{
|
||||||
|
key = [...aesjs.utils.utf8.toBytes(key.substring(3))];
|
||||||
|
// console.log(key)
|
||||||
|
return sm4.encrypt(str, key)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export {encrypt,encryptString,generateKey}
|
||||||
+2
-2
@@ -3,7 +3,7 @@ import 'vfonts/Lato.css'
|
|||||||
|
|
||||||
import { createApp } from "vue";
|
import { createApp } from "vue";
|
||||||
import App from "./App.vue";
|
import App from "./App.vue";
|
||||||
import router from "./router";
|
// import router from "./router";
|
||||||
// import naive from "naive-ui";
|
// import naive from "naive-ui";
|
||||||
import { createPinia } from "pinia";
|
import { createPinia } from "pinia";
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@ import { createPinia } from "pinia";
|
|||||||
const pinia = createPinia()
|
const pinia = createPinia()
|
||||||
const app = createApp(App);
|
const app = createApp(App);
|
||||||
|
|
||||||
app.use(router);
|
// app.use(router);
|
||||||
app.use(pinia);
|
app.use(pinia);
|
||||||
// app.use(naive);
|
// app.use(naive);
|
||||||
|
|
||||||
|
|||||||
+2
-1
@@ -1,4 +1,5 @@
|
|||||||
import { defineStore } from "pinia";
|
import { defineStore } from "pinia";
|
||||||
|
import config from "../../miaoShareConfig.json"
|
||||||
|
|
||||||
|
|
||||||
var activeFuctionLocal = localStorage.getItem('activeFuction')
|
var activeFuctionLocal = localStorage.getItem('activeFuction')
|
||||||
@@ -17,7 +18,7 @@ export const useSettingStore = defineStore("setting", {
|
|||||||
state: () => ({
|
state: () => ({
|
||||||
activeFuction: activeFuctionLocal,
|
activeFuction: activeFuctionLocal,
|
||||||
activeKeyMap:JSON.parse(activeKeyMap),
|
activeKeyMap:JSON.parse(activeKeyMap),
|
||||||
serverPort:"17058"
|
serverPort:config.PORT
|
||||||
}),
|
}),
|
||||||
getters: {
|
getters: {
|
||||||
// double: state => state.count * 2
|
// double: state => state.count * 2
|
||||||
|
|||||||
+42
-14
@@ -1,22 +1,50 @@
|
|||||||
|
// 未使用
|
||||||
|
|
||||||
import { createRouter, createWebHistory } from 'vue-router'
|
import { createRouter, createWebHistory } from 'vue-router'
|
||||||
// import HomeView from '../views/HomeView.vue'
|
import uploadFileMiao from "../views/uploadFileMiao.vue";
|
||||||
|
import downloadFileMiao from "../views/downloadFileMiao.vue";
|
||||||
|
import settingMiao from "../views/setting.vue";
|
||||||
|
import chat from "../views/chat.vue";
|
||||||
|
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
history: createWebHistory(import.meta.env.BASE_URL),
|
history: createWebHistory(import.meta.env.BASE_URL),
|
||||||
routes: [
|
routes: [
|
||||||
// {
|
{
|
||||||
// path: '/',
|
path: '/',
|
||||||
// name: 'home',
|
redirect: '/upload',
|
||||||
// component: HomeView
|
},
|
||||||
// },
|
{
|
||||||
// {
|
path: '/upload',
|
||||||
// path: '/about',
|
name: 'upload',
|
||||||
// name: 'about',
|
component: uploadFileMiao,
|
||||||
// // route level code-splitting
|
meta: {
|
||||||
// // this generates a separate chunk (About.[hash].js) for this route
|
keepAlive: true,
|
||||||
// // which is lazy-loaded when the route is visited.
|
}
|
||||||
// component: () => import('../views/AboutView.vue')
|
},
|
||||||
// }
|
{
|
||||||
|
path: '/download',
|
||||||
|
name: 'download',
|
||||||
|
component: downloadFileMiao,
|
||||||
|
meta: {
|
||||||
|
keepAlive: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/setting',
|
||||||
|
name: 'setting',
|
||||||
|
component: settingMiao,
|
||||||
|
meta: {
|
||||||
|
keepAlive: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/chat',
|
||||||
|
name: 'chat',
|
||||||
|
component: chat,
|
||||||
|
meta: {
|
||||||
|
keepAlive: true,
|
||||||
|
}
|
||||||
|
},
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,171 @@
|
|||||||
|
<template>
|
||||||
|
<n-button @click="createGroup">
|
||||||
|
createTest
|
||||||
|
</n-button>
|
||||||
|
<n-text> createTest gID:{{ gID }}<br />key:{{ key }}<br />code:{{ gID+key }}</n-text>
|
||||||
|
<n-input
|
||||||
|
v-model:value="codeInput"
|
||||||
|
type="textarea"
|
||||||
|
placeholder="测试加入群组"
|
||||||
|
/>
|
||||||
|
<n-button @click="joinGroup(codeInput)">
|
||||||
|
joinTest
|
||||||
|
</n-button>
|
||||||
|
<n-input
|
||||||
|
v-model:value="msg"
|
||||||
|
type="textarea"
|
||||||
|
placeholder="测试发送信息"
|
||||||
|
/>
|
||||||
|
<n-button @click="sendMsg(codeInput.substring(0,8),msg)">
|
||||||
|
sendMsgTest
|
||||||
|
</n-button>
|
||||||
|
<n-button @click="data.length = 0">
|
||||||
|
clearMsg
|
||||||
|
</n-button>
|
||||||
|
<n-data-table
|
||||||
|
:columns="columns"
|
||||||
|
:data="data"
|
||||||
|
:row-props="null"
|
||||||
|
:max-height="250"
|
||||||
|
:bordered="false"
|
||||||
|
:single-line="false"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import {ref} from 'vue'
|
||||||
|
import {NText,NDataTable,NButton,NInput} from 'naive-ui'
|
||||||
|
import { useSettingStore } from "@/pinia/store";
|
||||||
|
import { generateKey,encryptString } from '@/func/upload';
|
||||||
|
import { decryptString } from '@/func/download';
|
||||||
|
import WebsocketHeartbeatJs from 'websocket-heartbeat-js';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const setting = useSettingStore();
|
||||||
|
const serverPort = setting.serverPort;
|
||||||
|
const baseUrl = 'ws' + "://" + location.hostname + ":" + serverPort;
|
||||||
|
|
||||||
|
const columns = [
|
||||||
|
{
|
||||||
|
title: "from",
|
||||||
|
key: "from"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "message",
|
||||||
|
key: "msg"
|
||||||
|
},
|
||||||
|
];
|
||||||
|
const data = ref([])
|
||||||
|
const gID = ref('')
|
||||||
|
const codeInput = ref('')
|
||||||
|
const key = ref('')
|
||||||
|
const msg = ref('')
|
||||||
|
const joinedGroup = []
|
||||||
|
const uuid = ref('')
|
||||||
|
|
||||||
|
|
||||||
|
const gID2key = {}
|
||||||
|
const options = {
|
||||||
|
url: baseUrl,
|
||||||
|
pingTimeout: 20000,
|
||||||
|
pongTimeout: 10000,
|
||||||
|
reconnectTimeout: 3000,
|
||||||
|
pingMsg: JSON.stringify({type:'heartbeat'})
|
||||||
|
}
|
||||||
|
let socket = new WebsocketHeartbeatJs(options);
|
||||||
|
|
||||||
|
// const socket = new WebSocket(baseUrl);
|
||||||
|
// socket.addEventListener("open", (event) => {
|
||||||
|
// // socket.send("");
|
||||||
|
// });
|
||||||
|
|
||||||
|
|
||||||
|
socket.onmessage= (event) => {
|
||||||
|
const msg = JSON.parse(event.data)
|
||||||
|
data.value.push({from:'server',msg:event.data})
|
||||||
|
if(msg.type){
|
||||||
|
let type = msg.type
|
||||||
|
if(type === 'sMsg'){
|
||||||
|
let type1 = msg.type1
|
||||||
|
if(type1 === 'create'){
|
||||||
|
gID.value=msg.gID
|
||||||
|
}else if(type1 === 'joinVerify'){
|
||||||
|
let gID = msg.gID
|
||||||
|
let key = gID2key[gID].key
|
||||||
|
// console.log(gID2key,gID,key)
|
||||||
|
let res = decryptString(key,msg.verify)
|
||||||
|
console.log(res,key,msg.verify)
|
||||||
|
if(res === 'miaoSpring'){
|
||||||
|
socket.send(JSON.stringify({type:'join',type1:'success',gID}))
|
||||||
|
joinedGroup.push(msg.gID)
|
||||||
|
}
|
||||||
|
}else if(type1 === 'history'){
|
||||||
|
let gID = msg.gID
|
||||||
|
let key = gID2key[gID].key
|
||||||
|
for(let m of JSON.parse(msg.history)){
|
||||||
|
data.value.push({from:'decrypt',msg:decryptString(key,m.msg)})
|
||||||
|
}
|
||||||
|
}else if(type1 === 'uuid'){
|
||||||
|
uuid.value = msg.uuid
|
||||||
|
}
|
||||||
|
}else if(type === 'gMsg'){
|
||||||
|
let gID = msg.gID
|
||||||
|
let key = gID2key[gID].key
|
||||||
|
data.value.push({from:'decrypt',msg:decryptString(key,msg.msg)})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
socket.onopen = ()=>{
|
||||||
|
if(uuid.value){
|
||||||
|
socket.send(JSON.stringify({type:'uuid',type1:'set',uuid:uuid.value}))
|
||||||
|
}else{
|
||||||
|
socket.send(JSON.stringify({type:'uuid',type1:'get'}))
|
||||||
|
}
|
||||||
|
console.log(joinedGroup)
|
||||||
|
let toJoin = [...joinedGroup]
|
||||||
|
joinedGroup.length = 0
|
||||||
|
for(let gID of toJoin){
|
||||||
|
let code = gID+gID2key[gID].key
|
||||||
|
console.log(code)
|
||||||
|
joinGroup(code)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
socket.onreconnect = (e) => {
|
||||||
|
console.log('reconnecting...');
|
||||||
|
}
|
||||||
|
|
||||||
|
function createGroup(){
|
||||||
|
let keyt = generateKey(setting)
|
||||||
|
key.value = keyt
|
||||||
|
socket.send(JSON.stringify({type:'create',verify:encryptString(keyt,'miaoSpring',setting)}))
|
||||||
|
}
|
||||||
|
|
||||||
|
function joinGroup(code){
|
||||||
|
var gID = code.substring(0, 8);
|
||||||
|
var key = code.substring(8);
|
||||||
|
if(joinedGroup.includes(gID)){
|
||||||
|
return
|
||||||
|
}
|
||||||
|
gID2key[gID] = {}
|
||||||
|
gID2key[gID].key = key
|
||||||
|
joinGroup_Verify(gID)
|
||||||
|
}
|
||||||
|
|
||||||
|
function joinGroup_Verify(gID){
|
||||||
|
socket.send(JSON.stringify({type:'join',type1:'verify',gID}))
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendMsg(gID,msg){
|
||||||
|
let key = gID2key[gID].key
|
||||||
|
msg = encryptString(key,msg,setting)
|
||||||
|
socket.send(JSON.stringify({type:'message',msg,gID}))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
</style>
|
||||||
@@ -22,17 +22,15 @@
|
|||||||
:max-height="250"
|
:max-height="250"
|
||||||
:bordered="false"
|
:bordered="false"
|
||||||
:single-line="false"
|
:single-line="false"
|
||||||
|
style="user-select: none;"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, onMounted } from "vue";
|
import { ref, onMounted } from "vue";
|
||||||
import aesjs from "aes-js";
|
|
||||||
import { Base64 } from "js-base64";
|
|
||||||
import { saveAs } from "file-saver";
|
|
||||||
import { useSettingStore } from "@/pinia/store";
|
import { useSettingStore } from "@/pinia/store";
|
||||||
import { sm4 } from "sm-crypto";
|
import {decrypt, decryptString, downloadFromUint8Array} from '../func/download'
|
||||||
import {NInput,NFlex,NDataTable,NButton} from 'naive-ui'
|
import {NInput,NFlex,NDataTable,NButton} from 'naive-ui'
|
||||||
|
|
||||||
var downloadFileID = ref();
|
var downloadFileID = ref();
|
||||||
@@ -46,83 +44,85 @@ var baseUrl =
|
|||||||
location.protocol + "//" + location.hostname + ":" + serverPort + "/";
|
location.protocol + "//" + location.hostname + ":" + serverPort + "/";
|
||||||
// console.log(baseUrl);
|
// console.log(baseUrl);
|
||||||
|
|
||||||
const blob2Uint8Array = function(blob) {
|
// const blob2Uint8Array = function(blob) {
|
||||||
return new Promise((resolve, reject) => {
|
// return new Promise((resolve, reject) => {
|
||||||
let reader = new FileReader();
|
// let reader = new FileReader();
|
||||||
reader.readAsArrayBuffer(blob);
|
// reader.readAsArrayBuffer(blob);
|
||||||
reader.onload = function() {
|
// reader.onload = function() {
|
||||||
let buffer = reader.result;
|
// let buffer = reader.result;
|
||||||
let uint8array = new Uint8Array(buffer);
|
// let uint8array = new Uint8Array(buffer);
|
||||||
resolve(uint8array);
|
// resolve(uint8array);
|
||||||
};
|
// };
|
||||||
reader.onerror = function() {
|
// reader.onerror = function() {
|
||||||
reject(reader.error);
|
// reject(reader.error);
|
||||||
};
|
// };
|
||||||
});
|
// });
|
||||||
};
|
// };
|
||||||
const decrypt = (key, data) => {
|
// const decrypt = (key, data) => {
|
||||||
return blob2Uint8Array(data).then(data => {
|
// return blob2Uint8Array(data).then(data => {
|
||||||
// 无加密
|
// // 无加密
|
||||||
if(key.length === 0){
|
// if(key.length === 0){
|
||||||
return data
|
// return data
|
||||||
}
|
// }
|
||||||
// SM4
|
// // SM4
|
||||||
if (key.length >= 34) {
|
// if (key.length >= 34) {
|
||||||
key = key.substring(3);
|
// key = key.substring(3);
|
||||||
// console.log([...data])
|
// // console.log([...data])
|
||||||
var decryptedBytes = new Uint8Array(
|
// var decryptedBytes = new Uint8Array(
|
||||||
sm4.decrypt([...data], key, { output: "array" })
|
// sm4.decrypt([...data], key, { output: "array" })
|
||||||
);
|
// );
|
||||||
return decryptedBytes;
|
// return decryptedBytes;
|
||||||
} else {
|
// } else {
|
||||||
// AES
|
// // AES
|
||||||
key = aesjs.utils.utf8.toBytes(key);
|
// key = aesjs.utils.utf8.toBytes(key);
|
||||||
var aesCtr = new aesjs.ModeOfOperation.ctr(
|
// var aesCtr = new aesjs.ModeOfOperation.ctr(
|
||||||
key,
|
// key,
|
||||||
new aesjs.Counter(5)
|
// new aesjs.Counter(5)
|
||||||
);
|
// );
|
||||||
var decryptedBytes = aesCtr.decrypt(data);
|
// var decryptedBytes = aesCtr.decrypt(data);
|
||||||
return decryptedBytes;
|
// return decryptedBytes;
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
};
|
// };
|
||||||
const decryptString = (key, str) => {
|
// const decryptString = (key, str) => {
|
||||||
// 无加密
|
// // 无加密
|
||||||
if(key.length === 0){
|
// if(key.length === 0){
|
||||||
return sm4.decrypt(str, 'miaospringmiaospringmiaospringao');
|
// return sm4.decrypt(str, 'miaospringmiaospringmiaospringao');
|
||||||
}
|
// }
|
||||||
// SM4
|
// // SM4
|
||||||
// console.log(key,key.length)
|
// // console.log(key,key.length)
|
||||||
if (key.length >= 34) {
|
// if (key.length >= 34) {
|
||||||
key = key.substring(3);
|
// key = key.substring(3);
|
||||||
return sm4.decrypt(str, key);
|
// return sm4.decrypt(str, key);
|
||||||
}
|
// }
|
||||||
// AES
|
// // AES
|
||||||
var data = new Uint8Array(
|
// var data = new Uint8Array(
|
||||||
Base64.decode(str)
|
// Base64.decode(str)
|
||||||
.split(",")
|
// .split(",")
|
||||||
.map(n => parseInt(n))
|
// .map(n => parseInt(n))
|
||||||
);
|
// );
|
||||||
key = aesjs.utils.utf8.toBytes(key);
|
// key = aesjs.utils.utf8.toBytes(key);
|
||||||
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
|
// var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
|
||||||
var decryptedBytes = aesCtr.decrypt(data);
|
// var decryptedBytes = aesCtr.decrypt(data);
|
||||||
var decryptedStr = aesjs.utils.utf8.fromBytes(decryptedBytes);
|
// var decryptedStr = aesjs.utils.utf8.fromBytes(decryptedBytes);
|
||||||
return decryptedStr;
|
// return decryptedStr;
|
||||||
};
|
// };
|
||||||
|
|
||||||
|
// const downloadFromUint8Array = (data, fileName) => {
|
||||||
|
// let uint8Array = data;
|
||||||
|
// let blob = new Blob([uint8Array], { type: "text/plain" });
|
||||||
|
// // 使用file-saver.js
|
||||||
|
// saveAs(blob, fileName);
|
||||||
|
|
||||||
|
// //let url = URL.createObjectURL(blob);
|
||||||
|
// //let a = document.createElement("a");
|
||||||
|
// //a.href = url;
|
||||||
|
// //a.download = fileName;
|
||||||
|
// //a.click();
|
||||||
|
// //URL.revokeObjectURL(url);
|
||||||
|
// };
|
||||||
|
|
||||||
const downloadFromUint8Array = (data, fileName) => {
|
|
||||||
let uint8Array = data;
|
|
||||||
let blob = new Blob([uint8Array], { type: "text/plain" });
|
|
||||||
// 使用file-saver.js
|
|
||||||
saveAs(blob, fileName);
|
|
||||||
|
|
||||||
//let url = URL.createObjectURL(blob);
|
|
||||||
//let a = document.createElement("a");
|
|
||||||
//a.href = url;
|
|
||||||
//a.download = fileName;
|
|
||||||
//a.click();
|
|
||||||
//URL.revokeObjectURL(url);
|
|
||||||
};
|
|
||||||
// 刷新展示的下载进度
|
// 刷新展示的下载进度
|
||||||
const updateDownloadQuene = (code, key, value) => {
|
const updateDownloadQuene = (code, key, value) => {
|
||||||
for (let index in downloadQuene.value) {
|
for (let index in downloadQuene.value) {
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<n-list hoverable>
|
<n-list hoverable>
|
||||||
<n-list-item>
|
<n-list-item>
|
||||||
<p style="font-size:larger;position:absolute;left:5px;">选择加密算法:</p>
|
<p style="font-size:larger;position:absolute;left:5px;user-select: none;">选择加密算法:</p>
|
||||||
<br />
|
<br />
|
||||||
<!-- <br /> -->
|
<!-- <br /> -->
|
||||||
<!-- <br /> -->
|
<!-- <br /> -->
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
</n-flex>
|
</n-flex>
|
||||||
</n-list-item>
|
</n-list-item>
|
||||||
<n-list-item>
|
<n-list-item>
|
||||||
<p style="font-size:larger;position:absolute;left:5px;">选择密钥组成:</p>
|
<p style="font-size:larger;position:absolute;left:5px;user-select: none;">选择密钥组成:</p>
|
||||||
<br />
|
<br />
|
||||||
<n-flex justify="end">
|
<n-flex justify="end">
|
||||||
<span v-for="k in keyButtons" style="margin:5px">
|
<span v-for="k in keyButtons" style="margin:5px">
|
||||||
@@ -11,8 +11,8 @@
|
|||||||
<!-- <div style="margin-bottom: 12px">
|
<!-- <div style="margin-bottom: 12px">
|
||||||
<n-icon size="48" :depth="3"></n-icon>
|
<n-icon size="48" :depth="3"></n-icon>
|
||||||
</div>-->
|
</div>-->
|
||||||
<n-text style="font-size: 16px">点击此处或者拖动文件到该区域来上传</n-text>
|
<n-text style="font-size: 16px;user-select: none;">点击此处或者拖动文件到该区域来上传</n-text>
|
||||||
<n-p depth="3" style="margin: 8px 0 0 0">
|
<n-p depth="3" style="margin: 8px 0 0 0;user-select: none;">
|
||||||
最大支持200MB大小文件,其实只是懒得做分片上传而已
|
最大支持200MB大小文件,其实只是懒得做分片上传而已
|
||||||
<br />虽然理论上没有人有能力审查你上传的东西
|
<br />虽然理论上没有人有能力审查你上传的东西
|
||||||
<br />反正没人用写这么多干什么。。。
|
<br />反正没人用写这么多干什么。。。
|
||||||
@@ -31,58 +31,57 @@
|
|||||||
:max-height="250"
|
:max-height="250"
|
||||||
:bordered="false"
|
:bordered="false"
|
||||||
:single-line="false"
|
:single-line="false"
|
||||||
|
style="user-select: none;"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ref, onMounted } from "vue";
|
import { ref, onMounted } from "vue";
|
||||||
import aesjs from "aes-js";
|
// import aesjs from "aes-js";
|
||||||
import { Base64 } from "js-base64";
|
// import { Base64 } from "js-base64";
|
||||||
import { useMessage, useNotification } from "naive-ui";
|
import { useMessage, useNotification } from "naive-ui";
|
||||||
import useClipboard from "vue-clipboard3";
|
import useClipboard from "vue-clipboard3";
|
||||||
import { useSettingStore } from "@/pinia/store";
|
import { useSettingStore } from "@/pinia/store";
|
||||||
import { sm4 } from 'sm-crypto'
|
// import { sm4 } from 'sm-crypto'
|
||||||
import {NUpload,NUploadDragger,NText,NP,NFlex,NDataTable,NButton,NInputNumber} from 'naive-ui'
|
import {NUpload,NUploadDragger,NText,NP,NFlex,NDataTable,NButton,NInputNumber} from 'naive-ui'
|
||||||
|
import {encrypt,encryptString,generateKey} from '../func/upload'
|
||||||
|
|
||||||
const setting = useSettingStore();
|
const setting = useSettingStore();
|
||||||
const { toClipboard } = useClipboard();
|
const { toClipboard } = useClipboard();
|
||||||
const message = useMessage();
|
const message = useMessage();
|
||||||
const notification = useNotification();
|
const notification = useNotification();
|
||||||
|
|
||||||
// 目前使用加密
|
|
||||||
const activeFuction = setting.activeFuction;
|
|
||||||
// 启用的密钥组成
|
|
||||||
const activeKeyButtons = setting.activeKeyMap;
|
|
||||||
// 服务端端口
|
// 服务端端口
|
||||||
const serverPort = setting.serverPort;
|
const serverPort = setting.serverPort;
|
||||||
|
|
||||||
// console.log(activeFuction,activeKeyButtons)
|
// console.log(activeFuction,activeKeyButtons)
|
||||||
var charMap = ""
|
// var charMap = ""
|
||||||
for(let i of setting.activeKeyMap){
|
// for(let i of setting.activeKeyMap){
|
||||||
if(i === 'A-Z'){
|
// if(i === 'A-Z'){
|
||||||
charMap = charMap + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
// charMap = charMap + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||||
}else if(i === "a-z"){
|
// }else if(i === "a-z"){
|
||||||
charMap = charMap + 'abcdefghijklmnopqrstuvwxyz'
|
// charMap = charMap + 'abcdefghijklmnopqrstuvwxyz'
|
||||||
}else if(i === '0-9'){
|
// }else if(i === '0-9'){
|
||||||
charMap = charMap + '0123456789'
|
// charMap = charMap + '0123456789'
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
// 生成密钥
|
// // 生成密钥
|
||||||
const generateKey = function() {
|
// const generateKey = function() {
|
||||||
if(setting.activeFuction === "不加密"){
|
// if(setting.activeFuction === "不加密"){
|
||||||
return ''
|
// return ''
|
||||||
}
|
// }
|
||||||
var returnStr = "",
|
// var returnStr = "",
|
||||||
length = setting.activeFuction === "AES128" ? 16 : 32
|
// length = setting.activeFuction === "AES128" ? 16 : 32
|
||||||
// charMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
// // charMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||||
|
|
||||||
for (var i = 0; i < length; i++) {
|
// for (var i = 0; i < length; i++) {
|
||||||
var index = Math.round(Math.random() * charMap.length);
|
// var index = Math.round(Math.random() * charMap.length);
|
||||||
returnStr += charMap.substring(index, index + 1);
|
// returnStr += charMap.substring(index, index + 1);
|
||||||
}
|
// }
|
||||||
return returnStr;
|
// return returnStr;
|
||||||
};
|
// };
|
||||||
|
|
||||||
// 上传文件用
|
// 上传文件用
|
||||||
const uploadRef = ref(null);
|
const uploadRef = ref(null);
|
||||||
@@ -99,69 +98,68 @@ const baseUrl =
|
|||||||
location.protocol + "//" + location.hostname + ":" + serverPort + "/";
|
location.protocol + "//" + location.hostname + ":" + serverPort + "/";
|
||||||
|
|
||||||
|
|
||||||
const blob2Uint8Array = function(blob) {
|
// const blob2Uint8Array = function(blob) {
|
||||||
return new Promise((resolve, reject) => {
|
// return new Promise((resolve, reject) => {
|
||||||
let reader = new FileReader();
|
// let reader = new FileReader();
|
||||||
reader.readAsArrayBuffer(blob);
|
// reader.readAsArrayBuffer(blob);
|
||||||
reader.onload = function() {
|
// reader.onload = function() {
|
||||||
let buffer = reader.result;
|
// let buffer = reader.result;
|
||||||
let uint8array = new Uint8Array(buffer);
|
// let uint8array = new Uint8Array(buffer);
|
||||||
resolve(uint8array);
|
// resolve(uint8array);
|
||||||
};
|
// };
|
||||||
reader.onerror = function() {
|
// reader.onerror = function() {
|
||||||
reject(reader.error);
|
// reject(reader.error);
|
||||||
};
|
// };
|
||||||
});
|
// });
|
||||||
};
|
// };
|
||||||
// 包含AES128和AES256
|
// // 包含AES128和AES256
|
||||||
const AES = (key,data)=>{
|
// const AES = (key,data)=>{
|
||||||
key = aesjs.utils.utf8.toBytes(key);
|
// key = aesjs.utils.utf8.toBytes(key);
|
||||||
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
|
// var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
|
||||||
var encryptedBytes = aesCtr.encrypt(data);
|
// var encryptedBytes = aesCtr.encrypt(data);
|
||||||
return encryptedBytes;
|
// return encryptedBytes;
|
||||||
}
|
// }
|
||||||
const SM4 = (key,data)=>{
|
// const SM4 = (key,data)=>{
|
||||||
// console.log(key)
|
// // console.log(key)
|
||||||
var encryptedBytes = sm4.encrypt(data,key,{padding: 'pkcs#7',output:'array'});
|
// var encryptedBytes = sm4.encrypt(data,key,{padding: 'pkcs#7',output:'array'});
|
||||||
// console.log(encryptedBytes, sm4.decrypt(encryptedBytes, key,{output:'array'}))
|
// // console.log(encryptedBytes, sm4.decrypt(encryptedBytes, key,{output:'array'}))
|
||||||
return new Uint8Array(encryptedBytes);
|
// return new Uint8Array(encryptedBytes);
|
||||||
}
|
// }
|
||||||
const encrypt = (key, data, fileName) => {
|
// const encrypt = (key, data, fileName) => {
|
||||||
return blob2Uint8Array(data).then(data => {
|
// return blob2Uint8Array(data).then(data => {
|
||||||
let encrypted_data = null
|
// let encrypted_data = null
|
||||||
if(setting.activeFuction === "不加密"){
|
// if(setting.activeFuction === "不加密"){
|
||||||
encrypted_data = data
|
// encrypted_data = data
|
||||||
}else if(setting.activeFuction != "SM4"){
|
// }else if(setting.activeFuction != "SM4"){
|
||||||
message.info(`开始加密${fileName}`);
|
// message.info(`开始加密${fileName}`);
|
||||||
encrypted_data = AES(key,data)
|
// encrypted_data = AES(key,data)
|
||||||
message.info(`${fileName}加密完成`);
|
// message.info(`${fileName}加密完成`);
|
||||||
}else{
|
// }else{
|
||||||
message.info(`开始加密${fileName}`);
|
// message.info(`开始加密${fileName}`);
|
||||||
encrypted_data = SM4(key,data)
|
// encrypted_data = SM4(key,data)
|
||||||
message.info(`${fileName}加密完成`);
|
// message.info(`${fileName}加密完成`);
|
||||||
}
|
// }
|
||||||
return encrypted_data
|
// return encrypted_data
|
||||||
});
|
// });
|
||||||
};
|
// };
|
||||||
const encryptString = (key, str) => {
|
// const encryptString = (key, str) => {
|
||||||
// console.log(key)
|
// // console.log(key)
|
||||||
if(setting.activeFuction === "不加密"){
|
// if(setting.activeFuction === "不加密"){
|
||||||
return sm4.encrypt(str, 'miaospringmiaospringmiaospringao')
|
// return sm4.encrypt(str, 'miaospringmiaospringmiaospringao')
|
||||||
}else if(setting.activeFuction !== "SM4"){
|
// }else if(setting.activeFuction !== "SM4"){
|
||||||
key = aesjs.utils.utf8.toBytes(key);
|
// key = aesjs.utils.utf8.toBytes(key);
|
||||||
var data = aesjs.utils.utf8.toBytes(str);
|
// var data = aesjs.utils.utf8.toBytes(str);
|
||||||
var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
|
// var aesCtr = new aesjs.ModeOfOperation.ctr(key, new aesjs.Counter(5));
|
||||||
var encryptedBytes = aesCtr.encrypt(data);
|
// var encryptedBytes = aesCtr.encrypt(data);
|
||||||
return Base64.encode(encryptedBytes);
|
// return Base64.encode(encryptedBytes);
|
||||||
}else{
|
// }else{
|
||||||
return sm4.encrypt(str, key)
|
// return sm4.encrypt(str, key)
|
||||||
}
|
// }
|
||||||
};
|
// };
|
||||||
|
|
||||||
const clickUpload = function(){
|
const clickUpload = function(){
|
||||||
// for(let i of uploadRef.value)console.log(i)
|
// for(let i of uploadRef.value)console.log(i)
|
||||||
// console.log(uploadRef.value)
|
// console.log(uploadRef.value)
|
||||||
message.info(`开始上传`);
|
|
||||||
uploadRef.value.submit();
|
uploadRef.value.submit();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,13 +182,13 @@ const customRequest = ({
|
|||||||
onError,
|
onError,
|
||||||
onProgress
|
onProgress
|
||||||
}) => {
|
}) => {
|
||||||
// console.log(file);
|
|
||||||
file = file.file;
|
file = file.file;
|
||||||
var fileName = file.name;
|
var fileName = file.name;
|
||||||
const key = generateKey();
|
const key = generateKey(setting);
|
||||||
const encryptedFileName = encryptString(key, fileName);
|
const encryptedFileName = encryptString(key, fileName, setting);
|
||||||
var f = new Blob([file]);
|
var f = new Blob([file]);
|
||||||
encrypt(key, f, fileName).then(data => {
|
encrypt(key, f, fileName, setting, message).then(data => {
|
||||||
|
message.info(`开始上传${fileName}`);
|
||||||
const params = {
|
const params = {
|
||||||
fileName: encryptedFileName,
|
fileName: encryptedFileName,
|
||||||
downloadCredit:downloadCredit.value == null ? -1 : downloadCredit.value
|
downloadCredit:downloadCredit.value == null ? -1 : downloadCredit.value
|
||||||
@@ -211,9 +209,9 @@ const customRequest = ({
|
|||||||
if (xhr.readyState === 4 && xhr.status === 200) {
|
if (xhr.readyState === 4 && xhr.status === 200) {
|
||||||
let id = xhr.responseText;
|
let id = xhr.responseText;
|
||||||
let code = id + key
|
let code = id + key
|
||||||
if(setting.activeFuction === "SM4"){
|
// if(setting.activeFuction === "SM4"){
|
||||||
code = id + 'SM4' + key
|
// code = id + 'SM4' + key
|
||||||
}
|
// }
|
||||||
file_Code_Map.value.push({
|
file_Code_Map.value.push({
|
||||||
code: code,
|
code: code,
|
||||||
fileName: fileName
|
fileName: fileName
|
||||||
+2
-2
@@ -14,8 +14,8 @@ export default defineConfig({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
server:{
|
server:{
|
||||||
host:'0.0.0.0',
|
// host:'0.0.0.0',
|
||||||
port:'17057',
|
port:'17058',
|
||||||
open:true,
|
open:true,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
Reference in new issue
Block a user