mirror of https://github.com/go-gitea/gitea.git
commit
2577940c30
@ -0,0 +1,13 @@
|
||||
{
|
||||
"paths": ["."],
|
||||
"depth": 2,
|
||||
"exclude": [],
|
||||
"include": ["\\.go$"],
|
||||
"command": [
|
||||
"bash", "-c", "go build && ./gogs web"
|
||||
],
|
||||
"env": {
|
||||
"POWERED_BY": "github.com/shxsun/fswatch"
|
||||
},
|
||||
"enable-restart": true
|
||||
}
|
@ -1,28 +1,26 @@
|
||||
[target]
|
||||
path=github.com/gogits/gogs
|
||||
path = github.com/gogits/gogs
|
||||
|
||||
[deps]
|
||||
github.com/codegangsta/cli=
|
||||
github.com/go-martini/martini=
|
||||
github.com/Unknwon/com=
|
||||
github.com/Unknwon/cae=
|
||||
github.com/Unknwon/goconfig=
|
||||
github.com/dchest/scrypt=
|
||||
github.com/nfnt/resize=
|
||||
github.com/lunny/xorm=
|
||||
github.com/go-sql-driver/mysql=
|
||||
github.com/lib/pq=
|
||||
github.com/gogits/logs=
|
||||
github.com/gogits/binding=
|
||||
github.com/gogits/git=
|
||||
github.com/gogits/gfm=
|
||||
github.com/gogits/cache=
|
||||
github.com/gogits/session=
|
||||
github.com/gogits/webdav=
|
||||
github.com/martini-contrib/oauth2=
|
||||
github.com/martini-contrib/sessions=
|
||||
code.google.com/p/goauth2=
|
||||
github.com/codegangsta/cli =
|
||||
github.com/go-martini/martini =
|
||||
github.com/Unknwon/com =
|
||||
github.com/Unknwon/cae =
|
||||
github.com/Unknwon/goconfig =
|
||||
github.com/nfnt/resize =
|
||||
github.com/lunny/xorm =
|
||||
github.com/go-sql-driver/mysql =
|
||||
github.com/lib/pq =
|
||||
github.com/qiniu/log =
|
||||
code.google.com/p/goauth2 =
|
||||
github.com/gogits/logs =
|
||||
github.com/gogits/binding =
|
||||
github.com/gogits/git =
|
||||
github.com/gogits/gfm =
|
||||
github.com/gogits/cache =
|
||||
github.com/gogits/session =
|
||||
github.com/gogits/webdav =
|
||||
|
||||
[res]
|
||||
include=templates|public|conf
|
||||
include = templates|public|conf
|
||||
|
||||
|
@ -1,49 +1,122 @@
|
||||
// Copyright 2014 The Gogs Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package user
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"strconv"
|
||||
|
||||
"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"
|
||||
)
|
||||
|
||||
// github && google && ...
|
||||
func SocialSignIn(tokens oauth2.Tokens) {
|
||||
transport := &oauth.Transport{}
|
||||
transport.Token = &oauth.Token{
|
||||
AccessToken: tokens.Access(),
|
||||
RefreshToken: tokens.Refresh(),
|
||||
Expiry: tokens.ExpiryTime(),
|
||||
Extra: tokens.ExtraData(),
|
||||
}
|
||||
type SocialConnector interface {
|
||||
Identity() string
|
||||
Type() int
|
||||
Name() string
|
||||
Email() string
|
||||
Token() string
|
||||
}
|
||||
|
||||
// Github API refer: https://developer.github.com/v3/users/
|
||||
// FIXME: need to judge url
|
||||
type GithubUser struct {
|
||||
type SocialGithub struct {
|
||||
data struct {
|
||||
Id int `json:"id"`
|
||||
Name string `json:"login"`
|
||||
Email string `json:"email"`
|
||||
}
|
||||
WebToken *oauth.Token
|
||||
}
|
||||
|
||||
func (s *SocialGithub) Identity() string {
|
||||
return strconv.Itoa(s.data.Id)
|
||||
}
|
||||
|
||||
func (s *SocialGithub) Type() int {
|
||||
return models.OT_GITHUB
|
||||
}
|
||||
|
||||
func (s *SocialGithub) Name() string {
|
||||
return s.data.Name
|
||||
}
|
||||
|
||||
func (s *SocialGithub) Email() string {
|
||||
return s.data.Email
|
||||
}
|
||||
|
||||
func (s *SocialGithub) Token() string {
|
||||
data, _ := json.Marshal(s.WebToken)
|
||||
return string(data)
|
||||
}
|
||||
|
||||
// Make the request.
|
||||
// Github API refer: https://developer.github.com/v3/users/
|
||||
func (s *SocialGithub) Update() error {
|
||||
scope := "https://api.github.com/user"
|
||||
transport := &oauth.Transport{
|
||||
Token: s.WebToken,
|
||||
}
|
||||
log.Debug("update github info")
|
||||
r, err := transport.Client().Get(scope)
|
||||
if err != nil {
|
||||
log.Error("connect with github error: %s", err)
|
||||
// FIXME: handle error page
|
||||
return
|
||||
return err
|
||||
}
|
||||
defer r.Body.Close()
|
||||
return json.NewDecoder(r.Body).Decode(&s.data)
|
||||
}
|
||||
|
||||
user := &GithubUser{}
|
||||
err = json.NewDecoder(r.Body).Decode(user)
|
||||
if err != nil {
|
||||
log.Error("Get: %s", err)
|
||||
// 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(),
|
||||
},
|
||||
}
|
||||
log.Info("login: %s", user.Name)
|
||||
if len(tokens.Access()) == 0 {
|
||||
log.Error("empty access")
|
||||
return
|
||||
}
|
||||
var err error
|
||||
var u *models.User
|
||||
if err = gh.Update(); err != nil {
|
||||
// FIXME: handle error page
|
||||
log.Error("connect with github error: %s", err)
|
||||
return
|
||||
}
|
||||
var soc SocialConnector = gh
|
||||
log.Info("login: %s", soc.Name())
|
||||
// FIXME: login here, user email to check auth, if not registe, then generate a uniq username
|
||||
if u, err = models.GetOauth2User(soc.Identity()); err != nil {
|
||||
u = &models.User{
|
||||
Name: soc.Name(),
|
||||
Email: soc.Email(),
|
||||
Passwd: "123456",
|
||||
IsActive: !base.Service.RegisterEmailConfirm,
|
||||
}
|
||||
if u, err = models.RegisterUser(u); err != nil {
|
||||
log.Error("register user: %v", err)
|
||||
return
|
||||
}
|
||||
oa := &models.Oauth2{}
|
||||
oa.Uid = u.Id
|
||||
oa.Type = soc.Type()
|
||||
oa.Token = soc.Token()
|
||||
oa.Identity = soc.Identity()
|
||||
log.Info("oa: %v", oa)
|
||||
if err = models.AddOauth2(oa); err != nil {
|
||||
log.Error("add oauth2 %v", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
ctx.Session.Set("userId", u.Id)
|
||||
ctx.Session.Set("userName", u.Name)
|
||||
ctx.Redirect("/")
|
||||
}
|
||||
|
@ -1,6 +1,15 @@
|
||||
#!/bin/bash -
|
||||
#!/bin/sh -
|
||||
# Copyright 2014 The Gogs Authors. All rights reserved.
|
||||
# Use of this source code is governed by a MIT-style
|
||||
# license that can be found in the LICENSE file.
|
||||
#
|
||||
# start gogs web
|
||||
#
|
||||
cd "$(dirname $0)"
|
||||
./gogs web
|
||||
IFS='
|
||||
'
|
||||
PATH=/bin:/usr/bin:/usr/local/bin
|
||||
HOME=${HOME:?"need \$HOME variable"}
|
||||
USER=$(whoami)
|
||||
export USER HOME PATH
|
||||
|
||||
cd "$(dirname $0)" && exec ./gogs web
|
||||
|
@ -0,0 +1,33 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>{{.User.Name}}, please reset your password</title>
|
||||
</head>
|
||||
<body style="background:#eee;">
|
||||
<div style="color:#333; font:12px/1.5 Tahoma,Arial,sans-serif;; text-shadow:1px 1px #fff; padding:0; margin:0;">
|
||||
<div style="width:600px;margin:0 auto; padding:40px 0 20px;">
|
||||
<div style="border:1px solid #d9d9d9;border-radius:3px; background:#fff; box-shadow: 0px 2px 5px rgba(0, 0, 0,.05); -webkit-box-shadow: 0px 2px 5px rgba(0, 0, 0,.05);">
|
||||
<div style="padding: 20px 15px;">
|
||||
<h1 style="font-size:20px; padding:10px 0 20px; margin:0; border-bottom:1px solid #ddd;"><img src="{{.AppUrl}}/{{.AppLogo}}" style="height: 32px; margin-bottom: -10px;"> <a style="color:#333;text-decoration:none;" target="_blank" href="{{.AppUrl}}">{{.AppName}}</a></h1>
|
||||
<div style="padding:40px 15px;">
|
||||
<div style="font-size:16px; padding-bottom:30px; font-weight:bold;">
|
||||
Hi <span style="color: #00BFFF;">{{.User.Name}}</span>,
|
||||
</div>
|
||||
<div style="font-size:14px; padding:0 15px;">
|
||||
<p style="margin:0;padding:0 0 9px 0;">Please click following link to reset your password within <b>{{.ActiveCodeLives}} hours</b>.</p>
|
||||
<p style="margin:0;padding:0 0 9px 0;">
|
||||
<a href="{{.AppUrl}}user/reset_password?code={{.Code}}">{{.AppUrl}}user/reset_password?code={{.Code}}</a>
|
||||
</p>
|
||||
<p style="margin:0;padding:0 0 9px 0;">Copy and paste it to your browser if the link is not working.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="color:#aaa;padding:10px;text-align:center;">
|
||||
© 2014 <a style="color:#888;text-decoration:none;" target="_blank" href="http://gogits.org">Gogs: Go Git Service</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -1,25 +0,0 @@
|
||||
{{template "mail/base.html" .}}
|
||||
{{define "title"}}
|
||||
{{if eq .Lang "zh-CN"}}
|
||||
{{.User.NickName}},重置账户密码
|
||||
{{end}}
|
||||
{{if eq .Lang "en-US"}}
|
||||
{{.User.NickName}}, reset your password
|
||||
{{end}}
|
||||
{{end}}
|
||||
{{define "body"}}
|
||||
{{if eq .Lang "zh-CN"}}
|
||||
<p style="margin:0;padding:0 0 9px 0;">点击链接重置密码,{{.ResetPwdCodeLives}} 分钟内有效</p>
|
||||
<p style="margin:0;padding:0 0 9px 0;">
|
||||
<a href="{{.AppUrl}}reset/{{.Code}}">{{.AppUrl}}reset/{{.Code}}</a>
|
||||
</p>
|
||||
<p style="margin:0;padding:0 0 9px 0;">如果链接点击无反应,请复制到浏览器打开。</p>
|
||||
{{end}}
|
||||
{{if eq .Lang "en-US"}}
|
||||
<p style="margin:0;padding:0 0 9px 0;">Please click following link to reset your password in {{.ResetPwdCodeLives}} hours</p>
|
||||
<p style="margin:0;padding:0 0 9px 0;">
|
||||
<a href="{{.AppUrl}}reset/{{.Code}}">{{.AppUrl}}reset/{{.Code}}</a>
|
||||
</p>
|
||||
<p style="margin:0;padding:0 0 9px 0;">Copy and paste it to your browser if it's not working.</p>
|
||||
{{end}}
|
||||
{{end}}
|
@ -0,0 +1,6 @@
|
||||
{{template "base/head" .}}
|
||||
{{template "base/navbar" .}}
|
||||
<div class="container">
|
||||
401 Unauthorized
|
||||
</div>
|
||||
{{template "base/footer" .}}
|
@ -0,0 +1,30 @@
|
||||
{{template "base/head" .}}
|
||||
{{template "base/navbar" .}}
|
||||
<div id="body" class="container">
|
||||
<form action="/user/forget_password" method="post" class="form-horizontal card" id="login-card">
|
||||
{{.CsrfTokenHtml}}
|
||||
<h3>Reset Your Password</h3>
|
||||
<div class="alert alert-danger form-error{{if .HasError}}{{else}} hidden{{end}}">{{.ErrorMsg}}</div>
|
||||
{{if .IsResetSent}}
|
||||
<p>A confirmation e-mail has been sent to <b>{{.Email}}</b>, please check your inbox within {{.Hours}} hours.</p>
|
||||
<hr/>
|
||||
<a href="http://{{Mail2Domain .Email}}" class="btn btn-lg btn-success">Sign in to your e-mail</a>
|
||||
{{else if .IsResetRequest}}
|
||||
<div class="form-group {{if .Err_Email}}has-error has-feedback{{end}}">
|
||||
<label class="col-md-3 control-label">Email: </label>
|
||||
<div class="col-md-7">
|
||||
<input name="email" class="form-control" placeholder="Type your e-mail address" required="required">
|
||||
</div>
|
||||
</div>
|
||||
<hr/>
|
||||
<div class="form-group">
|
||||
<div class="col-md-offset-4 col-md-6">
|
||||
<button type="submit" class="btn btn-lg btn-primary">Click here to send reset confirmation e-mail</button>
|
||||
</div>
|
||||
</div>
|
||||
{{else if .IsResetDisable}}
|
||||
<p>Sorry, mail service is not enabled.</p>
|
||||
{{end}}
|
||||
</form>
|
||||
</div>
|
||||
{{template "base/footer" .}}
|
@ -0,0 +1,26 @@
|
||||
{{template "base/head" .}}
|
||||
{{template "base/navbar" .}}
|
||||
<div id="body" class="container">
|
||||
<form action="/user/reset_password?code={{.Code}}" method="post" class="form-horizontal card" id="login-card">
|
||||
{{.CsrfTokenHtml}}
|
||||
<h3>Reset Your Pasword</h3>
|
||||
<div class="alert alert-danger form-error{{if .HasError}}{{else}} hidden{{end}}">{{.ErrorMsg}}</div>
|
||||
{{if .IsResetForm}}
|
||||
<div class="form-group">
|
||||
<label class="col-md-4 control-label">Password: </label>
|
||||
<div class="col-md-6">
|
||||
<input name="passwd" type="password" class="form-control" placeholder="Type your password" required="required">
|
||||
</div>
|
||||
</div>
|
||||
<hr/>
|
||||
<div class="form-group">
|
||||
<div class="col-md-offset-4 col-md-6">
|
||||
<button type="submit" class="btn btn-lg btn-primary">Click here to reset your password</button>
|
||||
</div>
|
||||
</div>
|
||||
{{else}}
|
||||
<p>Sorry, your confirmation code has been exipired or not valid.</p>
|
||||
{{end}}
|
||||
</form>
|
||||
</div>
|
||||
{{template "base/footer" .}}
|
Loading…
Reference in New Issue