fix invalid session error

pull/6/head
Namekuji 2022-12-04 00:19:41 -05:00
rodzic 429844799f
commit 059ab019d6
13 zmienionych plików z 416 dodań i 68 usunięć

Wyświetl plik

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

277
audon-fe/package-lock.json wygenerowano
Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

@ -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})\.?$/
),
},
};

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

@ -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
Wyświetl plik

@ -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
Wyświetl plik

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

Wyświetl plik

@ -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
Wyświetl plik

@ -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()
}

Wyświetl plik

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

Wyświetl plik

@ -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())
}