diff --git a/app/main.go b/app/main.go index 2a7b7cda..3cf7de51 100644 --- a/app/main.go +++ b/app/main.go @@ -98,6 +98,12 @@ func main() { exporter := migrator.Remark{DataStore: dataStore} + avatarProxy := &avatar.Proxy{ + StorePath: opts.ServerCommand.AvatarStore, + RoutePath: "/api/v1/avatar", + DefaultAvatar: opts.ServerCommand.DefaultAvatar, + } + srv := rest.Server{ Version: revision, DataService: dataService, @@ -105,13 +111,9 @@ func main() { Admins: opts.Admins, DevMode: opts.DevMode, Exporter: &exporter, - AuthProviders: makeAuthProviders(sessionStore), + AuthProviders: makeAuthProviders(sessionStore, avatarProxy), Cache: common.NewLoadingCache(4*time.Hour, 15*time.Minute, postFlushFn), - AvatarProxy: avatar.Proxy{ - StorePath: opts.ServerCommand.AvatarStore, - RoutePath: "/api/v1/avatar", - DefaultAvatar: opts.ServerCommand.DefaultAvatar, - }, + AvatarProxy: avatarProxy, } if opts.DevMode { @@ -173,19 +175,19 @@ func makeDirs(dirs ...string) error { return nil } -func makeAuthProviders(sessionStore sessions.Store) []auth.Provider { +func makeAuthProviders(sessionStore sessions.Store, avatarProxy *avatar.Proxy) []auth.Provider { providers := []auth.Provider{} srvOpts := opts.ServerCommand if srvOpts.GoogleCID != "" && srvOpts.GoogleCSEC != "" { - providers = append(providers, auth.NewGoogle(auth.Params{ + providers = append(providers, auth.NewGoogle(auth.Params{AvatarProxy: avatarProxy, Cid: srvOpts.GoogleCID, Csecret: srvOpts.GoogleCSEC, SessionStore: sessionStore, RemarkURL: opts.RemarkURL})) } if srvOpts.GithubCID != "" && srvOpts.GithubCSEC != "" { - providers = append(providers, auth.NewGithub(auth.Params{ + providers = append(providers, auth.NewGithub(auth.Params{AvatarProxy: avatarProxy, Cid: srvOpts.GithubCID, Csecret: srvOpts.GithubCSEC, SessionStore: sessionStore, RemarkURL: opts.RemarkURL})) } if srvOpts.FacebookCID != "" && srvOpts.FacebookCSEC != "" { - providers = append(providers, auth.NewFacebook(auth.Params{ + providers = append(providers, auth.NewFacebook(auth.Params{AvatarProxy: avatarProxy, Cid: srvOpts.FacebookCID, Csecret: srvOpts.FacebookCSEC, SessionStore: sessionStore, RemarkURL: opts.RemarkURL})) } if len(providers) == 0 { diff --git a/app/rest/auth/auth.go b/app/rest/auth/auth.go index 46d39d1d..9173e5ff 100644 --- a/app/rest/auth/auth.go +++ b/app/rest/auth/auth.go @@ -17,6 +17,7 @@ import ( "github.com/gorilla/sessions" "golang.org/x/oauth2" + "github.com/umputun/remark/app/rest/avatar" "github.com/umputun/remark/app/rest/common" "github.com/umputun/remark/app/store" ) @@ -31,6 +32,7 @@ type Provider struct { Endpoint oauth2.Endpoint Scopes []string MapUser func(userData) store.User + AvatarProxy *avatar.Proxy conf *oauth2.Config } @@ -41,6 +43,7 @@ type Params struct { Csecret string SessionStore sessions.Store RemarkURL string + AvatarProxy *avatar.Proxy } type userData map[string]interface{} @@ -53,7 +56,7 @@ func (u userData) value(key string) string { } // newProvider makes auth for given provider -func initProvider(p Params, provider Provider) Provider { +func initProvider(p Params, provider Provider, avatarProxy *avatar.Proxy) Provider { log.Printf("[INFO] create %s auth, id=%s, redir: %s", provider.Name, p.Cid, provider.RedirectURL) conf := oauth2.Config{ @@ -66,6 +69,7 @@ func initProvider(p Params, provider Provider) Provider { provider.conf = &conf provider.Store = p.SessionStore + provider.AvatarProxy = avatarProxy return provider } @@ -161,7 +165,14 @@ func (p Provider) authHandler(w http.ResponseWriter, r *http.Request) { } log.Printf("[DEBUG] got raw user info %+v", jData) - session.Values["uinfo"] = p.MapUser(jData) + u := p.MapUser(jData) + if avatarURL, e := p.AvatarProxy.Put(u); e == nil { + u.Picture = avatarURL + } else { + log.Printf("[WARN] failed to proxy avatar, %s", e) + } + session.Values["uinfo"] = u + if err = session.Save(r, w); err != nil { common.SendErrorJSON(w, r, http.StatusInternalServerError, err, "failed to save user info") return diff --git a/app/rest/auth/middleware.go b/app/rest/auth/middleware.go index 62b8eb39..e9072e7f 100644 --- a/app/rest/auth/middleware.go +++ b/app/rest/auth/middleware.go @@ -6,9 +6,6 @@ import ( "github.com/gorilla/sessions" - "log" - - "github.com/umputun/remark/app/rest/avatar" "github.com/umputun/remark/app/rest/common" "github.com/umputun/remark/app/store" ) @@ -32,7 +29,7 @@ var devUser = store.User{ } // Auth middleware adds auth from session and populates user info -func Auth(sessionStore sessions.Store, avatarProxy avatar.Proxy, admins []string, modes []Mode) func(http.Handler) http.Handler { +func Auth(sessionStore sessions.Store, admins []string, modes []Mode) func(http.Handler) http.Handler { inModes := func(mode Mode) bool { for _, m := range modes { @@ -82,12 +79,6 @@ func Auth(sessionStore sessions.Store, avatarProxy avatar.Proxy, admins []string } } - if avatarURL, e := avatarProxy.Put(user); e == nil { - user.Picture = avatarURL - } else { - log.Printf("[WARN] failed to proxy avatar, %s", e) - } - ctx := r.Context() ctx = context.WithValue(ctx, common.ContextKey("user"), user) r = r.WithContext(ctx) diff --git a/app/rest/server.go b/app/rest/server.go index db1ac141..d4f9e876 100644 --- a/app/rest/server.go +++ b/app/rest/server.go @@ -39,7 +39,7 @@ type Server struct { Exporter migrator.Exporter Cache common.LoadingCache DevMode bool - AvatarProxy avatar.Proxy + AvatarProxy *avatar.Proxy httpServer *http.Server mod admin @@ -68,7 +68,7 @@ func (s *Server) Run(port int) { router.Use(tollbooth_chi.LimitHandler(tollbooth.NewLimiter(10, nil))) // all request by default allow anonymous access - router.Use(auth.Auth(s.SessionStore, s.AvatarProxy, s.Admins, maybeWithDevMode(auth.Anonymous))) + router.Use(auth.Auth(s.SessionStore, s.Admins, maybeWithDevMode(auth.Anonymous))) router.Use(AppInfo("remark42", s.Version), Ping, Logger(LogAll)) router.Use(context.ClearHandler) // if you aren't using gorilla/mux, you need to wrap your handlers with context.ClearHandler @@ -99,7 +99,7 @@ func (s *Server) Run(port int) { rapi.Get("/config", s.configCtrl) // protected routes, require auth - rapi.With(auth.Auth(s.SessionStore, s.AvatarProxy, s.Admins, maybeWithDevMode(auth.Full))).Group(func(rauth chi.Router) { + rapi.With(auth.Auth(s.SessionStore, s.Admins, maybeWithDevMode(auth.Full))).Group(func(rauth chi.Router) { rauth.Post("/comment", s.createCommentCtrl) rauth.Put("/comment/{id}", s.updateCommentCtrl) rauth.Get("/user", s.userInfoCtrl)