mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Batch of mirror fixes
This commit is contained in:
		| @@ -43,7 +43,7 @@ func newMartini() *martini.ClassicMartini { | |||||||
| 	m := martini.New() | 	m := martini.New() | ||||||
| 	m.Use(middleware.Logger()) | 	m.Use(middleware.Logger()) | ||||||
| 	m.Use(martini.Recovery()) | 	m.Use(martini.Recovery()) | ||||||
| 	m.Use(martini.Static("public", martini.StaticOptions{SkipLogging: !base.RouterLog})) | 	m.Use(martini.Static("public", martini.StaticOptions{SkipLogging: !base.DisableRouterLog})) | ||||||
| 	m.MapTo(r, (*martini.Routes)(nil)) | 	m.MapTo(r, (*martini.Routes)(nil)) | ||||||
| 	m.Action(r.Handle) | 	m.Action(r.Handle) | ||||||
| 	return &martini.ClassicMartini{m, r} | 	return &martini.ClassicMartini{m, r} | ||||||
|   | |||||||
| @@ -20,7 +20,7 @@ HTTP_ADDR = | |||||||
| HTTP_PORT = 3000 | HTTP_PORT = 3000 | ||||||
| ; Disable CDN even in "prod" mode | ; Disable CDN even in "prod" mode | ||||||
| OFFLINE_MODE = false | OFFLINE_MODE = false | ||||||
| ROUTER_LOG = true | DISABLE_ROUTER_LOG = false | ||||||
| ; Generate steps: | ; Generate steps: | ||||||
| ; $ cd path/to/gogs/custom/https | ; $ cd path/to/gogs/custom/https | ||||||
| ; $ go run $GOROOT/src/pkg/crypto/tls/generate_cert.go -ca=true -duration=8760h0m0s -host=myhost.example.com | ; $ go run $GOROOT/src/pkg/crypto/tls/generate_cert.go -ca=true -duration=8760h0m0s -host=myhost.example.com | ||||||
|   | |||||||
| @@ -30,6 +30,7 @@ const ( | |||||||
| 	OP_PULL_REQUEST | 	OP_PULL_REQUEST | ||||||
| 	OP_TRANSFER_REPO | 	OP_TRANSFER_REPO | ||||||
| 	OP_PUSH_TAG | 	OP_PUSH_TAG | ||||||
|  | 	OP_COMMENT_ISSUE | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // Action represents user operation type and other information to repository., | // Action represents user operation type and other information to repository., | ||||||
| @@ -37,7 +38,7 @@ const ( | |||||||
| type Action struct { | type Action struct { | ||||||
| 	Id           int64 | 	Id           int64 | ||||||
| 	UserId       int64 // Receiver user id. | 	UserId       int64 // Receiver user id. | ||||||
| 	OpType       int    // Operations: CREATE DELETE STAR ... | 	OpType       int | ||||||
| 	ActUserId    int64  // Action user id. | 	ActUserId    int64  // Action user id. | ||||||
| 	ActUserName  string // Action user name. | 	ActUserName  string // Action user name. | ||||||
| 	ActEmail     string | 	ActEmail     string | ||||||
|   | |||||||
| @@ -80,3 +80,9 @@ func DeleteOauth2ById(id int64) error { | |||||||
| 	_, err := orm.Delete(&Oauth2{Id: id}) | 	_, err := orm.Delete(&Oauth2{Id: id}) | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // CleanUnbindOauth deletes all unbind OAuthes. | ||||||
|  | func CleanUnbindOauth() error { | ||||||
|  | 	_, err := orm.Delete(&Oauth2{Uid: -1}) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
|   | |||||||
| @@ -50,7 +50,7 @@ var ( | |||||||
| 	AppLogo          string | 	AppLogo          string | ||||||
| 	AppUrl           string | 	AppUrl           string | ||||||
| 	OfflineMode      bool | 	OfflineMode      bool | ||||||
| 	RouterLog   bool | 	DisableRouterLog bool | ||||||
| 	ProdMode         bool | 	ProdMode         bool | ||||||
| 	Domain           string | 	Domain           string | ||||||
| 	SecretKey        string | 	SecretKey        string | ||||||
| @@ -330,7 +330,7 @@ func NewConfigContext() { | |||||||
| 	AppUrl = Cfg.MustValue("server", "ROOT_URL") | 	AppUrl = Cfg.MustValue("server", "ROOT_URL") | ||||||
| 	Domain = Cfg.MustValue("server", "DOMAIN") | 	Domain = Cfg.MustValue("server", "DOMAIN") | ||||||
| 	OfflineMode = Cfg.MustBool("server", "OFFLINE_MODE", false) | 	OfflineMode = Cfg.MustBool("server", "OFFLINE_MODE", false) | ||||||
| 	RouterLog = Cfg.MustBool("server", "ROUTER_LOG", true) | 	DisableRouterLog = Cfg.MustBool("server", "DISABLE_ROUTER_LOG", false) | ||||||
| 	SecretKey = Cfg.MustValue("security", "SECRET_KEY") | 	SecretKey = Cfg.MustValue("security", "SECRET_KEY") | ||||||
|  |  | ||||||
| 	InstallLock = Cfg.MustBool("security", "INSTALL_LOCK", false) | 	InstallLock = Cfg.MustBool("security", "INSTALL_LOCK", false) | ||||||
|   | |||||||
| @@ -117,6 +117,8 @@ func ActionIcon(opType int) string { | |||||||
| 		return "exclamation-circle" | 		return "exclamation-circle" | ||||||
| 	case 8: // Transfer repository. | 	case 8: // Transfer repository. | ||||||
| 		return "share" | 		return "share" | ||||||
|  | 	case 10: // Comment issue. | ||||||
|  | 		return "comment" | ||||||
| 	default: | 	default: | ||||||
| 		return "invalid type" | 		return "invalid type" | ||||||
| 	} | 	} | ||||||
| @@ -130,6 +132,8 @@ const ( | |||||||
| <div><img src="%s?s=16" alt="user-avatar"/> %s</div>` | <div><img src="%s?s=16" alt="user-avatar"/> %s</div>` | ||||||
| 	TPL_TRANSFER_REPO = `<a href="/user/%s">%s</a> transfered repository <code>%s</code> to <a href="/%s">%s</a>` | 	TPL_TRANSFER_REPO = `<a href="/user/%s">%s</a> transfered repository <code>%s</code> to <a href="/%s">%s</a>` | ||||||
| 	TPL_PUSH_TAG      = `<a href="/user/%s">%s</a> pushed tag <a href="/%s/src/%s" rel="nofollow">%s</a> at <a href="/%s">%s</a>` | 	TPL_PUSH_TAG      = `<a href="/user/%s">%s</a> pushed tag <a href="/%s/src/%s" rel="nofollow">%s</a> at <a href="/%s">%s</a>` | ||||||
|  | 	TPL_COMMENT_ISSUE = `<a href="/user/%s">%s</a> commented on issue <a href="/%s/issues/%s">%s#%s</a> | ||||||
|  | <div><img src="%s?s=16" alt="user-avatar"/> %s</div>` | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type PushCommit struct { | type PushCommit struct { | ||||||
| @@ -179,6 +183,10 @@ func ActionDesc(act Actioner) string { | |||||||
| 		return fmt.Sprintf(TPL_TRANSFER_REPO, actUserName, actUserName, repoLink, newRepoLink, newRepoLink) | 		return fmt.Sprintf(TPL_TRANSFER_REPO, actUserName, actUserName, repoLink, newRepoLink, newRepoLink) | ||||||
| 	case 9: // Push tag. | 	case 9: // Push tag. | ||||||
| 		return fmt.Sprintf(TPL_PUSH_TAG, actUserName, actUserName, repoLink, branch, branch, repoLink, repoLink) | 		return fmt.Sprintf(TPL_PUSH_TAG, actUserName, actUserName, repoLink, branch, branch, repoLink, repoLink) | ||||||
|  | 	case 10: // Comment issue. | ||||||
|  | 		infos := strings.SplitN(content, "|", 2) | ||||||
|  | 		return fmt.Sprintf(TPL_COMMENT_ISSUE, actUserName, actUserName, repoLink, infos[0], repoLink, infos[0], | ||||||
|  | 			AvatarLink(email), infos[1]) | ||||||
| 	default: | 	default: | ||||||
| 		return "invalid type" | 		return "invalid type" | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -77,7 +77,7 @@ func handleQueue() { | |||||||
| 				log.Error("hooks.handleQueue: Fail to deliver hook: %v", err) | 				log.Error("hooks.handleQueue: Fail to deliver hook: %v", err) | ||||||
| 				continue | 				continue | ||||||
| 			} | 			} | ||||||
| 			log.Info("Hook delivered") | 			log.Info("Hook delivered: %s", string(data)) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ func init() { | |||||||
|  |  | ||||||
| func Logger() martini.Handler { | func Logger() martini.Handler { | ||||||
| 	return func(res http.ResponseWriter, req *http.Request, ctx martini.Context, log *log.Logger) { | 	return func(res http.ResponseWriter, req *http.Request, ctx martini.Context, log *log.Logger) { | ||||||
| 		if !base.RouterLog { | 		if base.DisableRouterLog { | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -98,9 +98,36 @@ func updateSystemStatus() { | |||||||
| 	sysStatus.NumGC = m.NumGC | 	sysStatus.NumGC = m.NumGC | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // Operation types. | ||||||
|  | const ( | ||||||
|  | 	OT_CLEAN_OAUTH = iota + 1 | ||||||
|  | ) | ||||||
|  |  | ||||||
| func Dashboard(ctx *middleware.Context) { | func Dashboard(ctx *middleware.Context) { | ||||||
| 	ctx.Data["Title"] = "Admin Dashboard" | 	ctx.Data["Title"] = "Admin Dashboard" | ||||||
| 	ctx.Data["PageIsDashboard"] = true | 	ctx.Data["PageIsDashboard"] = true | ||||||
|  |  | ||||||
|  | 	// Run operation. | ||||||
|  | 	op, _ := base.StrTo(ctx.Query("op")).Int() | ||||||
|  | 	if op > 0 { | ||||||
|  | 		var err error | ||||||
|  | 		var success string | ||||||
|  |  | ||||||
|  | 		switch op { | ||||||
|  | 		case OT_CLEAN_OAUTH: | ||||||
|  | 			success = "All unbind OAuthes have been deleted." | ||||||
|  | 			err = models.CleanUnbindOauth() | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if err != nil { | ||||||
|  | 			ctx.Flash.Error(err.Error()) | ||||||
|  | 		} else { | ||||||
|  | 			ctx.Flash.Success(success) | ||||||
|  | 		} | ||||||
|  | 		ctx.Redirect("/admin") | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	ctx.Data["Stats"] = models.GetStatistic() | 	ctx.Data["Stats"] = models.GetStatistic() | ||||||
| 	updateSystemStatus() | 	updateSystemStatus() | ||||||
| 	ctx.Data["SysStatus"] = sysStatus | 	ctx.Data["SysStatus"] = sysStatus | ||||||
| @@ -153,7 +180,7 @@ func Config(ctx *middleware.Context) { | |||||||
| 	ctx.Data["AppUrl"] = base.AppUrl | 	ctx.Data["AppUrl"] = base.AppUrl | ||||||
| 	ctx.Data["Domain"] = base.Domain | 	ctx.Data["Domain"] = base.Domain | ||||||
| 	ctx.Data["OfflineMode"] = base.OfflineMode | 	ctx.Data["OfflineMode"] = base.OfflineMode | ||||||
| 	ctx.Data["RouterLog"] = base.RouterLog | 	ctx.Data["DisableRouterLog"] = base.DisableRouterLog | ||||||
| 	ctx.Data["RunUser"] = base.RunUser | 	ctx.Data["RunUser"] = base.RunUser | ||||||
| 	ctx.Data["RunMode"] = strings.Title(martini.Env) | 	ctx.Data["RunMode"] = strings.Title(martini.Env) | ||||||
| 	ctx.Data["RepoRootPath"] = base.RepoRootPath | 	ctx.Data["RepoRootPath"] = base.RepoRootPath | ||||||
|   | |||||||
| @@ -295,5 +295,39 @@ func Comment(ctx *middleware.Context, params martini.Params) { | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	// Notify watchers. | ||||||
|  | 	if err = models.NotifyWatchers(&models.Action{ActUserId: ctx.User.Id, ActUserName: ctx.User.Name, ActEmail: ctx.User.Email, | ||||||
|  | 		OpType: models.OP_COMMENT_ISSUE, Content: fmt.Sprintf("%d|%s", issue.Index, strings.Split(content, "\n")[0]), | ||||||
|  | 		RepoId: ctx.Repo.Repository.Id, RepoName: ctx.Repo.Repository.Name, RefName: ""}); err != nil { | ||||||
|  | 		ctx.Handle(500, "issue.CreateIssue(NotifyWatchers)", err) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Mail watchers and mentions. | ||||||
|  | 	if base.Service.NotifyMail { | ||||||
|  | 		issue.Content = content | ||||||
|  | 		tos, err := mailer.SendIssueNotifyMail(ctx.User, ctx.Repo.Owner, ctx.Repo.Repository, issue) | ||||||
|  | 		if err != nil { | ||||||
|  | 			ctx.Handle(500, "issue.Comment(SendIssueNotifyMail)", err) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		tos = append(tos, ctx.User.LowerName) | ||||||
|  | 		ms := base.MentionPattern.FindAllString(issue.Content, -1) | ||||||
|  | 		newTos := make([]string, 0, len(ms)) | ||||||
|  | 		for _, m := range ms { | ||||||
|  | 			if com.IsSliceContainsStr(tos, m[1:]) { | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			newTos = append(newTos, m[1:]) | ||||||
|  | 		} | ||||||
|  | 		if err = mailer.SendIssueMentionMail(ctx.Render, ctx.User, ctx.Repo.Owner, | ||||||
|  | 			ctx.Repo.Repository, issue, models.GetUserEmailsByNames(newTos)); err != nil { | ||||||
|  | 			ctx.Handle(500, "issue.Comment(SendIssueMentionMail)", err) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	ctx.Redirect(fmt.Sprintf("%s/issues/%d", ctx.Repo.RepoLink, index)) | 	ctx.Redirect(fmt.Sprintf("%s/issues/%d", ctx.Repo.RepoLink, index)) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -20,8 +20,8 @@ | |||||||
|                     <dd>{{.Domain}}</dd> |                     <dd>{{.Domain}}</dd> | ||||||
|                     <dt>Offline Mode</dt> |                     <dt>Offline Mode</dt> | ||||||
|                     <dd><i class="fa fa{{if .OfflineMode}}-check{{end}}-square-o"></i></dd> |                     <dd><i class="fa fa{{if .OfflineMode}}-check{{end}}-square-o"></i></dd> | ||||||
|                     <dt>Router Log</dt> |                     <dt>Disable Router Log</dt> | ||||||
|                     <dd><i class="fa fa{{if .RouterLog}}-check{{end}}-square-o"></i></dd> |                     <dd><i class="fa fa{{if .DisableRouterLog}}-check{{end}}-square-o"></i></dd> | ||||||
|                     <hr/> |                     <hr/> | ||||||
|                     <dt>Run User</dt> |                     <dt>Run User</dt> | ||||||
|                     <dd>{{.RunUser}}</dd> |                     <dd>{{.RunUser}}</dd> | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ | |||||||
| <div id="body" class="container" data-page="admin"> | <div id="body" class="container" data-page="admin"> | ||||||
|     {{template "admin/nav" .}} |     {{template "admin/nav" .}} | ||||||
|     <div id="admin-container" class="col-md-10"> |     <div id="admin-container" class="col-md-10"> | ||||||
|  |         {{template "base/alert" .}} | ||||||
|         <div class="panel panel-default"> |         <div class="panel panel-default"> | ||||||
|             <div class="panel-heading"> |             <div class="panel-heading"> | ||||||
|                 Statistic |                 Statistic | ||||||
| @@ -13,6 +14,29 @@ | |||||||
|             </div> |             </div> | ||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|  |         <div class="panel panel-default"> | ||||||
|  |             <div class="panel-heading"> | ||||||
|  |                 Operations | ||||||
|  |             </div> | ||||||
|  |  | ||||||
|  |             <div class="panel-body"> | ||||||
|  |                 <table class="table"> | ||||||
|  |                     <thead> | ||||||
|  |                         <tr> | ||||||
|  |                             <th>Name</th> | ||||||
|  |                             <th>Op.</th> | ||||||
|  |                         </tr> | ||||||
|  |                     </thead> | ||||||
|  |                     <tbody> | ||||||
|  |                         <tr> | ||||||
|  |                             <td>Clean unbind OAuthes</td> | ||||||
|  |                             <td><i class="fa fa-caret-square-o-right"></i> <a href="/admin?op=1">Run</a></td> | ||||||
|  |                         </tr> | ||||||
|  |                     </tbody> | ||||||
|  |                 </table> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|  |  | ||||||
|         <div class="panel panel-default"> |         <div class="panel panel-default"> | ||||||
|             <div class="panel-heading"> |             <div class="panel-heading"> | ||||||
|                 System Monitor Status |                 System Monitor Status | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user