From 9d8953792f0895acfbf9ef3529a734936205fffc Mon Sep 17 00:00:00 2001 From: droplet92 Date: Thu, 18 Feb 2021 00:36:53 +0900 Subject: [PATCH 01/24] =?UTF-8?q?node.js=20v14=20=EA=B8=B0=EC=A4=80?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=8F=8C=EC=95=84=EA=B0=80=EA=B2=8C=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +- yarn.lock | 667 +++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 483 insertions(+), 187 deletions(-) diff --git a/package.json b/package.json index 5d75dfa..2a3ffd1 100644 --- a/package.json +++ b/package.json @@ -5,13 +5,14 @@ "main": "app.js", "dependencies": { "@koa/cors": "2", + "@mapbox/node-pre-gyp": "^1.0.0", "@types/node": "^8.0.47", "koa": "^2.3.0", "koa-bodyparser": "^4.2.0", "koa-logger": "^3.1.0", "koa-router": "^7.2.1", "koa-views": "^6.1.1", - "sqlite3": "^3.1.13", + "sqlite3": "^5.0.2", "typeorm": "next", "typescript": "^2.6.1" }, diff --git a/yarn.lock b/yarn.lock index 8d7e6fd..18b5baa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6,6 +6,26 @@ version "2.2.1" resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-2.2.1.tgz#c06a1c34d787e3cee79c0d4c20e8952d1b6d75c5" +"@mapbox/node-pre-gyp@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.0.tgz#2b809e701da0f6729b47fe78ad4b9dc187a7d2e5" + integrity sha512-mEaiD1CURETR/dBIiJAwz0M0Q0mH3gCW4pPMaIlNt97mdzYUVeqGcTJSamgJpS6Tg4tBHDrOJpjdh5fJTLnyNQ== + dependencies: + detect-libc "^1.0.3" + http-proxy-agent "^4.0.1" + mkdirp "^1.0.4" + node-fetch "^2.6.1" + nopt "^5.0.0" + npmlog "^4.1.2" + rimraf "^3.0.2" + semver "^7.3.4" + tar "^6.1.0" + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + "@types/node@*": version "9.4.6" resolved "https://registry.yarnpkg.com/@types/node/-/node-9.4.6.tgz#d8176d864ee48753d053783e4e463aec86b8d82e" @@ -25,12 +45,22 @@ accepts@^1.2.2: mime-types "~2.1.18" negotiator "0.6.1" -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" + debug "4" + +ajv@^6.12.3: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" ansi-regex@^2.0.0: version "2.1.1" @@ -87,10 +117,6 @@ assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - assertion-error@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -99,13 +125,15 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= -aws4@^1.2.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== babel-code-frame@^6.22.0: version "6.26.0" @@ -135,12 +163,6 @@ bluebird@^3.0.5, bluebird@^3.1.1: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -205,6 +227,16 @@ check-error@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + cli-highlight@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-1.2.3.tgz#b200f97ed0e43d24633e89de0f489a48bb87d2bf" @@ -258,9 +290,10 @@ color-name@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" @@ -332,12 +365,6 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -350,12 +377,26 @@ debug@*, debug@3.1.0, debug@^3.1.0: dependencies: ms "2.0.0" -debug@^2.2.0, debug@^2.6.3, debug@^2.6.8: +debug@4: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +debug@^2.6.3, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" +debug@^3.2.6: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -370,9 +411,10 @@ deep-equal@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== delayed-stream@~1.0.0: version "1.0.0" @@ -394,7 +436,7 @@ destroy@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" -detect-libc@^1.0.2: +detect-libc@^1.0.2, detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" @@ -485,9 +527,10 @@ extend-shallow@^2.0.1: dependencies: is-extendable "^0.1.0" -extend@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== extsprintf@1.3.0: version "1.3.0" @@ -497,6 +540,16 @@ extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + figlet@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.2.0.tgz#6c46537378fab649146b5a6143dda019b430b410" @@ -511,12 +564,13 @@ forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.5" + combined-stream "^1.0.6" mime-types "^2.1.12" fresh@^0.5.2: @@ -531,19 +585,25 @@ fs-extra@^4.0.2: jsonfile "^4.0.0" universalify "^0.1.0" +fs-minipass@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: +fstream@^1.0.0: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" dependencies: @@ -552,6 +612,16 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: mkdirp ">=0.5 0" rimraf "2" +fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -600,6 +670,18 @@ glob@7.1.2, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.0.3, glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -608,16 +690,18 @@ growl@1.10.3: version "1.10.3" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" + ajv "^6.12.3" + har-schema "^2.0.0" has-ansi@^2.0.0: version "2.0.0" @@ -637,15 +721,6 @@ has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" -hawk@3.1.3, hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" @@ -654,10 +729,6 @@ highlight.js@^9.6.0: version "9.12.0" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - hosted-git-info@^2.1.4: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" @@ -678,11 +749,21 @@ http-errors@1.6.2, http-errors@^1.2.8, http-errors@^1.3.1, http-errors@^1.6.1, h setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== dependencies: - assert-plus "^0.2.0" + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" jsprim "^1.2.2" sshpk "^1.7.0" @@ -694,6 +775,20 @@ iconv-lite@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore-walk@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" + integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== + dependencies: + minimatch "^3.0.4" + inflation@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" @@ -801,16 +896,15 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -821,10 +915,6 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -983,6 +1073,13 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + make-error@^1.1.1: version "1.3.4" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" @@ -1001,21 +1098,33 @@ methods@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" +mime-db@1.45.0: + version "1.45.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" + integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== + mime-db@~1.33.0: version "1.33.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" -mime-types@^2.0.7, mime-types@^2.1.12, mime-types@~2.1.18, mime-types@~2.1.7: +mime-types@^2.0.7, mime-types@^2.1.12, mime-types@~2.1.18: version "2.1.18" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" dependencies: mime-db "~1.33.0" +mime-types@~2.1.19: + version "2.1.28" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" + integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ== + dependencies: + mime-db "1.45.0" + mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" -minimatch@^3.0.0, minimatch@^3.0.4: +minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -1029,12 +1138,59 @@ minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== + dependencies: + yallist "^4.0.0" + +minizlib@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +minizlib@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" +mkdirp@^0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@^1.0.3, mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mocha@^5.0.1: version "5.0.2" resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.0.2.tgz#caab0b813575141c5690c37d53c894b605ae60b5" @@ -1054,6 +1210,16 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + mz@^2.4.0, mz@^2.6.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -1062,29 +1228,68 @@ mz@^2.4.0, mz@^2.6.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@~2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" +needle@^2.2.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.6.0.tgz#24dbb55f2509e2324b4a99d61f413982013ccdbe" + integrity sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg== + dependencies: + debug "^3.2.6" + iconv-lite "^0.4.4" + sax "^1.2.4" negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" -node-pre-gyp@~0.6.38: - version "0.6.39" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" +node-addon-api@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" + integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== + +node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + +node-gyp@3.x: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-pre-gyp@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz#db1f33215272f692cd38f03238e3e9b47c5dd054" + integrity sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q== dependencies: detect-libc "^1.0.2" - hawk "3.1.3" mkdirp "^0.5.1" + needle "^2.2.1" nopt "^4.0.1" + npm-packlist "^1.1.6" npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" + rc "^1.2.7" rimraf "^2.6.1" semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" + tar "^4" + +"nopt@2 || 3", nopt@~3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" nopt@^4.0.1: version "4.0.1" @@ -1093,9 +1298,10 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -nopt@~3.0.1: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== dependencies: abbrev "1" @@ -1108,13 +1314,34 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +npm-bundled@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.1.tgz#1edd570865a94cdb1bc8220775e29466c9fb234b" + integrity sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-normalize-package-bin@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" + integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== + +npm-packlist@^1.1.6: + version "1.4.8" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" + integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-normalize-package-bin "^1.0.1" + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" dependencies: path-key "^2.0.0" -npmlog@^4.0.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: @@ -1127,9 +1354,10 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" @@ -1141,7 +1369,7 @@ on-finished@^2.1.0: dependencies: ee-first "1.1.1" -once@^1.3.0, once@^1.3.3: +once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -1167,7 +1395,7 @@ os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" -osenv@^0.1.4: +osenv@0, osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" dependencies: @@ -1250,9 +1478,10 @@ pathval@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= pify@^2.0.0: version "2.3.0" @@ -1278,17 +1507,24 @@ pseudomap@^1.0.1, pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== qs@^6.4.0: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== raw-body@^2.2.0: version "2.3.2" @@ -1299,11 +1535,12 @@ raw-body@^2.2.0: iconv-lite "0.4.19" unpipe "1.0.0" -rc@^1.1.7: - version "1.2.5" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: - deep-extend "~0.4.0" + deep-extend "^0.6.0" ini "~1.3.0" minimist "^1.2.0" strip-json-comments "~2.0.1" @@ -1323,7 +1560,7 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -readable-stream@^2.0.6, readable-stream@^2.1.4: +readable-stream@^2.0.6: version "2.3.5" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" dependencies: @@ -1339,32 +1576,31 @@ reflect-metadata@^0.1.10: version "0.1.12" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2" -request@2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" +request@^2.87.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" + aws-sign2 "~0.7.0" + aws4 "^1.8.0" caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" + combined-stream "~1.0.6" + extend "~3.0.2" forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" + 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.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" + 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.0.0" + uuid "^3.3.2" require-directory@^2.1.1: version "2.1.1" @@ -1387,24 +1623,54 @@ resolve@^1.3.2: dependencies: path-parse "^1.0.5" -rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: +rimraf@2, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: glob "^7.0.5" +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" -sax@>=0.6.0: +safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sax@>=0.6.0, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" +semver@^7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -1431,12 +1697,6 @@ signal-exit@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - source-map-support@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.3.tgz#2b3d5fff298cfa4d1afd7d4352d569e9a0158e76" @@ -1473,12 +1733,15 @@ sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" -sqlite3@^3.1.13: - version "3.1.13" - resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-3.1.13.tgz#d990a05627392768de6278bafd1a31fdfe907dd9" +sqlite3@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/sqlite3/-/sqlite3-5.0.2.tgz#00924adcc001c17686e0a6643b6cbbc2d3965083" + integrity sha512-1SdTNo+BVU211Xj1csWa8lV6KM0CtucDwRyA0VHl91wEH1Mgh7RxUpI4rVvG7OhHrzCSGaVyW5g8vKvlrk9DJA== dependencies: - nan "~2.7.0" - node-pre-gyp "~0.6.38" + node-addon-api "^3.0.0" + node-pre-gyp "^0.11.0" + optionalDependencies: + node-gyp "3.x" sshpk@^1.7.0: version "1.13.1" @@ -1519,10 +1782,6 @@ string_decoder@~1.0.3: dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -1563,27 +1822,40 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -tar-pack@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" - dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - -tar@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" +tar@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" + integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== dependencies: block-stream "*" - fstream "^1.0.2" + fstream "^1.0.12" inherits "2" +tar@^4: + version "4.4.13" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" + integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.8.6" + minizlib "^1.2.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.3" + +tar@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz#d1724e9bcc04b977b18d5c573b333a2207229a83" + integrity sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^3.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" @@ -1596,11 +1868,13 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" -tough-cookie@~2.3.0: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== dependencies: - punycode "^1.4.1" + psl "^1.1.28" + punycode "^2.1.1" ts-node@^5.0.1: version "5.0.1" @@ -1698,10 +1972,6 @@ typescript@^2.6.1: version "2.7.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.2.tgz#2d615a1ef4aee4f574425cdff7026edf81919836" -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - universalify@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" @@ -1710,6 +1980,13 @@ unpipe@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + urijs@^1.19.0: version "1.19.1" resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a" @@ -1718,9 +1995,10 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -uuid@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== validate-npm-package-license@^3.0.1: version "3.0.3" @@ -1745,6 +2023,13 @@ which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" +which@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + which@^1.2.9: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" @@ -1787,6 +2072,16 @@ yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" +yallist@^3.0.0, yallist@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yargonaut@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.2.tgz#ee7b89e98121a3f241fa926a2a6e1b6641c81b3f" From b9f460dc850fbdb857ff08381228ab8dee1c5e8d Mon Sep 17 00:00:00 2001 From: droplet92 Date: Thu, 18 Feb 2021 00:37:39 +0900 Subject: [PATCH 02/24] =?UTF-8?q?DB=20=ED=8C=8C=EC=9D=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=95=88=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b6cd1d1..1b2608f 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ node_modules .vscode yarn-error.log .idea -db +db/ From 289043829ebf5e192041aa8a6e7d46a49a2cb19b Mon Sep 17 00:00:00 2001 From: droplet92 Date: Thu, 18 Feb 2021 00:38:23 +0900 Subject: [PATCH 03/24] =?UTF-8?q?=EC=99=9C=20=EC=95=88=EB=90=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1b2608f..3971c14 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ node_modules yarn-error.log .idea db/ +*.sql \ No newline at end of file From ff9e5da872697145de5a18299023a72c70e1e019 Mon Sep 17 00:00:00 2001 From: droplet92 Date: Thu, 18 Feb 2021 00:39:27 +0900 Subject: [PATCH 04/24] =?UTF-8?q?=EC=A7=84=EC=A7=9C=20=EC=98=AC=EB=9D=BC?= =?UTF-8?q?=EA=B0=90=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/test.sql | Bin 73728 -> 73728 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/db/test.sql b/db/test.sql index 2fdc1418c41ccda3090323de2fb4e4e98c25a1a4..32bcf6ca818189f911478f514093010d6cc2e3c4 100644 GIT binary patch delta 479 zcmbu)J4ypl7>409lNrcB!XIrcG;uZ%JhwTQRD!w>&lS=*;*dJY3e+VCVy}TTX|e(v zOE=&Oter{((}?X`d>_wZn=Q84-C>g7ADt!n^X0=az$?mOjo=eL;2qYhLHPv3Ue*~V zO=y~FebuDhymL^@nsCz~g!;wm?S!0mQy3w*h0$tnun+S(Ezq)GAjZ1XaIH9HjA~}J z(^VzB@dPUyqcB$6$}?va4wNgdt&3hrqI?wIaUVmVn36H3V5{32WSlmB|t^LC|Z5q~!Hej*-|@(Yeqd7uCQ delta 82 zcmV-Y0ImOkzyyH61dtm60+Ad;0RpjLp&t(b000FK!~hTW59klu56-g?Af^wIP!10W o1p^leb#rBMa|;9m9SF12FEK!)1TYYz1b}d}1Q7iXwE+SDAJ(K8AOHXW From 023c837bc9e2e61a39f3307f1a509f95a7abb857 Mon Sep 17 00:00:00 2001 From: droplet92 Date: Thu, 18 Feb 2021 18:25:33 +0900 Subject: [PATCH 05/24] =?UTF-8?q?koa=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 +- yarn.lock | 280 ++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 200 insertions(+), 84 deletions(-) diff --git a/package.json b/package.json index 2a3ffd1..8647827 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,10 @@ "description": "koa restful example", "main": "app.js", "dependencies": { - "@koa/cors": "2", + "@koa/cors": "^3.1.0", "@mapbox/node-pre-gyp": "^1.0.0", "@types/node": "^8.0.47", - "koa": "^2.3.0", + "koa": "^2.13.1", "koa-bodyparser": "^4.2.0", "koa-logger": "^3.1.0", "koa-router": "^7.2.1", diff --git a/yarn.lock b/yarn.lock index 18b5baa..34aa47c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,9 +2,12 @@ # yarn lockfile v1 -"@koa/cors@2": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-2.2.1.tgz#c06a1c34d787e3cee79c0d4c20e8952d1b6d75c5" +"@koa/cors@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@koa/cors/-/cors-3.1.0.tgz#618bb073438cfdbd3ebd0e648a76e33b84f3a3b2" + integrity sha512-7ulRC1da/rBa6kj6P4g2aJfnET3z8Uf3SWu60cjbtxTA5g8lxRdX/Bd2P92EagGwwAhANeNw8T8if99rJliR6Q== + dependencies: + vary "^1.1.2" "@mapbox/node-pre-gyp@^1.0.0": version "1.0.0" @@ -38,12 +41,13 @@ abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" -accepts@^1.2.2: - version "1.3.5" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" +accepts@^1.3.5: + version "1.3.7" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== dependencies: - mime-types "~2.1.18" - negotiator "0.6.1" + mime-types "~2.1.24" + negotiator "0.6.2" agent-base@6: version "6.0.2" @@ -186,6 +190,14 @@ bytes@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.5.0.tgz#4c9423ea2d252c270c41b2bdefeff9bb6b62c06a" +cache-content-type@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" + integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA== + dependencies: + mime-types "^2.1.18" + ylru "^1.2.0" + camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -334,20 +346,25 @@ consolidate@^0.15.0: dependencies: bluebird "^3.1.1" -content-disposition@~0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" +content-disposition@~0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + dependencies: + safe-buffer "5.1.2" -content-type@^1.0.0: +content-type@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -cookies@~0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.7.1.tgz#7c8a615f5481c61ab9f16c833731bcb8f663b99b" +cookies@~0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90" + integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow== dependencies: - depd "~1.1.1" - keygrip "~1.0.2" + depd "~2.0.0" + keygrip "~1.1.0" copy-to@^2.0.1: version "2.0.1" @@ -371,7 +388,7 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug@*, debug@3.1.0, debug@^3.1.0: +debug@3.1.0, debug@^3.1.0, debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: @@ -428,13 +445,20 @@ depd@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" -depd@^1.1.0, depd@~1.1.1: +depd@^2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -destroy@^1.0.3: +destroy@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= detect-libc@^1.0.2, detect-libc@^1.0.3: version "1.0.3" @@ -479,19 +503,21 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" +encodeurl@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + error-ex@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" dependencies: is-arrayish "^0.2.1" -error-inject@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" - -escape-html@~1.0.1: +escape-html@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" @@ -573,9 +599,10 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -fresh@^0.5.2: +fresh@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= fs-extra@^4.0.2: version "4.0.3" @@ -733,14 +760,15 @@ hosted-git-info@^2.1.4: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" -http-assert@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.3.0.tgz#a31a5cf88c873ecbb5796907d4d6f132e8c01e4a" +http-assert@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.4.1.tgz#c5f725d677aa7e873ef736199b89686cceb37878" + integrity sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw== dependencies: deep-equal "~1.0.1" - http-errors "~1.6.1" + http-errors "~1.7.2" -http-errors@1.6.2, http-errors@^1.2.8, http-errors@^1.3.1, http-errors@^1.6.1, http-errors@~1.6.1, http-errors@~1.6.2: +http-errors@1.6.2, http-errors@^1.3.1, http-errors@^1.6.1, http-errors@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" dependencies: @@ -749,6 +777,28 @@ http-errors@1.6.2, http-errors@^1.2.8, http-errors@^1.3.1, http-errors@^1.6.1, h setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" +http-errors@^1.6.3: + version "1.8.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507" + integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +http-errors@~1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" @@ -804,6 +854,11 @@ inherits@2, inherits@2.0.3, inherits@~2.0.0, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" +inherits@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" @@ -840,9 +895,10 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" -is-generator-function@^1.0.3: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" +is-generator-function@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.8.tgz#dfb5c2b120e02b0a8d9d2c6806cd5621aa922f7b" + integrity sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ== is-stream@^1.1.0: version "1.1.0" @@ -924,9 +980,12 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -keygrip@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.2.tgz#ad3297c557069dea8bcfe7a4fa491b75c5ddeb91" +keygrip@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" + integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== + dependencies: + tsscmp "1.0.6" kind-of@^3.0.2: version "3.2.2" @@ -947,9 +1006,10 @@ koa-compose@^3.0.0: dependencies: any-promise "^1.1.0" -koa-compose@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.0.0.tgz#2800a513d9c361ef0d63852b038e4f6f2d5a773c" +koa-compose@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" + integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw== koa-convert@^1.2.0: version "1.2.0" @@ -958,10 +1018,6 @@ koa-convert@^1.2.0: co "^4.6.0" koa-compose "^3.0.0" -koa-is-json@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" - koa-logger@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/koa-logger/-/koa-logger-3.1.0.tgz#81a353f41870119d56260e0e644f04e731810039" @@ -1009,34 +1065,34 @@ koa-views@^6.1.1: mz "^2.4.0" pretty "^2.0.0" -koa@^2.3.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/koa/-/koa-2.5.0.tgz#b0fbe1e195e43b27588a04fd0be0ddaeca2c154c" - dependencies: - accepts "^1.2.2" - content-disposition "~0.5.0" - content-type "^1.0.0" - cookies "~0.7.0" - debug "*" +koa@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/koa/-/koa-2.13.1.tgz#6275172875b27bcfe1d454356a5b6b9f5a9b1051" + integrity sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w== + dependencies: + accepts "^1.3.5" + cache-content-type "^1.0.0" + content-disposition "~0.5.2" + content-type "^1.0.4" + cookies "~0.8.0" + debug "~3.1.0" delegates "^1.0.0" - depd "^1.1.0" - destroy "^1.0.3" - error-inject "~1.0.0" - escape-html "~1.0.1" - fresh "^0.5.2" - http-assert "^1.1.0" - http-errors "^1.2.8" - is-generator-function "^1.0.3" - koa-compose "^4.0.0" + depd "^2.0.0" + destroy "^1.0.4" + encodeurl "^1.0.2" + escape-html "^1.0.3" + fresh "~0.5.2" + http-assert "^1.3.0" + http-errors "^1.6.3" + is-generator-function "^1.0.7" + koa-compose "^4.1.0" koa-convert "^1.2.0" - koa-is-json "^1.0.0" - mime-types "^2.0.7" - on-finished "^2.1.0" - only "0.0.2" - parseurl "^1.3.0" - statuses "^1.2.0" - type-is "^1.5.5" - vary "^1.0.0" + on-finished "^2.3.0" + only "~0.0.2" + parseurl "^1.3.2" + statuses "^1.5.0" + type-is "^1.6.16" + vary "^1.1.2" lcid@^1.0.0: version "1.0.0" @@ -1103,16 +1159,28 @@ mime-db@1.45.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea" integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w== +mime-db@1.46.0: + version "1.46.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" + integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== + mime-db@~1.33.0: version "1.33.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" -mime-types@^2.0.7, mime-types@^2.1.12, mime-types@~2.1.18: +mime-types@^2.1.12, mime-types@~2.1.18: version "2.1.18" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" dependencies: mime-db "~1.33.0" +mime-types@^2.1.18, mime-types@~2.1.24: + version "2.1.29" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" + integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== + dependencies: + mime-db "1.46.0" + mime-types@~2.1.19: version "2.1.28" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd" @@ -1237,9 +1305,10 @@ needle@^2.2.1: iconv-lite "^0.4.4" sax "^1.2.4" -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" +negotiator@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== node-addon-api@^3.0.0: version "3.1.0" @@ -1363,9 +1432,10 @@ object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" -on-finished@^2.1.0: +on-finished@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" @@ -1375,9 +1445,10 @@ once@^1.3.0: dependencies: wrappy "1" -only@0.0.2: +only@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" + integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q= os-homedir@^1.0.0: version "1.0.2" @@ -1438,9 +1509,10 @@ parse5@^3.0.3: dependencies: "@types/node" "*" -parseurl@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" +parseurl@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== passthrough-counter@^1.0.0: version "1.0.0" @@ -1636,6 +1708,11 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -1679,6 +1756,16 @@ setprototypeof@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -1757,10 +1844,15 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" -"statuses@>= 1.3.1 < 2", statuses@^1.2.0: +"statuses@>= 1.3.1 < 2": version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" +"statuses@>= 1.5.0 < 2", statuses@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -1868,6 +1960,11 @@ thenify-all@^1.0.0: dependencies: any-promise "^1.0.0" +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" @@ -1918,6 +2015,11 @@ tslint@^5.9.1: tslib "^1.8.0" tsutils "^2.12.1" +tsscmp@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" + integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== + tsutils@2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.8.0.tgz#0160173729b3bf138628dd14a1537e00851d814a" @@ -1944,13 +2046,21 @@ type-detect@^4.0.0: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" -type-is@^1.5.5, type-is@^1.6.14: +type-is@^1.6.14: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" dependencies: media-typer "0.3.0" mime-types "~2.1.18" +type-is@^1.6.16: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + typeorm@next: version "0.2.0-alpha.27" resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.0-alpha.27.tgz#a8bfe9041380de1dcb276d8e2d9f768443387d6f" @@ -2007,9 +2117,10 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -vary@^1.0.0: +vary@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= verror@1.10.0: version "1.10.0" @@ -2137,6 +2248,11 @@ yargs@^9.0.1: y18n "^3.2.1" yargs-parser "^7.0.0" +ylru@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f" + integrity sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ== + yn@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" From 7a2bb79db51e751b6d49a6403008e6ec73ffec1b Mon Sep 17 00:00:00 2001 From: droplet92 Date: Thu, 18 Feb 2021 18:26:11 +0900 Subject: [PATCH 06/24] =?UTF-8?q?firefox=EC=97=90=EC=84=9C=20ipv6=20?= =?UTF-8?q?=EA=B8=B0=EB=B0=98=EC=9C=BC=EB=A1=9C=20ipv4=20=EC=A3=BC?= =?UTF-8?q?=EC=86=8C=20=EC=A3=BC=EB=8A=94=EA=B1=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/ip2int.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/ip2int.ts b/src/lib/ip2int.ts index 952fb9b..6043f6b 100644 --- a/src/lib/ip2int.ts +++ b/src/lib/ip2int.ts @@ -10,6 +10,7 @@ const ipv6re = /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1, /* https://stackoverflow.com/a/8105740 */ const ipv4ToInt = (ip: string): number => { + ip = ip.startsWith("::ffff:") ? ip.substr(7) : ip const d = ip.split(".") return ((((((+d[0]) * 256) + (+d[1])) * 256) + (+d[2])) * 256) + (+d[3]) } From 94eb6c0b2beefdd4722bdbe5e973551e585a1152 Mon Sep 17 00:00:00 2001 From: droplet92 Date: Thu, 18 Feb 2021 18:27:34 +0900 Subject: [PATCH 07/24] =?UTF-8?q?=EC=BF=A0=ED=82=A4=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=20=EB=AC=B8=EC=A0=9C=20=EB=95=8C=EB=AC=B8=EC=97=90=20nginx=20?= =?UTF-8?q?=ED=94=84=EB=A1=9D=EC=8B=9C=20=EC=84=A4=EC=A0=95=ED=95=B4?= =?UTF-8?q?=EC=84=9C=20frontend=EC=99=80=20backend=20=EA=B0=99=EA=B2=8C=20?= =?UTF-8?q?=EA=B0=99=EC=9D=80=20=ED=8F=AC=ED=8A=B8=EC=97=90=EC=84=9C=20/ap?= =?UTF-8?q?i=20=EB=B6=99=EC=97=AC=EC=84=9C=20backend=20=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/route.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/route.ts b/src/route.ts index 160fab4..69dd35a 100644 --- a/src/route.ts +++ b/src/route.ts @@ -7,13 +7,14 @@ import * as Sessions from "./controllers/sessions" import * as Timeline from "./controllers/timeline" import * as Users from "./controllers/users" -export var router = new Router() +export var router = new Router({ prefix: '/api' }) +// export var router = new Router() -if (process.env.NODE_ENV === 'production') { - router = new Router({ - prefix: '/api' - }) -} +// if (process.env.NODE_ENV === 'production') { +// router = new Router({ +// prefix: '/api' +// }) +// } /* router 등록방법: router.메소드("경로", 함수) From 9cf0411438645fa16cffb422df4d3fdd3218ccc7 Mon Sep 17 00:00:00 2001 From: droplet92 Date: Thu, 18 Feb 2021 18:29:05 +0900 Subject: [PATCH 08/24] =?UTF-8?q?=EB=A0=88=EA=B1=B0=EC=8B=9C=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/sessions.ts | 1 - src/session.ts | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/controllers/sessions.ts b/src/controllers/sessions.ts index c0388ce..5f75d9c 100644 --- a/src/controllers/sessions.ts +++ b/src/controllers/sessions.ts @@ -23,7 +23,6 @@ export const Login = async (ctx, next) => { session.ipv4 = ipToInt(ctx.ip) ctx.session = await conn.manager.save(session) - // ctx.set("CIASESSIONID", session.data) ctx.cookies.set("CIASESSIONID", session.data) ctx.response.body = session.user } diff --git a/src/session.ts b/src/session.ts index 1ccb024..b21708c 100644 --- a/src/session.ts +++ b/src/session.ts @@ -9,8 +9,6 @@ const session = async (ctx, next) => { const s = await conn .getRepository(Sessions) .createQueryBuilder("session") - // .innerJoin("session.user", "user") - // .where("session.data = :data", { data : ctx.header.CIASESSIONID }) .leftJoinAndSelect("session.user", "user") .where("session.data = :data", { data : ctx.cookies.get("CIASESSIONID") }) .getOne() From 6a27b9f332e4de9a475def6ac58db71a8ea215a9 Mon Sep 17 00:00:00 2001 From: droplet92 Date: Thu, 18 Feb 2021 19:20:24 +0900 Subject: [PATCH 09/24] =?UTF-8?q?nginx=EB=A5=BC=20=ED=86=B5=ED=95=B4=20?= =?UTF-8?q?=EC=A0=95=EC=A0=81=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20=EC=84=9C?= =?UTF-8?q?=EB=B9=99=ED=95=98=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=ED=95=B4=EC=84=9C=20=EA=B2=BD=EB=A1=9C=20=EB=A7=9E=EA=B2=8C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/files.ts | 3 ++- src/controllers/users.ts | 3 ++- src/leaver.ts | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/controllers/files.ts b/src/controllers/files.ts index b95bc5d..b850a61 100644 --- a/src/controllers/files.ts +++ b/src/controllers/files.ts @@ -47,7 +47,8 @@ export const Post = async (ctx, next) => { const data = ctx.request.body file.filename = data.file - file.savedPath = "YO" + // file.savedPath = "YO" + file.savedPath = "images/YO.png" try{ const user: Users = ctx.session.user diff --git a/src/controllers/users.ts b/src/controllers/users.ts index 57a3581..b0783a9 100644 --- a/src/controllers/users.ts +++ b/src/controllers/users.ts @@ -104,7 +104,8 @@ export const Post = async (ctx, next) => { /* 프로필 이미지 DB 저장 및 relation 설정 */ try { profile.filename = data.profileImage - profile.savedPath = "MIKI" + // profile.savedPath = "MIKI" + profile.savedPath = "/images/MIKI.png" profile.user = user await conn.manager.save(profile) diff --git a/src/leaver.ts b/src/leaver.ts index be17ddf..62becd9 100644 --- a/src/leaver.ts +++ b/src/leaver.ts @@ -19,7 +19,8 @@ const leaver = async (ctx, next) => { /* 탈퇴 회원 이미지 생성 */ profile.id = 0 profile.filename = "leaved.jpg" - profile.savedPath = "MIKI" + // profile.savedPath = "MIKI" + profile.savedPath = "/images/MIKI.png" await conn.manager.save(profile) From ec3a40749992a72bd78974ba975f9ff965465937 Mon Sep 17 00:00:00 2001 From: droplet92 Date: Thu, 18 Feb 2021 20:16:48 +0900 Subject: [PATCH 10/24] clean git cache --- db/test.sql | Bin 73728 -> 0 bytes test-restful | 1 - 2 files changed, 1 deletion(-) delete mode 100644 db/test.sql delete mode 160000 test-restful diff --git a/db/test.sql b/db/test.sql deleted file mode 100644 index 32bcf6ca818189f911478f514093010d6cc2e3c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73728 zcmeI5&2JmW6~MWY_#xRcowzB}qOP|D8i}yo?)OIw0aYa05G+f!ETM1{fS8?`wYMd? z%I;Ejj<(|_=_P+kZn@;zOAqa($fYgXYk}T+C{QGazFl#b+!bj#LfSO)BSdmJA8+RU zX6C&&v$T2l&ZZY}(e;BKiA1$@z9a~xpNV3rR4T*sRd}9*=L|f*56?MxrVk;#c+Pvd z^b_G1u^^%TMO^IF`WFkI*REE-tV)%?RbDUuZtk<$cS`?U_;BIF=ScaASdrm!X8WGFy0^Q%u?6*RwYPS~t!;SjZEjwH$^j=4XRA?D zWN;CAJ)UKY>+S2Sdz-uBa+ccUCt*$L95$9ZlCPN;RTM zwqqH(%&Donro&ZLyYU9!+;aN4AX<0|Ii@E$<%hFHDWGf7)#1vblx?urj>NrGGWo8qVF_RQA zXHz&&I5%NhPtKgHHX04#=^(-DdR-nSFZDduB<(~<^6xW9LW@2_>)3_@nUME?D&rVDyvE zhn5elT&L^(inEUMUMFGMk<&?A$T;_S{cN>y?V9l9QqD>iicP7#m>+;CrQ#t;vnB&O zv=Ec?#tm>z4p_iMH>lQXZJ(($=*l!I*@7#m)sd&=oPE5pP;IQN2v2^TU(*E%)9Rne zlbKd5Mw8`D)<07+b4epBpJy{JCRpUczc;wXemCsjv2nsy%I#9ACHw#t>pN@JR^q2){7Dj&Q(mpGA+ zUrP`tiOEYj4>w6W5m|T8?M`+g{atV$X+Swzz47StZTBrNh}}#4VSK8`9XS+Nj1FPq z?~^cm=m#*BiVlnMeG)`*Om{Rdj0Oxcwgx?i2NQe5d&KJ=t+@Zd@AI@;u|=00_yKsK zHNWT4LfujDdl<-OWg*%nG>UtX6IU$%OK@xJ0OqU4)n2&T_xoTee80;{KjS)*FU4{7 ze&ENhfA?s3Jt}zEaWA|(*yq6>49c-mp>Y~{2eE;9fwDIO!Uiu`c8A{|bjk5O=&z4r z;o`g-X_g@9!?4A(1)}ETN~S_LA+&gb;zPkNRC+vOij60i90zs-x*~BdX@;#!ny$#) zlwr$}8P9Bmv|6`kDvisRg?oqY>M$q@`MU$&r+gSAr5|T=>%EY<9Iv=5P_*^8>whSf>z|hD|EmAJ{^$Cq_1~UaRZ%e{fCP{L5&DeUab?4?@vO~9G}HInbe;{E?` z+0bKmkpL1v0!RP}AOR$R1dsp{Kmter37mjHy#E*Ke=NZtK9B$sKmter2_OL^fCP{L z5n*UoY<%|5`RYw9y00|%gB!C2v01`j~NB{{S0VHs$ z3E=(zQ$4(>91=hRNB{{S0VIF~kN^@u0!RP}Ac1iL0(?l00>%^Z8VMi)B!C2v01`j~ zNB{{S0VIF~kN^@m9R%V{zfk{o3I6bb1dsp{Kmter2_OL^fCP{L5Ytr96;U4~fCP{L5e$rQb%PNmOP1rh261dhXDTI@#1+lbY=^qcFlCFm2BR8tIiFbvDf5P-aMyMS zlh_)giwnOlRm-20>e9Kt zo+&MSKL4opz49mJPb#mMe>eBp>^r4@E_}G~;nzp&S^0dmAvlHR`$J-B#L_~=JT52)Yk@qQGh@71-P_Udk1++BTZvn@8$fLH@?TTC5@Z8(nyaJU2P9n}$qo&BL9Fw0imV+{87px`T-)BdySuZx0XjCX-|T3*W>KmUO|l)!&}B|d-8Esl zT2fQIzP;1lxUrSsSswMMCGNDZw|ClGYwf#Ya}e?%9D)UP3i2sq)HPhLFcsbun-Q5i zlo+l9Wb*P0O66N&Lv5$GSl3mQ@=USG2N+w%jKqUs2j_QU5l&RwoO$7@@RK`qF#GFmxJmK7gX+1e} zuG(lcgr|c9uj_Srn7q{USd+99A&qPHNe|{*agBxKfV0~qdT=x=?&R3I8C#hJ9ws-z z7(24*+T4^(Rh79-3aozhS7NacRXcbv7+(Hd;gOduc^Mj1u@$; zxh9mnKI4zVce`H1JKzKSApxd47MEbknKGJ}4EJlk1!fp30FNobs{9(+8Btg@m zxMFk&q2E3U!-swVpyxcKy3Y!|PGO!;X95-N8N&_Q2;KD-{~2k#_*yhVeP32VQt1AZ+l0Wq0`f zL6;oggMR8fAr>yqyOCxIf<6pevM)NmWGZwMR_BWgexcIiMtJW|$AwL<1G@oTkvNw$ z!`3BDS7dI=u;tj>+PJgVhHYBBRFf6bYTcfxG%jBj?j>t`Xjel1?tu3xFMOQMt@lFa zaxCu()NDPzB~%+1E(lMBL?-nJ{LSR*HX-Fimf{=OF18kH{Zgg!m(u*%+Mg?bsr}~M z;M^O>?VvFq2_OL^@c&5Q=^L+A8{6B$vulZc&dwL71(C-VIFq;S$CiℜSugJ_a~E z_nMqH?(pD@&6G`UIhJLs8Z%VzciiE!O-x;ah$?>uHr8hT&?L8AZ90|VeA#p) z+i-M~SozT+tXt7V=;H+V~d=9 zTE9?jtgHynn$7_Xs#I*GJ{K!u$7IV$=CXZ^S_K~RT$f>8Kxt8PD60@lzyAlk) z?iy6F9O=ke^O>8q8-+Qn%CLmq~n-w!)- zdUgKk%~z5;1HbkTtj4`&Lqn|PlG@AHiASm9CW zNsmfzfwTVl&gafPtwE4>?V9jx>2MQ0JZdPI_B3!QBo_j*DWzgFkY-J`TwlQ{pW-m= EKln9kGXMYp diff --git a/test-restful b/test-restful deleted file mode 160000 index 99c94ba..0000000 --- a/test-restful +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 99c94ba4983466f3bc9e260d3fbce47c4467be58 From 387145e97b5c6c7c9437aadd663bccdd4f4cb569 Mon Sep 17 00:00:00 2001 From: droplet92 Date: Fri, 19 Feb 2021 20:51:50 +0900 Subject: [PATCH 11/24] =?UTF-8?q?cors=20=EC=97=90=EB=9F=AC=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.ts b/src/app.ts index 3e7f588..da7b440 100644 --- a/src/app.ts +++ b/src/app.ts @@ -13,7 +13,7 @@ const cors = require('@koa/cors') const app = new Koa() app.proxy = true -app.use(cors()) +app.use(cors({ origin: '*' })) /* DB와 연결을 맺고 Connection Pool을 생성함 */ // tslint:disable-next-line From a7fd1eb4b3468fb21ce62779956e07596aab49fd Mon Sep 17 00:00:00 2001 From: droplet92 Date: Mon, 1 Mar 2021 23:57:18 +0900 Subject: [PATCH 12/24] =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=B2=A0?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?=EC=95=94=ED=98=B8=ED=99=94=20=EC=A0=80=EC=9E=A5=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/auth/auth.ts | 10 ++++++++-- src/controllers/users.ts | 6 +++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/auth/auth.ts b/src/auth/auth.ts index 7451718..36f29da 100644 --- a/src/auth/auth.ts +++ b/src/auth/auth.ts @@ -8,9 +8,15 @@ export default async function Auth (username: string, password: string): Promise .getRepository(Users) .find({ where: { - password, username, }, }) - return users[0] + const user = users[0] + + const [encryptedKey, salt] = user.password.split("@") + const derivedKey = crypto.pbkdf2Sync(password, salt, 131071, 64, 'sha512') + + if (derivedKey.toString('hex') !== encryptedKey) + throw new Error('password mismatch') + return user } diff --git a/src/controllers/users.ts b/src/controllers/users.ts index b0783a9..8697d00 100644 --- a/src/controllers/users.ts +++ b/src/controllers/users.ts @@ -1,3 +1,4 @@ +import * as crypto from "crypto" import { Connection, getConnection } from "typeorm" import Comments from "../entities/comments" import Documents from "../entities/documents" @@ -80,7 +81,6 @@ export const Post = async (ctx, next) => { user.nTh = data.nTh user.dateOfBirth = data.dateOfBirth user.username = data.username - user.password = data.password user.department = data.department user.studentNumber = data.studentNumber user.email = data.email @@ -89,6 +89,10 @@ export const Post = async (ctx, next) => { user.favoriteComic = data.favoriteComic user.favoriteCharacter = data.favoriteCharacter + const salt: Buffer = crypto.randomBytes(64) + const derivedKey: Buffer = crypto.pbkdf2Sync(data.password, salt.toString('hex'), 131071, 64, 'sha512') + user.password = `${derivedKey.toString('hex')}@${salt.toString('hex')}` + try { /* 데이터 저장 */ await conn.manager.save(user) From f4fc312409405a990f523f53b83c103de1e0f19b Mon Sep 17 00:00:00 2001 From: droplet92 Date: Thu, 4 Mar 2021 01:55:47 +0900 Subject: [PATCH 13/24] =?UTF-8?q?=EA=B8=80=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?=EC=9E=91=EB=8F=99=ED=95=98=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/documents.ts | 6 ++---- src/session.ts | 18 +++++++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/controllers/documents.ts b/src/controllers/documents.ts index 763da4f..e72b5c2 100644 --- a/src/controllers/documents.ts +++ b/src/controllers/documents.ts @@ -35,11 +35,10 @@ export const GetOne = async (ctx, next) => { export const Post = async (ctx, next) => { const conn: Connection = getConnection() const document: Documents = new Documents() - const data = ctx.request.body try { document.author = ctx.session.user - document.text = data.text + document.text = ctx.request.body.data /* 게시글 작성자의 게시글 수 1 증가 */ ++(document.author.nDocuments) @@ -91,7 +90,6 @@ export const DeleteOne = async (ctx, next) => { /* 해당 게시글 PATCH */ export const PatchOne = async (ctx, next) => { const conn: Connection = getConnection() - const data = ctx.request.body try{ const document: Documents = await conn @@ -108,7 +106,7 @@ export const PatchOne = async (ctx, next) => { "likedBy", ]}) - document.text += "\n\n" + data.text + document.text += "\n\n" + ctx.request.body.data await conn.manager.save(document) diff --git a/src/session.ts b/src/session.ts index b21708c..250cc99 100644 --- a/src/session.ts +++ b/src/session.ts @@ -6,14 +6,18 @@ const session = async (ctx, next) => { if (ctx.request.url !== "/login") { try { - const s = await conn + const session: Sessions[] = await conn .getRepository(Sessions) - .createQueryBuilder("session") - .leftJoinAndSelect("session.user", "user") - .where("session.data = :data", { data : ctx.cookies.get("CIASESSIONID") }) - .getOne() - - ctx.session = s + .find({ + where: { + data: ctx.cookies.get("CIASESSIONID") + }, + relations: [ + "user", + "user.profileImage" + ] + }) + ctx.session = session[0] } catch (e) { ctx.throw(401, e) From 5ac5c50633205ad059e320dc5c989f6739c63e07 Mon Sep 17 00:00:00 2001 From: droplet92 Date: Thu, 4 Mar 2021 02:17:38 +0900 Subject: [PATCH 14/24] =?UTF-8?q?=EB=8C=93=EA=B8=80=20=EC=9E=91=EC=84=B1?= =?UTF-8?q?=20=EB=8F=99=EC=9E=91=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/comments.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/controllers/comments.ts b/src/controllers/comments.ts index e808cd2..87b1426 100644 --- a/src/controllers/comments.ts +++ b/src/controllers/comments.ts @@ -34,7 +34,7 @@ export const GetOne = async (ctx, next) => { export const Post = async (ctx, next) => { const conn: Connection = getConnection() const comment: Comments = new Comments() - const data = ctx.request.body + const data = ctx.request.body.data let documentId: number = null try{ @@ -69,6 +69,8 @@ export const Post = async (ctx, next) => { /* 댓글 작성자의 댓글 수 1 증가 */ ++(comment.author.nComments) + comment.likedBy = [] + await conn.manager.save(comment.author) await conn.manager.save(comment) } From bacc5119e25ee555bc29287435daaa4a7ef142ab Mon Sep 17 00:00:00 2001 From: droplet92 Date: Sun, 7 Mar 2021 14:09:54 +0900 Subject: [PATCH 15/24] =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=ED=8C=8C=EC=9D=BC=EB=93=A4=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/cia.ts | 101 ----------------------------------------- src/entities/cia.ts | 8 ---- src/leaver.ts | 53 --------------------- src/session.ts | 30 ------------ 4 files changed, 192 deletions(-) delete mode 100644 src/controllers/cia.ts delete mode 100644 src/entities/cia.ts delete mode 100644 src/leaver.ts delete mode 100644 src/session.ts diff --git a/src/controllers/cia.ts b/src/controllers/cia.ts deleted file mode 100644 index 2c32490..0000000 --- a/src/controllers/cia.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { Connection, getConnection } from "typeorm" -import Cia from "../entities/cia" - -/* 해당 동아리 정보 GET */ -export const GetOne = async (ctx, next) => { - const conn: Connection = getConnection() - - try{ - const cia: Cia = await conn - .getRepository(Cia) - .createQueryBuilder() - .where("cia.title = :title", { title: ctx.params.title }) - .getOne() - - ctx.body = cia - } - catch (e){ - ctx.throw(400, e) - } - - /* GET 완료 응답 */ - ctx.response.status = 200 -} - -/* 모든 동아리 정보 GET - title만 로드 */ -export const GetAll = async (ctx, next) => { - const conn: Connection = getConnection() - const responseBody: string[] = [] - - try{ - const allCia: Cia[] = await conn - .getRepository(Cia) - .find() - - /* 모든 게시물의 title만 ctx.body에 반환 */ - for (const ciaSet of allCia.entries()) { - const cia: Cia = ciaSet["1"] - responseBody.push(cia.title) - } - } - catch (e){ - ctx.throw(400, e) - } - - /* GET 완료 응답 */ - ctx.body = responseBody - ctx.response.status = 200 -} - -/* 동아리 정보 POST */ -export const Post = async (ctx, next) => { - const conn: Connection = getConnection() - const cia: Cia = new Cia() - const data = ctx.request.body - - cia.title = data.title - cia.text = data.text - - try{ - await conn.manager.save(cia) - } - catch (e){ - ctx.throw(400, e) - } - - /* POST 완료 응답 */ - ctx.body = cia - ctx.response.status = 200 -} - -/* 해당 동아리 정보 PATCH */ -export const PatchOne = async (ctx, next) => { - const conn: Connection = getConnection() - const data = ctx.request.body - - try{ - /* name 문서를 찾아서 가져옴 */ - const cia: Cia = await conn - .getRepository(Cia) - .createQueryBuilder() - .where("cia.title = :title", { title: ctx.params.title }) - .getOne() - - /* 입력받은 값으로 수정 */ - if (data.title !== undefined){ - cia.title = data.title - } - if (data.text !== undefined){ - cia.text = data.text - } - - await conn.manager.save(cia) - ctx.body = cia - } - catch (e){ - ctx.throw(400, e) - } - - /* PATCH 완료 응답 */ - ctx.response.status = 200 -} diff --git a/src/entities/cia.ts b/src/entities/cia.ts deleted file mode 100644 index 6a24a0b..0000000 --- a/src/entities/cia.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Entity } from "typeorm" -import Contents from "./contents" - -/* 동아리 정보 테이블 스키마 */ -@Entity() -export default class Cia extends Contents { - // contents와 동일 -} diff --git a/src/leaver.ts b/src/leaver.ts deleted file mode 100644 index 62becd9..0000000 --- a/src/leaver.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Connection, getConnection } from "typeorm" -import Files from "./entities/files" -import Users from "./entities/users" - -// 작동을 안합니다. 추후 수정해주세요. - -const leaver = async (ctx, next) => { - const conn: Connection = getConnection() - const profile: Files = new Files() - - try{ - const leavedUser = await conn - .getRepository(Users) - .findOne(0) - - if (leavedUser){ - const user: Users = new Users() - - /* 탈퇴 회원 이미지 생성 */ - profile.id = 0 - profile.filename = "leaved.jpg" - // profile.savedPath = "MIKI" - profile.savedPath = "/images/MIKI.png" - - await conn.manager.save(profile) - - /* 탈퇴 회원 DB에 추가 */ - user.id = 0 - user.fullname = "탈퇴 회원" - user.nTh = 0 - user.dateOfBirth = new Date() - user.username = "asdf" - user.password = "asdf" - user.department = "leaved" - user.studentNumber = 0 - user.email = "leaved" - user.phoneNumber = "leaved" - - /* relation 형성 */ - profile.user = user - - await conn.manager.save(user) - } - } - catch (e){ - await conn.manager.remove(profile) - ctx.throw(400, e) - } - - await next() -} - -export default leaver diff --git a/src/session.ts b/src/session.ts deleted file mode 100644 index 250cc99..0000000 --- a/src/session.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Connection, getConnection, getConnectionManager, getManager } from "typeorm" -import Sessions from "./entities/sessions" - -const session = async (ctx, next) => { - const conn: Connection = getConnection() - - if (ctx.request.url !== "/login") { - try { - const session: Sessions[] = await conn - .getRepository(Sessions) - .find({ - where: { - data: ctx.cookies.get("CIASESSIONID") - }, - relations: [ - "user", - "user.profileImage" - ] - }) - ctx.session = session[0] - } - catch (e) { - ctx.throw(401, e) - } - } - - await next() -} - -export default session From d661ba9740e7564918672da4a8a8cbcac4eb8146 Mon Sep 17 00:00:00 2001 From: droplet92 Date: Sun, 7 Mar 2021 17:35:43 +0900 Subject: [PATCH 16/24] =?UTF-8?q?=EC=95=B1=EC=9D=B4=EB=9E=91=20=EB=AF=B8?= =?UTF-8?q?=EB=93=A4=EC=9B=A8=EC=96=B4=20=EA=B5=AC=EB=B6=84=EC=9D=B4=20?= =?UTF-8?q?=EC=96=B4=EB=A0=A4=EC=9B=8C=EC=84=9C=20=EB=94=94=EB=A0=89?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EC=83=88=EB=A1=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/route.ts | 83 ---------------------------------------------------- 1 file changed, 83 deletions(-) delete mode 100644 src/route.ts diff --git a/src/route.ts b/src/route.ts deleted file mode 100644 index 69dd35a..0000000 --- a/src/route.ts +++ /dev/null @@ -1,83 +0,0 @@ -import * as Router from "koa-router" -import * as Cia from "./controllers/cia" -import * as Comments from "./controllers/comments" -import * as Documents from "./controllers/documents" -import * as Files from "./controllers/files" -import * as Sessions from "./controllers/sessions" -import * as Timeline from "./controllers/timeline" -import * as Users from "./controllers/users" - -export var router = new Router({ prefix: '/api' }) -// export var router = new Router() - -// if (process.env.NODE_ENV === 'production') { -// router = new Router({ -// prefix: '/api' -// }) -// } - -/* router 등록방법: router.메소드("경로", 함수) - - 메소드: get, post, put, delete, option 등등 - - 함수: (ctx, next)를 인자로 받는 함수. - ctx: 현재 컨텍스트. 리퀘스트 1개당 컨텍스트 1개가 생성됨. - 리퀘스트 + 리스폰스 = 컨텍스트. - next: 다른 미들웨어가 실행될 때 까지 현재 미들웨어가 기다림. - 실행하고 싶은 다른 미들웨어가 있을 경우 사용. - async (ctx, next) => { - // app.use에 등록한 순서대로 실행 - await next() - // 역순으로 실행 - } -*/ - -/* 응답코드 : 메소드가 제데로 작동 되었을 때에 따른 출력되는 코드 - - 200 : OK (get, post, delete 등 작업이 완료되었을 때 출력) - 201 : Created (주로 put 에 쓰이며 작업으로 인해 정보가 추가되었을 때 출력) - CIAPI 에서는 put 이 아닌 post 로 정보를 추가하기 때문에, 정보가 추가되는 곳에는 201 로 설정함. - 204 : No Content (작업을 진행해도 아무런 정보가 뜨지 않는 경우) - - 출처 : https://developer.mozilla.org/ko/docs/Web/HTTP/Status -*/ - -router.post("/login", Sessions.Login) -router.post("/logout", Sessions.Logout) - -router.get("/users/session", Users.GetSession) -router.get("/users/:id", Users.GetOne) -router.get("/users", Users.GetAll) -router.post("/users", Users.Post) -router.delete("/users/:id", Users.DeleteOne) -router.patch("/users/:id", Users.PatchOne) -router.patch("/users", Users.PatchAll) -router.get("/users/:id/documents", Users.GetDocuments) -router.get("/users/:id/comments", Users.GetComments) - -router.get("/timeline/:page", Timeline.GetTimeline) - -router.get("/documents/:id", Documents.GetOne) -router.post("/documents", Documents.Post) -router.delete("/documents/:id", Documents.DeleteOne) -router.patch("/documents/:id", Documents.PatchOne) -router.get("/documents/:id/likeIt", Documents.GetLikes) -router.post("/documents/:id/likeIt", Documents.PostLikes) -router.delete("/documents/:id/likeIt", Documents.CancelLikes) - -router.get("/comments/:id", Comments.GetOne) -router.post("/comments", Comments.Post) -router.delete("/comments/:id", Comments.DeleteOne) -router.get("/comments/:id/likeIt", Comments.GetLikes) -router.post("/comments/:id/likeIt", Comments.PostLikes) -router.delete("/comments/:id/likeIt", Comments.CalcelLikes) - -router.get("/files/:id", Files.GetOne) -router.get("/files", Files.GetAll) -router.post("/files", Files.Post) -router.delete("/files/:id", Files.DeleteOne) - -router.get("/cia/:title", Cia.GetOne) -router.get("/cia", Cia.GetAll) -router.post("/cia", Cia.Post) -router.patch("/cia/:title", Cia.PatchOne) From 74fb98a3434a999bd8cf37a3e761d275d5f8a018 Mon Sep 17 00:00:00 2001 From: droplet92 Date: Sun, 7 Mar 2021 17:38:07 +0900 Subject: [PATCH 17/24] =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=B2=A0?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=8A=A4=ED=82=A4=EB=A7=88=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20-=20=EC=BB=AC=EB=9F=BC=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=EC=9D=84=20=EC=A1=B0=EA=B8=88=20=EB=8D=94=20=EC=A7=81=EA=B4=80?= =?UTF-8?q?=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20-=20jwt=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D=EC=9A=A9=20=ED=85=8C=EC=9D=B4=EB=B8=94=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20=EC=84=B8=EC=85=98=20=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EB=B8=94=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controllers/authenticationToken.ts | 82 +++++++++++ src/controllers/{comments.ts => comment.ts} | 78 +++++----- src/controllers/{documents.ts => document.ts} | 93 ++++++------ src/controllers/{files.ts => file.ts} | 24 ++-- src/controllers/sessions.ts | 53 ------- src/controllers/timeline.ts | 13 +- src/controllers/{users.ts => user.ts} | 135 +++++++++--------- src/entities/authenticationToken.ts | 28 ++++ src/entities/comment.ts | 41 ++++++ src/entities/comments.ts | 42 ------ src/entities/{contents.ts => content.ts} | 4 +- src/entities/document.ts | 29 ++++ src/entities/documents.ts | 30 ---- src/entities/{files.ts => file.ts} | 8 +- src/entities/sessions.ts | 53 ------- src/entities/{users.ts => user.ts} | 46 +++--- 16 files changed, 382 insertions(+), 377 deletions(-) create mode 100644 src/controllers/authenticationToken.ts rename src/controllers/{comments.ts => comment.ts} (72%) rename src/controllers/{documents.ts => document.ts} (66%) rename src/controllers/{files.ts => file.ts} (80%) delete mode 100644 src/controllers/sessions.ts rename src/controllers/{users.ts => user.ts} (72%) create mode 100644 src/entities/authenticationToken.ts create mode 100644 src/entities/comment.ts delete mode 100644 src/entities/comments.ts rename src/entities/{contents.ts => content.ts} (83%) create mode 100644 src/entities/document.ts delete mode 100644 src/entities/documents.ts rename src/entities/{files.ts => file.ts} (76%) delete mode 100644 src/entities/sessions.ts rename src/entities/{users.ts => user.ts} (71%) diff --git a/src/controllers/authenticationToken.ts b/src/controllers/authenticationToken.ts new file mode 100644 index 0000000..4ae570d --- /dev/null +++ b/src/controllers/authenticationToken.ts @@ -0,0 +1,82 @@ +import { Connection, getConnection } from "typeorm" +import AuthenticationToken from "../entities/authenticationToken" +import { ipToInt } from "../lib/ip2int" +import { cookieExpirationDate } from "../lib/date" +import * as crypto from "crypto" +import User from "../entities/user" + +const jwt = require('jsonwebtoken') + + +async function Authenticate (username: string, password: string): Promise { + const conn: Connection = getConnection() + const users: User[] = await conn + .getRepository(User) + .find({ + where: { + username, + }, + relations: ['profileImage'] + }) + const user = users[0] + + const [encryptedKey, salt] = user.password.split("@") + const derivedKey = crypto.pbkdf2Sync(password, salt, 131071, 64, 'sha512') + + if (derivedKey.toString('hex') !== encryptedKey) + throw new Error('password mismatch') + return user +} + +/* 로그인 */ +export const Login = async (ctx, next) => { + const authenticationToken: AuthenticationToken = new AuthenticationToken() + const conn: Connection = getConnection() + + try { + // 1. User authentication + const { + username, + password, + } = ctx.request.body + + const user = await Authenticate(username, password) + + // 2. Issue access token and refresh token + const accessToken = jwt.sign({ user }, 'secretKey', { expiresIn: '1h' }) + const refreshToken = jwt.sign({ user }, 'secretKey', { expiresIn: '14d' }) + + // 3. Set authentication token cookie + ctx.cookies.set('accessToken', accessToken, { expires: cookieExpirationDate() }) + + // 4. Save refresh token to database + authenticationToken.accessToken = accessToken + authenticationToken.refreshToken = refreshToken + authenticationToken.accessIp = ipToInt(ctx.ip) + + await conn.manager.save(authenticationToken) + } + catch (e){ + ctx.throw(400, e) + } + + /* 로그인 완료 응답 */ + ctx.response.status = 200 +} + +/* 로그아웃 */ +export const Logout = async (ctx, next) => { + try { + const conn: Connection = getConnection() + await conn.manager.delete(AuthenticationToken, ctx.authenticationToken.id) + + ctx.status = 204 + ctx.redirect("/") + } + catch (e) { + ctx.throw(400, e) + } + + /* 로그아웃 완료 응답 */ + ctx.response.status = 204 +} diff --git a/src/controllers/comments.ts b/src/controllers/comment.ts similarity index 72% rename from src/controllers/comments.ts rename to src/controllers/comment.ts index 87b1426..74ee9a3 100644 --- a/src/controllers/comments.ts +++ b/src/controllers/comment.ts @@ -1,22 +1,22 @@ import { Connection, getConnection } from "typeorm" -import Comments from "../entities/comments" -import Documents from "../entities/documents" -import Users from "../entities/users" +import Comment from "../entities/comment" +import Document from "../entities/document" +import User from "../entities/user" /* 해당 댓글 GET */ export const GetOne = async (ctx, next) => { const conn: Connection = getConnection() try{ - const comment: Comments = await conn - .getRepository(Comments) + const comment: Comment = await conn + .getRepository(Comment) .findOne(ctx.params.id, { relations: [ "author", "author.profileImage", "rootDocument", - "likedBy", - "replies", + "likedUsers", + "comments", "rootComment", ]}) @@ -33,18 +33,18 @@ export const GetOne = async (ctx, next) => { /* 댓글 POST */ export const Post = async (ctx, next) => { const conn: Connection = getConnection() - const comment: Comments = new Comments() + const comment: Comment = new Comment() const data = ctx.request.body.data let documentId: number = null try{ /* 세션의 유저와 relation 설정 */ - comment.author = ctx.session.user + comment.author = ctx.state.token.user /* commentId를 인자로 전달하면 대댓글 relation 설정 */ if (typeof(data.commentId) === "number") { - const parent: Comments = await conn - .getRepository(Comments) + const parent: Comment = await conn + .getRepository(Comment) .findOne(data.commentId, { relations: ["rootDocument"], }) @@ -54,8 +54,8 @@ export const Post = async (ctx, next) => { } /* 게시글과 relation 설정 */ - const document: Documents = await conn - .getRepository(Documents) + const document: Document = await conn + .getRepository(Document) .findOneOrFail(documentId ? documentId : Number(data.documentId)) @@ -63,13 +63,13 @@ export const Post = async (ctx, next) => { /* 나머지 required 정보 입력 */ comment.id = data.id - comment.createdAt = data.createdAt - comment.text = data.text + comment.createdAt = data.created_at + comment.content = data.text /* 댓글 작성자의 댓글 수 1 증가 */ - ++(comment.author.nComments) + ++(comment.author.commentsCount) - comment.likedBy = [] + comment.likedUsers = [] await conn.manager.save(comment.author) await conn.manager.save(comment) @@ -90,20 +90,20 @@ export const Post = async (ctx, next) => { /* 해당 댓글 DELETE */ export const DeleteOne = async (ctx, next) => { const conn: Connection = getConnection() - const leaver: Users = await conn.getRepository(Users).findOne(0) + const leaver: User = await conn.getRepository(User).findOne(0) try { /* DB에서 댓글 불러오기 */ - const comment: Comments = await conn - .getRepository(Comments) + const comment: Comment = await conn + .getRepository(Comment) .findOne(ctx.params.id, { relations: [ "author", - "likedBy", + "likedUsers", ]}) /* 댓글 작성자의 댓글 수 1 감소 */ - --(comment.author.nComments) + --(comment.author.commentsCount) await conn.manager.save(comment.author) /* 탈퇴한 유저 relation */ @@ -123,15 +123,15 @@ export const GetLikes = async (ctx, next) => { const conn: Connection = getConnection() try{ - const comment: Comments = await conn - .getRepository(Comments) + const comment: Comment = await conn + .getRepository(Comment) .findOne(ctx.params.id, { relations: [ - "likedBy", - "likedBy.profileImage", + "likedUsers", + "likedUsers.profileImage", ]}) - ctx.body = comment.likedBy + ctx.body = comment.likedUsers } catch (e){ ctx.throw(400, e) @@ -147,24 +147,24 @@ export const PostLikes = async (ctx, next) => { try { /* DB에서 댓글 불러오기 */ - const comment: Comments = await conn - .getRepository(Comments) + const comment: Comment = await conn + .getRepository(Comment) .findOne(ctx.params.id, { - relations: ["likedBy"], + relations: ["likedUsers"], }) /* 세션 유저 불러오기 */ - const user: Users = ctx.session.user + const user: User = ctx.state.token.user /* 세션의 유저와 좋아요 relation 설정 */ - comment.likedBy.push(user) - ++(user.nCommentLikes) + comment.likedUsers.push(user) + ++(user.likedCommentsCount) await conn.manager.save(comment) await conn.manager.save(user) /* POST 성공 응답 */ - ctx.body = comment.likedBy + ctx.body = comment.likedUsers ctx.response.status = 200 } catch (e) { @@ -182,22 +182,22 @@ export const CalcelLikes = async (ctx, next) => { try { /* DB에서 댓글 불러오기 */ - const comment: Comments = await conn - .getRepository(Comments) + const comment: Comment = await conn + .getRepository(Comment) .findOne(ctx.params.id) /* 세션 유저 불러오기 */ - const user: Users = ctx.session.user + const user: User = ctx.state.token.user /* 세션의 유저와 좋아요 relation 해제 */ await conn .createQueryBuilder() - .relation(Comments, "likedBy") + .relation(Comment, "likedUsers") .of(comment) .remove(user) /* 세션 유저의 댓글 좋아요 수 1 감소 */ - --(user.nCommentLikes) + --(user.likedCommentsCount) await conn.manager.save(user) } catch (e) { diff --git a/src/controllers/documents.ts b/src/controllers/document.ts similarity index 66% rename from src/controllers/documents.ts rename to src/controllers/document.ts index e72b5c2..493d128 100644 --- a/src/controllers/documents.ts +++ b/src/controllers/document.ts @@ -1,24 +1,24 @@ import { Connection, getConnection } from "typeorm" -import Documents from "../entities/documents" -import Users from "../entities/users" +import Document from "../entities/document" +import User from "../entities/user" /* 해당 게시글 GET */ export const GetOne = async (ctx, next) => { const conn: Connection = getConnection() try{ - const document: Documents = await conn - .getRepository(Documents) + const document: Document = await conn + .getRepository(Document) .findOne(ctx.params.id, { relations: [ "author", "author.profileImage", - "comments", - "comments.author", - "comments.author.profileImage", - "comments.replies", - "comments.likedBy", - "likedBy", + "comment", + "comment.author", + "comment.author.profileImage", + "comment.comments", + "comment.likedUsers", + "likedUsers", ]}) ctx.body = document @@ -34,14 +34,19 @@ export const GetOne = async (ctx, next) => { /* 게시글 POST */ export const Post = async (ctx, next) => { const conn: Connection = getConnection() - const document: Documents = new Documents() + const document: Document = new Document() try { - document.author = ctx.session.user - document.text = ctx.request.body.data + // ctx.state.token.user 바로 저장이 안됨 + document.author = await conn + .getRepository(User) + .findOne(ctx.state.token.user.id, { + relations: ['profileImage'] + }) + document.content = ctx.request.body.data /* 게시글 작성자의 게시글 수 1 증가 */ - ++(document.author.nDocuments) + ++(document.author.documentsCount) await conn.manager.save(document.author) await conn.manager.save(document) @@ -62,18 +67,18 @@ export const Post = async (ctx, next) => { /* 해당 게시글 DELETE */ export const DeleteOne = async (ctx, next) => { const conn: Connection = getConnection() - const leaver: Users = await conn.getRepository(Users).findOne(0) + const leaver: User = await conn.getRepository(User).findOne(0) try { /* DB에서 게시글 불러오기 */ - const document: Documents = await conn - .getRepository(Documents) + const document: Document = await conn + .getRepository(Document) .findOne(ctx.params.id, { relations: ["author"], }) /* 게시글 작성자의 게시글 수 1 감소 */ - --(document.author.nDocuments) + --(document.author.documentsCount) /* 탈퇴한 유저 relation */ document.author = leaver @@ -92,21 +97,21 @@ export const PatchOne = async (ctx, next) => { const conn: Connection = getConnection() try{ - const document: Documents = await conn - .getRepository(Documents) + const document: Document = await conn + .getRepository(Document) .findOne(ctx.params.id, { relations: [ "author", "author.profileImage", - "comments", - "comments.author", - "comments.author.profileImage", - "comments.replies", - "comments.likedBy", - "likedBy", + "comment", + "comment.author", + "comment.author.profileImage", + "comment.comments", + "comment.likedUsers", + "likedUsers", ]}) - document.text += "\n\n" + ctx.request.body.data + document.content += "\n\n" + ctx.request.body.data await conn.manager.save(document) @@ -124,15 +129,15 @@ export const GetLikes = async (ctx, next) => { const conn: Connection = getConnection() try{ - const document: Documents = await conn - .getRepository(Documents) + const document: Document = await conn + .getRepository(Document) .findOne(ctx.params.id, { relations: [ - "likedBy", - "likedBy.profileImage", + "likedUsers", + "likedUsers.profileImage", ]}) - ctx.body = document.likedBy + ctx.body = document.likedUsers } catch (e){ ctx.throw(400, e) @@ -148,24 +153,24 @@ export const PostLikes = async (ctx, next) => { try { /* DB에서 게시글 불러오기 */ - const document: Documents = await conn - .getRepository(Documents) + const document: Document = await conn + .getRepository(Document) .findOne(ctx.params.id, { - relations: ["likedBy"], + relations: ["likedUsers"], }) /* 세션 유저 불러오기 */ - const user: Users = ctx.session.user + const user: User = ctx.state.token.user /* 게시글과 유저의 좋아요 relation 설정 */ - document.likedBy.push(user) - ++(user.nDocumentLikes) + document.likedUsers.push(user) + ++(user.likedDocumentsCount) await conn.manager.save(user) await conn.manager.save(document) /* POST 완료 응답 */ - ctx.body = document.likedBy + ctx.body = document.likedUsers ctx.response.status = 200 } catch (e) { @@ -183,22 +188,22 @@ export const CancelLikes = async (ctx, next) => { try { /* DB에서 게시글 불러오기 */ - const document: Documents = await conn - .getRepository(Documents) + const document: Document = await conn + .getRepository(Document) .findOne(ctx.params.id) /* 세션 유저 불러오기 */ - const user: Users = ctx.session.user + const user: User = ctx.state.token.user /* 게시글과 유저의 좋아요 relation 해제 */ await conn .createQueryBuilder() - .relation(Documents, "likedBy") + .relation(Document, "likedUsers") .of(document) .remove(user) /* 게시글에 좋아요한 수 1 감소 */ - --(user.nDocumentLikes) + --(user.likedDocumentsCount) await conn.manager.save(user) } catch (e) { diff --git a/src/controllers/files.ts b/src/controllers/file.ts similarity index 80% rename from src/controllers/files.ts rename to src/controllers/file.ts index b850a61..334cea1 100644 --- a/src/controllers/files.ts +++ b/src/controllers/file.ts @@ -1,14 +1,14 @@ import { Connection, getConnection } from "typeorm" -import Files from "../entities/files" -import Users from "../entities/users" +import File from "../entities/file" +import User from "../entities/user" /* 해당 파일 GET */ export const GetOne = async (ctx, next) => { const conn: Connection = getConnection() try{ - const files: Files = await conn - .getRepository(Files) + const files: File = await conn + .getRepository(File) .findOne(ctx.params.id) ctx.body = files @@ -26,8 +26,8 @@ export const GetAll = async (ctx, next) => { const conn: Connection = getConnection() try{ - const files: Files[] = await conn - .getRepository(Files) + const files: File[] = await conn + .getRepository(File) .find() ctx.body = files @@ -43,15 +43,15 @@ export const GetAll = async (ctx, next) => { /* 파일 POST */ export const Post = async (ctx, next) => { const conn: Connection = getConnection() - const file: Files = new Files() + const file: File = new File() const data = ctx.request.body file.filename = data.file // file.savedPath = "YO" file.savedPath = "images/YO.png" - try{ - const user: Users = ctx.session.user + try { + const user: User = ctx.state.token.user file.user = user await conn.manager.save(file) } @@ -74,15 +74,15 @@ export const DeleteOne = async (ctx, next) => { try { /* DB에서 파일 불러오기 */ - const file: Files = await conn - .getRepository(Files) + const file: File = await conn + .getRepository(File) .findOne(ctx.params.id) /* DB에서 파일 삭제 */ await conn .createQueryBuilder() .delete() - .from(Files) + .from(File) .where("id = :id", { id: file.id }) .execute() } diff --git a/src/controllers/sessions.ts b/src/controllers/sessions.ts deleted file mode 100644 index 5f75d9c..0000000 --- a/src/controllers/sessions.ts +++ /dev/null @@ -1,53 +0,0 @@ -import * as crypto from "crypto" -import { Connection, getConnection } from "typeorm" -import Auth from "../auth/auth" -import Sessions from "../entities/sessions" -import Users from "../entities/users" -import { ipToInt } from "../lib/ip2int" - -/* 로그인 */ -export const Login = async (ctx, next) => { - const session: Sessions = new Sessions() - const conn: Connection = getConnection() - const hash: crypto.Hash = crypto.createHash("sha256") - - try{ - const { - username, - password, - to = "/", - } = ctx.request.body - - session.user = await Auth(username, password) - session.data = hash.update(Math.random().toString()).digest("hex") - session.ipv4 = ipToInt(ctx.ip) - - ctx.session = await conn.manager.save(session) - ctx.cookies.set("CIASESSIONID", session.data) - ctx.response.body = session.user - } - catch (e){ - ctx.throw(400, e) - // ctx.throw(400, "Login failed") - } - - /* 로그인 완료 응답 */ - ctx.response.status = 200 -} - -/* 로그아웃 */ -export const Logout = async (ctx, next) => { - try { - const conn: Connection = getConnection() - await conn.manager.delete(Sessions, ctx.session.id) - - ctx.status = 204 - ctx.redirect("/") - } - catch (e) { - ctx.throw(400, e) - } - - /* 로그아웃 완료 응답 */ - ctx.response.status = 204 -} diff --git a/src/controllers/timeline.ts b/src/controllers/timeline.ts index ac940fd..03db73b 100644 --- a/src/controllers/timeline.ts +++ b/src/controllers/timeline.ts @@ -1,14 +1,13 @@ import { Connection, getConnection } from "typeorm" -import Documents from "../entities/documents" -import Users from "../entities/users" +import Document from "../entities/document" /* 타임라인 GET */ export const GetTimeline = async (ctx, next) => { const conn: Connection = getConnection() try{ - const timeline: Documents[] = await conn - .getRepository(Documents) + const timeline: Document[] = await conn + .getRepository(Document) .find({ order: { id: -1, @@ -19,9 +18,9 @@ export const GetTimeline = async (ctx, next) => { "comments", "comments.author", "comments.author.profileImage", - "comments.replies", - "comments.likedBy", - "likedBy", + "comments.comments", + "comments.likedUsers", + "likedUsers", ], skip: (ctx.params.page - 1) * 5, take: 5, diff --git a/src/controllers/users.ts b/src/controllers/user.ts similarity index 72% rename from src/controllers/users.ts rename to src/controllers/user.ts index 8697d00..891028c 100644 --- a/src/controllers/users.ts +++ b/src/controllers/user.ts @@ -1,19 +1,19 @@ import * as crypto from "crypto" import { Connection, getConnection } from "typeorm" -import Comments from "../entities/comments" -import Documents from "../entities/documents" -import Files from "../entities/files" -import Sessions from "../entities/sessions" -import Users from "../entities/users" +import Comment from "../entities/comment" +import Document from "../entities/document" +import File from "../entities/file" +import AuthenticationToken from "../entities/authenticationToken" +import User from "../entities/user" /* 세션 유저 GET */ -export const GetSession = async (ctx, next) => { +export const GetAuthenticated = async (ctx, next) => { const conn: Connection = getConnection() - - try{ - const user: Users = await conn - .getRepository(Users) - .findOne(ctx.session.user.id, { + + try { + const user: User = await conn + .getRepository(User) + .findOne(ctx.state.token.user.id, { relations: ["profileImage"], }) @@ -32,8 +32,8 @@ export const GetOne = async (ctx, next) => { const conn: Connection = getConnection() try{ - const user: Users = await conn - .getRepository(Users) + const user: User = await conn + .getRepository(User) .findOne(ctx.params.id, { relations: ["profileImage"], }) @@ -53,12 +53,12 @@ export const GetAll = async (ctx, next) => { const conn: Connection = getConnection() try{ - const users: Users[] = await conn - .getRepository(Users) + const users: User[] = await conn + .getRepository(User) .find({ relations: ["profileImage"] }) /* 0번 탈퇴한 유저 제외 */ - const onlyUsers: Users[] = users.slice(1, users.length) + const onlyUsers: User[] = users.slice(1, users.length) ctx.body = onlyUsers } @@ -73,13 +73,13 @@ export const GetAll = async (ctx, next) => { /* 유저 POST */ export const Post = async (ctx, next) => { const conn: Connection = getConnection() - const user: Users = new Users() - const profile: Files = new Files() + const user: User = new User() + const profile: File = new File() const data = ctx.request.body user.fullname = data.fullname user.nTh = data.nTh - user.dateOfBirth = data.dateOfBirth + user.birthdate = data.birthdate user.username = data.username user.department = data.department user.studentNumber = data.studentNumber @@ -99,7 +99,7 @@ export const Post = async (ctx, next) => { } catch (e) { if (e.message === - "SQLITE_CONSTRAINT: UNIQUE constraint failed: users.username"){ + "SQLITE_CONSTRAINT: UNIQUE constraint failed: user.username"){ ctx.throw(409, e) } ctx.throw(400, e) @@ -108,7 +108,6 @@ export const Post = async (ctx, next) => { /* 프로필 이미지 DB 저장 및 relation 설정 */ try { profile.filename = data.profileImage - // profile.savedPath = "MIKI" profile.savedPath = "/images/MIKI.png" profile.user = user @@ -120,8 +119,8 @@ export const Post = async (ctx, next) => { } try{ - const relationedUser: Users = await conn - .getRepository(Users) + const relationedUser: User = await conn + .getRepository(User) .findOne(user.id, { relations: ["profileImage"], }) @@ -139,7 +138,7 @@ export const Post = async (ctx, next) => { /* 해당 유저 DELETE */ export const DeleteOne = async (ctx, next) => { const conn: Connection = getConnection() - const leaver: Users = await conn.getRepository(Users).findOne(0) + const leaver: User = await conn.getRepository(User).findOne(0) /* 코드 상에는 문제가 없어 텍스트를 throw함 변경할 수 있으면 좋습니다. */ @@ -149,45 +148,45 @@ export const DeleteOne = async (ctx, next) => { try { /* DB에서 유저 불러오기 */ - const user: Users = await conn - .getRepository(Users) + const user: User = await conn + .getRepository(User) .findOne(ctx.params.id) /* DB에서 유저 relation 모두 불러오기 */ - const comments: Comments[] = await conn + const comment: Comment[] = await conn .createQueryBuilder() - .relation(Users, "comments") + .relation(User, "comment") .of(user) .loadMany() - const documents: Documents[] = await conn + const document: Document[] = await conn .createQueryBuilder() - .relation(Users, "documents") + .relation(User, "document") .of(user) .loadMany() - const likedComments: Comments[] = await conn + const likedComments: Comment[] = await conn .createQueryBuilder() - .relation(Comments, "likedBy") + .relation(Comment, "likedUsers") .of(user.likedComments) .loadMany() - const likedDocuments: Documents[] = await conn + const likedDocuments: Document[] = await conn .createQueryBuilder() - .relation(Documents, "likedBy") + .relation(Document, "likedUsers") .of(user.likedDocuments) .loadMany() /* 댓글 relation 해제 및 삭제 */ - for (const commentSet of comments.entries()) { - const comment: Comments = await conn - .getRepository(Comments) + for (const commentSet of comment.entries()) { + const comment: Comment = await conn + .getRepository(Comment) .findOne(commentSet["1"].id, { relations: ["author"], }) /* 댓글 작성자의 댓글 수 1 감소 */ - --(comment.author.nComments) + --(comment.author.commentsCount) await conn.manager.save(comment.author) /* 탈퇴한 유저 relation */ @@ -196,15 +195,15 @@ export const DeleteOne = async (ctx, next) => { } /* 게시글 relation 해제 및 삭제 */ - for (const documentSet of documents.entries()) { - const document: Documents = await conn - .getRepository(Documents) + for (const documentSet of document.entries()) { + const document: Document = await conn + .getRepository(Document) .findOne(documentSet["1"].id, { relations: ["author"], }) /* 게시글 작성자의 게시글 수 1 감소 */ - --(document.author.nDocuments) + --(document.author.documentsCount) /* 탈퇴한 유저 relation */ document.author = leaver @@ -213,21 +212,21 @@ export const DeleteOne = async (ctx, next) => { /* 좋아요한 컨텐츠 relation 해제 */ for (const likedDocumentSet of likedDocuments.entries()) { - const likedDocument: Documents = likedDocumentSet["1"] + const likedDocument: Document = likedDocumentSet["1"] await conn .createQueryBuilder() - .relation(Documents, "likedBy") + .relation(Document, "likedUsers") .of(likedDocument) .remove(user) } for (const likedCommentSet of likedComments.entries()) { - const likedComment: Comments = likedCommentSet["1"] + const likedComment: Comment = likedCommentSet["1"] await conn .createQueryBuilder() - .relation(Comments, "likedBy") + .relation(Comment, "likedUsers") .of(likedComment) .remove(user) } @@ -236,14 +235,14 @@ export const DeleteOne = async (ctx, next) => { await conn .createQueryBuilder() .delete() - .from(Files) + .from(File) .where("userId = :id", { id: user.id }) .execute() await conn .createQueryBuilder() .delete() - .from(Sessions) + .from(AuthenticationToken) .where("userId = :id", { id: user.id }) .execute() @@ -251,7 +250,7 @@ export const DeleteOne = async (ctx, next) => { await conn .createQueryBuilder() .delete() - .from(Users) + .from(User) .where("id = :id", { id: user.id }) .execute() } @@ -268,8 +267,8 @@ export const GetDocuments = async (ctx, next) => { const conn: Connection = getConnection() try{ - const documents: Documents[] = await conn - .getRepository(Documents) + const documents: Document[] = await conn + .getRepository(Document) .createQueryBuilder("document") .leftJoinAndSelect("document.author", "author") .where("author.id = :id", { id: ctx.params.id }) @@ -286,18 +285,18 @@ export const GetDocuments = async (ctx, next) => { } /* 해당 유저 댓글 GET */ -export const GetComments = async (ctx, next) => { +export const GetComment = async (ctx, next) => { const conn: Connection = getConnection() try{ - const comments: Comments[] = await conn - .getRepository(Comments) + const comment: Comment[] = await conn + .getRepository(Comment) .createQueryBuilder("comment") .leftJoinAndSelect("comment.author", "author") .where("author.id = :id", { id: ctx.params.id }) .getMany() - ctx.body = comments + ctx.body = comment } catch (e) { ctx.throw(400, e) @@ -313,8 +312,8 @@ export const PatchOne = async (ctx, next) => { const data = ctx.request.body try{ - const user: Users = await conn - .getRepository(Users) + const user: User = await conn + .getRepository(User) .findOne(ctx.params.id, { relations: ["profileImage"], }) @@ -322,11 +321,11 @@ export const PatchOne = async (ctx, next) => { if (data.fullname !== undefined) { user.fullname = data.fullname } - if (data.nTh !== undefined) { + if (data.n_th !== undefined) { user.nTh = data.nTh } - if (data.dateOfBirth !== undefined) { - user.dateOfBirth = data.dateOfBirth + if (data.birthdate !== undefined) { + user.birthdate = data.birthdate } if (data.department !== undefined) { user.department = data.department @@ -346,8 +345,8 @@ export const PatchOne = async (ctx, next) => { if (data.favoriteCharacter !== undefined) { user.favoriteCharacter = data.favoriteCharacter } - if (data.isActivated !== undefined) { - user.isActivated = !user.isActivated + if (data.is_active !== undefined) { + user.isActive = !user.isActive } await conn.manager.save(user) @@ -368,18 +367,18 @@ export const PatchAll = async (ctx, next) => { const data = ctx.request.body try{ - const allUsers: Users[] = await conn - .getRepository(Users) + const allUsers: User[] = await conn + .getRepository(User) .createQueryBuilder() .getMany() - const onlyUsers: Users[] = allUsers.slice(1, allUsers.length) + const onlyUsers: User[] = allUsers.slice(1, allUsers.length) for (const userSet of onlyUsers.entries()) { - const user: Users = userSet["1"] + const user: User = userSet["1"] - if (data.isActivated !== undefined) { - user.isActivated = !user.isActivated + if (data.is_active !== undefined) { + user.isActive = !user.isActive } await conn.manager.save(user) } diff --git a/src/entities/authenticationToken.ts b/src/entities/authenticationToken.ts new file mode 100644 index 0000000..8c03bf3 --- /dev/null +++ b/src/entities/authenticationToken.ts @@ -0,0 +1,28 @@ +import { + Column, + Entity, + PrimaryGeneratedColumn, + } from "typeorm" + +@Entity() +export default class AuthenticationToken { + @PrimaryGeneratedColumn() + public id: number + + @Column({ + type: "blob", + unique: true, + }) + public accessToken: string + + @Column({ + type: "blob", + unique: true, + }) + public refreshToken: string + + @Column({ + type: "bigint", + }) + public accessIp: number +} diff --git a/src/entities/comment.ts b/src/entities/comment.ts new file mode 100644 index 0000000..1445d12 --- /dev/null +++ b/src/entities/comment.ts @@ -0,0 +1,41 @@ +import { + Entity, + JoinTable, + ManyToMany, + ManyToOne, + OneToMany, +} from "typeorm" +import Content from "./content" +import Document from "./document" +import User from "./user" + +/* 댓글 테이블 스키마 */ +@Entity() +export default class Comment extends Content { + /* 작성자 */ + @ManyToOne(type => User, author => author.comments, { + nullable : false, + }) + public author: User + + /* 댓글이 달린 게시물 */ + @ManyToOne(type => Document, documents => documents.comments, { + nullable: false, + }) + public rootDocument: Document + + /* 좋아요한 유저들 */ + @ManyToMany(type => User) + @JoinTable() + public likedUsers: User[] + + // 이하 대댓글 옵션 + + /* 이 대댓글이 달린 댓글 */ + @ManyToOne(type => Comment, comment => comment.comments) + public rootComment: Comment + + /* 가지고 있는 대댓글 리스트 */ + @OneToMany(type => Comment, comment => comment.rootComment) + public comments: Comment[] +} diff --git a/src/entities/comments.ts b/src/entities/comments.ts deleted file mode 100644 index 162ce6f..0000000 --- a/src/entities/comments.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - Column, - Entity, - JoinTable, - ManyToMany, - ManyToOne, - OneToMany, -} from "typeorm" -import Contents from "./contents" -import Documents from "./documents" -import Users from "./users" - -/* 댓글 테이블 스키마 */ -@Entity() -export default class Comments extends Contents { - /* 작성자 */ - @ManyToOne(type => Users, author => author.comments, { - nullable : false, - }) - public author: Users - - /* 댓글이 달린 게시물 */ - @ManyToOne(type => Documents, documents => documents.comments, { - nullable: false, - }) - public rootDocument: Documents - - /* 좋아요 수 */ - @ManyToMany(type => Users) - @JoinTable() - public likedBy: Users[] - - // 이하 대댓글 옵션 - - /* 이 대댓글이 달린 댓글 */ - @ManyToOne(type => Comments, comments => comments.replies) - public rootComment: Comments - - /* 가지고 있는 대댓글 리스트 */ - @OneToMany(type => Comments, comments => comments.rootComment) - public replies: Comments[] -} diff --git a/src/entities/contents.ts b/src/entities/content.ts similarity index 83% rename from src/entities/contents.ts rename to src/entities/content.ts index 15b5bbc..96c271a 100644 --- a/src/entities/contents.ts +++ b/src/entities/content.ts @@ -4,7 +4,7 @@ import { PrimaryGeneratedColumn, } from "typeorm" -export default abstract class Contents { +export default abstract class Content { /* 컨텐츠 pk */ @PrimaryGeneratedColumn() public id: number @@ -21,5 +21,5 @@ export default abstract class Contents { /* 내용 */ @Column("text") - public text: string + public content: string } diff --git a/src/entities/document.ts b/src/entities/document.ts new file mode 100644 index 0000000..3f95ee4 --- /dev/null +++ b/src/entities/document.ts @@ -0,0 +1,29 @@ +import { + Entity, + JoinTable, + ManyToMany, + ManyToOne, + OneToMany, +} from "typeorm" +import Comment from "./comment" +import Content from "./content" +import User from "./user" + +/* 게시글 테이블 스키마 */ +@Entity() +export default class Document extends Content { + /* 작성자 */ + @ManyToOne(type => User, author => author.documents, { + nullable : false, + }) + public author: User + + /* 게시글에 달린 댓글 */ + @OneToMany(type => Comment, comment => comment.rootDocument) + public comments: Comment[] + + /* 좋아요한 유저들 */ + @ManyToMany(type => User) + @JoinTable() + public likedUsers: User[] +} diff --git a/src/entities/documents.ts b/src/entities/documents.ts deleted file mode 100644 index 1c895df..0000000 --- a/src/entities/documents.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { - Column, - Entity, - JoinTable, - ManyToMany, - ManyToOne, - OneToMany, -} from "typeorm" -import Comments from "./comments" -import Contents from "./contents" -import Users from "./users" - -/* 게시글 테이블 스키마 */ -@Entity() -export default class Documents extends Contents { - /* 작성자 */ - @ManyToOne( type => Users, author => author.documents, { - nullable : false, - }) - public author: Users - - /* 게시글에 달린 댓글 */ - @OneToMany(type => Comments, comments => comments.rootDocument) - public comments: Comments[] - - /* 좋아요 수 */ - @ManyToMany(type => Users) - @JoinTable() - public likedBy: Users[] -} diff --git a/src/entities/files.ts b/src/entities/file.ts similarity index 76% rename from src/entities/files.ts rename to src/entities/file.ts index 7fae26d..ff68e15 100644 --- a/src/entities/files.ts +++ b/src/entities/file.ts @@ -5,11 +5,11 @@ import { OneToOne, PrimaryGeneratedColumn, } from "typeorm" -import Users from "./users" +import User from "./user" /* 파일 테이블 스키마 */ @Entity() -export default class Files{ +export default class File{ /* 파일 pk */ @PrimaryGeneratedColumn() public id: number @@ -23,9 +23,9 @@ export default class Files{ public savedPath: string /* 파일 소유 유저 */ - @OneToOne(type => Users, user => user.profileImage, { + @OneToOne(type => User, user => user.profileImage, { nullable: false, }) @JoinColumn() - public user: Users + public user: User } diff --git a/src/entities/sessions.ts b/src/entities/sessions.ts deleted file mode 100644 index e330c42..0000000 --- a/src/entities/sessions.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { - Column, - CreateDateColumn, - Entity, - JoinColumn, - OneToOne, - PrimaryGeneratedColumn, - UpdateDateColumn, - } from "typeorm" -import Users from "./users" - -/* 세션 테이블 스키마 */ -@Entity() -export default class Sessions { - @PrimaryGeneratedColumn() - public id: number - - /* 세션에 해당하는 유저 */ - @OneToOne(type => Users, { - nullable: false, - }) - @JoinColumn() - public user: Users - - /* BLOB(Binary Large OBject)는 TEXT보다 알맞다고 함. - 세션아이디 컬럼. */ - @Column({ - type: "blob", - unique: true, - }) - public data: string - - @Column({ - type: "bigint", - }) - public ipv4: number - - @Column({ - nullable: true, - type: "bigint", - }) - public ipv6: number - - @CreateDateColumn({ - // type: "timestamp", - }) - public createdAt: Date - - @UpdateDateColumn({ - // type: "timestamp", - }) - public updatedAt: Date -} diff --git a/src/entities/users.ts b/src/entities/user.ts similarity index 71% rename from src/entities/users.ts rename to src/entities/user.ts index ce9987f..7279fd3 100644 --- a/src/entities/users.ts +++ b/src/entities/user.ts @@ -7,13 +7,13 @@ import { OneToOne, PrimaryGeneratedColumn, } from "typeorm" -import Comments from "./comments" -import Documents from "./documents" -import Files from "./files" +import Comment from "./comment" +import Document from "./document" +import File from "./file" /* 유저 테이블 스키마 */ @Entity() -export default class Users { +export default class User { /* Users table pk */ @PrimaryGeneratedColumn() public id: number @@ -30,7 +30,7 @@ export default class Users { /* 생일 */ @Column("date") - public dateOfBirth: Date + public birthdate: Date /* 아이디 */ @Column("varchar", { @@ -71,8 +71,8 @@ export default class Users { public favoriteCharacter: string /* 프로필 이미지 */ - @OneToOne(type => Files, files => files.user) - public profileImage: Files + @OneToOne(type => File, files => files.user) + public profileImage: File // 회원가입 시 입력받는 정보 끝 @@ -84,7 +84,7 @@ export default class Users { @Column("boolean", { default: false, }) - public isAnon: boolean + public isApproved: boolean /* 프로필 */ @Column("text", { @@ -96,19 +96,19 @@ export default class Users { @Column("boolean", { default: false, }) - public isSuperUser: boolean + public isSuperuser: boolean /* 활동인구 여부 */ @Column("boolean", { default: false, }) - public isActivated: boolean + public isActive: boolean /* 졸업여부 */ @Column("boolean", { default: false, }) - public isGraduated: boolean + public hasGraduated: boolean /* 정회원 여부 */ @Column("boolean", { @@ -120,39 +120,39 @@ export default class Users { @Column("int", { default: 0, }) - public nDocuments: number + public documentsCount: number /* 댓글 수 */ @Column("int", { default: 0, }) - public nComments: number + public commentsCount: number /* 좋아요한 게시글 수 */ @Column("int", { default: 0, }) - public nDocumentLikes: number + public likedDocumentsCount: number /* 좋아요한 댓글 수 */ @Column("int" , { default: 0, }) - public nCommentLikes: number + public likedCommentsCount: number /* 작성 글 리스트 */ - @OneToMany(type => Documents, document => document.author) - public documents: Documents[] + @OneToMany(type => Document, document => document.author) + public documents: Document[] /* 작성 댓글 리스트 */ - @OneToMany(type => Comments, comment => comment.author) - public comments: Comments[] + @OneToMany(type => Comment, comment => comment.author) + public comments: Comment[] /* 좋아요한 게시글 리스트 */ - @ManyToMany(type => Documents, document => document.likedBy) - public likedDocuments: Documents[] + @ManyToMany(type => Document, document => document.likedUsers) + public likedDocuments: Document[] /* 좋아요한 댓글 리스트 */ - @ManyToMany(type => Comments, comments => comments.likedBy) - public likedComments: Comments[] + @ManyToMany(type => Comment, comment => comment.likedUsers) + public likedComments: Comment[] } From f4ddd0b1b1e5a3c3aaaefe0fed05884e7d38d94b Mon Sep 17 00:00:00 2001 From: droplet92 Date: Sun, 7 Mar 2021 17:38:47 +0900 Subject: [PATCH 18/24] =?UTF-8?q?=EC=95=B1=EC=9D=B4=EB=9E=91=20=EB=AF=B8?= =?UTF-8?q?=EB=93=A4=EC=9B=A8=EC=96=B4=20=EA=B5=AC=EB=B6=84=EC=9D=B4=20?= =?UTF-8?q?=EC=96=B4=EB=A0=A4=EC=9B=8C=EC=84=9C=20=EB=94=94=EB=A0=89?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EC=83=88=EB=A1=9C=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/middleware/route.ts | 79 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/middleware/route.ts diff --git a/src/middleware/route.ts b/src/middleware/route.ts new file mode 100644 index 0000000..1db1e06 --- /dev/null +++ b/src/middleware/route.ts @@ -0,0 +1,79 @@ +import * as Router from "koa-router" +import * as Comment from "../controllers/comment" +import * as Document from "../controllers/document" +import * as File from "../controllers/file" +import * as AuthenticationToken from "../controllers/authenticationToken" +import * as Timeline from "../controllers/timeline" +import * as User from "../controllers/user" + +export var router = new Router({ prefix: '/api' }) +// export var router = new Router() + +// if (process.env.NODE_ENV === 'production') { +// router = new Router({ +// prefix: '/api' +// }) +// } + +/* router 등록방법: router.메소드("경로", 함수) + + 메소드: get, post, put, delete, option 등등 + + 함수: (ctx, next)를 인자로 받는 함수. + ctx: 현재 컨텍스트. 리퀘스트 1개당 컨텍스트 1개가 생성됨. + 리퀘스트 + 리스폰스 = 컨텍스트. + next: 다른 미들웨어가 실행될 때 까지 현재 미들웨어가 기다림. + 실행하고 싶은 다른 미들웨어가 있을 경우 사용. + async (ctx, next) => { + // app.use에 등록한 순서대로 실행 + await next() + // 역순으로 실행 + } +*/ + +/* 응답코드 : 메소드가 제데로 작동 되었을 때에 따른 출력되는 코드 + + 200 : OK (get, post, delete 등 작업이 완료되었을 때 출력) + 201 : Created (주로 put 에 쓰이며 작업으로 인해 정보가 추가되었을 때 출력) + CIAPI 에서는 put 이 아닌 post 로 정보를 추가하기 때문에, 정보가 추가되는 곳에는 201 로 설정함. + 204 : No Content (작업을 진행해도 아무런 정보가 뜨지 않는 경우) + + 출처 : https://developer.mozilla.org/ko/docs/Web/HTTP/Status +*/ + +// public API +router.post("/public/login", AuthenticationToken.Login) +router.post("/public/logout", AuthenticationToken.Logout) +router.post("/public/user", User.Post) + +// authorization required API +router.get("/user/authenticated", User.GetAuthenticated) +router.get("/user/:id", User.GetOne) +router.get("/user", User.GetAll) +router.delete("/user/:id", User.DeleteOne) +router.patch("/user/:id", User.PatchOne) +router.patch("/user", User.PatchAll) +router.get("/user/:id/document", User.GetDocuments) +router.get("/user/:id/comment", User.GetComment) + +router.get("/timeline/:page", Timeline.GetTimeline) + +router.get("/document/:id", Document.GetOne) +router.post("/document", Document.Post) +router.delete("/document/:id", Document.DeleteOne) +router.patch("/document/:id", Document.PatchOne) +router.get("/document/:id/likeIt", Document.GetLikes) +router.post("/document/:id/likeIt", Document.PostLikes) +router.delete("/document/:id/likeIt", Document.CancelLikes) + +router.get("/comment/:id", Comment.GetOne) +router.post("/comment", Comment.Post) +router.delete("/comment/:id", Comment.DeleteOne) +router.get("/comment/:id/likeIt", Comment.GetLikes) +router.post("/comment/:id/likeIt", Comment.PostLikes) +router.delete("/comment/:id/likeIt", Comment.CalcelLikes) + +router.get("/file/:id", File.GetOne) +router.get("/file", File.GetAll) +router.post("/file", File.Post) +router.delete("/file/:id", File.DeleteOne) From d52dfef80e17fe335b8d351af967f01f006c8e41 Mon Sep 17 00:00:00 2001 From: droplet92 Date: Sun, 7 Mar 2021 17:39:12 +0900 Subject: [PATCH 19/24] =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/auth/auth.ts | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 src/auth/auth.ts diff --git a/src/auth/auth.ts b/src/auth/auth.ts deleted file mode 100644 index 36f29da..0000000 --- a/src/auth/auth.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as crypto from "crypto" -import { Connection, getConnection } from "typeorm" -import Users from "../entities/users" - -export default async function Auth (username: string, password: string): Promise { - const conn: Connection = getConnection() - const users: Users[] = await conn - .getRepository(Users) - .find({ - where: { - username, - }, - }) - const user = users[0] - - const [encryptedKey, salt] = user.password.split("@") - const derivedKey = crypto.pbkdf2Sync(password, salt, 131071, 64, 'sha512') - - if (derivedKey.toString('hex') !== encryptedKey) - throw new Error('password mismatch') - return user -} From d66c9eaf0968e1f1c60c40387fb32afb5ce6ff2a Mon Sep 17 00:00:00 2001 From: droplet92 Date: Sun, 7 Mar 2021 17:39:31 +0900 Subject: [PATCH 20/24] =?UTF-8?q?jwt=20=EC=9D=B8=EC=A6=9D=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 + src/app.ts | 28 ++++--- src/lib/date.ts | 7 ++ src/middleware/refresher.ts | 42 +++++++++++ yarn.lock | 144 ++++++++++++++++++++++++++++++++++++ 5 files changed, 213 insertions(+), 10 deletions(-) create mode 100644 src/lib/date.ts create mode 100644 src/middleware/refresher.ts diff --git a/package.json b/package.json index 8647827..0f4ce98 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,10 @@ "@koa/cors": "^3.1.0", "@mapbox/node-pre-gyp": "^1.0.0", "@types/node": "^8.0.47", + "jsonwebtoken": "^8.5.1", "koa": "^2.13.1", "koa-bodyparser": "^4.2.0", + "koa-jwt": "^4.0.0", "koa-logger": "^3.1.0", "koa-router": "^7.2.1", "koa-views": "^6.1.1", diff --git a/src/app.ts b/src/app.ts index da7b440..0d7b143 100644 --- a/src/app.ts +++ b/src/app.ts @@ -4,16 +4,16 @@ import * as logger from "koa-logger" import * as Serve from "koa-static" import * as path from "path" import "reflect-metadata" -import { Connection, createConnection } from "typeorm" -// import leaver from "./leaver" -import { router } from "./route" -import session from "./session" +import { createConnection } from "typeorm" +import { router } from "./middleware/route" +import refresher from "./middleware/refresher" const cors = require('@koa/cors') +const jwt = require('koa-jwt') const app = new Koa() app.proxy = true -app.use(cors({ origin: '*' })) +app.use(cors({ origin: '*', credentials: true })) /* DB와 연결을 맺고 Connection Pool을 생성함 */ // tslint:disable-next-line @@ -30,11 +30,19 @@ if (process.env.NODE_ENV !== "production") { app.use(Serve(path.join("test-restful", "dist"))) } -/* DB에 탈퇴 회원 추가 */ -// app.use(leaver) - -/* 세션 */ -app.use(session) +/* authentication */ +app.use(jwt({ + secret: 'secretKey', + cookie: 'accessToken', + key: 'token', + passthrough: true, + }) + .unless({ + path: [/^\/api\/public(?:\/)?/] + }) +) + +app.use(refresher) /* 라우팅 */ app.use(router.routes()) diff --git a/src/lib/date.ts b/src/lib/date.ts new file mode 100644 index 0000000..82e9e34 --- /dev/null +++ b/src/lib/date.ts @@ -0,0 +1,7 @@ +const getAfter2weeks = () => { + const after2weeks = new Date() + after2weeks.setTime(Date.now() + (14*24*60*60*1000)) + return after2weeks +} + +export const cookieExpirationDate = () => getAfter2weeks() \ No newline at end of file diff --git a/src/middleware/refresher.ts b/src/middleware/refresher.ts new file mode 100644 index 0000000..58f02e1 --- /dev/null +++ b/src/middleware/refresher.ts @@ -0,0 +1,42 @@ +import { Connection, getConnection } from "typeorm" +import AuthenticationToken from "../entities/authenticationToken" +import { cookieExpirationDate } from "../lib/date" + +const jwt = require('jsonwebtoken') + +export default async function refresher(ctx, next) { + if (ctx.state.jwtOriginalError === undefined) + return await next() + + const conn: Connection = getConnection() + + try { + let accessToken = ctx.cookies.get('accessToken') + + // 1. Find refresh token by access token + const authenticationTokens: AuthenticationToken[] = await conn + .getRepository(AuthenticationToken) + .find({ where: { accessToken } }) + const authenticationToken = authenticationTokens[0] + + // 2. Decode refresh token + const decoded = jwt.verify(authenticationToken.refreshToken, 'secretKey') + const jsonUser = { user: decoded.user } + + // 3. Reissue access token + accessToken = jwt.sign(jsonUser, 'secretKey', { expiresIn: '30s' }) + ctx.cookies.set('accessToken', accessToken, { expires: cookieExpirationDate() }) + + // 4. Update database + authenticationToken.accessToken = accessToken + await conn.manager.save(authenticationToken) + + // 5. Set ctx.state.token + ctx.state.token = jsonUser + } + catch (e) { + ctx.throw(401, e) + } + + await next() +} diff --git a/yarn.lock b/yarn.lock index 34aa47c..df2f946 100644 --- a/yarn.lock +++ b/yarn.lock @@ -56,6 +56,14 @@ agent-base@6: dependencies: debug "4" +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv@^6.12.3: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -178,6 +186,11 @@ browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -249,6 +262,11 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + cli-highlight@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-1.2.3.tgz#b200f97ed0e43d24633e89de0f489a48bb87d2bf" @@ -489,6 +507,13 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + editorconfig@^0.13.2: version "0.13.3" resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.13.3.tgz#e5219e587951d60958fd94ea9a9a008cdeff1b34" @@ -839,6 +864,11 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflation@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" @@ -971,6 +1001,22 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonwebtoken@^8.5.1: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -980,6 +1026,23 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + keygrip@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" @@ -1018,6 +1081,15 @@ koa-convert@^1.2.0: co "^4.6.0" koa-compose "^3.0.0" +koa-jwt@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/koa-jwt/-/koa-jwt-4.0.0.tgz#4cac70cde5e225bc961a266303d4b6e873cba9bc" + integrity sha512-n56AG98tWQDtvVZwtVFKuPn1pGPOvtkKFEotSPRsdqKmZJqRdppDRD0toiiK7kefMLnVBzFbocaPyaI5WK/iyQ== + dependencies: + jsonwebtoken "^8.5.1" + koa-unless "^1.0.7" + p-any "^2.1.0" + koa-logger@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/koa-logger/-/koa-logger-3.1.0.tgz#81a353f41870119d56260e0e644f04e731810039" @@ -1054,6 +1126,11 @@ koa-static@^4.0.1: debug "^2.6.8" koa-send "^4.1.0" +koa-unless@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/koa-unless/-/koa-unless-1.0.7.tgz#b9df375e2b4da3043918d48622520c2c0b79f032" + integrity sha1-ud83XitNowQ5GNSGIlIMLAt58DI= + koa-views@^6.1.1: version "6.1.4" resolved "https://registry.yarnpkg.com/koa-views/-/koa-views-6.1.4.tgz#595eb683ca17d8dfaa1d100b42ba4e34c762154d" @@ -1116,6 +1193,41 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + lru-cache@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee" @@ -1473,6 +1585,20 @@ osenv@0, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-any@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-any/-/p-any-2.1.0.tgz#719489408e14f5f941a748f1e817f5c71cab35cb" + integrity sha512-JAERcaMBLYKMq+voYw36+x5Dgh47+/o7yuv2oQYuSSUml4YeqJEFznBrY2UeEkoSHqBua6hz518n/PsowTYLLg== + dependencies: + p-cancelable "^2.0.0" + p-some "^4.0.0" + type-fest "^0.3.0" + +p-cancelable@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" + integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg== + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -1489,6 +1615,14 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" +p-some@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-some/-/p-some-4.1.0.tgz#28e73bc1e0d62db54c2ed513acd03acba30d5c04" + integrity sha512-MF/HIbq6GeBqTrTIl5OJubzkGU+qfFhAFi0gnTAK6rgEIJIknEiABHOTtQu4e6JiXjIwuMPMUFQzyHh5QjCl1g== + dependencies: + aggregate-error "^3.0.0" + p-cancelable "^2.0.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -1736,6 +1870,11 @@ sax@>=0.6.0, sax@^1.2.4: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" +semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + semver@^7.3.4: version "7.3.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" @@ -2046,6 +2185,11 @@ type-detect@^4.0.0: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" +type-fest@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + type-is@^1.6.14: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" From 4388ddd4ed38020c57809b716ca4695e3a011495 Mon Sep 17 00:00:00 2001 From: droplet92 Date: Sun, 7 Mar 2021 17:40:12 +0900 Subject: [PATCH 21/24] =?UTF-8?q?sqlite=20DB=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=ED=99=95=EC=9E=A5=EC=9E=90=EC=9D=B8=20.sqlite=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ormconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ormconfig.json b/ormconfig.json index d4d7e3d..a14c88a 100644 --- a/ormconfig.json +++ b/ormconfig.json @@ -1,6 +1,6 @@ { "type": "sqlite", - "database": "db/test.sql", + "database": "db/test.sqlite", "synchronize": true, "logging": false, "entities": [ From e0a33d9eee3cfeab1b661ddc7271aac3aa0ceef7 Mon Sep 17 00:00:00 2001 From: droplet92 Date: Sun, 7 Mar 2021 22:37:19 +0900 Subject: [PATCH 22/24] =?UTF-8?q?ip2int=20=EA=B5=AC=ED=98=84=20(=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=ED=95=84=EC=9A=94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/ip2int.ts | 64 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 10 deletions(-) diff --git a/src/lib/ip2int.ts b/src/lib/ip2int.ts index 6043f6b..28187ba 100644 --- a/src/lib/ip2int.ts +++ b/src/lib/ip2int.ts @@ -14,22 +14,66 @@ const ipv4ToInt = (ip: string): number => { const d = ip.split(".") return ((((((+d[0]) * 256) + (+d[1])) * 256) + (+d[2])) * 256) + (+d[3]) } + +// https://stackoverflow.com/questions/30329991/ipv6-as-a-comparable-javascript-string const ipv6ToInt = (ip: string): number => { - return 1 + // replace ipv4 address if any + var ipv4 = ip_string.match(/(.*:)([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$)/); + if (ipv4) { + var ip_string = ipv4[1]; + ipv4 = ipv4[2].match(/[0-9]+/g); + for (var i = 0;i < 4;i ++) { + var byte = parseInt(ipv4[i],10); + ipv4[i] = ("0" + byte.toString(16)).substr(-2); + } + ip_string += ipv4[0] + ipv4[1] + ':' + ipv4[2] + ipv4[3]; + } + + // take care of leading and trailing :: + ip_string = ip_string.replace(/^:|:$/g, ''); + + var ipv6 = ip_string.split(':'); + + for (var i = 0; i < ipv6.length; i ++) { + var hex = ipv6[i]; + if (hex != "") { + // normalize leading zeros + ipv6[i] = ("0000" + hex).substr(-4); + } + else { + // normalize grouped zeros :: + hex = []; + for (var j = ipv6.length; j <= 8; j ++) { + hex.push('0000'); + } + ipv6[i] = hex.join(':'); + } + } + + return ipv6.join(':'); } /* https://stackoverflow.com/a/8105740 */ -export function intToIpv4 (num: number): string { - let d = String(num % 256) - for (let i = 3; i > 0; i--) { - num = Math.floor(num / 256) - d = num % 256 + "." + d - } - return d +function intToIpv4 (num: number): string { + const octet0 = ((num >> 24) & 255) + const octet1 = ((num >> 16) & 255) + const octet2 = ((num >> 8) & 255) + const octet3 = num & 255 + return [octet0, octet1, octet2, octet3].join('.') } -export function intToIpv6 (num: number): string { - return "bb" +function intToIpv6 (num: number): string { + const blockSize = (1 << 16) - 1 + return [ + (num >> 112) | blockSize, + (num >> 96) | blockSize, + (num >> 80) | blockSize, + (num >> 64) | blockSize, + (num >> 48) | blockSize, + (num >> 32) | blockSize, + (num >> 16) | blockSize, + num | blockSize, + ].join(':') } export function ipToInt (ip: string): number { From d48550a7ba0acef079e474c001573c8649c00d06 Mon Sep 17 00:00:00 2001 From: sGOM Date: Fri, 12 Mar 2021 19:16:22 +0900 Subject: [PATCH 23/24] =?UTF-8?q?=ED=94=84=EB=A1=9C=ED=95=84=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EC=88=98=EC=A0=95=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/auth/index.ts | 23 +++++++++++++++++++++++ src/controllers/authenticationToken.ts | 24 +----------------------- src/controllers/user.ts | 16 +++++----------- 3 files changed, 29 insertions(+), 34 deletions(-) create mode 100644 src/auth/index.ts diff --git a/src/auth/index.ts b/src/auth/index.ts new file mode 100644 index 0000000..3c3e145 --- /dev/null +++ b/src/auth/index.ts @@ -0,0 +1,23 @@ +import { Connection, getConnection } from "typeorm" +import * as crypto from "crypto" +import User from "../entities/user" + +export async function Authenticate (username: string, password: string): Promise { + const conn: Connection = getConnection() + const users: User[] = await conn + .getRepository(User) + .find({ + where: { + username, + }, + relations: ['profileImage'] + }) + const user = users[0] + + const [encryptedKey, salt] = user.password.split("@") + const derivedKey = crypto.pbkdf2Sync(password, salt, 131071, 64, 'sha512') + + if (derivedKey.toString('hex') !== encryptedKey) + throw new Error('password mismatch') + return user +} diff --git a/src/controllers/authenticationToken.ts b/src/controllers/authenticationToken.ts index 4ae570d..631e066 100644 --- a/src/controllers/authenticationToken.ts +++ b/src/controllers/authenticationToken.ts @@ -2,32 +2,10 @@ import { Connection, getConnection } from "typeorm" import AuthenticationToken from "../entities/authenticationToken" import { ipToInt } from "../lib/ip2int" import { cookieExpirationDate } from "../lib/date" -import * as crypto from "crypto" -import User from "../entities/user" +import { Authenticate } from "../auth" const jwt = require('jsonwebtoken') - -async function Authenticate (username: string, password: string): Promise { - const conn: Connection = getConnection() - const users: User[] = await conn - .getRepository(User) - .find({ - where: { - username, - }, - relations: ['profileImage'] - }) - const user = users[0] - - const [encryptedKey, salt] = user.password.split("@") - const derivedKey = crypto.pbkdf2Sync(password, salt, 131071, 64, 'sha512') - - if (derivedKey.toString('hex') !== encryptedKey) - throw new Error('password mismatch') - return user -} - /* 로그인 */ export const Login = async (ctx, next) => { const authenticationToken: AuthenticationToken = new AuthenticationToken() diff --git a/src/controllers/user.ts b/src/controllers/user.ts index 891028c..60845fe 100644 --- a/src/controllers/user.ts +++ b/src/controllers/user.ts @@ -5,6 +5,7 @@ import Document from "../entities/document" import File from "../entities/file" import AuthenticationToken from "../entities/authenticationToken" import User from "../entities/user" +import { Authenticate } from "../auth" /* 세션 유저 GET */ export const GetAuthenticated = async (ctx, next) => { @@ -57,10 +58,7 @@ export const GetAll = async (ctx, next) => { .getRepository(User) .find({ relations: ["profileImage"] }) - /* 0번 탈퇴한 유저 제외 */ - const onlyUsers: User[] = users.slice(1, users.length) - - ctx.body = onlyUsers + ctx.body = users } catch (e){ ctx.throw(400, e) @@ -312,11 +310,7 @@ export const PatchOne = async (ctx, next) => { const data = ctx.request.body try{ - const user: User = await conn - .getRepository(User) - .findOne(ctx.params.id, { - relations: ["profileImage"], - }) + const user = await Authenticate(ctx.state.token.user.username, data.password) if (data.fullname !== undefined) { user.fullname = data.fullname @@ -327,8 +321,8 @@ export const PatchOne = async (ctx, next) => { if (data.birthdate !== undefined) { user.birthdate = data.birthdate } - if (data.department !== undefined) { - user.department = data.department + if (data.major !== undefined) { + user.department = data.major } if (data.studentNumber !== undefined) { user.studentNumber = data.studentNumber From 4362a82eb8d2c73dbc5bca7ea848facdedfa70f7 Mon Sep 17 00:00:00 2001 From: droplet92 Date: Fri, 12 Mar 2021 23:03:18 +0900 Subject: [PATCH 24/24] =?UTF-8?q?=EB=8D=94=20=EC=9D=B4=EC=83=81=20travis?= =?UTF-8?q?=20CI=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EC=9D=8C=20-=20circle=20CI=EB=82=98=20github=20action?= =?UTF-8?q?s=EB=A1=9C=20=EC=9D=B4=EC=A3=BC=20=EC=A4=80=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .travis.yml | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 61dee01..0000000 --- a/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -sudo: required -dist: trusty -language: node_js -node_js: - - "8" -cache: - directories: - - node_modules - - $HOME/.yarn-cache -install: -- | - yarn install -script: -- | - yarn lint - yarn test \ No newline at end of file