From 88a6b43fe7eae16a8e7998e7672575df279ad5fc Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Thu, 23 Dec 2021 14:44:06 +0900 Subject: [PATCH 01/38] go get "github.com/sapphi-red/go-traq" --- go.mod | 5 +++++ go.sum | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/go.mod b/go.mod index fe6a6f19..a96fc952 100644 --- a/go.mod +++ b/go.mod @@ -65,3 +65,8 @@ require ( gopkg.in/guregu/null.v4 v4.0.0 gorm.io/plugin/prometheus v0.0.0-20210820101226-2a49866f83ee ) + +require ( + github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6 // indirect + github.com/sapphi-red/go-traq v0.0.0-20210619185243-f487eb63bd8c // indirect +) diff --git a/go.sum b/go.sum index 74fb483f..efe8a7ac 100644 --- a/go.sum +++ b/go.sum @@ -45,6 +45,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6 h1:uZuxRZCz65cG1o6K/xUqImNcYKtmk9ylqaH0itMSvzA= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/appleboy/gofight/v2 v2.1.2 h1:VOy3jow4vIK8BRQJoC/I9muxyYlJ2yb9ht2hZoS3rf4= @@ -378,6 +380,8 @@ github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6po github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= +github.com/sapphi-red/go-traq v0.0.0-20210619185243-f487eb63bd8c h1:Iv0wMhNYjZwRvhHdXCupgxONFCUL/vwnxc6zViDgEeU= +github.com/sapphi-red/go-traq v0.0.0-20210619185243-f487eb63bd8c/go.mod h1:yQ7EvL2If5/AA2k+QZwhDazUVR6QaerT1uuhaRUI7NI= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= From 5124647e6a69473677c89041f08ced807cd70ffd Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Fri, 24 Dec 2021 02:14:33 +0900 Subject: [PATCH 02/38] go get "github.com/thanhpk/randstr" --- go.mod | 1 + go.sum | 2 ++ 2 files changed, 3 insertions(+) diff --git a/go.mod b/go.mod index a96fc952..e86870dd 100644 --- a/go.mod +++ b/go.mod @@ -69,4 +69,5 @@ require ( require ( github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6 // indirect github.com/sapphi-red/go-traq v0.0.0-20210619185243-f487eb63bd8c // indirect + github.com/thanhpk/randstr v1.0.4 // indirect ) diff --git a/go.sum b/go.sum index efe8a7ac..8acf89f0 100644 --- a/go.sum +++ b/go.sum @@ -404,6 +404,8 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/thanhpk/randstr v1.0.4 h1:IN78qu/bR+My+gHCvMEXhR/i5oriVHcTB/BJJIRTsNo= +github.com/thanhpk/randstr v1.0.4/go.mod h1:M/H2P1eNLZzlDwAzpkkkUvoyNNMbzRGhESZuEQk3r0U= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.4.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= From 8f88d2b2b9c0b3a4783ed219b0b342953cd418b4 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Sun, 26 Dec 2021 09:49:03 +0900 Subject: [PATCH 03/38] go get golang.org/x/oauth2 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index e86870dd..b7347dc9 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect golang.org/x/mod v0.5.0 // indirect golang.org/x/net v0.0.0-20210913180222-943fd674d43e // indirect - golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f + golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20210910150752-751e447fb3d0 // indirect golang.org/x/text v0.3.7 // indirect diff --git a/go.sum b/go.sum index 8acf89f0..3f205c5d 100644 --- a/go.sum +++ b/go.sum @@ -531,6 +531,8 @@ golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f h1:Qmd2pbz05z7z6lm0DrgQVVPuBm92jqujBKMHMOlOQEw= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= From 46203eab455aed16759c5dd08614504598252753 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Wed, 29 Dec 2021 12:23:05 +0900 Subject: [PATCH 04/38] =?UTF-8?q?=E7=92=B0=E5=A2=83=E5=A4=89=E6=95=B0?= =?UTF-8?q?=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/dev/Dockerfile | 6 +++--- docker/dev/docker-compose.yaml | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docker/dev/Dockerfile b/docker/dev/Dockerfile index 36bc51a6..24244103 100644 --- a/docker/dev/Dockerfile +++ b/docker/dev/Dockerfile @@ -10,8 +10,8 @@ RUN go mod download ENV DOCKERIZE_VERSION v0.6.1 RUN apk add --no-cache openssl \ - && wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ - && tar -C /usr/local/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ - && rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz + && wget https://github.com/jwilder/dockerize/releases/download/$DOCKERIZE_VERSION/dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && tar -C /usr/local/bin -xzvf dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz \ + && rm dockerize-alpine-linux-amd64-$DOCKERIZE_VERSION.tar.gz ENTRYPOINT dockerize -timeout 10s -wait tcp://mysql:3306 air -c docker/dev/.air.toml \ No newline at end of file diff --git a/docker/dev/docker-compose.yaml b/docker/dev/docker-compose.yaml index 27005b6d..d00235f9 100644 --- a/docker/dev/docker-compose.yaml +++ b/docker/dev/docker-compose.yaml @@ -14,6 +14,9 @@ services: MARIADB_DATABASE: anke-to TZ: Asia/Tokyo GO111MODULE: "on" + CLIENT_ID: + CLIENT_SECRET: + SESSION_SECRET: secret ports: - "1323:1323" volumes: From f5f524482d635d91950633a83f0e336663ea26d8 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Wed, 29 Dec 2021 12:25:10 +0900 Subject: [PATCH 05/38] =?UTF-8?q?session=E3=81=AE=E3=82=A4=E3=83=B3?= =?UTF-8?q?=E3=82=BF=E3=83=BC=E3=83=95=E3=82=A7=E3=82=A4=E3=82=B9=E3=81=AE?= =?UTF-8?q?=E5=AE=9A=E7=BE=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 8 +++++--- go.sum | 11 +++++------ model/session.go | 7 +++++++ 3 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 model/session.go diff --git a/go.mod b/go.mod index b7347dc9..4308e3a0 100644 --- a/go.mod +++ b/go.mod @@ -61,13 +61,15 @@ require ( require ( github.com/go-sql-driver/mysql v1.6.0 // indirect + github.com/gorilla/sessions v1.2.1 github.com/prometheus/client_golang v1.11.0 + github.com/thanhpk/randstr v1.0.4 gopkg.in/guregu/null.v4 v4.0.0 gorm.io/plugin/prometheus v0.0.0-20210820101226-2a49866f83ee ) require ( - github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6 // indirect - github.com/sapphi-red/go-traq v0.0.0-20210619185243-f487eb63bd8c // indirect - github.com/thanhpk/randstr v1.0.4 // indirect + github.com/gorilla/context v1.1.1 // indirect + github.com/gorilla/securecookie v1.1.1 // indirect + github.com/srinathgs/mysqlstore v0.0.0-20200417050510-9cbb9420fc4c // indirect ) diff --git a/go.sum b/go.sum index 3f205c5d..9ee5d075 100644 --- a/go.sum +++ b/go.sum @@ -45,8 +45,6 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6 h1:uZuxRZCz65cG1o6K/xUqImNcYKtmk9ylqaH0itMSvzA= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/appleboy/gofight/v2 v2.1.2 h1:VOy3jow4vIK8BRQJoC/I9muxyYlJ2yb9ht2hZoS3rf4= @@ -196,10 +194,13 @@ github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -380,8 +381,6 @@ github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6po github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sapphi-red/go-traq v0.0.0-20210619185243-f487eb63bd8c h1:Iv0wMhNYjZwRvhHdXCupgxONFCUL/vwnxc6zViDgEeU= -github.com/sapphi-red/go-traq v0.0.0-20210619185243-f487eb63bd8c/go.mod h1:yQ7EvL2If5/AA2k+QZwhDazUVR6QaerT1uuhaRUI7NI= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -393,6 +392,8 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/srinathgs/mysqlstore v0.0.0-20200417050510-9cbb9420fc4c h1:HT6QRF79dL2Ed6HCrX9RufkxFGo7+NPkgYF1Uzvv/js= +github.com/srinathgs/mysqlstore v0.0.0-20200417050510-9cbb9420fc4c/go.mod h1:kt46Hd+lF0rtpeRgOvYSWYJItOAd73EKkIBZFbX7TXs= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= @@ -529,8 +530,6 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f h1:Qmd2pbz05z7z6lm0DrgQVVPuBm92jqujBKMHMOlOQEw= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= diff --git a/model/session.go b/model/session.go new file mode 100644 index 00000000..12f21768 --- /dev/null +++ b/model/session.go @@ -0,0 +1,7 @@ +package model + +import "github.com/srinathgs/mysqlstore" + +type ISession interface { + Get() (*mysqlstore.MySQLStore,error) +} From 12b10aa1f44da706ac46002beb477045774efa6e Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Wed, 29 Dec 2021 18:16:27 +0900 Subject: [PATCH 06/38] =?UTF-8?q?session=E3=81=AE=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/session_impl.go | 28 ++++++++++++++++++++++++ router/session.go | 50 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 model/session_impl.go create mode 100644 router/session.go diff --git a/model/session_impl.go b/model/session_impl.go new file mode 100644 index 00000000..593c8692 --- /dev/null +++ b/model/session_impl.go @@ -0,0 +1,28 @@ +package model + +import ( + "fmt" + "github.com/srinathgs/mysqlstore" + "os" +) + +type Session struct { +} + +func (s *Session) Get() (*mysqlstore.MySQLStore, error) { + _db, err := db.DB() + if err != nil { + return nil, fmt.Errorf("failed to get sql.DB :%w", err) + } + + store, err := mysqlstore.NewMySQLStoreFromConnection(_db, "sessions", "/", 60*60*24*14, []byte(os.Getenv("SESSION_SECRET"))) + if err != nil { + return nil, fmt.Errorf("failed to create session store:%w", err) + } + + return store, nil +} + +func NewSession() *Session { + return &Session{} +} diff --git a/router/session.go b/router/session.go new file mode 100644 index 00000000..611599c1 --- /dev/null +++ b/router/session.go @@ -0,0 +1,50 @@ +package router + +import ( + "crypto/sha256" + "encoding/base64" + "github.com/gorilla/sessions" + "github.com/labstack/echo-contrib/session" + "github.com/labstack/echo/v4" + "github.com/thanhpk/randstr" + "net/http" + "net/url" +) + +type OAuth struct { + ClientID string + Secret string +} + +func (o *OAuth) GetCallback(c echo.Context) error { + sess, err := session.Get("session", c) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + } + + verifier := randstr.String(64) + hash := sha256.Sum256([]byte(verifier)) + challenge := base64.RawURLEncoding.EncodeToString(hash[:]) + + sess.Values["verifier"] = verifier + sess.Options = &sessions.Options{ + Path: "/", + MaxAge: 30, + HttpOnly: true, + } + + + if err = sess.Save(c.Request(), c.Response());err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + } + + oauthUrl,_ := url.Parse("https://q.trap.jp/api/v3/oauth2/authorize") + q := oauthUrl.Query() + oauthUrl.Query().Set("response_type","code") + oauthUrl.Query().Set("client_id",o.ClientID) + oauthUrl.Query().Set("code_challenge_method","s256") + oauthUrl.Query().Set("code_challenge",challenge) + oauthUrl.RawQuery = q.Encode() + + return c.JSON(http.StatusOK,oauthUrl.String()) +} From 0ee2b680cb32286b86e11cb382fb9eae964caf86 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Wed, 29 Dec 2021 18:17:34 +0900 Subject: [PATCH 07/38] =?UTF-8?q?err=E3=81=AE=E3=82=BB=E3=83=83=E3=82=B7?= =?UTF-8?q?=E3=83=A7=E3=83=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/session/errror.go | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 router/session/errror.go diff --git a/router/session/errror.go b/router/session/errror.go new file mode 100644 index 00000000..a8eeb9d4 --- /dev/null +++ b/router/session/errror.go @@ -0,0 +1,10 @@ +package session + +import "errors" + +var ( + ErrNoSession = errors.New("no session") + ErrNoValue = errors.New("no value") +) + + From 3872d3a2619327f1e079093513d7083908806dad Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Wed, 29 Dec 2021 19:36:06 +0900 Subject: [PATCH 08/38] =?UTF-8?q?Store=E3=81=AE=E5=AE=9A=E7=BE=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/session/session.go | 8 ++++++++ router/session/session_impl.go | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 router/session/session.go create mode 100644 router/session/session_impl.go diff --git a/router/session/session.go b/router/session/session.go new file mode 100644 index 00000000..8d660d8d --- /dev/null +++ b/router/session/session.go @@ -0,0 +1,8 @@ +package session + +import "github.com/labstack/echo/v4" + +type IStore interface { + GetMiddleware() echo.MiddlewareFunc + GetSession(c echo.Context) (Store,error) +} diff --git a/router/session/session_impl.go b/router/session/session_impl.go new file mode 100644 index 00000000..96230237 --- /dev/null +++ b/router/session/session_impl.go @@ -0,0 +1,19 @@ +package session + +import ( + "fmt" + "github.com/srinathgs/mysqlstore" + "github.com/traPtitech/anke-to/model" +) + +type Store struct { + store *mysqlstore.MySQLStore +} + +func NewStore(sess model.Session) (*Store,error) { + store,err := sess.Get() + if err != nil { + return nil, fmt.Errorf("failed to get session: %w", err) + } + return &Store{store: store},nil +} From a80a2b27fad30c546915a97073f6ac751eb44ffc Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Wed, 29 Dec 2021 21:16:58 +0900 Subject: [PATCH 09/38] =?UTF-8?q?Store=E3=81=AE=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/session/session.go | 2 +- router/session/session_impl.go | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/router/session/session.go b/router/session/session.go index 8d660d8d..3407b3b7 100644 --- a/router/session/session.go +++ b/router/session/session.go @@ -4,5 +4,5 @@ import "github.com/labstack/echo/v4" type IStore interface { GetMiddleware() echo.MiddlewareFunc - GetSession(c echo.Context) (Store,error) + GetSession(c echo.Context) (*Session,error) } diff --git a/router/session/session_impl.go b/router/session/session_impl.go index 96230237..9d577316 100644 --- a/router/session/session_impl.go +++ b/router/session/session_impl.go @@ -2,6 +2,9 @@ package session import ( "fmt" + "github.com/gorilla/sessions" + "github.com/labstack/echo-contrib/session" + "github.com/labstack/echo/v4" "github.com/srinathgs/mysqlstore" "github.com/traPtitech/anke-to/model" ) @@ -10,6 +13,22 @@ type Store struct { store *mysqlstore.MySQLStore } +func (s *Store) GetMiddleware() echo.MiddlewareFunc { + return session.Middleware(s.store) +} + +func (s *Store) GetSession(c echo.Context) (*Session, error) { + sess,err := session.Get("sessions",c) + if err != nil { + return nil,fmt.Errorf("failed to get session:%w",err) + } + + return &Session{ + c: c, + sess: sess, + },nil +} + func NewStore(sess model.Session) (*Store,error) { store,err := sess.Get() if err != nil { @@ -17,3 +36,9 @@ func NewStore(sess model.Session) (*Store,error) { } return &Store{store: store},nil } + +type Session struct { + c echo.Context + store mysqlstore.MySQLStore + sess *sessions.Session +} From 8228be707fb9be38fa4bb2474df12c6027e45b42 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Thu, 30 Dec 2021 21:53:32 +0900 Subject: [PATCH 10/38] =?UTF-8?q?setuserID=E3=81=A8GetUserID=E3=81=AE?= =?UTF-8?q?=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/session/session_impl.go | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/router/session/session_impl.go b/router/session/session_impl.go index 9d577316..f7e46c29 100644 --- a/router/session/session_impl.go +++ b/router/session/session_impl.go @@ -18,27 +18,41 @@ func (s *Store) GetMiddleware() echo.MiddlewareFunc { } func (s *Store) GetSession(c echo.Context) (*Session, error) { - sess,err := session.Get("sessions",c) + sess, err := session.Get("sessions", c) if err != nil { - return nil,fmt.Errorf("failed to get session:%w",err) + return nil, fmt.Errorf("failed to get session:%w", err) } return &Session{ - c: c, + c: c, sess: sess, - },nil + }, nil } -func NewStore(sess model.Session) (*Store,error) { - store,err := sess.Get() +func NewStore(sess model.Session) (*Store, error) { + store, err := sess.Get() if err != nil { return nil, fmt.Errorf("failed to get session: %w", err) } - return &Store{store: store},nil + return &Store{store: store}, nil } type Session struct { - c echo.Context + c echo.Context store mysqlstore.MySQLStore - sess *sessions.Session + sess *sessions.Session } + +func (s *Session) SetUserID(userID string) { + s.sess.Values["userID"] = userID +} + +func (s *Session) GetUserID() (string, error) { + userID, ok := s.sess.Values["userID"].(string) + if !ok || userID == "" { + return "", nil + } + + return userID, nil +} + From 3c4b417986c24a6c1d5f8aa4258f6e17402fb2d6 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Thu, 30 Dec 2021 22:11:41 +0900 Subject: [PATCH 11/38] =?UTF-8?q?Oauth=E3=81=AE=E3=82=B3=E3=83=B3=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=83=A9=E3=82=AF=E3=82=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/oauth.go | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 router/oauth.go diff --git a/router/oauth.go b/router/oauth.go new file mode 100644 index 00000000..5e225fc4 --- /dev/null +++ b/router/oauth.go @@ -0,0 +1,35 @@ +package router + +import ( + "fmt" + "github.com/traPtitech/anke-to/router/session" + "golang.org/x/oauth2" + "os" +) + +var ( + clientID = os.Getenv("CLIENT_ID") + clientSecret = os.Getenv("CLIENT_SECRET") + baseURL = "https://q.trap.jp/api/v3" +) + +type Oauth struct { + config *oauth2.Config + sessStore session.Store +} + +func NewOauth(sessStore session.Store) *Oauth { + return &Oauth{ + config: &oauth2.Config{ + ClientID: clientID, + ClientSecret: clientSecret, + Endpoint: oauth2.Endpoint{ + AuthURL: fmt.Sprintf("%s/%s",baseURL,"oauth2/authorize"), + TokenURL: fmt.Sprintf("%s/%s",baseURL,"oauth2/token"), + }, + Scopes: []string{"read"}, + }, + sessStore: sessStore, + } +} + From c6b18d41eeb9bdd1100c94238207c3fa8e9e8664 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Sun, 2 Jan 2022 21:42:39 +0900 Subject: [PATCH 12/38] =?UTF-8?q?verifier=E3=81=AEgettersetter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/session/session_impl.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/router/session/session_impl.go b/router/session/session_impl.go index f7e46c29..77b28ac9 100644 --- a/router/session/session_impl.go +++ b/router/session/session_impl.go @@ -39,7 +39,6 @@ func NewStore(sess model.Session) (*Store, error) { type Session struct { c echo.Context - store mysqlstore.MySQLStore sess *sessions.Session } @@ -47,12 +46,24 @@ func (s *Session) SetUserID(userID string) { s.sess.Values["userID"] = userID } -func (s *Session) GetUserID() (string, error) { +func (s *Session) GetUserID() string { userID, ok := s.sess.Values["userID"].(string) if !ok || userID == "" { - return "", nil + return "" } - return userID, nil + return userID } +func (s *Session) SetVerifier(verifier string) { + s.sess.Values["verifier"] = verifier +} + +func (s *Session) GetVerifier() string { + verifier,ok := s.sess.Values["verifier"].(string) + if !ok || verifier == "" { + return "" + } + + return verifier +} \ No newline at end of file From 748c4388be9d90379239dc0a45f7090feb324c1c Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Sun, 2 Jan 2022 22:12:42 +0900 Subject: [PATCH 13/38] =?UTF-8?q?token=E3=81=AEgettersetter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/session/session_impl.go | 49 ++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/router/session/session_impl.go b/router/session/session_impl.go index 77b28ac9..58a89c69 100644 --- a/router/session/session_impl.go +++ b/router/session/session_impl.go @@ -2,11 +2,14 @@ package session import ( "fmt" + "time" + "github.com/gorilla/sessions" "github.com/labstack/echo-contrib/session" "github.com/labstack/echo/v4" "github.com/srinathgs/mysqlstore" "github.com/traPtitech/anke-to/model" + "golang.org/x/oauth2" ) type Store struct { @@ -38,8 +41,8 @@ func NewStore(sess model.Session) (*Store, error) { } type Session struct { - c echo.Context - sess *sessions.Session + c echo.Context + sess *sessions.Session } func (s *Session) SetUserID(userID string) { @@ -59,11 +62,47 @@ func (s *Session) SetVerifier(verifier string) { s.sess.Values["verifier"] = verifier } -func (s *Session) GetVerifier() string { - verifier,ok := s.sess.Values["verifier"].(string) +func (s *Session) GetVerifier() string { + verifier, ok := s.sess.Values["verifier"].(string) if !ok || verifier == "" { return "" } return verifier -} \ No newline at end of file +} + +func (s *Session) SetToken(token *oauth2.Token) { + s.sess.Values["access_token"] = token.AccessToken + s.sess.Values["token_type"] = token.TokenType + s.sess.Values["refresh_token"] = token.RefreshToken + s.sess.Values["expiry"] = token.Expiry +} + +func (s *Session) GetToken() (*oauth2.Token, error) { + accessToken, ok := s.sess.Values["access_token"].(string) + if !ok || accessToken == "" { + return nil, ErrNoValue + } + + tokenType, ok := s.sess.Values["token_type"].(string) + if !ok || tokenType == "" { + return nil, ErrNoValue + } + + refreshToken, ok := s.sess.Values["refresh_token"].(string) + if !ok || refreshToken == "" { + return nil, ErrNoValue + } + + expiry, ok := s.sess.Values["expiry"].(time.Time) + if !ok || expiry.IsZero() { + return nil, ErrNoValue + } + + return &oauth2.Token{ + AccessToken: accessToken, + TokenType: tokenType, + RefreshToken: refreshToken, + Expiry: expiry, + }, nil +} From a2ce38a6075945e39b164a9ee75f336198e9de2f Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Sun, 2 Jan 2022 22:12:52 +0900 Subject: [PATCH 14/38] =?UTF-8?q?session.go=E3=81=AE=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/session.go | 50 ----------------------------------------------- 1 file changed, 50 deletions(-) delete mode 100644 router/session.go diff --git a/router/session.go b/router/session.go deleted file mode 100644 index 611599c1..00000000 --- a/router/session.go +++ /dev/null @@ -1,50 +0,0 @@ -package router - -import ( - "crypto/sha256" - "encoding/base64" - "github.com/gorilla/sessions" - "github.com/labstack/echo-contrib/session" - "github.com/labstack/echo/v4" - "github.com/thanhpk/randstr" - "net/http" - "net/url" -) - -type OAuth struct { - ClientID string - Secret string -} - -func (o *OAuth) GetCallback(c echo.Context) error { - sess, err := session.Get("session", c) - if err != nil { - return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) - } - - verifier := randstr.String(64) - hash := sha256.Sum256([]byte(verifier)) - challenge := base64.RawURLEncoding.EncodeToString(hash[:]) - - sess.Values["verifier"] = verifier - sess.Options = &sessions.Options{ - Path: "/", - MaxAge: 30, - HttpOnly: true, - } - - - if err = sess.Save(c.Request(), c.Response());err != nil { - return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) - } - - oauthUrl,_ := url.Parse("https://q.trap.jp/api/v3/oauth2/authorize") - q := oauthUrl.Query() - oauthUrl.Query().Set("response_type","code") - oauthUrl.Query().Set("client_id",o.ClientID) - oauthUrl.Query().Set("code_challenge_method","s256") - oauthUrl.Query().Set("code_challenge",challenge) - oauthUrl.RawQuery = q.Encode() - - return c.JSON(http.StatusOK,oauthUrl.String()) -} From 6ea055005a36f10c607231a63a1a6ea245baba73 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Sun, 2 Jan 2022 22:13:26 +0900 Subject: [PATCH 15/38] =?UTF-8?q?.idea=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index fa996640..7d2fd96e 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,5 @@ mock_* *.png # End of https://www.gitignore.io/api/go + +.idea \ No newline at end of file From cbcc4a8b422395d68df7289a307f8da883ce467d Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Sun, 2 Jan 2022 22:17:39 +0900 Subject: [PATCH 16/38] =?UTF-8?q?err=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/session/session_impl.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/router/session/session_impl.go b/router/session/session_impl.go index 58a89c69..066b8e73 100644 --- a/router/session/session_impl.go +++ b/router/session/session_impl.go @@ -49,26 +49,26 @@ func (s *Session) SetUserID(userID string) { s.sess.Values["userID"] = userID } -func (s *Session) GetUserID() string { +func (s *Session) GetUserID() (string, error) { userID, ok := s.sess.Values["userID"].(string) if !ok || userID == "" { - return "" + return "", ErrNoValue } - return userID + return userID, nil } func (s *Session) SetVerifier(verifier string) { s.sess.Values["verifier"] = verifier } -func (s *Session) GetVerifier() string { +func (s *Session) GetVerifier() (string, error) { verifier, ok := s.sess.Values["verifier"].(string) if !ok || verifier == "" { - return "" + return "", ErrNoValue } - return verifier + return verifier, nil } func (s *Session) SetToken(token *oauth2.Token) { From 8c13949ddbba1c9dde1e44227e5488adeea384fb Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Sun, 2 Jan 2022 22:25:08 +0900 Subject: [PATCH 17/38] =?UTF-8?q?state=E3=81=AEgettersetter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/session/session_impl.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/router/session/session_impl.go b/router/session/session_impl.go index 066b8e73..33b7f5fb 100644 --- a/router/session/session_impl.go +++ b/router/session/session_impl.go @@ -106,3 +106,16 @@ func (s *Session) GetToken() (*oauth2.Token, error) { Expiry: expiry, }, nil } + +func (s *Session) SetState(state string) { + s.sess.Values["state"] = state +} + +func (s *Session) GetState() (string, error) { + state, ok := s.sess.Values["state"].(string) + if !ok || state == "" { + return "", ErrNoValue + } + + return state, nil +} From c5e28b91f73fddd536130f30628cec408461a56d Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Sun, 2 Jan 2022 22:47:25 +0900 Subject: [PATCH 18/38] =?UTF-8?q?save=E3=81=AE=E3=83=A1=E3=82=BD=E3=83=83?= =?UTF-8?q?=E3=83=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/session/session_impl.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/router/session/session_impl.go b/router/session/session_impl.go index 33b7f5fb..e48e6b02 100644 --- a/router/session/session_impl.go +++ b/router/session/session_impl.go @@ -119,3 +119,11 @@ func (s *Session) GetState() (string, error) { return state, nil } + +func (s *Session) Save() error { + if err := s.sess.Save(s.c.Request(),s.c.Response());err!=nil { + return err + } + + return nil +} From 404040ccd7686f0d3f771fa6a90a837e17084eba Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Sun, 2 Jan 2022 22:47:49 +0900 Subject: [PATCH 19/38] =?UTF-8?q?code=E3=82=92=E8=AA=8D=E5=8F=AF=E3=82=B5?= =?UTF-8?q?=E3=83=BC=E3=83=90=E3=83=BC=E3=81=ABGet=E3=81=99=E3=82=8B?= =?UTF-8?q?=E3=83=8F=E3=83=B3=E3=83=89=E3=83=A9=E3=81=AE=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/oauth.go | 61 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/router/oauth.go b/router/oauth.go index 5e225fc4..8e0a15ba 100644 --- a/router/oauth.go +++ b/router/oauth.go @@ -1,35 +1,78 @@ package router import ( + "crypto/sha256" + "encoding/base64" + "errors" "fmt" + "math/rand" + "net/http" + "os" + + "github.com/labstack/echo/v4" "github.com/traPtitech/anke-to/router/session" "golang.org/x/oauth2" - "os" ) var ( - clientID = os.Getenv("CLIENT_ID") + clientID = os.Getenv("CLIENT_ID") clientSecret = os.Getenv("CLIENT_SECRET") - baseURL = "https://q.trap.jp/api/v3" + baseURL = "https://q.trap.jp/api/v3" ) type Oauth struct { - config *oauth2.Config + config *oauth2.Config sessStore session.Store } func NewOauth(sessStore session.Store) *Oauth { return &Oauth{ - config: &oauth2.Config{ + config: &oauth2.Config{ ClientID: clientID, ClientSecret: clientSecret, - Endpoint: oauth2.Endpoint{ - AuthURL: fmt.Sprintf("%s/%s",baseURL,"oauth2/authorize"), - TokenURL: fmt.Sprintf("%s/%s",baseURL,"oauth2/token"), + Endpoint: oauth2.Endpoint{ + AuthURL: fmt.Sprintf("%s/%s", baseURL, "oauth2/authorize"), + TokenURL: fmt.Sprintf("%s/%s", baseURL, "oauth2/token"), }, - Scopes: []string{"read"}, + Scopes: []string{"read"}, }, sessStore: sessStore, } } +func (o *Oauth) GetCode(c echo.Context) error { + sess, err := o.sessStore.GetSession(c) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to get session:%w", err)) + } + + verifier := RandomString(90) + sess.SetVerifier(verifier) + + state := RandomString(32) + sess.SetState(state) + + hash := sha256.Sum256([]byte(verifier)) + challenge := base64.RawURLEncoding.EncodeToString(hash[:]) + + challengeOption := oauth2.SetAuthURLParam("code_challenge", challenge) + methodOption := oauth2.SetAuthURLParam("code_challenge_method", "s256") + + authURL := o.config.AuthCodeURL(state, challengeOption, methodOption) + + if err = sess.Save(); err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to save session:%w", err)) + } + + return c.String(http.StatusOK, authURL) +} + +func RandomString(n int) string { + var letter = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + + b := make([]rune, n) + for i := range b { + b[i] = letter[rand.Intn(len(letter))] + } + return string(b) +} From 4e1e0e6715daa4b2c5b2ed3915fb9665ee0706eb Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Sun, 2 Jan 2022 23:02:16 +0900 Subject: [PATCH 20/38] =?UTF-8?q?util=E3=81=AB=E7=A7=BB=E5=8B=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/oauth.go | 12 ------------ router/utils.go | 13 +++++++++++++ 2 files changed, 13 insertions(+), 12 deletions(-) create mode 100644 router/utils.go diff --git a/router/oauth.go b/router/oauth.go index 8e0a15ba..1247a45c 100644 --- a/router/oauth.go +++ b/router/oauth.go @@ -3,9 +3,7 @@ package router import ( "crypto/sha256" "encoding/base64" - "errors" "fmt" - "math/rand" "net/http" "os" @@ -66,13 +64,3 @@ func (o *Oauth) GetCode(c echo.Context) error { return c.String(http.StatusOK, authURL) } - -func RandomString(n int) string { - var letter = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") - - b := make([]rune, n) - for i := range b { - b[i] = letter[rand.Intn(len(letter))] - } - return string(b) -} diff --git a/router/utils.go b/router/utils.go new file mode 100644 index 00000000..7bc5d868 --- /dev/null +++ b/router/utils.go @@ -0,0 +1,13 @@ +package router + +import "math/rand" + +func RandomString(n int) string { + var letter = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + + b := make([]rune, n) + for i := range b { + b[i] = letter[rand.Intn(len(letter))] + } + return string(b) +} From 59dddf71ccb3eadb05cd48c471e48514a52142ce Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Sun, 2 Jan 2022 23:24:30 +0900 Subject: [PATCH 21/38] =?UTF-8?q?Callback=E3=81=AE=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/oauth.go | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/router/oauth.go b/router/oauth.go index 1247a45c..06cff4a8 100644 --- a/router/oauth.go +++ b/router/oauth.go @@ -3,6 +3,7 @@ package router import ( "crypto/sha256" "encoding/base64" + "errors" "fmt" "net/http" "os" @@ -64,3 +65,48 @@ func (o *Oauth) GetCode(c echo.Context) error { return c.String(http.StatusOK, authURL) } + +func (o *Oauth) Callback(c echo.Context) error { + sess, err := o.sessStore.GetSession(c) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to get session :%w", err)) + } + + state := c.QueryParam("state") + sessState, err := sess.GetState() + if err != nil { + if errors.Is(err, session.ErrNoValue) { + return echo.NewHTTPError(http.StatusUnauthorized, fmt.Errorf("failed to get state for no value : %w", err)) + } + return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to get state :%w", err)) + } + + if state != sessState { + return echo.NewHTTPError(http.StatusUnauthorized, "failed to match state") + } + + code := c.QueryParam("code") + verifier, err := sess.GetVerifier() + if err != nil { + if errors.Is(err, session.ErrNoValue) { + return echo.NewHTTPError(http.StatusUnauthorized, fmt.Errorf("failed to get verifier for no value:%w", err)) + } + + return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to get verifier :%w", err)) + } + + codeChallengeOption := oauth2.SetAuthURLParam("code_verifier", verifier) + + token, err := o.config.Exchange(c.Request().Context(), code, codeChallengeOption) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to exchange token: %w", err)) + } + + sess.SetToken(token) + + if err = sess.Save(); err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to save :%w ", err)) + } + + return c.NoContent(http.StatusOK) +} From 0f64b1b5fe8a4cc1477e0d43d583f53a0fc2385d Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Mon, 3 Jan 2022 00:23:26 +0900 Subject: [PATCH 22/38] wire --- router.go | 9 +++------ router/api.go | 4 +++- router/oauth.go | 4 ++-- router/session/session_impl.go | 2 +- wire.go | 11 ++++++++--- wire_gen.go | 15 ++++++++++++--- 6 files changed, 29 insertions(+), 16 deletions(-) diff --git a/router.go b/router.go index 389a4d19..ad8187a9 100644 --- a/router.go +++ b/router.go @@ -16,7 +16,7 @@ func SetRouting(port string) { p := prometheus.NewPrometheus("echo", nil) p.Use(e) - api := InjectAPIServer() + /*api,_ := InjectAPIServer() // Static Files e.Static("/", "client/dist") @@ -58,10 +58,7 @@ func SetRouting(port string) { apiUsers := echoAPI.Group("/users") { - /* - TODO - apiUsers.GET("") - */ + apiUsersMe := apiUsers.Group("/me") { apiUsersMe.GET("", api.GetUsersMe) @@ -77,7 +74,7 @@ func SetRouting(port string) { { apiResults.GET("/:questionnaireID", api.GetResults, api.ResultAuthenticate) } - } + }*/ e.Logger.Fatal(e.Start(port)) } diff --git a/router/api.go b/router/api.go index 3981794b..ccd1e9f3 100644 --- a/router/api.go +++ b/router/api.go @@ -8,10 +8,11 @@ type API struct { *Response *Result *User + *Oauth } // NewAPI APIのコンストラクタ -func NewAPI(middleware *Middleware, questionnaire *Questionnaire, question *Question, response *Response, result *Result, user *User) *API { +func NewAPI(middleware *Middleware, questionnaire *Questionnaire, question *Question, response *Response, result *Result, user *User, oauth *Oauth) *API { return &API{ Middleware: middleware, Questionnaire: questionnaire, @@ -19,5 +20,6 @@ func NewAPI(middleware *Middleware, questionnaire *Questionnaire, question *Ques Response: response, Result: result, User: user, + Oauth: oauth, } } diff --git a/router/oauth.go b/router/oauth.go index 06cff4a8..e97ce8f4 100644 --- a/router/oauth.go +++ b/router/oauth.go @@ -21,10 +21,10 @@ var ( type Oauth struct { config *oauth2.Config - sessStore session.Store + sessStore session.IStore } -func NewOauth(sessStore session.Store) *Oauth { +func NewOauth(sessStore session.IStore) *Oauth { return &Oauth{ config: &oauth2.Config{ ClientID: clientID, diff --git a/router/session/session_impl.go b/router/session/session_impl.go index e48e6b02..14f3cc11 100644 --- a/router/session/session_impl.go +++ b/router/session/session_impl.go @@ -32,7 +32,7 @@ func (s *Store) GetSession(c echo.Context) (*Session, error) { }, nil } -func NewStore(sess model.Session) (*Store, error) { +func NewStore(sess *model.Session) (*Store, error) { store, err := sess.Get() if err != nil { return nil, fmt.Errorf("failed to get session: %w", err) diff --git a/wire.go b/wire.go index c32e951f..2032db0c 100644 --- a/wire.go +++ b/wire.go @@ -7,6 +7,7 @@ import ( "github.com/google/wire" "github.com/traPtitech/anke-to/model" "github.com/traPtitech/anke-to/router" + "github.com/traPtitech/anke-to/router/session" "github.com/traPtitech/anke-to/traq" ) @@ -21,11 +22,12 @@ var ( targetBind = wire.Bind(new(model.ITarget), new(*model.Target)) validationBind = wire.Bind(new(model.IValidation), new(*model.Validation)) transactionBind = wire.Bind(new(model.ITransaction), new(*model.Transaction)) + storeBind = wire.Bind(new(session.IStore), new(*session.Store)) webhookBind = wire.Bind(new(traq.IWebhook), new(*traq.Webhook)) ) -func InjectAPIServer() *router.API { +func InjectAPIServer() (*router.API,error) { wire.Build( router.NewAPI, router.NewMiddleware, @@ -34,6 +36,7 @@ func InjectAPIServer() *router.API { router.NewResponse, router.NewResult, router.NewUser, + router.NewOauth, model.NewAdministrator, model.NewOption, model.NewQuestionnaire, @@ -44,6 +47,8 @@ func InjectAPIServer() *router.API { model.NewTarget, model.NewValidation, model.NewTransaction, + model.NewSession, + session.NewStore, traq.NewWebhook, administratorBind, optionBind, @@ -56,7 +61,7 @@ func InjectAPIServer() *router.API { validationBind, transactionBind, webhookBind, + storeBind, ) - - return nil + return nil,nil } diff --git a/wire_gen.go b/wire_gen.go index bede2c48..8dd17711 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -10,6 +10,7 @@ import ( "github.com/google/wire" "github.com/traPtitech/anke-to/model" "github.com/traPtitech/anke-to/router" + "github.com/traPtitech/anke-to/router/session" "github.com/traPtitech/anke-to/traq" ) @@ -19,7 +20,7 @@ import ( // Injectors from wire.go: -func InjectAPIServer() *router.API { +func InjectAPIServer() (*router.API, error) { administrator := model.NewAdministrator() respondent := model.NewRespondent() question := model.NewQuestion() @@ -37,8 +38,14 @@ func InjectAPIServer() *router.API { routerResponse := router.NewResponse(questionnaire, validation, scaleLabel, respondent, response) result := router.NewResult(respondent, questionnaire, administrator) user := router.NewUser(respondent, questionnaire, target, administrator) - api := router.NewAPI(middleware, routerQuestionnaire, routerQuestion, routerResponse, result, user) - return api + modelSession := model.NewSession() + store, err := session.NewStore(modelSession) + if err != nil { + return nil, err + } + oauth := router.NewOauth(store) + api := router.NewAPI(middleware, routerQuestionnaire, routerQuestion, routerResponse, result, user, oauth) + return api, nil } // wire.go: @@ -54,6 +61,8 @@ var ( targetBind = wire.Bind(new(model.ITarget), new(*model.Target)) validationBind = wire.Bind(new(model.IValidation), new(*model.Validation)) transactionBind = wire.Bind(new(model.ITransaction), new(*model.Transaction)) + //sessionBind = wire.Bind(new(model.ISession),new(*model.Session)) + storeBind = wire.Bind(new(session.IStore), new(*session.Store)) webhookBind = wire.Bind(new(traq.IWebhook), new(*traq.Webhook)) ) From e065057384b284f1d4f652f40cf9e3b63031b898 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Mon, 3 Jan 2022 00:23:40 +0900 Subject: [PATCH 23/38] =?UTF-8?q?=E5=90=8D=E5=89=8D=E3=81=AE=E5=A4=89?= =?UTF-8?q?=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/session/{errror.go => error.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename router/session/{errror.go => error.go} (100%) diff --git a/router/session/errror.go b/router/session/error.go similarity index 100% rename from router/session/errror.go rename to router/session/error.go From 529b7aca5f63960bd33fd4bad7ca476ecadc1841 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Mon, 24 Jan 2022 15:27:12 +0900 Subject: [PATCH 24/38] =?UTF-8?q?endpoint=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router.go | 14 ++++++++++++-- router/oauth.go | 2 ++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/router.go b/router.go index ad8187a9..84457770 100644 --- a/router.go +++ b/router.go @@ -4,6 +4,7 @@ import ( "github.com/labstack/echo-contrib/prometheus" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" + "log" ) // SetRouting ルーティングの設定 @@ -16,7 +17,10 @@ func SetRouting(port string) { p := prometheus.NewPrometheus("echo", nil) p.Use(e) - /*api,_ := InjectAPIServer() + api, err := InjectAPIServer() + if err != nil { + log.Panicln(err) + } // Static Files e.Static("/", "client/dist") @@ -74,7 +78,13 @@ func SetRouting(port string) { { apiResults.GET("/:questionnaireID", api.GetResults, api.ResultAuthenticate) } - }*/ + + apiOauth := echoAPI.Group("/oauth") + { + apiOauth.GET("/callback", api.Callback) + apiOauth.GET("/generate/code", api.GetCode) + } + } e.Logger.Fatal(e.Start(port)) } diff --git a/router/oauth.go b/router/oauth.go index e97ce8f4..f96be194 100644 --- a/router/oauth.go +++ b/router/oauth.go @@ -39,6 +39,7 @@ func NewOauth(sessStore session.IStore) *Oauth { } } +// GetCode GET /oauth/generate/code func (o *Oauth) GetCode(c echo.Context) error { sess, err := o.sessStore.GetSession(c) if err != nil { @@ -66,6 +67,7 @@ func (o *Oauth) GetCode(c echo.Context) error { return c.String(http.StatusOK, authURL) } +// Callback GET /oauth/callback func (o *Oauth) Callback(c echo.Context) error { sess, err := o.sessStore.GetSession(c) if err != nil { From 62811742ec565ed2cfe05cc4bc27279fc3e5b0a7 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Mon, 24 Jan 2022 15:58:22 +0900 Subject: [PATCH 25/38] =?UTF-8?q?swagger=E3=81=ABEndpoint=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/swagger/swagger.yaml | 169 ++++++++++++++++++++++++-------------- 1 file changed, 109 insertions(+), 60 deletions(-) diff --git a/docs/swagger/swagger.yaml b/docs/swagger/swagger.yaml index 5630757f..04acfeda 100644 --- a/docs/swagger/swagger.yaml +++ b/docs/swagger/swagger.yaml @@ -22,6 +22,7 @@ tags: - name: user - name: group - name: result + - name: oauth paths: /questionnaires: get: @@ -461,8 +462,45 @@ paths: description: 結果を閲覧する権限がありません。 '500': description: アンケートの回答の詳細情報一覧が取得できませんでした + '/oauth/generate/code': + get: + operationId: getCode + tags: + - oauth + summary: Oauthの詳細を取得 + description: Oauthの詳細を取得 + responses: + '200': + description: 成功 + content: + application/json: + schema: + $ref: '#/components/schemas/OAuthCode' + '500': + description: 失敗 + '/oauth/callback': + parameters: + - $ref: '#/components/parameters/codeInQuery' + get: + tags: + - oauth + summary: OAuthのコールバック + description: OAuthのコールバック + operationId: callback + responses: + '200': + description: 成功 + '302': + description: 失敗時。認証ページへリダイレクト components: parameters: + codeInQuery: + name: code + in: query + required: true + description: OAuth2.0のcode + schema: + type: string answeredInQuery: name: answered in: query @@ -539,6 +577,17 @@ components: schema: type: string schemas: + OAuthCode: + type: object + properties: + code_challenge: + type: string + code_challenge_method: + type: string + client_id: + type: string + response_type: + type: string AnsweredType: type: string description: アンケート検索時に回答済みかの状態での絞り込み @@ -618,7 +667,7 @@ components: - administrators NewQuestionnaireResponse: allOf: - - $ref: '#/components/schemas/QuestionnaireUser' + - $ref: '#/components/schemas/QuestionnaireUser' Questionnaire: type: object properties: @@ -687,20 +736,20 @@ components: - respondents QuestionnaireMyTargeted: allOf: - - $ref: '#/components/schemas/Questionnaire' - - type: object - properties: - responded_at: - type: string - format: date-time - has_response: - type: boolean - description: 回答済みあるいは下書きが存在する - required: - - responded_at - - has_response + - $ref: '#/components/schemas/Questionnaire' + - type: object + properties: + responded_at: + type: string + format: date-time + has_response: + type: boolean + description: 回答済みあるいは下書きが存在する + required: + - responded_at + - has_response QuestionnaireMyAdministrates: - allOf: + allOf: - $ref: '#/components/schemas/QuestionnaireUser' - type: object properties: @@ -716,16 +765,16 @@ components: - respondents QuestionnaireUser: allOf: - - $ref: '#/components/schemas/Questionnaire' - - type: object - properties: - targets: - $ref: '#/components/schemas/Users' - administrators: - $ref: '#/components/schemas/Users' - required: - - targets - - administrators + - $ref: '#/components/schemas/Questionnaire' + - type: object + properties: + targets: + $ref: '#/components/schemas/Users' + administrators: + $ref: '#/components/schemas/Users' + required: + - targets + - administrators QuestionType: type: string example: Text @@ -800,38 +849,38 @@ components: - scale_max NewQuestion: allOf: - - $ref: '#/components/schemas/QuestionBase' - - type: object - properties: - questionnaireID: - type: integer - example: 1 - required: - - questionnaireID + - $ref: '#/components/schemas/QuestionBase' + - type: object + properties: + questionnaireID: + type: integer + example: 1 + required: + - questionnaireID Question: allOf: - - $ref: '#/components/schemas/NewQuestion' - - type: object - properties: - questionID: - type: integer - example: 1 - required: - - questionID + - $ref: '#/components/schemas/NewQuestion' + - type: object + properties: + questionID: + type: integer + example: 1 + required: + - questionID QuestionDetails: allOf: - - $ref: '#/components/schemas/QuestionBase' - - type: object - properties: - questionID: - type: integer - example: 1 - created_at: - type: string - format: date-time - required: - - questionID - - created_at + - $ref: '#/components/schemas/QuestionBase' + - type: object + properties: + questionID: + type: integer + example: 1 + created_at: + type: string + format: date-time + required: + - questionID + - created_at NewResponse: type: object properties: @@ -936,14 +985,14 @@ components: - question_type ResponseResult: allOf: - - $ref: '#/components/schemas/Response' - - type: object - properties: - traqID: - type: string - example: lolico - required: - - traqID + - $ref: '#/components/schemas/Response' + - type: object + properties: + traqID: + type: string + example: lolico + required: + - traqID required: - submitted_at Users: From c81c7bf507c5af29f1ad94a7e37dc337b4302272 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Mon, 24 Jan 2022 22:38:06 +0900 Subject: [PATCH 26/38] =?UTF-8?q?client=E3=81=ABOauth=E3=81=AE=E8=A8=98?= =?UTF-8?q?=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/router/index.js | 70 +++++++------------------------------- client/src/util/api.js | 24 +++++++++++++ 2 files changed, 37 insertions(+), 57 deletions(-) create mode 100644 client/src/util/api.js diff --git a/client/src/router/index.js b/client/src/router/index.js index e1671673..161b68e6 100644 --- a/client/src/router/index.js +++ b/client/src/router/index.js @@ -10,7 +10,7 @@ import Results from '@/pages/Results' import ResponseDetails from '@/pages/ResponseDetails' import NotFound from '@/pages/NotFound' import Blank from '@/pages/Blank' -import { sendTokenRequest, sendCodeRequest } from '../bin/traqAuth' +import { getRequest2Callback, redirect2AuthEndpoint } from '@/util/api.js' Vue.use(Router) @@ -58,9 +58,6 @@ const router = new Router({ path: '/questionnaires/:id/edit', name: 'QuestionnaireDetailsEdit', component: QuestionnaireDetails, - meta: { - requiresTraqAuth: true - } }, { path: '/results/:id', @@ -89,32 +86,12 @@ const router = new Router({ name: 'Callback', component: Blank, beforeEnter: async (to, _, next) => { - const clearSessionStorage = () => { - sessionStorage.removeItem('nextRoute') - sessionStorage.removeItem('previousRoute') - sessionStorage.removeItem(`traq-auth-code-verifier-${state}`) + await getRequest2Callback(to) + const destination = sessionStorage.getItem('destination') + if (destination) { + next(destination) } - - const code = to.query.code - const state = to.query.state - const codeVerifier = sessionStorage.getItem( - `traq-auth-code-verifier-${state}` - ) - if (!code || !codeVerifier) { - let previousRoute = sessionStorage.getItem('previousRoute') - if (!previousRoute) previousRoute = '/targeted' - clearSessionStorage() - next(previousRoute) - return - } - - const res = await sendTokenRequest(code, codeVerifier) - store.commit('traq/setAccessToken', res.data.access_token) - - let nextRoute = sessionStorage.getItem('nextRoute') - if (!nextRoute) nextRoute = '/targeted' - clearSessionStorage() - next(nextRoute) + next() } } ], @@ -129,6 +106,11 @@ const router = new Router({ }) router.beforeEach(async (to, from, next) => { + console.log(to.name) + if (to.name === 'Callback') { + next() + return + } // traQにログイン済みかどうか調べる if (!store.state.me) { await store.dispatch('whoAmI') @@ -136,34 +118,8 @@ router.beforeEach(async (to, from, next) => { if (!store.state.me) { // 未ログインの場合、traQのログインページに飛ばす - const traQLoginURL = 'https://q.trap.jp/login?redirect=' + location.href - location.href = traQLoginURL - } - - if (to.meta.requiresTraqAuth) { - await store.dispatch('traq/ensureToken') - if (!store.state.traq.accessToken) { - const message = - 'アンケートの編集・作成にはtraQアカウントへのアクセスが必要です。OKを押すとtraQに飛びます。' - if (window.confirm(message)) { - sessionStorage.setItem('nextRoute', to.path) // traQでのトークン取得後に飛ばすルート - sessionStorage.setItem('previousRoute', from.path) // traQでのトークン取得失敗時に飛ばすルート - await sendCodeRequest() - - // traQのconsentページに飛ぶ前にnextが表示されることを防ぐ - next(false) - return - } else { - // キャンセルを押された場合は元のルートに戻る - if (from.path !== to.path) { - next(from.path) - } else { - // url直打ちなどでアクセスされた場合 - next('/targeted') - } - return - } - } + sessionStorage.setItem(`destination`, to.fullPath) + await redirect2AuthEndpoint() } next() diff --git a/client/src/util/api.js b/client/src/util/api.js new file mode 100644 index 00000000..ed255c41 --- /dev/null +++ b/client/src/util/api.js @@ -0,0 +1,24 @@ +import axios from 'axios' + +export const traQBaseURL = 'https://q.trap.jp/api/v3' +axios.defaults.baseURL = + process.env.NODE_ENV === 'development' + ? 'http://localhost:8080/api' + : 'https://anke-to.trap.jp/api' + +export async function redirect2AuthEndpoint() { + const data = (await axios.get('/oauth2/generate/code')).data + + const authorizationEndpointUrl = new URL(data) + + window.location.assign(authorizationEndpointUrl.toString()) +} + +export async function getRequest2Callback(to) { + return axios.get('/oauth2/callback', { + params: { + code: to.query.code, + state: to.query.state + } + }) +} \ No newline at end of file From 7f5a4ff300e14bc5cdacae578514096438648cc5 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Tue, 25 Jan 2022 00:26:26 +0900 Subject: [PATCH 27/38] =?UTF-8?q?trap=E3=81=AEAPI=E3=81=8B=E3=82=89User?= =?UTF-8?q?=E3=82=92=E5=8F=96=E5=BE=97=E3=81=99=E3=82=8B=E3=83=A1=E3=82=BD?= =?UTF-8?q?=E3=83=83=E3=83=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- traq/user.go | 7 +++++++ traq/user_impl.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 traq/user.go create mode 100644 traq/user_impl.go diff --git a/traq/user.go b/traq/user.go new file mode 100644 index 00000000..cf7a1016 --- /dev/null +++ b/traq/user.go @@ -0,0 +1,7 @@ +package traq + +import "golang.org/x/oauth2" + +type IUser interface { + GetMyID(token *oauth2.Token) (string, error) +} diff --git a/traq/user_impl.go b/traq/user_impl.go new file mode 100644 index 00000000..1feacbbd --- /dev/null +++ b/traq/user_impl.go @@ -0,0 +1,47 @@ +package traq + +import ( + "encoding/json" + "fmt" + "golang.org/x/oauth2" + "net/http" +) + +type User struct { +} + +type UserRes struct { + ID string `json:"id"` + Name string `json:"name"` +} + +func (u *User) GetMyID(token *oauth2.Token) (string, error) { + path := "https://q.trap.jp/api/v3/users/me" + + req, err := http.NewRequest(http.MethodGet, path, nil) + if err != nil { + return "", fmt.Errorf("failed to create new req :%w", err) + } + + token.SetAuthHeader(req) + httpClient := http.DefaultClient + res, err := httpClient.Do(req) + if err != nil { + return "", fmt.Errorf("failed to get http res :%w", err) + } + + if res.StatusCode != 200 { + return "", fmt.Errorf("failed to get http res :(status :%d): %w", res.StatusCode, res.Status) + } + + user := &UserRes{} + if err = json.NewDecoder(res.Body).Decode(user); err != nil { + return "", fmt.Errorf("failed to decode res:%w", err) + } + + return user.Name, nil +} + +func NewUser() *User { + return &User{} +} From 80657608d2a7b66fc30b17d66fa6fc46f9c397e6 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Tue, 25 Jan 2022 00:44:22 +0900 Subject: [PATCH 28/38] =?UTF-8?q?User=E3=81=AE=E8=AA=8D=E8=A8=BC=E3=81=AEM?= =?UTF-8?q?iddleware=E3=81=AE=E6=9B=B8=E3=81=8D=E6=8F=9B=E3=81=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/middleware.go | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/router/middleware.go b/router/middleware.go index b638e536..a76f97d5 100644 --- a/router/middleware.go +++ b/router/middleware.go @@ -3,6 +3,8 @@ package router import ( "errors" "fmt" + "github.com/traPtitech/anke-to/router/session" + "github.com/traPtitech/anke-to/traq" "net/http" "strconv" @@ -18,6 +20,8 @@ type Middleware struct { model.IRespondent model.IQuestion model.IQuestionnaire + session.IStore + traq.IUser } // NewMiddleware Middlewareのコンストラクタ @@ -51,14 +55,39 @@ func (*Middleware) SetValidatorMiddleware(next echo.HandlerFunc) echo.HandlerFun 暫定的にハードコーディングで対応*/ var adminUserIDs = []string{"temma", "sappi_red", "ryoha", "mazrean", "xxarupakaxx", "asari"} +func (m *Middleware) SessionMiddleware() echo.MiddlewareFunc { + return m.IStore.GetMiddleware() +} + // SetUserIDMiddleware X-Showcase-UserからユーザーIDを取得しセットする -func (*Middleware) SetUserIDMiddleware(next echo.HandlerFunc) echo.HandlerFunc { +func (m *Middleware) SetUserIDMiddleware(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { - userID := c.Request().Header.Get("X-Showcase-User") - if userID == "" { - userID = "mds_boy" + sess, err := m.IStore.GetSession(c) + if errors.Is(err, session.ErrNoSession) { + return echo.NewHTTPError(http.StatusUnauthorized, "no session") + } + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err) + } + + userID, err := sess.GetUserID() + if err != nil && !errors.Is(err, session.ErrNoValue) { + return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to get userID :%w", err)) } + if errors.Is(err, session.ErrNoValue) { + token, err := sess.GetToken() + if errors.Is(err, session.ErrNoValue) { + return echo.NewHTTPError(http.StatusUnauthorized, "no token") + } + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to get token :%w", err)) + } + userID, err = m.IUser.GetMyID(token) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to get UserID:%w", err)) + } + } c.Set(userIDKey, userID) return next(c) From dbbd84caf894679df08b83caea2a87fbdd8c4ead Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Tue, 25 Jan 2022 00:55:30 +0900 Subject: [PATCH 29/38] =?UTF-8?q?middleware=E3=82=92=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router.go | 2 ++ router/middleware.go | 14 +++++++++----- wire.go | 3 +++ wire_gen.go | 21 +++++++++++---------- 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/router.go b/router.go index 84457770..7fb4ab98 100644 --- a/router.go +++ b/router.go @@ -33,6 +33,8 @@ func SetRouting(port string) { e.File("/favicon.ico", "client/dist/favicon.ico") e.File("*", "client/dist/index.html") + + e.Use(api.SessionMiddleware()) echoAPI := e.Group("/api", api.SetValidatorMiddleware, api.SetUserIDMiddleware, api.TraPMemberAuthenticate) { apiQuestionnnaires := echoAPI.Group("/questionnaires") diff --git a/router/middleware.go b/router/middleware.go index a76f97d5..1cf58a73 100644 --- a/router/middleware.go +++ b/router/middleware.go @@ -25,15 +25,19 @@ type Middleware struct { } // NewMiddleware Middlewareのコンストラクタ -func NewMiddleware(administrator model.IAdministrator, respondent model.IRespondent, question model.IQuestion, questionnaire model.IQuestionnaire) *Middleware { +func NewMiddleware(IAdministrator model.IAdministrator, IRespondent model.IRespondent, IQuestion model.IQuestion, IQuestionnaire model.IQuestionnaire, IStore session.IStore, IUser traq.IUser) *Middleware { return &Middleware{ - IAdministrator: administrator, - IRespondent: respondent, - IQuestion: question, - IQuestionnaire: questionnaire, + IAdministrator: IAdministrator, + IRespondent: IRespondent, + IQuestion: IQuestion, + IQuestionnaire: IQuestionnaire, + IStore: IStore, + IUser: IUser, } } + + const ( validatorKey = "validator" userIDKey = "userID" diff --git a/wire.go b/wire.go index 2032db0c..09240bbd 100644 --- a/wire.go +++ b/wire.go @@ -25,6 +25,7 @@ var ( storeBind = wire.Bind(new(session.IStore), new(*session.Store)) webhookBind = wire.Bind(new(traq.IWebhook), new(*traq.Webhook)) + userBind = wire.Bind(new(traq.IUser), new(*traq.User)) ) func InjectAPIServer() (*router.API,error) { @@ -50,6 +51,7 @@ func InjectAPIServer() (*router.API,error) { model.NewSession, session.NewStore, traq.NewWebhook, + traq.NewUser, administratorBind, optionBind, questionnaireBind, @@ -62,6 +64,7 @@ func InjectAPIServer() (*router.API,error) { transactionBind, webhookBind, storeBind, + userBind, ) return nil,nil } diff --git a/wire_gen.go b/wire_gen.go index 8dd17711..9d8af8bb 100644 --- a/wire_gen.go +++ b/wire_gen.go @@ -25,7 +25,13 @@ func InjectAPIServer() (*router.API, error) { respondent := model.NewRespondent() question := model.NewQuestion() questionnaire := model.NewQuestionnaire() - middleware := router.NewMiddleware(administrator, respondent, question, questionnaire) + modelSession := model.NewSession() + store, err := session.NewStore(modelSession) + if err != nil { + return nil, err + } + user := traq.NewUser() + middleware := router.NewMiddleware(administrator, respondent, question, questionnaire, store, user) target := model.NewTarget() option := model.NewOption() scaleLabel := model.NewScaleLabel() @@ -37,14 +43,9 @@ func InjectAPIServer() (*router.API, error) { response := model.NewResponse() routerResponse := router.NewResponse(questionnaire, validation, scaleLabel, respondent, response) result := router.NewResult(respondent, questionnaire, administrator) - user := router.NewUser(respondent, questionnaire, target, administrator) - modelSession := model.NewSession() - store, err := session.NewStore(modelSession) - if err != nil { - return nil, err - } + routerUser := router.NewUser(respondent, questionnaire, target, administrator) oauth := router.NewOauth(store) - api := router.NewAPI(middleware, routerQuestionnaire, routerQuestion, routerResponse, result, user, oauth) + api := router.NewAPI(middleware, routerQuestionnaire, routerQuestion, routerResponse, result, routerUser, oauth) return api, nil } @@ -61,8 +62,8 @@ var ( targetBind = wire.Bind(new(model.ITarget), new(*model.Target)) validationBind = wire.Bind(new(model.IValidation), new(*model.Validation)) transactionBind = wire.Bind(new(model.ITransaction), new(*model.Transaction)) - //sessionBind = wire.Bind(new(model.ISession),new(*model.Session)) - storeBind = wire.Bind(new(session.IStore), new(*session.Store)) + storeBind = wire.Bind(new(session.IStore), new(*session.Store)) webhookBind = wire.Bind(new(traq.IWebhook), new(*traq.Webhook)) + userBind = wire.Bind(new(traq.IUser), new(*traq.User)) ) From dc927ea4cf74eec74af06858f18a26d10db69231 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Thu, 27 Jan 2022 00:27:53 +0900 Subject: [PATCH 30/38] npm run lint --fix --- client/src/router/index.js | 2 +- client/src/util/api.js | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/client/src/router/index.js b/client/src/router/index.js index 161b68e6..36ede2fd 100644 --- a/client/src/router/index.js +++ b/client/src/router/index.js @@ -57,7 +57,7 @@ const router = new Router({ { path: '/questionnaires/:id/edit', name: 'QuestionnaireDetailsEdit', - component: QuestionnaireDetails, + component: QuestionnaireDetails }, { path: '/results/:id', diff --git a/client/src/util/api.js b/client/src/util/api.js index ed255c41..49b51db8 100644 --- a/client/src/util/api.js +++ b/client/src/util/api.js @@ -2,23 +2,23 @@ import axios from 'axios' export const traQBaseURL = 'https://q.trap.jp/api/v3' axios.defaults.baseURL = - process.env.NODE_ENV === 'development' - ? 'http://localhost:8080/api' - : 'https://anke-to.trap.jp/api' + process.env.NODE_ENV === 'development' + ? 'http://localhost:8080/api' + : 'https://anke-to.trap.jp/api' export async function redirect2AuthEndpoint() { - const data = (await axios.get('/oauth2/generate/code')).data + const data = (await axios.get('/oauth/generate/code')).data - const authorizationEndpointUrl = new URL(data) + const authorizationEndpointUrl = new URL(data) - window.location.assign(authorizationEndpointUrl.toString()) + window.location.assign(authorizationEndpointUrl.toString()) } export async function getRequest2Callback(to) { - return axios.get('/oauth2/callback', { - params: { - code: to.query.code, - state: to.query.state - } - }) -} \ No newline at end of file + return axios.get('/oauth/callback', { + params: { + code: to.query.code, + state: to.query.state + } + }) +} From 71a3b380b2b673ac783ef034a02dde6239bd7913 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Thu, 27 Jan 2022 00:36:27 +0900 Subject: [PATCH 31/38] =?UTF-8?q?=E3=83=9D=E3=82=A4=E3=83=B3=E3=82=BF?= =?UTF-8?q?=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/middleware.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/router/middleware.go b/router/middleware.go index 1cf58a73..da9b899b 100644 --- a/router/middleware.go +++ b/router/middleware.go @@ -46,7 +46,7 @@ const ( questionIDKey = "questionID" ) -func (*Middleware) SetValidatorMiddleware(next echo.HandlerFunc) echo.HandlerFunc { +func (m *Middleware) SetValidatorMiddleware(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { validate := validator.New() c.Set(validatorKey, validate) @@ -63,7 +63,7 @@ func (m *Middleware) SessionMiddleware() echo.MiddlewareFunc { return m.IStore.GetMiddleware() } -// SetUserIDMiddleware X-Showcase-UserからユーザーIDを取得しセットする +// SetUserIDMiddleware SessionからUserIDを取得 func (m *Middleware) SetUserIDMiddleware(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { sess, err := m.IStore.GetSession(c) @@ -99,7 +99,7 @@ func (m *Middleware) SetUserIDMiddleware(next echo.HandlerFunc) echo.HandlerFunc } // TraPMemberAuthenticate traP部員かの認証 -func (*Middleware) TraPMemberAuthenticate(next echo.HandlerFunc) echo.HandlerFunc { +func (m *Middleware) TraPMemberAuthenticate(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { userID, err := getUserID(c) if err != nil { @@ -118,7 +118,7 @@ func (*Middleware) TraPMemberAuthenticate(next echo.HandlerFunc) echo.HandlerFun } // TrapRateLimitMiddlewareFunc traP IDベースのリクエスト制限 -func (*Middleware) TrapRateLimitMiddlewareFunc() echo.MiddlewareFunc { +func (m *Middleware) TrapRateLimitMiddlewareFunc() echo.MiddlewareFunc { config := middleware.RateLimiterConfig{ Store: middleware.NewRateLimiterMemoryStore(5), IdentifierExtractor: func(c echo.Context) (string, error) { From dfab7af9d6fd1217cb06c2f155fd7dd89d4427b7 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Thu, 27 Jan 2022 00:36:46 +0900 Subject: [PATCH 32/38] s256 -> S256 --- router/oauth.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/router/oauth.go b/router/oauth.go index f96be194..4f30ecc3 100644 --- a/router/oauth.go +++ b/router/oauth.go @@ -42,7 +42,7 @@ func NewOauth(sessStore session.IStore) *Oauth { // GetCode GET /oauth/generate/code func (o *Oauth) GetCode(c echo.Context) error { sess, err := o.sessStore.GetSession(c) - if err != nil { + if err != nil && !errors.Is(err, session.ErrNoSession) { return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to get session:%w", err)) } @@ -56,7 +56,7 @@ func (o *Oauth) GetCode(c echo.Context) error { challenge := base64.RawURLEncoding.EncodeToString(hash[:]) challengeOption := oauth2.SetAuthURLParam("code_challenge", challenge) - methodOption := oauth2.SetAuthURLParam("code_challenge_method", "s256") + methodOption := oauth2.SetAuthURLParam("code_challenge_method", "S256") authURL := o.config.AuthCodeURL(state, challengeOption, methodOption) @@ -98,7 +98,6 @@ func (o *Oauth) Callback(c echo.Context) error { } codeChallengeOption := oauth2.SetAuthURLParam("code_verifier", verifier) - token, err := o.config.Exchange(c.Request().Context(), code, codeChallengeOption) if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, fmt.Errorf("failed to exchange token: %w", err)) From 8d042c3bf6872737ae762ee203f526b8b774a2c7 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Thu, 27 Jan 2022 00:37:06 +0900 Subject: [PATCH 33/38] =?UTF-8?q?Oauth=E3=81=AE=E3=82=A8=E3=83=B3=E3=83=89?= =?UTF-8?q?=E3=83=9D=E3=82=A4=E3=83=B3=E3=83=88=E3=81=AE=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/router.go b/router.go index 7fb4ab98..66434fd5 100644 --- a/router.go +++ b/router.go @@ -35,6 +35,16 @@ func SetRouting(port string) { e.Use(api.SessionMiddleware()) + + oauthAPI := e.Group("/api") + { + apiOauth := oauthAPI.Group("/oauth") + { + apiOauth.GET("/callback", api.Callback) + apiOauth.GET("/generate/code", api.GetCode) + } + } + echoAPI := e.Group("/api", api.SetValidatorMiddleware, api.SetUserIDMiddleware, api.TraPMemberAuthenticate) { apiQuestionnnaires := echoAPI.Group("/questionnaires") @@ -80,12 +90,6 @@ func SetRouting(port string) { { apiResults.GET("/:questionnaireID", api.GetResults, api.ResultAuthenticate) } - - apiOauth := echoAPI.Group("/oauth") - { - apiOauth.GET("/callback", api.Callback) - apiOauth.GET("/generate/code", api.GetCode) - } } e.Logger.Fatal(e.Start(port)) From d968dfdafcd1f268b95895e6c1671bd6847b0ff5 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Thu, 27 Jan 2022 00:39:27 +0900 Subject: [PATCH 34/38] =?UTF-8?q?GetToken=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/session/session_impl.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/router/session/session_impl.go b/router/session/session_impl.go index 14f3cc11..e07265f5 100644 --- a/router/session/session_impl.go +++ b/router/session/session_impl.go @@ -79,31 +79,31 @@ func (s *Session) SetToken(token *oauth2.Token) { } func (s *Session) GetToken() (*oauth2.Token, error) { - accessToken, ok := s.sess.Values["access_token"].(string) - if !ok || accessToken == "" { + iAccessToken, ok := s.sess.Values["access_token"] + if !ok || iAccessToken == nil { return nil, ErrNoValue } - tokenType, ok := s.sess.Values["token_type"].(string) - if !ok || tokenType == "" { + iTokenType, ok := s.sess.Values["token_type"] + if !ok || iTokenType == nil { return nil, ErrNoValue } - refreshToken, ok := s.sess.Values["refresh_token"].(string) - if !ok || refreshToken == "" { + iRefreshToken, ok := s.sess.Values["refresh_token"] + if !ok || iRefreshToken == nil { return nil, ErrNoValue } - expiry, ok := s.sess.Values["expiry"].(time.Time) - if !ok || expiry.IsZero() { + iExpiry, ok := s.sess.Values["expiry"] + if !ok || iExpiry == nil { return nil, ErrNoValue } return &oauth2.Token{ - AccessToken: accessToken, - TokenType: tokenType, - RefreshToken: refreshToken, - Expiry: expiry, + AccessToken: iAccessToken.(string), + TokenType: iTokenType.(string), + RefreshToken: iRefreshToken.(string), + Expiry: iExpiry.(time.Time), }, nil } From 52a36501ddaa8f1fa49bf853b776ee25a98918fd Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Thu, 27 Jan 2022 13:50:49 +0900 Subject: [PATCH 35/38] =?UTF-8?q?mock=E3=81=AE=E7=94=9F=E6=88=90=E3=82=B3?= =?UTF-8?q?=E3=83=9E=E3=83=B3=E3=83=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- model/session.go | 2 ++ traq/user.go | 2 ++ 2 files changed, 4 insertions(+) diff --git a/model/session.go b/model/session.go index 12f21768..fa1c760d 100644 --- a/model/session.go +++ b/model/session.go @@ -1,3 +1,5 @@ +//go:generate mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE + package model import "github.com/srinathgs/mysqlstore" diff --git a/traq/user.go b/traq/user.go index cf7a1016..a2421e6b 100644 --- a/traq/user.go +++ b/traq/user.go @@ -1,3 +1,5 @@ +//go:generate mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE + package traq import "golang.org/x/oauth2" From a6bf720d602deb1a01b171c434aae16575f2b563 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Thu, 27 Jan 2022 14:04:46 +0900 Subject: [PATCH 36/38] =?UTF-8?q?mock=E3=81=AE=E7=94=9F=E6=88=90=E3=82=B3?= =?UTF-8?q?=E3=83=9E=E3=83=B3=E3=83=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/session/session.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/router/session/session.go b/router/session/session.go index 3407b3b7..b2bba2bb 100644 --- a/router/session/session.go +++ b/router/session/session.go @@ -1,3 +1,5 @@ +//go:generate mockgen -source=$GOFILE -destination=mock_$GOPACKAGE/mock_$GOFILE + package session import "github.com/labstack/echo/v4" From 63ad65ef4304668cde7d21c3916c00325c1e218a Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Thu, 27 Jan 2022 14:06:24 +0900 Subject: [PATCH 37/38] =?UTF-8?q?middleware=5Ftest=E3=81=AE=E5=91=BC?= =?UTF-8?q?=E3=81=B3=E5=87=BA=E3=81=97=E3=81=AE=E6=9B=B8=E3=81=8D=E6=8F=9B?= =?UTF-8?q?=E3=81=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/middleware_test.go | 22 ++++++++++++++-------- router/responses_test.go | 17 ++++++++++++++++- router/users_test.go | 38 +++++++++++++++++++++----------------- 3 files changed, 51 insertions(+), 26 deletions(-) diff --git a/router/middleware_test.go b/router/middleware_test.go index 84503255..1d2febd1 100644 --- a/router/middleware_test.go +++ b/router/middleware_test.go @@ -3,6 +3,8 @@ package router import ( "errors" "fmt" + "github.com/traPtitech/anke-to/router/session/mock_session" + "github.com/traPtitech/anke-to/traq/mock_traq" "net/http" "net/http/httptest" "strconv" @@ -39,8 +41,9 @@ func TestSetUserIDMiddleware(t *testing.T) { mockAdministrator := mock_model.NewMockIAdministrator(ctrl) mockQuestionnaire := mock_model.NewMockIQuestionnaire(ctrl) mockQuestion := mock_model.NewMockIQuestion(ctrl) - - middleware := NewMiddleware(mockAdministrator, mockRespondent, mockQuestion, mockQuestionnaire) + mockStore := mock_session.NewMockIStore(ctrl) + mockUser := mock_traq.NewMockIUser(ctrl) + middleware := NewMiddleware(mockAdministrator, mockRespondent, mockQuestion, mockQuestionnaire, mockStore, mockUser) type args struct { userID string @@ -113,8 +116,9 @@ func TestTraPMemberAuthenticate(t *testing.T) { mockAdministrator := mock_model.NewMockIAdministrator(ctrl) mockQuestionnaire := mock_model.NewMockIQuestionnaire(ctrl) mockQuestion := mock_model.NewMockIQuestion(ctrl) - - middleware := NewMiddleware(mockAdministrator, mockRespondent, mockQuestion, mockQuestionnaire) + mockStore := mock_session.NewMockIStore(ctrl) + mockUser := mock_traq.NewMockIUser(ctrl) + middleware := NewMiddleware(mockAdministrator, mockRespondent, mockQuestion, mockQuestionnaire, mockStore, mockUser) type args struct { userID string @@ -181,8 +185,9 @@ func TestResponseReadAuthenticate(t *testing.T) { mockAdministrator := mock_model.NewMockIAdministrator(ctrl) mockQuestionnaire := mock_model.NewMockIQuestionnaire(ctrl) mockQuestion := mock_model.NewMockIQuestion(ctrl) - - middleware := NewMiddleware(mockAdministrator, mockRespondent, mockQuestion, mockQuestionnaire) + mockStore := mock_session.NewMockIStore(ctrl) + mockUser := mock_traq.NewMockIUser(ctrl) + middleware := NewMiddleware(mockAdministrator, mockRespondent, mockQuestion, mockQuestionnaire, mockStore, mockUser) type args struct { userID string @@ -407,8 +412,9 @@ func TestResultAuthenticate(t *testing.T) { mockAdministrator := mock_model.NewMockIAdministrator(ctrl) mockQuestionnaire := mock_model.NewMockIQuestionnaire(ctrl) mockQuestion := mock_model.NewMockIQuestion(ctrl) - - middleware := NewMiddleware(mockAdministrator, mockRespondent, mockQuestion, mockQuestionnaire) + mockStore := mock_session.NewMockIStore(ctrl) + mockUser := mock_traq.NewMockIUser(ctrl) + middleware := NewMiddleware(mockAdministrator, mockRespondent, mockQuestion, mockQuestionnaire, mockStore, mockUser) type args struct { haveReadPrivilege bool diff --git a/router/responses_test.go b/router/responses_test.go index 1ea9845b..eb36ec2b 100644 --- a/router/responses_test.go +++ b/router/responses_test.go @@ -4,6 +4,8 @@ import ( "encoding/json" "errors" "fmt" + "github.com/traPtitech/anke-to/router/session/mock_session" + "github.com/traPtitech/anke-to/traq/mock_traq" "github.com/go-playground/validator/v10" @@ -524,6 +526,8 @@ func TestPostResponse(t *testing.T) { mockAdministrator := mock_model.NewMockIAdministrator(ctrl) mockQuestion := mock_model.NewMockIQuestion(ctrl) + mockStore := mock_session.NewMockIStore(ctrl) + mockUser := mock_traq.NewMockIUser(ctrl) r := NewResponse( mockQuestionnaire, @@ -537,6 +541,9 @@ func TestPostResponse(t *testing.T) { mockRespondent, mockQuestion, mockQuestionnaire, + mockStore, + mockUser, + ) // Questionnaire // GetQuestionnaireLimit @@ -1063,7 +1070,8 @@ func TestGetResponse(t *testing.T) { mockAdministrator := mock_model.NewMockIAdministrator(ctrl) mockQuestion := mock_model.NewMockIQuestion(ctrl) - + mockStore := mock_session.NewMockIStore(ctrl) + mockUser := mock_traq.NewMockIUser(ctrl) r := NewResponse( mockQuestionnaire, mockValidation, @@ -1076,6 +1084,8 @@ func TestGetResponse(t *testing.T) { mockRespondent, mockQuestion, mockQuestionnaire, + mockStore, + mockUser, ) // Respondent @@ -1231,6 +1241,8 @@ func TestEditResponse(t *testing.T) { mockAdministrator := mock_model.NewMockIAdministrator(ctrl) mockQuestion := mock_model.NewMockIQuestion(ctrl) + mockStore := mock_session.NewMockIStore(ctrl) + mockUser := mock_traq.NewMockIUser(ctrl) r := NewResponse( mockQuestionnaire, @@ -1244,7 +1256,10 @@ func TestEditResponse(t *testing.T) { mockRespondent, mockQuestion, mockQuestionnaire, + mockStore, + mockUser, ) + // Questionnaire // GetQuestionnaireLimit // success diff --git a/router/users_test.go b/router/users_test.go index c4d77032..dc339591 100644 --- a/router/users_test.go +++ b/router/users_test.go @@ -4,6 +4,8 @@ import ( "encoding/json" "fmt" "github.com/go-playground/validator/v10" + "github.com/traPtitech/anke-to/router/session/mock_session" + "github.com/traPtitech/anke-to/traq/mock_traq" "net/http" "testing" "time" @@ -162,7 +164,8 @@ func TestGetUsersMe(t *testing.T) { mockAdministrator := mock_model.NewMockIAdministrator(ctrl) mockQuestion := mock_model.NewMockIQuestion(ctrl) - + mockStore := mock_session.NewMockIStore(ctrl) + mockUser := mock_traq.NewMockIUser(ctrl) u := NewUser( mockRespondent, mockQuestionnaire, @@ -174,6 +177,8 @@ func TestGetUsersMe(t *testing.T) { mockRespondent, mockQuestion, mockQuestionnaire, + mockStore, + mockUser, ) type request struct { @@ -305,19 +310,16 @@ func TestGetMyResponses(t *testing.T) { mockAdministrator := mock_model.NewMockIAdministrator(ctrl) mockQuestion := mock_model.NewMockIQuestion(ctrl) - + mockStore := mock_session.NewMockIStore(ctrl) + mockUser := mock_traq.NewMockIUser(ctrl) u := NewUser( mockRespondent, mockQuestionnaire, mockTarget, mockAdministrator, ) - m := NewMiddleware( - mockAdministrator, - mockRespondent, - mockQuestion, - mockQuestionnaire, - ) + + m := NewMiddleware(mockAdministrator, mockRespondent, mockQuestion, mockQuestionnaire, mockStore, mockUser) // Respondent // GetRespondentInfos @@ -462,19 +464,15 @@ func TestGetMyResponsesByID(t *testing.T) { mockAdministrator := mock_model.NewMockIAdministrator(ctrl) mockQuestion := mock_model.NewMockIQuestion(ctrl) - + mockStore := mock_session.NewMockIStore(ctrl) + mockUser := mock_traq.NewMockIUser(ctrl) + m := NewMiddleware(mockAdministrator, mockRespondent, mockQuestion, mockQuestionnaire, mockStore, mockUser) u := NewUser( mockRespondent, mockQuestionnaire, mockTarget, mockAdministrator, ) - m := NewMiddleware( - mockAdministrator, - mockRespondent, - mockQuestion, - mockQuestionnaire, - ) // Respondent // GetRespondentInfos @@ -634,7 +632,8 @@ func TestGetTargetedQuestionnaire(t *testing.T) { mockAdministrator := mock_model.NewMockIAdministrator(ctrl) mockQuestion := mock_model.NewMockIQuestion(ctrl) - + mockStore := mock_session.NewMockIStore(ctrl) + mockUser := mock_traq.NewMockIUser(ctrl) u := NewUser( mockRespondent, mockQuestionnaire, @@ -646,6 +645,8 @@ func TestGetTargetedQuestionnaire(t *testing.T) { mockRespondent, mockQuestion, mockQuestionnaire, + mockStore, + mockUser, ) // Questionnaire @@ -785,7 +786,8 @@ func TestGetTargettedQuestionnairesBytraQID(t *testing.T) { mockAdministrator := mock_model.NewMockIAdministrator(ctrl) mockQuestion := mock_model.NewMockIQuestion(ctrl) - + mockStore := mock_session.NewMockIStore(ctrl) + mockUser := mock_traq.NewMockIUser(ctrl) u := NewUser( mockRespondent, mockQuestionnaire, @@ -797,6 +799,8 @@ func TestGetTargettedQuestionnairesBytraQID(t *testing.T) { mockRespondent, mockQuestion, mockQuestionnaire, + mockStore, + mockUser, ) // Questionnaire From 9438130d573cf91f6b882505dc0ad9f97e197030 Mon Sep 17 00:00:00 2001 From: xxarupakaxx Date: Sun, 30 Jan 2022 17:02:19 +0900 Subject: [PATCH 38/38] =?UTF-8?q?getSession=E3=81=AEMock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- router/responses_test.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/router/responses_test.go b/router/responses_test.go index eb36ec2b..a8cd4bda 100644 --- a/router/responses_test.go +++ b/router/responses_test.go @@ -649,6 +649,10 @@ func TestPostResponse(t *testing.T) { InsertResponses(gomock.Any(), responseIDFailure, gomock.Any()). Return(errMock).AnyTimes() + + mockStore.EXPECT(). + GetSession(gomock.Any()). + Return(nil,nil).AnyTimes() // responseID, err := mockRespondent. // InsertRespondent(string(userOne), 1, null.NewTime(nowTime, true)) // assertion.Equal(1, responseID) @@ -1103,6 +1107,10 @@ func TestGetResponse(t *testing.T) { GetRespondentDetail(gomock.Any(), responseIDNotFound). Return(model.RespondentDetail{}, model.ErrRecordNotFound).AnyTimes() + mockStore.EXPECT(). + GetSession(gomock.Any()). + Return(nil,nil).AnyTimes() + type request struct { user users responseID int @@ -1378,6 +1386,11 @@ func TestEditResponse(t *testing.T) { DeleteResponse(gomock.Any(), responseIDFailure). Return(model.ErrNoRecordDeleted).AnyTimes() + + mockStore.EXPECT(). + GetSession(gomock.Any()). + Return(nil,nil).AnyTimes() + // responseID, err := mockRespondent. // InsertRespondent(string(userOne), 1, null.NewTime(nowTime, true)) // assertion.Equal(1, responseID)