kopia lustrzana https://codeberg.org/nmkj/audon
fix invalid session error
rodzic
429844799f
commit
059ab019d6
|
@ -1,7 +1,9 @@
|
|||
LOCAL_DOMAIN="localhost:1323"
|
||||
SESSION_SECRET="dev"
|
||||
DB_HOST="localhost"
|
||||
DB_PORT=27017
|
||||
LOCAL_DOMAIN="audon.nmkj.tk"
|
||||
SESSION_SECRET="secret"
|
||||
DB_HOST="localhost:27017"
|
||||
DB_NAME="audon"
|
||||
DB_USER="root"
|
||||
DB_PASS="example"
|
||||
LIVEKIT_API_KEY="devkey"
|
||||
LIVEKIT_API_SECRET="secret"
|
||||
LIVEKIT_HOST="localhost:7880"
|
||||
|
|
|
@ -8,6 +8,10 @@
|
|||
"name": "audon-fe",
|
||||
"version": "0.0.0",
|
||||
"dependencies": {
|
||||
"@vuelidate/core": "^2.0.0",
|
||||
"@vuelidate/validators": "^2.0.0",
|
||||
"axios": "^1.2.0",
|
||||
"lodash": "^4.17.21",
|
||||
"pinia": "^2.0.26",
|
||||
"vue": "^3.2.45",
|
||||
"vue-router": "^4.1.6",
|
||||
|
@ -303,6 +307,90 @@
|
|||
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz",
|
||||
"integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg=="
|
||||
},
|
||||
"node_modules/@vuelidate/core": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@vuelidate/core/-/core-2.0.0.tgz",
|
||||
"integrity": "sha512-xIFgdQlScO0aaSZ0wTGPJh8YcTMNAj5veI8yPgiAyxOT+GV7vNQFiU1vpYWCL4cklkkhYvRRSC2OEX7YOZNmPQ==",
|
||||
"dependencies": {
|
||||
"vue-demi": "^0.13.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@vue/composition-api": "^1.0.0-rc.1",
|
||||
"vue": "^2.0.0 || >=3.0.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@vue/composition-api": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@vuelidate/core/node_modules/vue-demi": {
|
||||
"version": "0.13.11",
|
||||
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
|
||||
"integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
|
||||
"hasInstallScript": true,
|
||||
"bin": {
|
||||
"vue-demi-fix": "bin/vue-demi-fix.js",
|
||||
"vue-demi-switch": "bin/vue-demi-switch.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@vue/composition-api": "^1.0.0-rc.1",
|
||||
"vue": "^3.0.0-0 || ^2.6.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@vue/composition-api": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@vuelidate/validators": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@vuelidate/validators/-/validators-2.0.0.tgz",
|
||||
"integrity": "sha512-fQQcmDWfz7pyH5/JPi0Ng2GEgNK1pUHn/Z/j5rG/Q+HwhgIXvJblTPcZwKOj1ABL7V4UVuGKECvZCDHNGOwdrg==",
|
||||
"dependencies": {
|
||||
"vue-demi": "^0.13.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@vue/composition-api": "^1.0.0-rc.1",
|
||||
"vue": "^2.0.0 || >=3.0.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@vue/composition-api": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@vuelidate/validators/node_modules/vue-demi": {
|
||||
"version": "0.13.11",
|
||||
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
|
||||
"integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
|
||||
"hasInstallScript": true,
|
||||
"bin": {
|
||||
"vue-demi-fix": "bin/vue-demi-fix.js",
|
||||
"vue-demi-switch": "bin/vue-demi-switch.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@vue/composition-api": "^1.0.0-rc.1",
|
||||
"vue": "^3.0.0-0 || ^2.6.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@vue/composition-api": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@vuetify/loader-shared": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@vuetify/loader-shared/-/loader-shared-1.7.0.tgz",
|
||||
|
@ -384,6 +472,21 @@
|
|||
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/asynckit": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
|
||||
},
|
||||
"node_modules/axios": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz",
|
||||
"integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==",
|
||||
"dependencies": {
|
||||
"follow-redirects": "^1.15.0",
|
||||
"form-data": "^4.0.0",
|
||||
"proxy-from-env": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/balanced-match": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||
|
@ -449,6 +552,17 @@
|
|||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/combined-stream": {
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
||||
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
||||
"dependencies": {
|
||||
"delayed-stream": "~1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/commondir": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
|
||||
|
@ -515,6 +629,14 @@
|
|||
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/delayed-stream": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
|
||||
"engines": {
|
||||
"node": ">=0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/doctrine": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
|
||||
|
@ -1196,6 +1318,38 @@
|
|||
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/follow-redirects": {
|
||||
"version": "1.15.2",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
|
||||
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "individual",
|
||||
"url": "https://github.com/sponsors/RubenVerborgh"
|
||||
}
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=4.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"debug": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/form-data": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
|
||||
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
|
||||
"dependencies": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.8",
|
||||
"mime-types": "^2.1.12"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
|
@ -1458,8 +1612,7 @@
|
|||
"node_modules/lodash": {
|
||||
"version": "4.17.21",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
|
||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
||||
"dev": true
|
||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
|
||||
},
|
||||
"node_modules/lodash.merge": {
|
||||
"version": "4.6.2",
|
||||
|
@ -1511,6 +1664,25 @@
|
|||
"semver": "bin/semver.js"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-db": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-types": {
|
||||
"version": "2.1.35",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
||||
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||
"dependencies": {
|
||||
"mime-db": "1.52.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/minimatch": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||
|
@ -1859,6 +2031,11 @@
|
|||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/proxy-from-env": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
|
||||
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
|
||||
},
|
||||
"node_modules/punycode": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
|
||||
|
@ -2570,6 +2747,38 @@
|
|||
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz",
|
||||
"integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg=="
|
||||
},
|
||||
"@vuelidate/core": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@vuelidate/core/-/core-2.0.0.tgz",
|
||||
"integrity": "sha512-xIFgdQlScO0aaSZ0wTGPJh8YcTMNAj5veI8yPgiAyxOT+GV7vNQFiU1vpYWCL4cklkkhYvRRSC2OEX7YOZNmPQ==",
|
||||
"requires": {
|
||||
"vue-demi": "^0.13.11"
|
||||
},
|
||||
"dependencies": {
|
||||
"vue-demi": {
|
||||
"version": "0.13.11",
|
||||
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
|
||||
"integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
|
||||
"requires": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"@vuelidate/validators": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@vuelidate/validators/-/validators-2.0.0.tgz",
|
||||
"integrity": "sha512-fQQcmDWfz7pyH5/JPi0Ng2GEgNK1pUHn/Z/j5rG/Q+HwhgIXvJblTPcZwKOj1ABL7V4UVuGKECvZCDHNGOwdrg==",
|
||||
"requires": {
|
||||
"vue-demi": "^0.13.11"
|
||||
},
|
||||
"dependencies": {
|
||||
"vue-demi": {
|
||||
"version": "0.13.11",
|
||||
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.13.11.tgz",
|
||||
"integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==",
|
||||
"requires": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"@vuetify/loader-shared": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@vuetify/loader-shared/-/loader-shared-1.7.0.tgz",
|
||||
|
@ -2626,6 +2835,21 @@
|
|||
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
|
||||
"dev": true
|
||||
},
|
||||
"asynckit": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
|
||||
},
|
||||
"axios": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-1.2.0.tgz",
|
||||
"integrity": "sha512-zT7wZyNYu3N5Bu0wuZ6QccIf93Qk1eV8LOewxgjOZFd2DenOs98cJ7+Y6703d0wkaXGY6/nZd4EweJaHz9uzQw==",
|
||||
"requires": {
|
||||
"follow-redirects": "^1.15.0",
|
||||
"form-data": "^4.0.0",
|
||||
"proxy-from-env": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"balanced-match": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
|
||||
|
@ -2679,6 +2903,14 @@
|
|||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||
"dev": true
|
||||
},
|
||||
"combined-stream": {
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
||||
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
||||
"requires": {
|
||||
"delayed-stream": "~1.0.0"
|
||||
}
|
||||
},
|
||||
"commondir": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
|
||||
|
@ -2728,6 +2960,11 @@
|
|||
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
|
||||
"dev": true
|
||||
},
|
||||
"delayed-stream": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
|
||||
},
|
||||
"doctrine": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
|
||||
|
@ -3129,6 +3366,21 @@
|
|||
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
|
||||
"dev": true
|
||||
},
|
||||
"follow-redirects": {
|
||||
"version": "1.15.2",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
|
||||
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
|
||||
},
|
||||
"form-data": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
|
||||
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
|
||||
"requires": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.8",
|
||||
"mime-types": "^2.1.12"
|
||||
}
|
||||
},
|
||||
"fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
|
@ -3323,8 +3575,7 @@
|
|||
"lodash": {
|
||||
"version": "4.17.21",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
|
||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
||||
"dev": true
|
||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
|
||||
},
|
||||
"lodash.merge": {
|
||||
"version": "4.6.2",
|
||||
|
@ -3366,6 +3617,19 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"mime-db": {
|
||||
"version": "1.52.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
|
||||
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
|
||||
},
|
||||
"mime-types": {
|
||||
"version": "2.1.35",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
|
||||
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
|
||||
"requires": {
|
||||
"mime-db": "1.52.0"
|
||||
}
|
||||
},
|
||||
"minimatch": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||
|
@ -3592,6 +3856,11 @@
|
|||
"fast-diff": "^1.1.2"
|
||||
}
|
||||
},
|
||||
"proxy-from-env": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
|
||||
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
|
||||
},
|
||||
"punycode": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
|
||||
|
|
|
@ -9,6 +9,10 @@
|
|||
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vuelidate/core": "^2.0.0",
|
||||
"@vuelidate/validators": "^2.0.0",
|
||||
"axios": "^1.2.0",
|
||||
"lodash": "^4.17.21",
|
||||
"pinia": "^2.0.26",
|
||||
"vue": "^3.2.45",
|
||||
"vue-router": "^4.1.6",
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
import { helpers } from "@vuelidate/validators";
|
||||
|
||||
export default {
|
||||
validators: {
|
||||
fqdn: helpers.regex(
|
||||
/^[a-zA-Z]([a-zA-Z0-9\-]+[\.]?)*[a-zA-Z0-9]$/,
|
||||
/^([a-zA-Z0-9]{1}[a-zA-Z0-9-]{0,62})(\.[a-zA-Z0-9]{1}[a-zA-Z0-9-]{0,62})*?(\.[a-zA-Z]{1}[a-zA-Z0-9]{0,62})\.?$/
|
||||
),
|
||||
},
|
||||
};
|
|
@ -4,6 +4,8 @@ import { createPinia } from "pinia";
|
|||
import { createVuetify } from "vuetify";
|
||||
import { aliases, mdi } from "vuetify/iconsets/mdi-svg";
|
||||
|
||||
import axios from "axios";
|
||||
|
||||
import App from "./App.vue";
|
||||
import router from "./router";
|
||||
|
||||
|
@ -22,6 +24,8 @@ const vuetify = createVuetify({
|
|||
},
|
||||
});
|
||||
|
||||
axios.defaults.withCredentials = true
|
||||
|
||||
const app = createApp(App);
|
||||
|
||||
app.use(createPinia());
|
||||
|
|
|
@ -1,33 +1,72 @@
|
|||
<script>
|
||||
import { RouterLink } from "vue-router";
|
||||
import { useVuelidate } from "@vuelidate/core";
|
||||
import { required, helpers } from "@vuelidate/validators";
|
||||
import utils from "../assets/utils";
|
||||
import _ from "lodash/collection";
|
||||
import axios from "axios";
|
||||
|
||||
export default {
|
||||
setup() {
|
||||
return {
|
||||
v$: useVuelidate(),
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
server: "",
|
||||
};
|
||||
},
|
||||
validations() {
|
||||
return {
|
||||
server: {
|
||||
required: helpers.withMessage("アドレスを入力してください", required),
|
||||
hostname: helpers.withMessage(
|
||||
"有効なアドレスを入力してください",
|
||||
utils.validators.fqdn
|
||||
),
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
serverErrors() {
|
||||
const errors = this.v$.server.$errors;
|
||||
return _.map(errors, (e) => e.$message);
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
submit() {
|
||||
console.log("submit called")
|
||||
}
|
||||
}
|
||||
async onSubmit() {
|
||||
const isFormCorrect = await this.v$.$validate();
|
||||
if (!isFormCorrect) {
|
||||
return;
|
||||
}
|
||||
const response = await axios.postForm("/api/login", { server: this.server });
|
||||
if (response.status === 201) {
|
||||
// this.$router.push(response.data)
|
||||
location.assign(response.data)
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<h1>Audon</h1>
|
||||
<v-form class="my-3">
|
||||
<v-form ref="form" @submit.prevent="onSubmit" class="my-3" lazy-validation>
|
||||
<v-text-field
|
||||
v-model="server"
|
||||
name="server"
|
||||
label="サーバーURL"
|
||||
hint="Mastodon / Pleroma / Misskey"
|
||||
label="Mastodon / Pleroma サーバー"
|
||||
placeholder="mastodon.example"
|
||||
class="mb-2"
|
||||
:error-messages="serverErrors"
|
||||
@input="v$.server.$touch"
|
||||
@blur="v$.server.$touch"
|
||||
clearable
|
||||
/>
|
||||
<v-btn block @click="submit">ログイン</v-btn>
|
||||
<v-btn block @click="onSubmit" :disabled="!v$.$dirty || v$.$error"
|
||||
>ログイン</v-btn
|
||||
>
|
||||
</v-form>
|
||||
<div class="w-100 text-right">
|
||||
<RouterLink to="/about">利用規約</RouterLink>
|
||||
|
|
35
config.go
35
config.go
|
@ -1,10 +1,8 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/url"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"github.com/joho/godotenv"
|
||||
)
|
||||
|
@ -17,21 +15,21 @@ type (
|
|||
}
|
||||
|
||||
AppConfigBase struct {
|
||||
DBName string `validate:"required,alphabum"`
|
||||
Database *DBConfig
|
||||
SeesionSecret string `validate:"required,ascii"`
|
||||
LocalDomain string `validate:"required,hostname|hostname_port`
|
||||
LocalDomain string `validate:"required,hostname|hostname_port"`
|
||||
}
|
||||
|
||||
LivekitConfig struct {
|
||||
LivekitAPIKey string `validate:"required,alphanum"`
|
||||
LivekitAPISecret string `validate:"required,alphanum"`
|
||||
APIKey string `validate:"required,ascii"`
|
||||
APISecret string `validate:"required,ascii"`
|
||||
Host string `validate:"required,hostname_port"`
|
||||
}
|
||||
|
||||
DBConfig struct {
|
||||
User string `validate:"required,alphanum"`
|
||||
Password string `validate:"required,ascii"`
|
||||
Host string `validare:"required,hostname"`
|
||||
Port int `validate:"required,gt=20000"`
|
||||
Host string `validare:"required,hostname_port"`
|
||||
Name string `validate:"required,alphanum"`
|
||||
}
|
||||
)
|
||||
|
@ -50,15 +48,16 @@ func loadConfig(envname string) (*AppConfig, error) {
|
|||
if err := godotenv.Load(".env." + envname); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if err := godotenv.Load(".env"); err != nil {
|
||||
return nil, err
|
||||
if _, err := os.Stat(".env"); err == nil {
|
||||
if err := godotenv.Load(".env"); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
var appConf AppConfig
|
||||
|
||||
// Setup base config
|
||||
basicConf := AppConfigBase{
|
||||
DBName: os.Getenv("DB_NAME"),
|
||||
SeesionSecret: os.Getenv("SESSION_SECRET"),
|
||||
LocalDomain: os.Getenv("LOCAL_DOMAIN"),
|
||||
}
|
||||
|
@ -71,30 +70,28 @@ func loadConfig(envname string) (*AppConfig, error) {
|
|||
appConf.AppConfigBase = basicConf
|
||||
|
||||
// Setup MongoDB config
|
||||
dbport, err := strconv.Atoi(os.Getenv("DB_PORT"))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
dbconf := &DBConfig{
|
||||
User: os.Getenv("DB_USER"),
|
||||
Password: os.Getenv("DB_PASS"),
|
||||
Host: os.Getenv("DB_HOST"),
|
||||
Port: dbport,
|
||||
Name: os.Getenv("DB_NAME"),
|
||||
}
|
||||
if err := mainValidator.Struct(dbconf); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
appConf.Database = dbconf
|
||||
mongoURL := &url.URL{
|
||||
Scheme: "mongodb",
|
||||
User: url.UserPassword(dbconf.User, dbconf.Password),
|
||||
Host: fmt.Sprintf("%s:%d", dbconf.Host, dbconf.Port),
|
||||
Host: dbconf.Host,
|
||||
}
|
||||
appConf.MongoURL = mongoURL
|
||||
|
||||
// Setup LiveKit config
|
||||
lkConf := &LivekitConfig{
|
||||
LivekitAPIKey: os.Getenv("LIVEKIT_API_KEY"),
|
||||
LivekitAPISecret: os.Getenv("LIVEKIT_API_SECRET"),
|
||||
APIKey: os.Getenv("LIVEKIT_API_KEY"),
|
||||
APISecret: os.Getenv("LIVEKIT_API_SECRET"),
|
||||
Host: os.Getenv("LIVEKIT_HOST"),
|
||||
}
|
||||
if err := mainValidator.Struct(lkConf); err != nil {
|
||||
return nil, err
|
||||
|
|
3
go.mod
3
go.mod
|
@ -6,10 +6,12 @@ require (
|
|||
github.com/go-playground/validator/v10 v10.11.1
|
||||
github.com/gorilla/sessions v1.2.1
|
||||
github.com/jaevor/go-nanoid v1.3.0
|
||||
github.com/joho/godotenv v1.4.0
|
||||
github.com/labstack/echo-contrib v0.13.0
|
||||
github.com/labstack/echo/v4 v4.9.1
|
||||
github.com/livekit/protocol v1.2.3
|
||||
github.com/mattn/go-mastodon v0.0.6
|
||||
github.com/oklog/ulid/v2 v2.1.0
|
||||
github.com/pkg/errors v0.9.1
|
||||
go.mongodb.org/mongo-driver v1.11.0
|
||||
)
|
||||
|
@ -24,7 +26,6 @@ require (
|
|||
github.com/gorilla/context v1.1.1 // indirect
|
||||
github.com/gorilla/securecookie v1.1.1 // indirect
|
||||
github.com/gorilla/websocket v1.5.0 // indirect
|
||||
github.com/joho/godotenv v1.4.0 // indirect
|
||||
github.com/klauspost/compress v1.13.6 // indirect
|
||||
github.com/labstack/gommon v0.4.0 // indirect
|
||||
github.com/leodido/go-urn v1.2.1 // indirect
|
||||
|
|
3
go.sum
3
go.sum
|
@ -96,6 +96,9 @@ github.com/mattn/go-mastodon v0.0.6/go.mod h1:cg7RFk2pcUfHZw/IvKe1FUzmlq5KnLFqs7
|
|||
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
|
||||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
|
||||
github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
|
||||
github.com/oklog/ulid/v2 v2.1.0 h1:+9lhoxAP56we25tyYETBBY1YLA2SaoLvUFgrP2miPJU=
|
||||
github.com/oklog/ulid/v2 v2.1.0/go.mod h1:rcEKHmBBKfef9DhnvX7y1HZBYxjXb0cP5ExxNsTT1QQ=
|
||||
github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
|
||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
|
|
19
oauth.go
19
oauth.go
|
@ -1,14 +1,15 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"time"
|
||||
|
||||
"github.com/gorilla/sessions"
|
||||
"github.com/jaevor/go-nanoid"
|
||||
"github.com/labstack/echo/v4"
|
||||
mastodon "github.com/mattn/go-mastodon"
|
||||
"github.com/oklog/ulid/v2"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
)
|
||||
|
||||
|
@ -36,7 +37,7 @@ func verifyTokenInSession(c echo.Context, sess *sessions.Session) (valid bool, e
|
|||
func loginHandler(c echo.Context) (err error) {
|
||||
serverHost := c.FormValue("server")
|
||||
|
||||
if err = mainValidator.Var(serverHost, "required,hostname|hostname_port"); err != nil {
|
||||
if err = mainValidator.Var(serverHost, "required,hostname,fqdn"); err != nil {
|
||||
return wrapValidationError(err)
|
||||
}
|
||||
|
||||
|
@ -122,12 +123,18 @@ func oauthHandler(c echo.Context) (err error) {
|
|||
coll := mainDB.Collection(COLLECTION_USER)
|
||||
if result, dbErr := findUserByRemote(c.Request().Context(), string(acc.ID), acc.URL); dbErr == mongo.ErrNoDocuments {
|
||||
// Create user if not yet registered
|
||||
canonic, err := nanoid.Standard(21) // Should AudonID be sortable?
|
||||
// canonic, err := nanoid.Standard(21) // Should AudonID be sortable?
|
||||
// if err != nil {
|
||||
// c.Logger().Error(err)
|
||||
// return echo.NewHTTPError(http.StatusInternalServerError)
|
||||
// }
|
||||
entropy := ulid.Monotonic(rand.Reader, 0)
|
||||
id, err := ulid.New(ulid.Timestamp(time.Now()), entropy)
|
||||
if err != nil {
|
||||
c.Logger().Error(err)
|
||||
return echo.NewHTTPError(http.StatusInternalServerError)
|
||||
}
|
||||
data.AudonID = canonic()
|
||||
data.AudonID = id.String()
|
||||
newUser := AudonUser{
|
||||
AudonID: data.AudonID,
|
||||
RemoteID: string(acc.ID),
|
||||
|
@ -152,6 +159,6 @@ func oauthHandler(c echo.Context) (err error) {
|
|||
return echo.NewHTTPError(http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
// return c.Redirect(http.StatusFound, "/")
|
||||
return c.Redirect(http.StatusFound, "http://localhost:5173")
|
||||
return c.Redirect(http.StatusFound, "/")
|
||||
// return c.Redirect(http.StatusFound, "http://localhost:5173")
|
||||
}
|
||||
|
|
26
room.go
26
room.go
|
@ -15,7 +15,7 @@ func createRoomHandler(c echo.Context) (err error) {
|
|||
if err = c.Bind(room); err != nil {
|
||||
return ErrInvalidRequestFormat
|
||||
}
|
||||
if err = mainValidator.StructExcept(room, "RoomID"); err != nil {
|
||||
if err = mainValidator.StructExcept(room, "RoomID"); err != nil { // New RoomID will be created, so one in request doesn't matter
|
||||
return wrapValidationError(err)
|
||||
}
|
||||
|
||||
|
@ -45,23 +45,33 @@ func createRoomHandler(c echo.Context) (err error) {
|
|||
}
|
||||
room.Host = host
|
||||
|
||||
for _, cohost := range room.CoHost {
|
||||
// If CoHosts are already registered, retrieve their AudonID
|
||||
for i, cohost := range room.CoHost {
|
||||
cohostUser, err := findUserByRemote(c.Request().Context(), cohost.RemoteID, cohost.RemoteURL)
|
||||
if err == nil {
|
||||
cohost.AudonID = cohostUser.AudonID
|
||||
room.CoHost[i].AudonID = cohostUser.AudonID
|
||||
}
|
||||
}
|
||||
|
||||
roomToken, err := getHostToken(room.RoomID, host.AudonID)
|
||||
if err != nil {
|
||||
c.Logger().Error(err)
|
||||
return echo.NewHTTPError(http.StatusInternalServerError)
|
||||
}
|
||||
|
||||
return c.JSON(http.StatusCreated, roomToken)
|
||||
}
|
||||
|
||||
func getJoinToken(apiKey, apiSecret, room, identity string) (string, error) {
|
||||
at := auth.NewAccessToken(apiKey, apiSecret)
|
||||
func getHostToken(room, identity string) (string, error) {
|
||||
at := auth.NewAccessToken(mainConfig.Livekit.APIKey, mainConfig.Livekit.APISecret)
|
||||
grant := &auth.VideoGrant{
|
||||
RoomJoin: true,
|
||||
Room: room,
|
||||
Room: room,
|
||||
RoomJoin: true,
|
||||
RoomRecord: true,
|
||||
}
|
||||
at.AddGrant(grant).
|
||||
SetIdentity(identity).
|
||||
SetValidFor(time.Hour)
|
||||
SetValidFor(24 * time.Hour)
|
||||
|
||||
return at.ToJWT()
|
||||
}
|
||||
|
|
12
schema.go
12
schema.go
|
@ -18,9 +18,9 @@ type (
|
|||
}
|
||||
|
||||
AudonUser struct {
|
||||
AudonID string `bson:"audon_id" json:"audon_id"`
|
||||
RemoteID string `bson:"remote_id" json:"remote_id"`
|
||||
RemoteURL string `bson:"remote_url" json:"remote_url"`
|
||||
AudonID string `bson:"audon_id" json:"audon_id" validate:"alphanum"`
|
||||
RemoteID string `bson:"remote_id" json:"remote_id" validate:"alphanum"`
|
||||
RemoteURL string `bson:"remote_url" json:"remote_url" validate:"url"`
|
||||
CreatedAt time.Time `bson:"created_at" json:"created_at"`
|
||||
}
|
||||
|
||||
|
@ -33,7 +33,9 @@ type (
|
|||
FollowingOnly bool `bson:"following_only" json:"following_only" validate:"required"`
|
||||
FollowerOnly bool `bson:"follower_only" json:"follower_only" validate:"required"`
|
||||
InviteOnly bool `bson:"invite_only" json:"invite_only" validate:"required"`
|
||||
InviteToken string `bson:"invite_token" json:"invite_token"`
|
||||
InviteToken string `bson:"invite_token" json:"invite_token" validate:"alphanum"`
|
||||
ScheduledAt time.Time `bson:"scheduled_at" json:"scheduled_at"`
|
||||
CreatedAt time.Time `bson:"created_at" json:"created_at"`
|
||||
}
|
||||
)
|
||||
|
||||
|
@ -79,7 +81,7 @@ func findUserByRemote(ctx context.Context, remoteID, remoteURL string) (*AudonUs
|
|||
func findUserByID(ctx context.Context, audonID string) (*AudonUser, error) {
|
||||
var result AudonUser
|
||||
coll := mainDB.Collection(COLLECTION_USER)
|
||||
if err := coll.FindOne(ctx, bson.D{{"audon_id", audonID}}).Decode(&result); err != nil {
|
||||
if err := coll.FindOne(ctx, bson.D{{Key: "audon_id", Value: audonID}}).Decode(&result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &result, nil
|
||||
|
|
26
server.go
26
server.go
|
@ -56,14 +56,14 @@ func main() {
|
|||
os.Exit(1)
|
||||
}
|
||||
|
||||
dbContext, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
dbContext, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||||
defer cancel()
|
||||
dbClient, err := mongo.Connect(dbContext, options.Client().ApplyURI(mainConfig.MongoURL.String()))
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
os.Exit(2)
|
||||
}
|
||||
mainDB = dbClient.Database(mainConfig.DBName)
|
||||
mainDB = dbClient.Database(mainConfig.Database.Name)
|
||||
err = createIndexes(dbContext)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
|
@ -81,13 +81,14 @@ func main() {
|
|||
e.Use(session.Middleware(sessions.NewCookieStore([]byte(mainConfig.SeesionSecret))))
|
||||
// e.Use(middleware.CSRFWithConfig(middleware.CSRFConfig{
|
||||
// CookiePath: "/",
|
||||
// TokenLookup: "header:X-CSRF-Token,form:csrf",
|
||||
// TokenLookup: "header:X-XSRF-TOKEN",
|
||||
// }))
|
||||
|
||||
e.GET("/api/v1/verify", verifyHandler)
|
||||
e.POST("/app/login", loginHandler)
|
||||
e.GET("/app/oauth", oauthHandler)
|
||||
e.Static("/assets", "audon-fe/dist/assets")
|
||||
e.GET("/api/verify", verifyHandler)
|
||||
e.POST("/api/room", createRoomHandler)
|
||||
e.POST("/api/login", loginHandler)
|
||||
e.GET("/api/oauth", oauthHandler)
|
||||
e.Static("/", "audon-fe/dist/assets")
|
||||
|
||||
e.Logger.Debug(e.Start(":1323"))
|
||||
}
|
||||
|
@ -133,10 +134,10 @@ func getAppConfig(server string) (*mastodon.AppConfig, error) {
|
|||
redirectURI := "urn:ietf:wg:oauth:2.0:oob"
|
||||
u := &url.URL{
|
||||
Host: mainConfig.LocalDomain,
|
||||
Scheme: "http",
|
||||
Scheme: "https",
|
||||
Path: "/",
|
||||
}
|
||||
u = u.JoinPath("app", "oauth")
|
||||
u = u.JoinPath("api", "oauth")
|
||||
redirectURI = u.String()
|
||||
|
||||
conf := &mastodon.AppConfig{
|
||||
|
@ -167,8 +168,8 @@ func getSession(c echo.Context) (sess *sessions.Session, err error) {
|
|||
Path: "/",
|
||||
MaxAge: 0,
|
||||
HttpOnly: true,
|
||||
// SameSite: http.SameSiteStrictMode,
|
||||
// Secure: true,
|
||||
SameSite: http.SameSiteStrictMode,
|
||||
Secure: true,
|
||||
}
|
||||
|
||||
return sess, nil
|
||||
|
@ -194,7 +195,6 @@ func writeSessionData(c echo.Context, data *SessionData) error {
|
|||
}
|
||||
|
||||
sess.Values[SESSION_DATASTORE_NAME] = data
|
||||
sess.Save(c.Request(), c.Response())
|
||||
|
||||
return nil
|
||||
return sess.Save(c.Request(), c.Response())
|
||||
}
|
||||
|
|
Ładowanie…
Reference in New Issue