From a3127af026f749b45aa736bdc05fe7056621563e Mon Sep 17 00:00:00 2001 From: Mohammed Sohail Date: Tue, 31 May 2022 11:35:49 +0300 Subject: [PATCH] add: meta proxy --- cmd/init.go | 11 +++++++++ cmd/main.go | 5 +++- cmd/server.go | 2 +- config.toml | 8 ++++++- go.mod | 1 + go.sum | 2 ++ internal/admin/api.go | 19 +++++++-------- internal/admin/user.go | 52 ++++++++++++++++++++++++++++++++++++++++-- 8 files changed, 86 insertions(+), 14 deletions(-) diff --git a/cmd/init.go b/cmd/init.go index 7a9f64e..58e36ba 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -6,6 +6,7 @@ import ( "strings" batch_balance "github.com/grassrootseconomics/cic-go/batch_balance" + "github.com/grassrootseconomics/cic-go/meta" cic_net "github.com/grassrootseconomics/cic-go/net" "github.com/ethereum/go-ethereum/common" @@ -40,6 +41,12 @@ type config struct { Enabled bool `koan:"enabled"` } Syncers map[string]string `koanf:"syncers"` + Meta struct { + Endpoint string `koanf:"meta"` + } + Jwt struct { + Secret string `koanf:"secret"` + } } type queries struct { @@ -111,6 +118,10 @@ func loadCicNet(tokenIndex common.Address) error { return nil } +func loadCicMeta(metaEndpoint string) { + metaClient = meta.NewCicMeta(metaEndpoint) +} + func loadBatchBalance(balanceResolver common.Address) error { var err error diff --git a/cmd/main.go b/cmd/main.go index c61d2d3..18d3746 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -8,6 +8,7 @@ import ( "time" batch_balance "github.com/grassrootseconomics/cic-go/batch_balance" + "github.com/grassrootseconomics/cic-go/meta" cic_net "github.com/grassrootseconomics/cic-go/net" "github.com/grassrootseconomics/cic-go/provider" "github.com/hibiken/asynq" @@ -28,6 +29,7 @@ var ( rpcProvider *provider.Provider cicnetClient *cic_net.CicNet batchBalance *batch_balance.BatchBalance + metaClient *meta.CicMeta rClient asynq.RedisConnOpt ) @@ -59,9 +61,10 @@ func init() { } if err := parseRedis(conf.Db.Redis); err != nil { - log.Fatal().Err(err).Msg("could not parse redis connection string") } + + loadCicMeta(conf.Meta.Endpoint) } func main() { diff --git a/cmd/server.go b/cmd/server.go index 029d78c..54ffcd3 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -22,7 +22,7 @@ func initHTTPServer() *echo.Echo { dashboard.InitDashboardApi(server, db, preparedQueries.dashboard) public.InitPublicApi(server, db, batchBalance, cicnetClient, preparedQueries.public) - admin.InitAdminApi(server, db, preparedQueries.admin, "test") + admin.InitAdminApi(server, db, preparedQueries.admin, metaClient, conf.Jwt.Secret) return server } diff --git a/config.toml b/config.toml index 5bb33cb..cce4ed3 100644 --- a/config.toml +++ b/config.toml @@ -25,4 +25,10 @@ enabled = true [syncers] cache = "@every 20s" ussd = "@every 30s" -token = "@every 1m" \ No newline at end of file +token = "@every 1m" + +[meta] +endpoint = "http://cic-meta-server:8000" + +[jwt] +secret = "0xd34db33f" \ No newline at end of file diff --git a/go.mod b/go.mod index 03bc233..266343c 100644 --- a/go.mod +++ b/go.mod @@ -42,6 +42,7 @@ require ( github.com/jackc/pgtype v1.11.0 // indirect github.com/jackc/puddle v1.2.1 // indirect github.com/labstack/gommon v0.3.1 // indirect + github.com/mapaiva/vcard-go v1.2.0 // indirect github.com/mattn/go-colorable v0.1.12 // indirect github.com/mattn/go-isatty v0.0.14 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect diff --git a/go.sum b/go.sum index fd9a641..eede51a 100644 --- a/go.sum +++ b/go.sum @@ -393,6 +393,8 @@ github.com/lmittmann/w3 v0.7.0 h1:z3Z7OeLAQ/oHWK8k5U5SH+G2BD6ZbsdrBktUytDzG78= github.com/lmittmann/w3 v0.7.0/go.mod h1:8F9LNaa0D/k68rnCdTtBsMon8ucpvlS9fmPVXp7Uz7M= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mapaiva/vcard-go v1.2.0 h1:w/Jmdow8CDE3T/6SBSTt1HBTDxZmQ39a415hCzElAN8= +github.com/mapaiva/vcard-go v1.2.0/go.mod h1:OedyhOJ8gUHmfp6iI3+2bf0kzQetFRpD625G9NCEB6Y= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= diff --git a/internal/admin/api.go b/internal/admin/api.go index b083c06..fb02824 100644 --- a/internal/admin/api.go +++ b/internal/admin/api.go @@ -4,6 +4,7 @@ import ( "net/http" "github.com/golang-jwt/jwt" + "github.com/grassrootseconomics/cic-go/meta" "github.com/jackc/pgx/v4/pgxpool" "github.com/labstack/echo/v4" "github.com/nleof/goyesql" @@ -13,11 +14,12 @@ import ( type api struct { db *pgxpool.Pool q goyesql.Queries + m *meta.CicMeta jwtKey []byte } -func InitAdminApi(e *echo.Echo, db *pgxpool.Pool, queries goyesql.Queries, jwtKey string) { - api := newApi(db, queries, jwtKey) +func InitAdminApi(e *echo.Echo, db *pgxpool.Pool, queries goyesql.Queries, metaClient *meta.CicMeta, jwtKey string) { + api := newApi(db, queries, metaClient, jwtKey) auth := e.Group(("/auth")) g := e.Group("/admin") @@ -29,13 +31,15 @@ func InitAdminApi(e *echo.Echo, db *pgxpool.Pool, queries goyesql.Queries, jwtKe g.Use(api.dwCoreMiddleware) g.Use(api.verifyAuthMiddleware) - g.GET("/protected", handleProtectedResource) + g.GET("/meta-proxy/:address", handleMetaProxy) } -func newApi(db *pgxpool.Pool, queries goyesql.Queries, jwtKey string) *api { +func newApi(db *pgxpool.Pool, queries goyesql.Queries, metaClient *meta.CicMeta, jwtKey string) *api { + log.Info().Msgf("%s inj", jwtKey) return &api{ db: db, q: queries, + m: metaClient, jwtKey: []byte(jwtKey), } } @@ -45,6 +49,7 @@ func (a *api) dwCoreMiddleware(next echo.HandlerFunc) echo.HandlerFunc { c.Set("api", &api{ db: a.db, q: a.q, + m: a.m, jwtKey: a.jwtKey, }) return next(c) @@ -53,7 +58,6 @@ func (a *api) dwCoreMiddleware(next echo.HandlerFunc) echo.HandlerFunc { func (a *api) verifyAuthMiddleware(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { - log.Info().Msgf("%v", c.Cookies()) cookie, err := c.Cookie("_ge_auth") if err != nil { return c.String(http.StatusForbidden, "auth cookie missing") @@ -65,10 +69,7 @@ func (a *api) verifyAuthMiddleware(next echo.HandlerFunc) echo.HandlerFunc { return a.jwtKey, nil }) if err != nil { - if err == jwt.ErrSignatureInvalid { - return c.String(http.StatusUnauthorized, "jwt signature validation failed") - } - return c.String(http.StatusBadRequest, "jwt bad request") + return c.String(http.StatusUnauthorized, "jwt validation failed") } if !token.Valid { return c.String(http.StatusUnauthorized, "jwt invalid") diff --git a/internal/admin/user.go b/internal/admin/user.go index 16cf83a..39215af 100644 --- a/internal/admin/user.go +++ b/internal/admin/user.go @@ -1,11 +1,59 @@ package admin import ( + "bytes" + "encoding/base64" "net/http" + "strings" + "github.com/grassrootseconomics/cic-go/meta" "github.com/labstack/echo/v4" + "github.com/mapaiva/vcard-go" ) -func handleProtectedResource(c echo.Context) error { - return c.String(http.StatusOK, "unlocked") +type metaRes struct { + Person meta.PersonResponse `json:"person"` + Name string `json:"name"` +} + +func handleMetaProxy(c echo.Context) error { + var ( + api = c.Get("api").(*api) + address = c.Param("address") + ) + + person, err := api.m.GetPersonMetadata(address) + if err != nil { + if strings.Contains(err.Error(), "404") { + return c.String(http.StatusNotFound, "meta resource not found") + } else { + return err + } + } + + vCard, err := parseVCard(person.VCard) + if err != nil { + return err + } + + return c.JSON(http.StatusOK, &metaRes{ + Person: person, + Name: vCard.FormattedName, + }) +} + +func parseVCard(encodedVCard string) (vcard.VCard, error) { + data, err := base64.StdEncoding.DecodeString(encodedVCard) + if err != nil { + return vcard.VCard{}, err + } + + reader := bytes.NewReader(data) + + vCards, err := vcard.GetVCardsByReader(reader) + if err != nil { + return vcard.VCard{}, nil + } + + return vCards[0], nil }