*.db
*.log
custom/
-.vendor/
\ No newline at end of file
+.vendor/
+.idea/
+*.iml
\ No newline at end of file
; For "postgres" only, either "disable", "require" or "verify-full"
SSL_MODE = disable
+[admin]
+; Administor's name, which should be same as the user name you want to authorize
+NAME = admin
+
[security]
; !!CHANGE THIS TO KEEP YOUR USER DATA SAFE!!
SECRET_KEY = !#@FDEWREWR&*(
Location string
Website string
IsActive bool
+ IsAdmin bool
Rands string `xorm:"VARCHAR(10)"`
Created time.Time `xorm:"created"`
Updated time.Time `xorm:"updated"`
AppUrl string
Domain string
SecretKey string
+ AdminName string
Cfg *goconfig.ConfigFile
MailService *Mailer
)
AppUrl = Cfg.MustValue("server", "ROOT_URL")
Domain = Cfg.MustValue("server", "DOMAIN")
SecretKey = Cfg.MustValue("security", "SECRET_KEY")
+ AdminName = strings.ToLower(Cfg.MustValue("admin", "NAME"))
}
func NewServices() {
return
} else if !ctx.User.IsActive && base.Service.RegisterEmailConfirm {
ctx.Data["Title"] = "Activate Your Account"
- ctx.Render.HTML(200, "user/active", ctx.Data)
+ ctx.HTML(200, "user/active")
return
}
}
return func(ctx *Context) {
if ctx.IsSigned {
ctx.Redirect("/")
+ return
+ }
+ }
+}
+
+// AdminRequire requires user signed in as administor.
+func AdminRequire() martini.Handler {
+ return func(ctx *Context) {
+ if ctx.User.LowerName != base.AdminName && !ctx.User.IsAdmin {
+ ctx.Error(403)
+ return
}
+ ctx.Data["PageIsAdmin"] = true
}
}
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/auth"
+ "github.com/gogits/gogs/modules/base"
"github.com/gogits/gogs/modules/log"
)
return hasErr.(bool)
}
+// HTML calls render.HTML underlying but reduce one argument.
+func (ctx *Context) HTML(status int, name string, htmlOpt ...HTMLOptions) {
+ ctx.Render.HTML(status, name, ctx.Data, htmlOpt...)
+}
+
// RenderWithErr used for page has form validation but need to prompt error to users.
func (ctx *Context) RenderWithErr(msg, tpl string, form auth.Form) {
ctx.Data["HasError"] = true
ctx.Data["ErrorMsg"] = msg
auth.AssignForm(form, ctx.Data)
- ctx.HTML(200, tpl, ctx.Data)
+ ctx.HTML(200, tpl)
}
// Handle handles and logs error by given status.
func (ctx *Context) Handle(status int, title string, err error) {
log.Error("%s: %v", title, err)
if martini.Dev == martini.Prod {
- ctx.HTML(500, "status/500", ctx.Data)
+ ctx.HTML(500, "status/500")
return
}
ctx.Data["ErrorMsg"] = err
- ctx.HTML(status, fmt.Sprintf("status/%d", status), ctx.Data)
+ ctx.HTML(status, fmt.Sprintf("status/%d", status))
}
// InitContext initializes a classic context for a request.
ctx.Data["SignedUser"] = user
ctx.Data["SignedUserId"] = user.Id
ctx.Data["SignedUserName"] = user.LowerName
+
+ if ctx.User.IsAdmin || ctx.User.LowerName == base.AdminName {
+ ctx.Data["IsAdmin"] = true
+ }
}
ctx.Data["PageStartTime"] = time.Now()
--- /dev/null
+// 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 admin
+
+import (
+ "github.com/gogits/gogs/modules/middleware"
+)
+
+func Dashboard(ctx *middleware.Context) {
+ ctx.Data["Title"] = "Admin Dashboard"
+ ctx.HTML(200, "admin/dashboard")
+}
+
+func Users(ctx *middleware.Context) {
+ ctx.Data["Title"] = "User Management"
+ ctx.HTML(200, "admin/users")
+}
+
+func Repositories(ctx *middleware.Context) {
+ ctx.Data["Title"] = "Repository Management"
+ ctx.HTML(200, "admin/repos")
+}
return
}
ctx.Data["PageIsHome"] = true
- ctx.HTML(200, "home", ctx.Data)
+ ctx.HTML(200, "home")
}
func Help(ctx *middleware.Context) {
ctx.Data["PageIsHelp"] = true
- ctx.HTML(200, "help", ctx.Data)
+ ctx.HTML(200, "help")
}
ctx.Data["Code"] = "2014031910370000009fff6782aadb2162b4a997acb69d4400888e0b9274657374"
ctx.Data["ActiveCodeLives"] = base.Service.ActiveCodeLives / 60
ctx.Data["ResetPwdCodeLives"] = base.Service.ResetPwdCodeLives / 60
- ctx.HTML(200, params["_1"], ctx.Data)
+ ctx.HTML(200, params["_1"])
}
ctx.Data["Licenses"] = models.Licenses
if ctx.Req.Method == "GET" {
- ctx.HTML(200, "repo/create", ctx.Data)
+ ctx.HTML(200, "repo/create")
return
}
case "delete":
if len(ctx.Repo.Repository.Name) == 0 || ctx.Repo.Repository.Name != ctx.Query("repository") {
ctx.Data["ErrorMsg"] = "Please make sure you entered repository name is correct."
- ctx.HTML(200, "repo/setting", ctx.Data)
+ ctx.HTML(200, "repo/setting")
return
}
ctx.Data["Branches"] = brs
ctx.Data["IsRepoToolbarBranches"] = true
- ctx.HTML(200, "repo/branches", ctx.Data)
+ ctx.HTML(200, "repo/branches")
}
func Single(ctx *middleware.Context, params martini.Params) {
return
} else if len(brs) == 0 {
ctx.Data["IsBareRepo"] = true
- ctx.HTML(200, "repo/single", ctx.Data)
+ ctx.HTML(200, "repo/single")
return
}
ctx.Data["Treenames"] = treenames
ctx.Data["IsRepoToolbarSource"] = true
ctx.Data["BranchLink"] = branchLink
- ctx.HTML(200, "repo/single", ctx.Data)
+ ctx.HTML(200, "repo/single")
}
func Setting(ctx *middleware.Context, params martini.Params) {
return
} else if len(brs) == 0 {
ctx.Data["IsBareRepo"] = true
- ctx.HTML(200, "repo/setting", ctx.Data)
+ ctx.HTML(200, "repo/setting")
return
}
ctx.Data["Title"] = title + " - settings"
ctx.Data["IsRepoToolbarSetting"] = true
- ctx.HTML(200, "repo/setting", ctx.Data)
+ ctx.HTML(200, "repo/setting")
}
func Commits(ctx *middleware.Context, params martini.Params) {
ctx.Data["Reponame"] = params["reponame"]
ctx.Data["CommitCount"] = commits.Len()
ctx.Data["Commits"] = commits
- ctx.HTML(200, "repo/commits", ctx.Data)
+ ctx.HTML(200, "repo/commits")
}
func Issues(ctx *middleware.Context) {
ctx.Data["IsRepoToolbarIssues"] = true
- ctx.HTML(200, "repo/issues", ctx.Data)
+ ctx.HTML(200, "repo/issues")
}
func Pulls(ctx *middleware.Context) {
ctx.Data["IsRepoToolbarPulls"] = true
- ctx.HTML(200, "repo/pulls", ctx.Data)
+ ctx.HTML(200, "repo/pulls")
}
func Action(ctx *middleware.Context, params martini.Params) {
ctx.Data["Owner"] = user
if ctx.Req.Method == "GET" {
- ctx.HTML(200, "user/setting", ctx.Data)
+ ctx.HTML(200, "user/setting")
return
}
// below is for POST requests
if hasErr, ok := ctx.Data["HasError"]; ok && hasErr.(bool) {
- ctx.HTML(200, "user/setting", ctx.Data)
+ ctx.HTML(200, "user/setting")
return
}
}
ctx.Data["IsSuccess"] = true
- ctx.HTML(200, "user/setting", ctx.Data)
+ ctx.HTML(200, "user/setting")
log.Trace("%s User setting updated: %s", ctx.Req.RequestURI, ctx.User.LowerName)
}
ctx.Data["IsUserPageSettingPasswd"] = true
if ctx.Req.Method == "GET" {
- ctx.HTML(200, "user/password", ctx.Data)
+ ctx.HTML(200, "user/password")
return
}
}
ctx.Data["Owner"] = user
- ctx.HTML(200, "user/password", ctx.Data)
+ ctx.HTML(200, "user/password")
log.Trace("%s User password updated: %s", ctx.Req.RequestURI, ctx.User.LowerName)
}
// Add new SSH key.
if ctx.Req.Method == "POST" {
if hasErr, ok := ctx.Data["HasError"]; ok && hasErr.(bool) {
- ctx.HTML(200, "user/publickey", ctx.Data)
+ ctx.HTML(200, "user/publickey")
return
}
ctx.Data["PageIsUserSetting"] = true
ctx.Data["IsUserPageSettingSSH"] = true
ctx.Data["Keys"] = keys
- ctx.HTML(200, "user/publickey", ctx.Data)
+ ctx.HTML(200, "user/publickey")
}
func SettingNotification(ctx *middleware.Context) {
ctx.Data["Title"] = "Notification"
ctx.Data["PageIsUserSetting"] = true
ctx.Data["IsUserPageSettingNotify"] = true
- ctx.HTML(200, "user/notification", ctx.Data)
+ ctx.HTML(200, "user/notification")
}
func SettingSecurity(ctx *middleware.Context) {
ctx.Data["Title"] = "Security"
ctx.Data["PageIsUserSetting"] = true
ctx.Data["IsUserPageSettingSecurity"] = true
- ctx.HTML(200, "user/security", ctx.Data)
+ ctx.HTML(200, "user/security")
}
return
}
ctx.Data["Feeds"] = feeds
- ctx.HTML(200, "user/dashboard", ctx.Data)
+ ctx.HTML(200, "user/dashboard")
}
func Profile(ctx *middleware.Context, params martini.Params) {
}
ctx.Data["PageIsUserProfile"] = true
- ctx.HTML(200, "user/profile", ctx.Data)
+ ctx.HTML(200, "user/profile")
}
func SignIn(ctx *middleware.Context, form auth.LogInForm) {
ctx.Data["Title"] = "Log In"
if ctx.Req.Method == "GET" {
- ctx.HTML(200, "user/signin", ctx.Data)
+ ctx.HTML(200, "user/signin")
return
}
if hasErr, ok := ctx.Data["HasError"]; ok && hasErr.(bool) {
- ctx.HTML(200, "user/signin", ctx.Data)
+ ctx.HTML(200, "user/signin")
return
}
ctx.Data["PageIsSignUp"] = true
if ctx.Req.Method == "GET" {
- ctx.HTML(200, "user/signup", ctx.Data)
+ ctx.HTML(200, "user/signup")
return
}
}
if ctx.HasError() {
- ctx.HTML(200, "user/signup", ctx.Data)
+ ctx.HTML(200, "user/signup")
return
}
ctx.Data["IsSendRegisterMail"] = true
ctx.Data["Email"] = u.Email
ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60
- ctx.Render.HTML(200, "user/active", ctx.Data)
+ ctx.HTML(200, "user/active")
return
}
ctx.Redirect("/user/login")
ctx.Data["IsUserPageSettingDelete"] = true
if ctx.Req.Method == "GET" {
- ctx.HTML(200, "user/delete", ctx.Data)
+ ctx.HTML(200, "user/delete")
return
}
}
}
- ctx.HTML(200, "user/delete", ctx.Data)
+ ctx.HTML(200, "user/delete")
}
const (
}
func Issues(ctx *middleware.Context) {
- ctx.HTML(200, "user/issues", ctx.Data)
+ ctx.HTML(200, "user/issues")
}
func Pulls(ctx *middleware.Context) {
- ctx.HTML(200, "user/pulls", ctx.Data)
+ ctx.HTML(200, "user/pulls")
}
func Stars(ctx *middleware.Context) {
- ctx.HTML(200, "user/stars", ctx.Data)
+ ctx.HTML(200, "user/stars")
}
func Activate(ctx *middleware.Context) {
} else {
ctx.Data["ServiceNotEnabled"] = true
}
- ctx.Render.HTML(200, "user/active", ctx.Data)
+ ctx.HTML(200, "user/active")
return
}
}
ctx.Data["IsActivateFailed"] = true
- ctx.Render.HTML(200, "user/active", ctx.Data)
+ ctx.HTML(200, "user/active")
}
--- /dev/null
+{{template "base/head" .}}
+{{template "base/navbar" .}}
+<div id="gogs-body" class="container" data-page="admin">
+ <div id="gogs-user-setting-nav" class="col-md-3">
+ <ul class="list-group" data-init="tabs">
+ <li class="list-group-item active"><a href="/admin"><i class="fa fa-tachometer fa-lg"></i> Dashboard</a></li>
+ <li class="list-group-item"><a href="/admin/users"><i class="fa fa-users fa-lg"></i> Users</a></li>
+ <li class="list-group-item"><a href="/admin/repos"><i class="fa fa-book fa-lg"></i> Repositories</a></li>
+ </ul>
+ </div>
+
+ <div id="gogs-admin-container" class="col-md-9">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ Statistic
+ </div>
+
+ <div class="panel-body">
+ Gogs database has 4 users, 3 repositories, 4 SSH keys.
+ </div>
+ </div>
+ </div>
+</div>
+{{template "base/footer" .}}
\ No newline at end of file
--- /dev/null
+{{template "base/head" .}}
+{{template "base/navbar" .}}
+<div id="gogs-body" class="container" data-page="admin">
+ <div id="gogs-user-setting-nav" class="col-md-3">
+ <ul class="list-group" data-init="tabs">
+ <li class="list-group-item"><a href="/admin"><i class="fa fa-tachometer fa-lg"></i> Dashboard</a></li>
+ <li class="list-group-item"><a href="/admin/users"><i class="fa fa-users fa-lg"></i> Users</a></li>
+ <li class="list-group-item active"><a href="/admin/repos"><i class="fa fa-book fa-lg"></i> Repositories</a></li>
+ </ul>
+ </div>
+
+ <div id="gogs-admin-container" class="col-md-9">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ Repository Management
+ </div>
+
+ <div class="panel-body">
+ </div>
+ </div>
+ </div>
+</div>
+{{template "base/footer" .}}
\ No newline at end of file
--- /dev/null
+{{template "base/head" .}}
+{{template "base/navbar" .}}
+<div id="gogs-body" class="container" data-page="admin">
+ <div id="gogs-user-setting-nav" class="col-md-3">
+ <ul class="list-group" data-init="tabs">
+ <li class="list-group-item"><a href="/admin"><i class="fa fa-tachometer fa-lg"></i> Dashboard</a></li>
+ <li class="list-group-item active"><a href="/admin/users"><i class="fa fa-users fa-lg"></i> Users</a></li>
+ <li class="list-group-item"><a href="/admin/repos"><i class="fa fa-book fa-lg"></i> Repositories</a></li>
+ </ul>
+ </div>
+
+ <div id="gogs-admin-container" class="col-md-9">
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ User Management
+ </div>
+
+ <div class="panel-body">
+ </div>
+ </div>
+ </div>
+</div>
+{{template "base/footer" .}}
\ No newline at end of file
</a>
<a class="navbar-right gogs-nav-item{{if .PageIsNewRepo}} active{{end}}" href="/repo/create" data-toggle="tooltip" data-placement="bottom" title="New Repository"><i class="fa fa-plus fa-lg"></i></a>
<a class="navbar-right gogs-nav-item{{if .PageIsUserSetting}} active{{end}}" href="/user/setting" data-toggle="tooltip" data-placement="bottom" title="Setting"><i class="fa fa-cogs fa-lg"></i></a>
+ {{if .IsAdmin}}<a class="navbar-right gogs-nav-item{{if .PageIsAdmin}} active{{end}}" href="/admin" data-toggle="tooltip" data-placement="bottom" title="Admin"><i class="fa fa-gear fa-lg"></i></a>{{end}}
{{else}}<a id="gogs-nav-signin" class="gogs-nav-item navbar-right navbar-btn btn btn-danger" href="/user/login/">Sign in</a>{{end}}
</nav>
</div>
<li class="list-group-item"><a href="#">Notifications</a></li>-->
</ul>
</div>
+
<div id="gogs-repo-setting-container" class="col-md-9">
{{if .ErrorMsg}}<p class="alert alert-danger">{{.ErrorMsg}}</p>{{end}}
<div class="panel panel-default">
<div class="panel-heading">
Repository Options
</div>
+
<div class="panel-body">
</div>
</div>
+
<div class="panel panel-warning">
<div class="panel-heading">
Danger Zone
</div>
+
<div class="panel-body">
<button type="button" class="btn btn-default pull-right" href="#delete-repository-modal" data-toggle="modal">
Delete this repository
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/routers"
+ "github.com/gogits/gogs/routers/admin"
"github.com/gogits/gogs/routers/dev"
"github.com/gogits/gogs/routers/repo"
"github.com/gogits/gogs/routers/user"
m.Get("/help", routers.Help)
+ adminReq := middleware.AdminRequire()
+ m.Any("/admin", reqSignIn, adminReq, admin.Dashboard)
+ m.Any("/admin/users", reqSignIn, adminReq, admin.Users)
+ m.Any("/admin/repos", reqSignIn, adminReq, admin.Repositories)
+
m.Post("/:username/:reponame/settings", reqSignIn, middleware.RepoAssignment(true), repo.SettingPost)
m.Get("/:username/:reponame/settings", reqSignIn, middleware.RepoAssignment(true), repo.Setting)