]> source.dussan.org Git - gitea.git/commitdiff
Work on admin
authorUnknown <joe2010xtmf@163.com>
Thu, 20 Mar 2014 11:50:26 +0000 (07:50 -0400)
committerUnknown <joe2010xtmf@163.com>
Thu, 20 Mar 2014 11:50:26 +0000 (07:50 -0400)
19 files changed:
.gitignore
conf/app.ini
models/user.go
modules/base/conf.go
modules/middleware/auth.go
modules/middleware/context.go
routers/admin/admin.go [new file with mode: 0644]
routers/dashboard.go
routers/dev/template.go
routers/repo/repo.go
routers/repo/single.go
routers/user/setting.go
routers/user/user.go
templates/admin/dashboard.tmpl [new file with mode: 0644]
templates/admin/repos.tmpl [new file with mode: 0644]
templates/admin/users.tmpl [new file with mode: 0644]
templates/base/navbar.tmpl
templates/repo/setting.tmpl
web.go

index 3e550c3fc7b62667bcd05f29547ed3c720cb7753..ad27cc8be8ebc41382ed443ca8e8dfe499a34082 100644 (file)
@@ -5,4 +5,6 @@ gogs
 *.db
 *.log
 custom/
-.vendor/
\ No newline at end of file
+.vendor/
+.idea/
+*.iml
\ No newline at end of file
index 658f7c01512e37fafe6ccb75caf76edc00f974e2..21090ceba5f01292a01b3a5cc5ce788a10a2c6c7 100644 (file)
@@ -27,6 +27,10 @@ PASSWD =
 ; 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&*(
index 76cf2d20ce83f6f7e8f07c7a7d0716b0858c3467..8f74fd53fb04c8056395fd3edec333b969fd132d 100644 (file)
@@ -51,6 +51,7 @@ type User struct {
        Location      string
        Website       string
        IsActive      bool
+       IsAdmin       bool
        Rands         string    `xorm:"VARCHAR(10)"`
        Created       time.Time `xorm:"created"`
        Updated       time.Time `xorm:"updated"`
index fdbf3ad38549ec010eb47b21f3fb3c40a9ae0e01..c904c5b39c0cf9f0e8bd9ab8eaa3b2882ae07ecd 100644 (file)
@@ -32,6 +32,7 @@ var (
        AppUrl      string
        Domain      string
        SecretKey   string
+       AdminName   string
        Cfg         *goconfig.ConfigFile
        MailService *Mailer
 )
@@ -173,6 +174,7 @@ func init() {
        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() {
index d45a21e988d8d1bbddcfc26f437ba7055f0d1363..b67f766bd7ef260789f8287cd19de79d2ca5118b 100644 (file)
@@ -20,7 +20,7 @@ func SignInRequire(redirect bool) martini.Handler {
                        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
                }
        }
@@ -31,6 +31,18 @@ func SignOutRequire() martini.Handler {
        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
        }
 }
index 6ac87de3beb316fdd08784876dc3bc56861b75ac..744cdfc10c9f06505e282cddbf0839c8b78f7e2a 100644 (file)
@@ -14,6 +14,7 @@ import (
 
        "github.com/gogits/gogs/models"
        "github.com/gogits/gogs/modules/auth"
+       "github.com/gogits/gogs/modules/base"
        "github.com/gogits/gogs/modules/log"
 )
 
@@ -61,24 +62,29 @@ func (ctx *Context) HasError() bool {
        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.
@@ -106,6 +112,10 @@ func InitContext() martini.Handler {
                        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()
diff --git a/routers/admin/admin.go b/routers/admin/admin.go
new file mode 100644 (file)
index 0000000..c7523b7
--- /dev/null
@@ -0,0 +1,24 @@
+// 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")
+}
index 6c194ad9e5fedaeeeb6d86ffd77e9c2062f320f6..f61d67b7de81a50d315abe5400734da80a35ab14 100644 (file)
@@ -15,10 +15,10 @@ func Home(ctx *middleware.Context) {
                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")
 }
index 7d5225ece73623a1377c670c9585c5939713cfd0..d2f77ac4d5ff0886704a4a63410ff77f292ed163 100644 (file)
@@ -21,5 +21,5 @@ func TemplatePreview(ctx *middleware.Context, params martini.Params) {
        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"])
 }
index b38473b18a05ea06f3c80c289426e2d50f79ad1e..556cc4343c905a553687f00db26b8c1e21a7dc2b 100644 (file)
@@ -18,7 +18,7 @@ func Create(ctx *middleware.Context, form auth.CreateRepoForm) {
        ctx.Data["Licenses"] = models.Licenses
 
        if ctx.Req.Method == "GET" {
-               ctx.HTML(200, "repo/create", ctx.Data)
+               ctx.HTML(200, "repo/create")
                return
        }
 
@@ -45,7 +45,7 @@ func SettingPost(ctx *middleware.Context) {
        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
                }
 
index c10d30a7d6b5816e0af6c822f29ece39456d295d..ebf64dc665224430caab0b6e0aba7c96fb5d7704 100644 (file)
@@ -38,7 +38,7 @@ func Branches(ctx *middleware.Context, params martini.Params) {
        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) {
@@ -67,7 +67,7 @@ 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
        }
 
@@ -178,7 +178,7 @@ func Single(ctx *middleware.Context, params martini.Params) {
        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) {
@@ -195,7 +195,7 @@ 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
        }
 
@@ -206,7 +206,7 @@ func Setting(ctx *middleware.Context, params martini.Params) {
 
        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) {
@@ -230,17 +230,17 @@ 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) {
index 053f327f0f225f19aa01a347541b9d6d2d285e9b..f0c7a8a5b138c0b39d86f5c87140b723917dd54d 100644 (file)
@@ -24,13 +24,13 @@ func Setting(ctx *middleware.Context, form auth.UpdateProfileForm) {
        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
        }
 
@@ -45,7 +45,7 @@ func Setting(ctx *middleware.Context, form auth.UpdateProfileForm) {
        }
 
        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)
 }
 
@@ -55,7 +55,7 @@ func SettingPassword(ctx *middleware.Context, form auth.UpdatePasswdForm) {
        ctx.Data["IsUserPageSettingPasswd"] = true
 
        if ctx.Req.Method == "GET" {
-               ctx.HTML(200, "user/password", ctx.Data)
+               ctx.HTML(200, "user/password")
                return
        }
 
@@ -82,7 +82,7 @@ func SettingPassword(ctx *middleware.Context, form auth.UpdatePasswdForm) {
        }
 
        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)
 }
 
@@ -123,7 +123,7 @@ func SettingSSHKeys(ctx *middleware.Context, form auth.AddSSHKeyForm) {
        // 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
                }
 
@@ -155,7 +155,7 @@ func SettingSSHKeys(ctx *middleware.Context, form auth.AddSSHKeyForm) {
        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) {
@@ -163,7 +163,7 @@ 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) {
@@ -171,5 +171,5 @@ 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")
 }
index f495cb13ab6dfe16e72dd53245949264e6b3381a..2b759e4192a1e5233282f55c2083602dcde901ea 100644 (file)
@@ -34,7 +34,7 @@ func Dashboard(ctx *middleware.Context) {
                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) {
@@ -70,19 +70,19 @@ 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
        }
 
@@ -113,7 +113,7 @@ func SignUp(ctx *middleware.Context, form auth.RegisterForm) {
        ctx.Data["PageIsSignUp"] = true
 
        if ctx.Req.Method == "GET" {
-               ctx.HTML(200, "user/signup", ctx.Data)
+               ctx.HTML(200, "user/signup")
                return
        }
 
@@ -126,7 +126,7 @@ func SignUp(ctx *middleware.Context, form auth.RegisterForm) {
        }
 
        if ctx.HasError() {
-               ctx.HTML(200, "user/signup", ctx.Data)
+               ctx.HTML(200, "user/signup")
                return
        }
 
@@ -158,7 +158,7 @@ func SignUp(ctx *middleware.Context, form auth.RegisterForm) {
                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")
@@ -170,7 +170,7 @@ func Delete(ctx *middleware.Context) {
        ctx.Data["IsUserPageSettingDelete"] = true
 
        if ctx.Req.Method == "GET" {
-               ctx.HTML(200, "user/delete", ctx.Data)
+               ctx.HTML(200, "user/delete")
                return
        }
 
@@ -195,7 +195,7 @@ func Delete(ctx *middleware.Context) {
                }
        }
 
-       ctx.HTML(200, "user/delete", ctx.Data)
+       ctx.HTML(200, "user/delete")
 }
 
 const (
@@ -218,15 +218,15 @@ func Feeds(ctx *middleware.Context, form auth.FeedsForm) {
 }
 
 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) {
@@ -244,7 +244,7 @@ func Activate(ctx *middleware.Context) {
                } else {
                        ctx.Data["ServiceNotEnabled"] = true
                }
-               ctx.Render.HTML(200, "user/active", ctx.Data)
+               ctx.HTML(200, "user/active")
                return
        }
 
@@ -263,5 +263,5 @@ func Activate(ctx *middleware.Context) {
        }
 
        ctx.Data["IsActivateFailed"] = true
-       ctx.Render.HTML(200, "user/active", ctx.Data)
+       ctx.HTML(200, "user/active")
 }
diff --git a/templates/admin/dashboard.tmpl b/templates/admin/dashboard.tmpl
new file mode 100644 (file)
index 0000000..84456c8
--- /dev/null
@@ -0,0 +1,24 @@
+{{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
diff --git a/templates/admin/repos.tmpl b/templates/admin/repos.tmpl
new file mode 100644 (file)
index 0000000..ec7f47e
--- /dev/null
@@ -0,0 +1,23 @@
+{{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
diff --git a/templates/admin/users.tmpl b/templates/admin/users.tmpl
new file mode 100644 (file)
index 0000000..8acf256
--- /dev/null
@@ -0,0 +1,23 @@
+{{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
index e0d796a87bb09872dcc18dffb21906ac201c3a3a..9c064d07e760307908f814297d13b5eeb8a865fd 100644 (file)
@@ -10,6 +10,7 @@
             </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>
index 06f0ed4d50feeec752c3b6396f34836c4f187bbe..a2fb1771d4416a2bbbe9c5032165d7d55f49e5d5 100644 (file)
             <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
diff --git a/web.go b/web.go
index ceb193e6fd0783f2a37376ed2da7b73c353e24b6..a5a8305aee6c3e748584fcae3e6488a506efe745 100644 (file)
--- a/web.go
+++ b/web.go
@@ -21,6 +21,7 @@ import (
        "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"
@@ -99,6 +100,11 @@ func runWeb(*cli.Context) {
 
        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)