account server integration, users and ban checking. limited support for /v1/people as well

This commit is contained in:
jay.poff@outlook.com
2020-05-07 00:51:56 -05:00
parent 4e9f3909c4
commit 100709536a
15 changed files with 930 additions and 67 deletions

441
package-lock.json generated
View File

@@ -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",

View File

@@ -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"
}
}

View File

View File

@@ -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
};

30
src/models/user.js Normal file
View File

@@ -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
};

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + xml(response));
}
}
catch (e)
{
//console.error(e);
}
const discovery = await database.getDiscoveryHosts();
switch(discovery.has_error)
{

View File

@@ -2,4 +2,5 @@ module.exports = {
DISCOVERY: require('./discovery'),
POST: require('./post'),
COMMUNITY: require('./communities'),
PEOPLE: require('./people'),
};

View File

@@ -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;

View File

@@ -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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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);

View File

@@ -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));

125
src/util/authentication.js Normal file
View File

@@ -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;

150
src/util/peoplePostGen.js Normal file
View File

@@ -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;
}

View File

@@ -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;