|
@@ -6,11 +6,15 @@ package user
|
|
|
|
|
|
import (
|
|
|
"encoding/json"
|
|
|
+ "net/http"
|
|
|
+ "net/url"
|
|
|
"strconv"
|
|
|
+ "strings"
|
|
|
|
|
|
"code.google.com/p/goauth2/oauth"
|
|
|
|
|
|
"github.com/gogits/gogs/models"
|
|
|
+ "github.com/gogits/gogs/modules/base"
|
|
|
"github.com/gogits/gogs/modules/log"
|
|
|
"github.com/gogits/gogs/modules/middleware"
|
|
|
"github.com/gogits/gogs/modules/oauth2"
|
|
@@ -69,23 +73,59 @@ func (s *SocialGithub) Update() error {
|
|
|
return json.NewDecoder(r.Body).Decode(&s.data)
|
|
|
}
|
|
|
|
|
|
+func extractPath(next string) string {
|
|
|
+ n, err := url.Parse(next)
|
|
|
+ if err != nil {
|
|
|
+ return "/"
|
|
|
+ }
|
|
|
+ return n.Path
|
|
|
+}
|
|
|
+
|
|
|
// github && google && ...
|
|
|
func SocialSignIn(ctx *middleware.Context, tokens oauth2.Tokens) {
|
|
|
- gh := &SocialGithub{
|
|
|
- WebToken: &oauth.Token{
|
|
|
- AccessToken: tokens.Access(),
|
|
|
- RefreshToken: tokens.Refresh(),
|
|
|
- Expiry: tokens.ExpiryTime(),
|
|
|
- Extra: tokens.ExtraData(),
|
|
|
- },
|
|
|
+ var socid int64
|
|
|
+ var ok bool
|
|
|
+ next := extractPath(ctx.Query("next"))
|
|
|
+ log.Debug("social signed check %s", next)
|
|
|
+ if socid, ok = ctx.Session.Get("socialId").(int64); ok && socid != 0 {
|
|
|
+ // already login
|
|
|
+ ctx.Redirect(next)
|
|
|
+ log.Info("login soc id: %v", socid)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ config := &oauth.Config{
|
|
|
+ //ClientId: base.OauthService.Github.ClientId,
|
|
|
+ //ClientSecret: base.OauthService.Github.ClientSecret, // FIXME: I don't know why compile error here
|
|
|
+ ClientId: "09383403ff2dc16daaa1",
|
|
|
+ ClientSecret: "0e4aa0c3630df396cdcea01a9d45cacf79925fea",
|
|
|
+ RedirectURL: strings.TrimSuffix(base.AppUrl, "/") + ctx.Req.URL.RequestURI(),
|
|
|
+ Scope: base.OauthService.GitHub.Scopes,
|
|
|
+ AuthURL: "https://github.com/login/oauth/authorize",
|
|
|
+ TokenURL: "https://github.com/login/oauth/access_token",
|
|
|
}
|
|
|
- if len(tokens.Access()) == 0 {
|
|
|
- log.Error("empty access")
|
|
|
+ transport := &oauth.Transport{
|
|
|
+ Config: config,
|
|
|
+ Transport: http.DefaultTransport,
|
|
|
+ }
|
|
|
+ code := ctx.Query("code")
|
|
|
+ if code == "" {
|
|
|
+ // redirect to social login page
|
|
|
+ ctx.Redirect(config.AuthCodeURL(next))
|
|
|
return
|
|
|
}
|
|
|
- var err error
|
|
|
+
|
|
|
+ // handle call back
|
|
|
+ tk, err := transport.Exchange(code)
|
|
|
+ if err != nil {
|
|
|
+ log.Error("oauth2 handle callback error: %v", err)
|
|
|
+ return // FIXME, need error page 501
|
|
|
+ }
|
|
|
+ next = extractPath(ctx.Query("state"))
|
|
|
+ log.Debug("success token: %v", tk)
|
|
|
+
|
|
|
+ gh := &SocialGithub{WebToken: tk}
|
|
|
if err = gh.Update(); err != nil {
|
|
|
- // FIXME: handle error page
|
|
|
+ // FIXME: handle error page 501
|
|
|
log.Error("connect with github error: %s", err)
|
|
|
return
|
|
|
}
|
|
@@ -102,18 +142,18 @@ func SocialSignIn(ctx *middleware.Context, tokens oauth2.Tokens) {
|
|
|
oa.Type = soc.Type()
|
|
|
oa.Token = soc.Token()
|
|
|
oa.Identity = soc.Identity()
|
|
|
- log.Info("oa: %v", oa)
|
|
|
+ log.Debug("oa: %v", oa)
|
|
|
if err = models.AddOauth2(oa); err != nil {
|
|
|
- log.Error("add oauth2 %v", err)
|
|
|
+ log.Error("add oauth2 %v", err) // 501
|
|
|
return
|
|
|
}
|
|
|
case models.ErrOauth2NotAssociatedWithUser:
|
|
|
- // pass
|
|
|
+ // ignore it. judge in /usr/login page
|
|
|
default:
|
|
|
log.Error(err.Error()) // FIXME: handle error page
|
|
|
return
|
|
|
}
|
|
|
ctx.Session.Set("socialId", oa.Id)
|
|
|
- log.Info("socialId: %v", oa.Id)
|
|
|
- ctx.Redirect("/")
|
|
|
+ log.Debug("socialId: %v", oa.Id)
|
|
|
+ ctx.Redirect(next)
|
|
|
}
|