diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/oauth2/google.go | 6 | ||||
-rw-r--r-- | server/oauth2/provider.go | 1 | ||||
-rw-r--r-- | server/routes.go | 1 | ||||
-rw-r--r-- | server/static/bin.go | 2 | ||||
-rw-r--r-- | server/static/css.go | 2 | ||||
-rw-r--r-- | server/static/js.go | 2 | ||||
-rw-r--r-- | server/template/common.go | 2 | ||||
-rw-r--r-- | server/template/html/settings.html | 10 | ||||
-rw-r--r-- | server/template/template.go | 7 | ||||
-rw-r--r-- | server/template/views.go | 14 | ||||
-rw-r--r-- | server/ui/controller/oauth2.go | 42 |
11 files changed, 82 insertions, 7 deletions
diff --git a/server/oauth2/google.go b/server/oauth2/google.go index 5c63c75..e57e027 100644 --- a/server/oauth2/google.go +++ b/server/oauth2/google.go @@ -23,6 +23,10 @@ type googleProvider struct { redirectURL string } +func (g googleProvider) GetUserExtraKey() string { + return "google_id" +} + func (g googleProvider) GetRedirectURL(state string) string { return g.config().AuthCodeURL(state) } @@ -48,7 +52,7 @@ func (g googleProvider) GetProfile(code string) (*Profile, error) { return nil, fmt.Errorf("unable to unserialize google profile: %v", err) } - profile := &Profile{Key: "google_id", ID: user.Sub, Username: user.Email} + profile := &Profile{Key: g.GetUserExtraKey(), ID: user.Sub, Username: user.Email} return profile, nil } diff --git a/server/oauth2/provider.go b/server/oauth2/provider.go index 27ab22a..c43931c 100644 --- a/server/oauth2/provider.go +++ b/server/oauth2/provider.go @@ -6,6 +6,7 @@ package oauth2 // Provider is an interface for OAuth2 providers. type Provider interface { + GetUserExtraKey() string GetRedirectURL(state string) string GetProfile(code string) (*Profile, error) } diff --git a/server/routes.go b/server/routes.go index 7c227eb..b6bcbc2 100644 --- a/server/routes.go +++ b/server/routes.go @@ -124,6 +124,7 @@ func getRoutes(cfg *config.Config, store *storage.Storage, feedHandler *feed.Han router.Handle("/import", uiHandler.Use(uiController.Import)).Name("import").Methods("GET") router.Handle("/upload", uiHandler.Use(uiController.UploadOPML)).Name("uploadOPML").Methods("POST") + router.Handle("/oauth2/{provider}/unlink", uiHandler.Use(uiController.OAuth2Unlink)).Name("oauth2Unlink").Methods("GET") router.Handle("/oauth2/{provider}/redirect", uiHandler.Use(uiController.OAuth2Redirect)).Name("oauth2Redirect").Methods("GET") router.Handle("/oauth2/{provider}/callback", uiHandler.Use(uiController.OAuth2Callback)).Name("oauth2Callback").Methods("GET") diff --git a/server/static/bin.go b/server/static/bin.go index f06a8d9..8769862 100644 --- a/server/static/bin.go +++ b/server/static/bin.go @@ -1,5 +1,5 @@ // Code generated by go generate; DO NOT EDIT. -// 2017-11-22 22:11:44.595540312 -0800 PST m=+0.009225645 +// 2017-11-24 16:04:49.314940117 -0800 PST m=+0.003107235 package static diff --git a/server/static/css.go b/server/static/css.go index 17ddc99..096fc5c 100644 --- a/server/static/css.go +++ b/server/static/css.go @@ -1,5 +1,5 @@ // Code generated by go generate; DO NOT EDIT. -// 2017-11-22 22:11:44.596955262 -0800 PST m=+0.010640595 +// 2017-11-24 16:04:49.315340301 -0800 PST m=+0.003507419 package static diff --git a/server/static/js.go b/server/static/js.go index f302bb9..28eed6a 100644 --- a/server/static/js.go +++ b/server/static/js.go @@ -1,5 +1,5 @@ // Code generated by go generate; DO NOT EDIT. -// 2017-11-22 22:11:44.598697812 -0800 PST m=+0.012383145 +// 2017-11-24 16:04:49.316027642 -0800 PST m=+0.004194760 package static diff --git a/server/template/common.go b/server/template/common.go index e65d611..40fb76a 100644 --- a/server/template/common.go +++ b/server/template/common.go @@ -1,5 +1,5 @@ // Code generated by go generate; DO NOT EDIT. -// 2017-11-22 22:11:44.609659332 -0800 PST m=+0.023344665 +// 2017-11-24 16:04:49.318279667 -0800 PST m=+0.006446785 package template diff --git a/server/template/html/settings.html b/server/template/html/settings.html index dcad092..23a5f42 100644 --- a/server/template/html/settings.html +++ b/server/template/html/settings.html @@ -63,4 +63,14 @@ </div> </form> +{{ if hasOAuth2Provider "google" }} +<div class="panel"> + {{ if hasKey .user.Extra "google_id" }} + <a href="{{ route "oauth2Unlink" "provider" "google" }}">{{ t "Unlink my Google account" }}</a> + {{ else }} + <a href="{{ route "oauth2Redirect" "provider" "google" }}">{{ t "Link my Google account" }}</a> + {{ end }} +</div> +{{ end }} + {{ end }} diff --git a/server/template/template.go b/server/template/template.go index 5ef68d6..627fd9f 100644 --- a/server/template/template.go +++ b/server/template/template.go @@ -40,6 +40,13 @@ func (e *Engine) parseAll() { "hasOAuth2Provider": func(provider string) bool { return e.cfg.Get("OAUTH2_PROVIDER", "") == provider }, + "hasKey": func(dict map[string]string, key string) bool { + log.Println(dict) + if value, found := dict[key]; found { + return value != "" + } + return false + }, "route": func(name string, args ...interface{}) string { return route.GetRoute(e.router, name, args...) }, diff --git a/server/template/views.go b/server/template/views.go index 4412149..d82ab0a 100644 --- a/server/template/views.go +++ b/server/template/views.go @@ -1,5 +1,5 @@ // Code generated by go generate; DO NOT EDIT. -// 2017-11-22 22:11:44.601583424 -0800 PST m=+0.015268757 +// 2017-11-24 16:04:49.316644027 -0800 PST m=+0.004811145 package template @@ -921,6 +921,16 @@ var templateViewsMap = map[string]string{ </div> </form> +{{ if hasOAuth2Provider "google" }} +<div class="panel"> + {{ if hasKey .user.Extra "google_id" }} + <a href="{{ route "oauth2Unlink" "provider" "google" }}">{{ t "Unlink my Google account" }}</a> + {{ else }} + <a href="{{ route "oauth2Redirect" "provider" "google" }}">{{ t "Link my Google account" }}</a> + {{ end }} +</div> +{{ end }} + {{ end }} `, "unread": `{{ define "title"}}{{ t "Unread Items" }} {{ if gt .countUnread 0 }}({{ .countUnread }}){{ end }} {{ end }} @@ -1052,7 +1062,7 @@ var templateViewsMapChecksums = map[string]string{ "integrations": "c485d6d9ed996635e55e73320610e6bcb01a41c1153e8e739ae2294b0b14b243", "login": "04f3ce79bfa5753f69e0d956c2a8999c0da549c7925634a3e8134975da0b0e0f", "sessions": "878dbe8f8ea783b44130c495814179519fa5c3aa2666ac87508f94d58dd008bf", - "settings": "a972fb5767fd32522648149880e40607ed8bbed7a389038bbab6b08539ac2893", + "settings": "1e2df11f5436eb2d05ae1fae30dd6f1362613011edbfcc79ae8b23854fa348b4", "unread": "b6f9be1a72188947c75a6fdcac6ff7878db7745f9efa46318e0433102892a722", "users": "44677e28bb5347799ed0020c90ec785aadec4b1454446d92411cfdaf6e32110b", } diff --git a/server/ui/controller/oauth2.go b/server/ui/controller/oauth2.go index c43d707..c80ec71 100644 --- a/server/ui/controller/oauth2.go +++ b/server/ui/controller/oauth2.go @@ -71,6 +71,17 @@ func (c *Controller) OAuth2Callback(ctx *core.Context, request *core.Request, re return } + if ctx.IsAuthenticated() { + user := ctx.LoggedUser() + if err := c.store.UpdateExtraField(user.ID, profile.Key, profile.ID); err != nil { + response.HTML().ServerError(err) + return + } + + response.Redirect(ctx.Route("settings")) + return + } + user, err := c.store.GetUserByExtraField(profile.Key, profile.ID) if err != nil { response.HTML().ServerError(err) @@ -78,6 +89,11 @@ func (c *Controller) OAuth2Callback(ctx *core.Context, request *core.Request, re } if user == nil { + if c.cfg.GetInt("OAUTH2_USER_CREATION", 0) == 0 { + response.HTML().Forbidden() + return + } + user = model.NewUser() user.Username = profile.Username user.IsAdmin = false @@ -114,6 +130,32 @@ func (c *Controller) OAuth2Callback(ctx *core.Context, request *core.Request, re response.Redirect(ctx.Route("unread")) } +// OAuth2Unlink unlink an account from the external provider. +func (c *Controller) OAuth2Unlink(ctx *core.Context, request *core.Request, response *core.Response) { + provider := request.StringParam("provider", "") + if provider == "" { + log.Println("[OAuth2] Invalid or missing provider") + response.Redirect(ctx.Route("login")) + return + } + + authProvider, err := getOAuth2Manager(c.cfg).Provider(provider) + if err != nil { + log.Println("[OAuth2]", err) + response.Redirect(ctx.Route("settings")) + return + } + + user := ctx.LoggedUser() + if err := c.store.RemoveExtraField(user.ID, authProvider.GetUserExtraKey()); err != nil { + response.HTML().ServerError(err) + return + } + + response.Redirect(ctx.Route("settings")) + return +} + func getOAuth2Manager(cfg *config.Config) *oauth2.Manager { return oauth2.NewManager( cfg.Get("OAUTH2_CLIENT_ID", ""), |