From 100709536afc1c1dcfbb20f25a4fc72607ea45c9 Mon Sep 17 00:00:00 2001 From: "jay.poff@outlook.com" <32065563+CaramelKat@users.noreply.github.com> Date: Thu, 7 May 2020 00:51:56 -0500 Subject: [PATCH] account server integration, users and ban checking. limited support for /v1/people as well --- package-lock.json | 441 ++++++++++++++++++ package.json | 5 +- src/api/index.js | 0 src/database.js | 10 + src/models/user.js | 30 ++ src/services/miiverse-api/index.js | 3 +- .../miiverse-api/routes/communities.js | 2 +- src/services/miiverse-api/routes/discovery.js | 30 ++ src/services/miiverse-api/routes/index.js | 1 + src/services/miiverse-api/routes/people.js | 40 ++ src/services/miiverse-api/routes/post.js | 117 +++-- src/testingDatabase.js | 28 +- src/util/authentication.js | 125 +++++ src/util/peoplePostGen.js | 150 ++++++ src/util/processHeaders.js | 15 - 15 files changed, 930 insertions(+), 67 deletions(-) delete mode 100644 src/api/index.js create mode 100644 src/models/user.js create mode 100644 src/services/miiverse-api/routes/people.js create mode 100644 src/util/authentication.js create mode 100644 src/util/peoplePostGen.js delete mode 100644 src/util/processHeaders.js diff --git a/package-lock.json b/package-lock.json index 2cd7465..62a62b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -98,6 +98,18 @@ "negotiator": "0.6.2" } }, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", @@ -109,11 +121,43 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, "basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -122,6 +166,24 @@ "safe-buffer": "5.1.2" } }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz", @@ -205,11 +267,26 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", @@ -262,6 +339,15 @@ "integrity": "sha1-6Z5384LGjy5asrPzqCuAMZV1Kag=", "dev": true }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -270,6 +356,12 @@ "ms": "2.0.0" } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, "denque": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", @@ -321,6 +413,16 @@ } } }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -410,6 +512,36 @@ "resolved": "https://registry.npmjs.org/express-subdomain/-/express-subdomain-1.0.5.tgz", "integrity": "sha1-mQ75eUC39MKCPZWTZIt5voWKY4s=" }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -424,6 +556,23 @@ "unpipe": "~1.0.0" } }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", @@ -445,11 +594,42 @@ "universalify": "^1.0.0" } }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", + "dev": true + }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", @@ -462,6 +642,17 @@ "toidentifier": "1.0.0" } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -480,11 +671,75 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "isemail": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", + "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", + "dev": true, + "requires": { + "punycode": "2.x.x" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "joi": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-13.7.0.tgz", + "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==", + "dev": true, + "requires": { + "hoek": "5.x.x", + "isemail": "3.x.x", + "topo": "3.x.x" + }, + "dependencies": { + "hoek": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-5.0.4.tgz", + "integrity": "sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w==", + "dev": true + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, "jsonfile": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", @@ -494,6 +749,18 @@ "universalify": "^1.0.0" } }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, "kareem": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", @@ -695,16 +962,46 @@ "xtend": "^4.0.0" } }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "dev": true + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, + "node-expat": { + "version": "2.3.18", + "resolved": "https://registry.npmjs.org/node-expat/-/node-expat-2.3.18.tgz", + "integrity": "sha512-9dIrDxXePa9HSn+hhlAg1wXkvqOjxefEbMclGxk2cEnq/Y3U7Qo5HNNqeo3fQ4bVmLhcdt3YN1TZy7WMZy4MHw==", + "dev": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.13.2" + } + }, + "node-rsa": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-1.0.8.tgz", + "integrity": "sha512-q8knkMHEqViIX/fshOltCHTtlt4Nw5wpBpu0//LB1tkxqYZB/001dYMwbPvTPiENwKvPqVDkhxK6J4fV09oa7w==", + "requires": { + "asn1": "^0.2.4" + } + }, "node-snowflake": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/node-snowflake/-/node-snowflake-0.0.1.tgz", "integrity": "sha1-C+XqvVsRMfY55j6JxfgtqoFLOrk=" }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -745,6 +1042,12 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -759,6 +1062,12 @@ "ipaddr.js": "1.9.1" } }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -809,6 +1118,42 @@ "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + } + } + }, "require_optional": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", @@ -915,6 +1260,23 @@ "memory-pager": "^1.0.2" } }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -939,6 +1301,48 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, + "topo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", + "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==", + "dev": true, + "requires": { + "hoek": "6.x.x" + }, + "dependencies": { + "hoek": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz", + "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==", + "dev": true + } + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -972,6 +1376,15 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -982,11 +1395,39 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "xml2json": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/xml2json/-/xml2json-0.12.0.tgz", + "integrity": "sha512-EPJHRWJnJUYbJlzR4pBhZODwWdi2IaYGtDdteJi0JpZ4OD31IplWALuit8r73dJuM4iHZdDVKY1tLqY2UICejg==", + "dev": true, + "requires": { + "hoek": "^4.2.1", + "joi": "^13.1.2", + "node-expat": "^2.3.18" + } + }, "xmlbuilder": { "version": "13.0.2", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", diff --git a/package.json b/package.json index 61ebd5b..b209dd5 100644 --- a/package.json +++ b/package.json @@ -21,12 +21,15 @@ "mongoose": "^5.8.3", "mongoose-unique-validator": "^2.0.3", "morgan": "^1.10.0", + "node-rsa": "^1.0.8", "node-snowflake": "0.0.1", "xmlbuilder": "^13.0.2", "xmlbuilder2": "0.0.4" }, "devDependencies": { "multer": "^1.4.2", - "object-to-xml": "^2.0.0" + "object-to-xml": "^2.0.0", + "request": "^2.88.2", + "xml2json": "^0.12.0" } } diff --git a/src/api/index.js b/src/api/index.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/database.js b/src/database.js index 4ebc0ee..811fc78 100644 --- a/src/database.js +++ b/src/database.js @@ -4,6 +4,7 @@ const { TOPIC } = require('./models/topic'); const { ENDPOINT } = require('./models/endpoint'); const { COMMUNITY } = require('./models/communities'); const { POST } = require('./models/post'); +const { USER } = require('./models/user'); const { uri, database, options } = mongooseConfig; let connection; @@ -91,6 +92,14 @@ async function getDiscoveryHosts() { }); } +async function getUserByPID(PID) { + verifyConnected(); + + return USER.findOne({ + pid: PID + }); +} + async function getServerConfig() { verifyConnected(); return ENDPOINT.findOne({ @@ -108,5 +117,6 @@ module.exports = { getPostsByCommunity, getPostsByCommunityKey, getPostByID, + getUserByPID, getServerConfig }; \ No newline at end of file diff --git a/src/models/user.js b/src/models/user.js new file mode 100644 index 0000000..f1c69c7 --- /dev/null +++ b/src/models/user.js @@ -0,0 +1,30 @@ +const { Schema, model } = require('mongoose'); + +const UserSchema = new Schema({ + pid: Number, + created_at: String, + user_id: String, + /** + * Account Status + * 0 - Fine + * 1 - Limited from Posting + * 2 - Temporary Ban + * 3 - Forever Ban + */ + account_status: { + type: Number, + default: 0 + }, + mii: String, + official: { + type: Boolean, + default: false + } +}); + +const USER = model('USER', UserSchema); + +module.exports = { + UserSchema, + USER +}; \ No newline at end of file diff --git a/src/services/miiverse-api/index.js b/src/services/miiverse-api/index.js index 2c68a48..02fedec 100644 --- a/src/services/miiverse-api/index.js +++ b/src/services/miiverse-api/index.js @@ -17,7 +17,7 @@ logger.info('[MIIVERSE] Creating \'discovery\' subdomain'); router.use(subdomain('discovery.olv', discovery)); logger.info('[MIIVERSE] Creating \'api\' subdomain'); router.use(subdomain('api.olv', api)); -router.use(subdomain('ca039cba', api)); +router.use(subdomain('4034a63d', discovery)); logger.info('[MIIVERSE] Importing middleware'); @@ -28,5 +28,6 @@ discovery.use(pnidMiddleware); discovery.use('/v1/endpoint', routes.DISCOVERY); api.use('/v1/posts', routes.POST); api.use('/v1/communities/', routes.COMMUNITY); +api.use('/v1/people/', routes.PEOPLE); module.exports = router; \ No newline at end of file diff --git a/src/services/miiverse-api/routes/communities.js b/src/services/miiverse-api/routes/communities.js index 58ec9b5..d9794f5 100644 --- a/src/services/miiverse-api/routes/communities.js +++ b/src/services/miiverse-api/routes/communities.js @@ -2,7 +2,7 @@ var express = require('express'); var router = express.Router(); const database = require('../../../database'); const comPostGen = require('../../../util/CommunityPostGen'); -const processHeaders = require('../../../util/processHeaders'); +const processHeaders = require('../../../util/authentication'); /* GET post titles. */ router.get('/0/posts', function (req, res) { diff --git a/src/services/miiverse-api/routes/discovery.js b/src/services/miiverse-api/routes/discovery.js index 9891402..af5d2ab 100644 --- a/src/services/miiverse-api/routes/discovery.js +++ b/src/services/miiverse-api/routes/discovery.js @@ -1,11 +1,41 @@ var express = require('express'); var xml = require('object-to-xml'); const database = require('../../../database'); +const util = require('../../../util/authentication'); var router = express.Router(); /* GET discovery server. */ router.get('/', function (req, res) { database.connect().then(async e => { + try + { + let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]); + let usrObj; + usrObj = await util.data.processUser(pid); + switch (usrObj.account_status) { + case 0: + break; + case 1: + case 2: + case 3: + res.set("Content-Type", "application/xml"); + res.statusCode = 400; + response = { + result: { + has_error: 1, + version: 1, + code: 400, + error_code: 7, + message: "POSTING_FROM_NNID" + } + }; + res.send("\n" + xml(response)); + } + } + catch (e) + { + //console.error(e); + } const discovery = await database.getDiscoveryHosts(); switch(discovery.has_error) { diff --git a/src/services/miiverse-api/routes/index.js b/src/services/miiverse-api/routes/index.js index aca9287..2e145e3 100644 --- a/src/services/miiverse-api/routes/index.js +++ b/src/services/miiverse-api/routes/index.js @@ -2,4 +2,5 @@ module.exports = { DISCOVERY: require('./discovery'), POST: require('./post'), COMMUNITY: require('./communities'), + PEOPLE: require('./people'), }; \ No newline at end of file diff --git a/src/services/miiverse-api/routes/people.js b/src/services/miiverse-api/routes/people.js new file mode 100644 index 0000000..efbf161 --- /dev/null +++ b/src/services/miiverse-api/routes/people.js @@ -0,0 +1,40 @@ +var express = require('express'); +var router = express.Router(); +const database = require('../../../database'); +const pplPostGen = require('../../../util/peoplePostGen'); +const processHeaders = require('../../../util/authentication'); + +/* GET post titles. */ +router.get('/', function (req, res) { + database.connect().then(async e => { + /* Parse out parameters from URL and headers */ + //const paramPack = processHeaders.data.decodeParamPack(req.headers["x-nintendo-parampack"]); + //"[0:1]=1407375153523200" + let community = await database.getCommunityByTitleID(1407375153321472); + if(community != null) + { + let posts; + if(req.query.search_key) + posts = await database.getPostsByCommunityKey(community, parseInt(req.query.limit), req.query.search_key); + else + posts = await database.getPostsByCommunity(community, parseInt(req.query.limit)); + + /* Build formatted response and send it off. */ + let response; + if(req.query.with_mii === 1) + response = await pplPostGen.PostsResponseWithMii(posts, community); + else + response = await pplPostGen.PostsResponse(posts, community); + res.contentType("application/xml"); + res.send(response); + } + else + { + res.status(404); + res.send(); + } + + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/src/services/miiverse-api/routes/post.js b/src/services/miiverse-api/routes/post.js index b51a3e2..f99c01c 100644 --- a/src/services/miiverse-api/routes/post.js +++ b/src/services/miiverse-api/routes/post.js @@ -1,67 +1,88 @@ var express = require('express'); var router = express.Router(); const moment = require('moment'); +var xml = require('object-to-xml'); const { POST } = require('../../../models/post'); -const processHeaders = require('../../../util/processHeaders'); +const util = require('../../../util/authentication'); const database = require('../../../database'); var multer = require('multer'); const snowflake = require('node-snowflake').Snowflake; var upload = multer(); /* GET post titles. */ -router.post('/', upload.none(), function (req, res, next) { - let paramPackData = processHeaders.data.decodeParamPack(req.headers["x-nintendo-parampack"]); - /*let dec = Buffer.from(paramPack, "base64").toString("ascii"); - dec = dec.slice(1, -1).split("\\"); - const paramPackData = {}; - for (let i = 0; i < dec.length; i += 2) { - paramPackData[dec[i].trim()] = dec[i + 1].trim(); - }*/ - const creationDate = moment().format('YYYY-MM-DD HH:MM:SS'); - let appData = ""; - if (req.body.app_data) { - appData = req.body.app_data.replace(/\0/g, "").trim(); +router.post('/', upload.none(), async function (req, res, next) { + try + { + let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]); + let pid = util.data.processServiceToken(req.headers["x-nintendo-servicetoken"]); + let usrObj; + usrObj = await util.data.processUser(pid); + const creationDate = moment().format('YYYY-MM-DD HH:MM:SS'); + let appData = ""; + if (req.body.app_data) { + appData = req.body.app_data.replace(/\0/g, "").trim(); + } + let painting = ""; + if (req.body.painting) { + painting = req.body.painting.replace(/\0/g, "").trim(); + } + let screenshot = ""; + if (req.body.screenshot) { + screenshot = req.body.screenshot.replace(/\0/g, "").trim(); + } + const document = { + title_id: paramPackData.title_id, + screen_name: usrObj.user_id, + body: req.body.body, + app_data: appData, + painting: painting, + screenshot: screenshot, + url: req.body.url, + search_key: req.body.search_key, + topic_tag: req.body.topic_tag, + community_id: req.body.community_id, + country_id: paramPackData.country_id, + created_at: creationDate, + feeling_id: req.body.feeling_id, + id: snowflake.nextId(), + is_autopost: req.body.is_autopost, + is_spoiler: req.body.is_spoiler, + is_app_jumpable: req.body.is_app_jumpable, + language_id: req.body.language_id, + mii: usrObj.mii, + mii_face_url: "http://mii-images.account.pretendo.cc/", + pid: pid, + platform_id: paramPackData.platform_id, + region_id: paramPackData.region_id, + }; + const newPost = new POST(document); + newPost.save(); + res.sendStatus(200); } - let painting = ""; - if (req.body.painting) { - painting = req.body.painting.replace(/\0/g, "").trim(); + catch (e) + { + console.error(e); } - let screenshot = ""; - if (req.body.screenshot) { - screenshot = req.body.screenshot.replace(/\0/g, "").trim(); + finally + { + res.set("Content-Type", "application/xml"); + res.statusCode = 400; + response = { + result: { + has_error: 1, + version: 1, + code: 400, + error_code: 7, + message: "POSTING_FROM_NNID" + } + }; + res.send("\n" + xml(response)); } - const document = { - title_id: paramPackData.title_id, - screen_name: "unknown", - body: req.body.body, - app_data: appData, - painting: painting, - screenshot: screenshot, - url: req.body.url, - search_key: req.body.search_key, - topic_tag: req.body.topic_tag, - community_id: req.body.community_id, - country_id: paramPackData.country_id, - created_at: creationDate, - feeling_id: req.body.feeling_id, - id: snowflake.nextId(), - is_autopost: req.body.is_autopost, - is_spoiler: req.body.is_spoiler, - is_app_jumpable: req.body.is_app_jumpable, - language_id: req.body.language_id, - mii: "AwEAQDqm28WAxLBw1aAFCOgGMzNhzwAApkAGJkIAaQBsAGwAeQAGJgAAAAAAAH8zAAAzAQNrRBYgNUYQ4QiWaA0AACEAUkpMQgBpAGwAbAB5AAAAAAAAAAAAAAAAAPPc", - mii_face_url: "http://mii-images.account.nintendo.net/u4w5ibugms72_normal_face.png", - pid: 0, - platform_id: paramPackData.platform_id, - region_id: paramPackData.region_id, - }; - const newPost = new POST(document); - newPost.save(); - res.sendStatus(200); + }); router.post('/*/empathies', upload.none(), function (req, res, next) { - let paramPackData = processHeaders.data.decodeParamPack(req.headers["x-nintendo-parampack"]); + let paramPackData = util.data.decodeParamPack(req.headers["x-nintendo-parampack"]); let pid = req.originalUrl.replace('/v1/posts/', '').replace('/empathies','').trim(); database.connect().then(async emp => { const post = await database.getPostByID(pid); diff --git a/src/testingDatabase.js b/src/testingDatabase.js index 860615f..09d6916 100644 --- a/src/testingDatabase.js +++ b/src/testingDatabase.js @@ -1,7 +1,10 @@ const { COMMUNITY } = require('./models/communities'); +const { USER } = require('./models/user'); const database = require('./database'); +const util = require('./util/authentication'); +const moment = require('moment'); -database.connect().then(async yeet => { +/**database.connect().then(async yeet => { const doc0 = { empathy_count: 0, id: 0, @@ -49,6 +52,29 @@ console.log(snowflake.nextId()); console.log(snowflake.nextId()); console.log(uid.getUniqueID());*/ +util.data.processUser('1346301359'); +/*database.connect().then(async yeet => { + let pidr = await database.getUserByPID(pid); + if(pidr != null) + console.log(pidr); + else + console.log("no user exists"); + const newUsr = { + pid: pid, + created_at: moment().format('YYYY-MM-DD HH:mm:SS'), + account_status: 0, + mii: "AwAAEEJ4VAIDBdLCgWl0xBYACARJKQAAAAhmAHQAYgA6AGQAZgBmAGoAZABpAAAAIgAeARJqYww3NEUUAhQVbggAACkAUkhQRwBhAGIAaQBlACAAQQBuAG4AAAAAANLs", + official: false + }; + const newUsrObj = new USER(newUsr); + newUsrObj.save(); +});*/ + +/**let data = 'cBW4iaphrOOGDnLXodAtLJr1bImHcKUsd0stwucPe09CPDK5FjKQSYx/VhH8JVMtE2bhwDPmdEHMwbuTI/Gsi5/YCNJrmTUVmh90Q7SQ3r8LmwTyFGi9B5pzWPRR7HY7mmprQ8fnsTxn5SLXfBY9wbDMUhBOgseixW9Ekz3UiHRvaLEkStsHfRZOaUmM/ezsw3H/hs1irwBaP+LBBSAyTGPCuJYr3rwYeL8KZ0v5m9xvFFnHHdfcbLUDki3/4SvLv11HeA=='; +let tknBuffer = Buffer.from(data, 'base64'); +console.log(tknBuffer); +let token = util.data.decryptToken(tknBuffer); +console.log("Token: " + token.readUInt32LE(0x2));**/ //database.getDiscoveryHosts().then(r => console.log(r.endpoint)); diff --git a/src/util/authentication.js b/src/util/authentication.js new file mode 100644 index 0000000..4201e22 --- /dev/null +++ b/src/util/authentication.js @@ -0,0 +1,125 @@ +const crypto = require('crypto'); +const NodeRSA = require('node-rsa'); +const fs = require('fs-extra'); +const database = require('../database'); +const xmlParser = require('xml2json'); +const request = require("request"); +const moment = require('moment'); +const { USER } = require('../models/user'); + +let methods = { + processUser: function(pid) { + return new Promise(function(resolve, reject) { + database.connect().then(async yeet => { + let userObject = await database.getUserByPID(pid); + if(userObject != null) + resolve(userObject); + else + { + await request({ + url: "http://account.miiverse.cc/v1/api/miis?pids=" + pid, + headers: { + 'X-Nintendo-Client-ID': 'a2efa818a34fa16b8afbc8a74eba3eda', + 'X-Nintendo-Client-Secret': 'c91cdb5658bd4954ade78533a339cf9a' + } + }, function (error, response, body) { + if (!error && response.statusCode === 200) { + let xml = xmlParser.toJson(body, {object: true}); + const newUsr = { + pid: pid, + created_at: moment().format('YYYY-MM-DD HH:mm:SS'), + user_id: xml.miis.mii.user_id, + account_status: 0, + mii: xml.miis.mii.data, + official: false + }; + const newUsrObj = new USER(newUsr); + newUsrObj.save(); + resolve(newUsr); + } + }) + + } + + }); + }); + }, + + decodeParamPack: function (paramPack) { + /* Decode base64 */ + let dec = Buffer.from(paramPack, "base64").toString("ascii"); + /* Remove starting and ending '/', split into array */ + dec = dec.slice(1, -1).split("\\"); + /* Parameters are in the format [name, val, name, val]. Copy into out{}. */ + const out = {}; + for (let i = 0; i < dec.length; i += 2) { + out[dec[i].trim()] = dec[i + 1].trim(); + } + return out; + }, + processServiceToken: function(token) { + let B64token = Buffer.from(token, 'base64'); + let decryptedToken = this.decryptToken(B64token); + let PID = decryptedToken.readUInt32LE(0x2); + return PID; + + }, + + decryptToken: function(token) { + + // Access and refresh tokens use a different format since they must be much smaller + // Assume a small length means access or refresh token + if (token.length <= 32) { + const cryptoPath = `${__dirname}/../certs/access`; + const aesKey = Buffer.from(fs.readFileSync(`${cryptoPath}/aes.key`, { encoding: 'utf8' }), 'hex'); + + const iv = Buffer.alloc(16); + + const decipher = crypto.createDecipheriv('aes-128-cbc', aesKey, iv); + + let decryptedBody = decipher.update(token); + decryptedBody = Buffer.concat([decryptedBody, decipher.final()]); + + return decryptedBody; + } + + const cryptoPath = `${__dirname}/../certs/access`; + + const cryptoOptions = { + private_key: fs.readFileSync(`${cryptoPath}/private.pem`), + hmac_secret: fs.readFileSync(`${cryptoPath}/secret.key`) + }; + + const privateKey = new NodeRSA(cryptoOptions.private_key, 'pkcs1-private-pem', { + environment: 'browser', + encryptionScheme: { + 'hash': 'sha256', + } + }); + + const cryptoConfig = token.subarray(0, 0x90); + const signature = token.subarray(0x90, 0xA4); + const encryptedBody = token.subarray(0xA4); + + const encryptedAESKey = cryptoConfig.subarray(0, 128); + const iv = cryptoConfig.subarray(128); + + const decryptedAESKey = privateKey.decrypt(encryptedAESKey); + + const decipher = crypto.createDecipheriv('aes-128-cbc', decryptedAESKey, iv); + + let decryptedBody = decipher.update(encryptedBody); + decryptedBody = Buffer.concat([decryptedBody, decipher.final()]); + + const hmac = crypto.createHmac('sha1', cryptoOptions.hmac_secret).update(decryptedBody); + const calculatedSignature = hmac.digest(); + + if (!calculatedSignature.equals(signature)) { + console.log('Token signature did not match'); + return null; + } + + return decryptedBody; +} +}; +exports.data = methods; diff --git a/src/util/peoplePostGen.js b/src/util/peoplePostGen.js new file mode 100644 index 0000000..6ce90b0 --- /dev/null +++ b/src/util/peoplePostGen.js @@ -0,0 +1,150 @@ +const xmlbuilder = require("xmlbuilder"); +const moment = require("moment"); + +class CommunityPostGen { + /* TODO lots of stubs and constants in here */ + static async PostsResponse(posts, community) { + const expirationDate = moment().add(11, 'days'); + + let xml = xmlbuilder.create("result") + .e("has_error", "0").up() + .e("version", "1").up() + .e("expire", expirationDate.format('YYYY-MM-DD HH:MM:SS')).up() + .e("request_name", "people").up() + .e("people"); + for (let i = 0; i < posts.length; i++) { + xml = xml.e("person") + .e("posts") + .e("post") + .e("body", posts[i].body).up() + .e("community_id", community.community_id).up() + .e("country_id", "254").up() + .e("created_at", posts[i].created_at).up() + .e("feeling_id", "1").up() + .e("id", posts[i].id).up() + .e("is_autopost", "0").up() + .e("is_community_private_autopost", "0").up() + .e("is_spoiler", "0").up() + .e("is_app_jumpable", "0").up() + .e("empathy_count", posts[i].empathy_count).up() + .e("language_id", "1").up(); + xml = xml.e("number", "0").up(); + if (posts[i].painting) { + xml = xml.e("painting") + .e("format", "tga").up() + .e("content", posts[i].painting).up() + .e("size", posts[i].painting.length).up() + .e("url", "https://s3.amazonaws.com/olv-public/pap/WVW69koebmETvBVqm1").up() + .up(); + } + xml = xml.e("pid", posts[i].pid).up() + .e("platform_id", "1").up() + .e("region_id", "4").up() + .e("reply_count", "0").up() + .e("screen_name", posts[i].screen_name).up() + .e("title_id", posts[i].title_id).up() + .up().up().up(); + } + + return xml.end({ pretty: true, allowEmpty: true }); + } + + static async PostsResponseWithMii(posts, community) { + let xml = xmlbuilder.create("result") + .e("has_error", "0").up() + .e("version", "1").up() + .e("request_name", "posts").up() + .e("topic") + .e("community_id", community.community_id).up() + .up() + .e("posts"); + for (let i = 0; i < posts.length; i++) { + xml = xml.e("person") + .e("posts") + .e("post") + .e("body", posts[i].body).up() + .e("community_id", community.community_id).up() + .e("country_id", "254").up() + .e("created_at", posts[i].created_at).up() + .e("feeling_id", "1").up() + .e("id", posts[i].id).up() + .e("is_autopost", "0").up() + .e("is_community_private_autopost", "0").up() + .e("is_spoiler", "0").up() + .e("is_app_jumpable", "0").up() + .e("empathy_count", posts[i].empathy_count).up() + .e("language_id", "1").up() + .e("mii", posts[i].mii).up() + .e("mii_face_url", posts[i].mii_face_url).up() + .e("number", "0").up(); + if (posts[i].painting) { + xml = xml.e("painting") + .e("format", "tga").up() + .e("content", posts[i].painting).up() + .e("size", posts[i].painting.length).up() + .e("url", "https://s3.amazonaws.com/olv-public/pap/WVW69koebmETvBVqm1").up() + .up(); + } + xml = xml.e("pid", posts[i].pid).up() + .e("platform_id", "1").up() + .e("region_id", "4").up() + .e("reply_count", "0").up() + .e("screen_name", posts[i].screen_name).up() + .e("title_id", posts[i].title_id).up() + .up(); + } + + return xml.end({ pretty: true, allowEmpty: true }); + } + + static async EmptyResponse() { + const xml = xmlbuilder.create("result") + .e("has_error", "0").up() + .e("version", "1").up(); + return xml.end({ pretty: true, allowEmpty: true }); + } + + /* TODO Again, some constants */ + static async SinglePostResponse(post) { + let xml = xmlbuilder.create("result") + .e("has_error", "0").up() + .e("version", "1").up() + .e("post"); + if (post.app_data) { + xml = xml.e("app_data", post.app_data).up(); + } + xml = xml.e("body", post.body).up() + .e("community_id", post.community_id).up() + .e("country_id", "254").up() + .e("created_at", post.created_at).up() + .e("feeling_id", "1").up() + .e("id", post.id).up() + .e("is_autopost", "0").up() + .e("is_community_private_autopost", "0").up() + .e("is_spoiler", "0").up() + .e("is_app_jumpable", "0").up() + .e("empathy_count", post.empathy_count).up() + .e("language_id", "1").up() + .e("number", "0").up(); + if (post.painting) { + xml = xml.e("painting") + .e("format", "tga").up() + .e("content", post.painting).up() + .e("size", post.painting.length).up() + .e("url", "https://s3.amazonaws.com/olv-public/pap/WVW69koebmETvBVqm1").up() + .up(); + } + xml = xml.e("pid", post.pid).up() + .e("platform_id", "1").up() + .e("region_id", "4").up() + .e("reply_count", "0").up() + .e("screen_name", post.screen_name).up() + .e("title_id", post.title_id).up() + .up(); + return xml.end({ pretty: true, allowEmpty: true }); + } +} + +if (typeof module !== "undefined") { + module.exports = CommunityPostGen; +} diff --git a/src/util/processHeaders.js b/src/util/processHeaders.js deleted file mode 100644 index 82036bc..0000000 --- a/src/util/processHeaders.js +++ /dev/null @@ -1,15 +0,0 @@ -let methods = { - decodeParamPack: function (paramPack) { - /* Decode base64 */ - let dec = Buffer.from(paramPack, "base64").toString("ascii"); - /* Remove starting and ending '/', split into array */ - dec = dec.slice(1, -1).split("\\"); - /* Parameters are in the format [name, val, name, val]. Copy into out{}. */ - const out = {}; - for (let i = 0; i < dec.length; i += 2) { - out[dec[i].trim()] = dec[i + 1].trim(); - } - return out; - } -}; -exports.data = methods;