| @@ -130,7 +130,7 @@ func runWeb(*cli.Context) { | |||
| m.Get("/user/:username", ignSignIn, user.Profile) | |||
| m.Group("/repo", func(r martini.Router) { | |||
| r.Get("/create", repo.Create) // TODO | |||
| r.Get("/create", repo.Create) | |||
| r.Post("/create", bindIgnErr(auth.CreateRepoForm{}), repo.CreatePost) | |||
| r.Get("/migrate", repo.Migrate) | |||
| r.Post("/migrate", bindIgnErr(auth.MigrateRepoForm{}), repo.MigratePost) | |||
| @@ -165,14 +165,19 @@ func runWeb(*cli.Context) { | |||
| m.Get("/template/**", dev.TemplatePreview) | |||
| } | |||
| reqOwner := middleware.RequireOwner | |||
| m.Group("/:username/:reponame", func(r martini.Router) { | |||
| r.Get("/settings", repo.Setting) | |||
| r.Post("/settings", repo.SettingPost) | |||
| r.Post("/settings", bindIgnErr(auth.RepoSettingForm{}), repo.SettingPost) | |||
| r.Get("/settings/collaboration", repo.Collaboration) | |||
| r.Post("/settings/collaboration", repo.CollaborationPost) | |||
| r.Get("/settings/hooks", repo.WebHooks) | |||
| r.Get("/settings/hooks", repo.WebHooks) // TODO | |||
| r.Get("/settings/hooks/add", repo.WebHooksAdd) | |||
| r.Get("/settings/hooks/id", repo.WebHooksEdit) | |||
| }, reqSignIn, middleware.RepoAssignment(true), reqOwner()) | |||
| m.Group("/:username/:reponame", func(r martini.Router) { | |||
| r.Get("/action/:action", repo.Action) | |||
| r.Get("/issues/new", repo.CreateIssue) | |||
| r.Post("/issues/new", bindIgnErr(auth.CreateIssueForm{}), repo.CreateIssuePost) | |||
| @@ -11,7 +11,6 @@ import ( | |||
| "github.com/go-martini/martini" | |||
| "github.com/gogits/gogs/modules/base" | |||
| "github.com/gogits/gogs/modules/log" | |||
| "github.com/gogits/gogs/modules/middleware/binding" | |||
| ) | |||
| @@ -36,20 +35,6 @@ func (f *AdminEditUserForm) Name(field string) string { | |||
| } | |||
| func (f *AdminEditUserForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { | |||
| if req.Method == "GET" || errors.Count() == 0 { | |||
| return | |||
| } | |||
| data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
| data["HasError"] = true | |||
| AssignForm(f, data) | |||
| if len(errors.Overall) > 0 { | |||
| for _, err := range errors.Overall { | |||
| log.Error("AdminEditUserForm.Validate: %v", err) | |||
| } | |||
| return | |||
| } | |||
| validate(errors, data, f) | |||
| } | |||
| @@ -183,20 +183,6 @@ func (f *InstallForm) Name(field string) string { | |||
| } | |||
| func (f *InstallForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { | |||
| if req.Method == "GET" || errors.Count() == 0 { | |||
| return | |||
| } | |||
| data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
| data["HasError"] = true | |||
| AssignForm(f, data) | |||
| if len(errors.Overall) > 0 { | |||
| for _, err := range errors.Overall { | |||
| log.Error("InstallForm.Validate: %v", err) | |||
| } | |||
| return | |||
| } | |||
| validate(errors, data, f) | |||
| } | |||
| @@ -11,7 +11,6 @@ import ( | |||
| "github.com/go-martini/martini" | |||
| "github.com/gogits/gogs/modules/base" | |||
| "github.com/gogits/gogs/modules/log" | |||
| "github.com/gogits/gogs/modules/middleware/binding" | |||
| ) | |||
| @@ -44,20 +43,6 @@ func (f *AuthenticationForm) Name(field string) string { | |||
| } | |||
| func (f *AuthenticationForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { | |||
| if req.Method == "GET" || errors.Count() == 0 { | |||
| return | |||
| } | |||
| data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
| data["HasError"] = true | |||
| AssignForm(f, data) | |||
| if len(errors.Overall) > 0 { | |||
| for _, err := range errors.Overall { | |||
| log.Error("AuthenticationForm.Validate: %v", err) | |||
| } | |||
| return | |||
| } | |||
| validate(errors, data, f) | |||
| } | |||
| @@ -11,12 +11,11 @@ import ( | |||
| "github.com/go-martini/martini" | |||
| "github.com/gogits/gogs/modules/base" | |||
| "github.com/gogits/gogs/modules/log" | |||
| "github.com/gogits/gogs/modules/middleware/binding" | |||
| ) | |||
| type CreateRepoForm struct { | |||
| RepoName string `form:"repo" binding:"Required;AlphaDash"` | |||
| RepoName string `form:"repo" binding:"Required;AlphaDash;MaxSize(100)"` | |||
| Private bool `form:"private"` | |||
| Description string `form:"desc" binding:"MaxSize(100)"` | |||
| Language string `form:"language"` | |||
| @@ -33,21 +32,7 @@ func (f *CreateRepoForm) Name(field string) string { | |||
| } | |||
| func (f *CreateRepoForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { | |||
| if req.Method == "GET" || errors.Count() == 0 { | |||
| return | |||
| } | |||
| data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
| data["HasError"] = true | |||
| AssignForm(f, data) | |||
| if len(errors.Overall) > 0 { | |||
| for _, err := range errors.Overall { | |||
| log.Error("CreateRepoForm.Validate: %v", err) | |||
| } | |||
| return | |||
| } | |||
| validate(errors, data, f) | |||
| } | |||
| @@ -55,7 +40,7 @@ type MigrateRepoForm struct { | |||
| Url string `form:"url" binding:"Url"` | |||
| AuthUserName string `form:"auth_username"` | |||
| AuthPasswd string `form:"auth_password"` | |||
| RepoName string `form:"repo" binding:"Required;AlphaDash"` | |||
| RepoName string `form:"repo" binding:"Required;AlphaDash;MaxSize(100)"` | |||
| Mirror bool `form:"mirror"` | |||
| Private bool `form:"private"` | |||
| Description string `form:"desc" binding:"MaxSize(100)"` | |||
| @@ -71,20 +56,30 @@ func (f *MigrateRepoForm) Name(field string) string { | |||
| } | |||
| func (f *MigrateRepoForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { | |||
| if req.Method == "GET" || errors.Count() == 0 { | |||
| return | |||
| } | |||
| data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
| data["HasError"] = true | |||
| AssignForm(f, data) | |||
| validate(errors, data, f) | |||
| } | |||
| if len(errors.Overall) > 0 { | |||
| for _, err := range errors.Overall { | |||
| log.Error("MigrateRepoForm.Validate: %v", err) | |||
| } | |||
| return | |||
| type RepoSettingForm struct { | |||
| RepoName string `form:"name" binding:"Required;AlphaDash;MaxSize(100)"` | |||
| Description string `form:"desc" binding:"MaxSize(100)"` | |||
| Website string `form:"url" binding:"Url;MaxSize(100)"` | |||
| Branch string `form:"branch"` | |||
| Interval int `form:"interval"` | |||
| Private bool `form:"private"` | |||
| GoGet bool `form:"goget"` | |||
| } | |||
| func (f *RepoSettingForm) Name(field string) string { | |||
| names := map[string]string{ | |||
| "RepoName": "Repository name", | |||
| "Description": "Description", | |||
| "Website": "Website address", | |||
| } | |||
| return names[field] | |||
| } | |||
| func (f *RepoSettingForm) Validate(errors *binding.BindingErrors, req *http.Request, context martini.Context) { | |||
| data := context.Get(reflect.TypeOf(base.TmplData{})).Interface().(base.TmplData) | |||
| validate(errors, data, f) | |||
| } | |||
| @@ -267,7 +267,10 @@ func validateStruct(errors *BindingErrors, obj interface{}) { | |||
| break | |||
| } | |||
| case rule == "Url": | |||
| if !urlPattern.MatchString(fmt.Sprintf("%v", fieldValue)) { | |||
| str := fmt.Sprintf("%v", fieldValue) | |||
| if len(str) == 0 { | |||
| continue | |||
| } else if !urlPattern.MatchString(str) { | |||
| errors.Fields[field.Name] = BindingUrlError | |||
| break | |||
| } | |||
| @@ -7,6 +7,7 @@ package middleware | |||
| import ( | |||
| "errors" | |||
| "fmt" | |||
| "net/url" | |||
| "strings" | |||
| "github.com/go-martini/martini" | |||
| @@ -238,3 +239,17 @@ func RepoAssignment(redirect bool, args ...bool) martini.Handler { | |||
| ctx.Data["IsRepositoryWatching"] = ctx.Repo.IsWatching | |||
| } | |||
| } | |||
| func RequireOwner() martini.Handler { | |||
| return func(ctx *Context) { | |||
| if !ctx.Repo.IsOwner { | |||
| if !ctx.IsSigned { | |||
| ctx.SetCookie("redirect_to", "/"+url.QueryEscape(ctx.Req.RequestURI)) | |||
| ctx.Redirect("/user/login") | |||
| return | |||
| } | |||
| ctx.Handle(404, ctx.Req.RequestURI, nil) | |||
| return | |||
| } | |||
| } | |||
| } | |||
| @@ -112,38 +112,38 @@ func Users(ctx *middleware.Context) { | |||
| ctx.Data["PageIsUsers"] = true | |||
| var err error | |||
| ctx.Data["Users"], err = models.GetUsers(100, 0) | |||
| ctx.Data["Users"], err = models.GetUsers(200, 0) | |||
| if err != nil { | |||
| ctx.Handle(200, "admin.Users", err) | |||
| ctx.Handle(500, "admin.Users", err) | |||
| return | |||
| } | |||
| ctx.HTML(200, "admin/users") | |||
| } | |||
| func Auths(ctx *middleware.Context) { | |||
| ctx.Data["Title"] = "Auth Sources" | |||
| ctx.Data["PageIsAuths"] = true | |||
| func Repositories(ctx *middleware.Context) { | |||
| ctx.Data["Title"] = "Repository Management" | |||
| ctx.Data["PageIsRepos"] = true | |||
| var err error | |||
| ctx.Data["Sources"], err = models.GetAuths() | |||
| ctx.Data["Repos"], err = models.GetRepos(200, 0) | |||
| if err != nil { | |||
| ctx.Handle(200, "admin.Auths", err) | |||
| ctx.Handle(500, "admin.Repositories", err) | |||
| return | |||
| } | |||
| ctx.HTML(200, "admin/auths") | |||
| ctx.HTML(200, "admin/repos") | |||
| } | |||
| func Repositories(ctx *middleware.Context) { | |||
| ctx.Data["Title"] = "Repository Management" | |||
| ctx.Data["PageIsRepos"] = true | |||
| func Auths(ctx *middleware.Context) { | |||
| ctx.Data["Title"] = "Auth Sources" | |||
| ctx.Data["PageIsAuths"] = true | |||
| var err error | |||
| ctx.Data["Repos"], err = models.GetRepos(100, 0) | |||
| ctx.Data["Sources"], err = models.GetAuths() | |||
| if err != nil { | |||
| ctx.Handle(200, "admin.Repositories", err) | |||
| ctx.Handle(500, "admin.Auths", err) | |||
| return | |||
| } | |||
| ctx.HTML(200, "admin/repos") | |||
| ctx.HTML(200, "admin/auths") | |||
| } | |||
| func Config(ctx *middleware.Context) { | |||
| @@ -34,16 +34,15 @@ func NewUserPost(ctx *middleware.Context, form auth.RegisterForm) { | |||
| ctx.Data["Title"] = "New Account" | |||
| ctx.Data["PageIsUsers"] = true | |||
| if ctx.HasError() { | |||
| ctx.HTML(200, "admin/users/new") | |||
| return | |||
| } | |||
| if form.Password != form.RetypePasswd { | |||
| ctx.Data["HasError"] = true | |||
| ctx.Data["Err_Password"] = true | |||
| ctx.Data["Err_RetypePasswd"] = true | |||
| ctx.Data["ErrorMsg"] = "Password and re-type password are not same" | |||
| auth.AssignForm(form, ctx.Data) | |||
| } | |||
| if ctx.HasError() { | |||
| ctx.HTML(200, "admin/users/new") | |||
| ctx.RenderWithErr("Password and re-type password are not same.", "admin/users/new", &form) | |||
| return | |||
| } | |||
| @@ -8,13 +8,14 @@ import ( | |||
| "encoding/base64" | |||
| "errors" | |||
| "fmt" | |||
| "github.com/gogits/git" | |||
| "path" | |||
| "path/filepath" | |||
| "strings" | |||
| "github.com/go-martini/martini" | |||
| "github.com/gogits/git" | |||
| "github.com/gogits/gogs/models" | |||
| "github.com/gogits/gogs/modules/auth" | |||
| "github.com/gogits/gogs/modules/base" | |||
| @@ -11,6 +11,7 @@ import ( | |||
| "github.com/gogits/git" | |||
| "github.com/gogits/gogs/models" | |||
| "github.com/gogits/gogs/modules/auth" | |||
| "github.com/gogits/gogs/modules/base" | |||
| "github.com/gogits/gogs/modules/log" | |||
| "github.com/gogits/gogs/modules/mailer" | |||
| @@ -18,27 +19,22 @@ import ( | |||
| ) | |||
| func Setting(ctx *middleware.Context) { | |||
| if !ctx.Repo.IsOwner { | |||
| ctx.Handle(404, "repo.Setting", nil) | |||
| return | |||
| } | |||
| ctx.Data["IsRepoToolbarSetting"] = true | |||
| ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - settings" | |||
| ctx.HTML(200, "repo/setting") | |||
| } | |||
| func SettingPost(ctx *middleware.Context) { | |||
| if !ctx.Repo.IsOwner { | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| func SettingPost(ctx *middleware.Context, form auth.RepoSettingForm) { | |||
| ctx.Data["IsRepoToolbarSetting"] = true | |||
| switch ctx.Query("action") { | |||
| case "update": | |||
| newRepoName := ctx.Query("name") | |||
| if ctx.HasError() { | |||
| ctx.HTML(200, "repo/setting") | |||
| return | |||
| } | |||
| newRepoName := form.RepoName | |||
| // Check if repository name has been changed. | |||
| if ctx.Repo.Repository.Name != newRepoName { | |||
| isExist, err := models.IsRepositoryExist(ctx.Repo.Owner, newRepoName) | |||
| @@ -57,15 +53,15 @@ func SettingPost(ctx *middleware.Context) { | |||
| ctx.Repo.Repository.Name = newRepoName | |||
| } | |||
| br := ctx.Query("branch") | |||
| br := form.Branch | |||
| if git.IsBranchExist(models.RepoPath(ctx.User.Name, ctx.Repo.Repository.Name), br) { | |||
| ctx.Repo.Repository.DefaultBranch = br | |||
| } | |||
| ctx.Repo.Repository.Description = ctx.Query("desc") | |||
| ctx.Repo.Repository.Website = ctx.Query("site") | |||
| ctx.Repo.Repository.IsPrivate = ctx.Query("private") == "on" | |||
| ctx.Repo.Repository.IsGoget = ctx.Query("goget") == "on" | |||
| ctx.Repo.Repository.Description = form.Description | |||
| ctx.Repo.Repository.Website = form.Website | |||
| ctx.Repo.Repository.IsPrivate = form.Private | |||
| ctx.Repo.Repository.IsGoget = form.GoGet | |||
| if err := models.UpdateRepository(ctx.Repo.Repository); err != nil { | |||
| ctx.Handle(404, "repo.SettingPost(update)", err) | |||
| return | |||
| @@ -73,12 +69,9 @@ func SettingPost(ctx *middleware.Context) { | |||
| log.Trace("%s Repository updated: %s/%s", ctx.Req.RequestURI, ctx.Repo.Owner.Name, ctx.Repo.Repository.Name) | |||
| if ctx.Repo.Repository.IsMirror { | |||
| if len(ctx.Query("interval")) > 0 { | |||
| var err error | |||
| ctx.Repo.Mirror.Interval, err = base.StrTo(ctx.Query("interval")).Int() | |||
| if err != nil { | |||
| log.Error("repo.SettingPost(get mirror interval): %v", err) | |||
| } else if err = models.UpdateMirror(ctx.Repo.Mirror); err != nil { | |||
| if form.Interval > 0 { | |||
| ctx.Repo.Mirror.Interval = form.Interval | |||
| if err := models.UpdateMirror(ctx.Repo.Mirror); err != nil { | |||
| log.Error("repo.SettingPost(UpdateMirror): %v", err) | |||
| } | |||
| } | |||
| @@ -125,11 +118,6 @@ func SettingPost(ctx *middleware.Context) { | |||
| } | |||
| func Collaboration(ctx *middleware.Context) { | |||
| if !ctx.Repo.IsOwner { | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| repoLink := strings.TrimPrefix(ctx.Repo.RepoLink, "/") | |||
| ctx.Data["IsRepoToolbarCollaboration"] = true | |||
| ctx.Data["Title"] = repoLink + " - collaboration" | |||
| @@ -166,11 +154,6 @@ func Collaboration(ctx *middleware.Context) { | |||
| } | |||
| func CollaborationPost(ctx *middleware.Context) { | |||
| if !ctx.Repo.IsOwner { | |||
| ctx.Error(404) | |||
| return | |||
| } | |||
| repoLink := strings.TrimPrefix(ctx.Repo.RepoLink, "/") | |||
| name := strings.ToLower(ctx.Query("collaborator")) | |||
| if len(name) == 0 || ctx.Repo.Owner.LowerName == name { | |||
| @@ -215,33 +198,18 @@ func CollaborationPost(ctx *middleware.Context) { | |||
| } | |||
| func WebHooks(ctx *middleware.Context) { | |||
| if !ctx.Repo.IsOwner { | |||
| ctx.Handle(404, "repo.WebHooks", nil) | |||
| return | |||
| } | |||
| ctx.Data["IsRepoToolbarWebHooks"] = true | |||
| ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Web Hooks" | |||
| ctx.HTML(200, "repo/hooks") | |||
| } | |||
| func WebHooksAdd(ctx *middleware.Context) { | |||
| if !ctx.Repo.IsOwner { | |||
| ctx.Handle(404, "repo.WebHooksAdd", nil) | |||
| return | |||
| } | |||
| ctx.Data["IsRepoToolbarWebHooks"] = true | |||
| ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Add Web Hook" | |||
| ctx.HTML(200, "repo/hooks_add") | |||
| } | |||
| func WebHooksEdit(ctx *middleware.Context) { | |||
| if !ctx.Repo.IsOwner { | |||
| ctx.Handle(404, "repo.WebHooksEdit", nil) | |||
| return | |||
| } | |||
| ctx.Data["IsRepoToolbarWebHooks"] = true | |||
| ctx.Data["Title"] = strings.TrimPrefix(ctx.Repo.RepoLink, "/") + " - Web Hook Name" | |||
| ctx.HTML(200, "repo/hooks_edit") | |||
| @@ -217,7 +217,7 @@ func SignUpPost(ctx *middleware.Context, form auth.RegisterForm) { | |||
| if form.Password != form.RetypePasswd { | |||
| ctx.Data["Err_Password"] = true | |||
| ctx.Data["Err_RetypePasswd"] = true | |||
| ctx.RenderWithErr("Password and re-type password are not same", "user/signup", &form) | |||
| ctx.RenderWithErr("Password and re-type password are not same.", "user/signup", &form) | |||
| return | |||
| } | |||
| @@ -3,7 +3,7 @@ | |||
| <li class="list-group-item{{if .PageIsDashboard}} active{{end}}"><a href="/admin"><i class="fa fa-tachometer fa-lg"></i> Dashboard</a></li> | |||
| <li class="list-group-item{{if .PageIsUsers}} active{{end}}"><a href="/admin/users"><i class="fa fa-users fa-lg"></i> Users</a></li> | |||
| <li class="list-group-item{{if .PageIsRepos}} active{{end}}"><a href="/admin/repos"><i class="fa fa-book fa-lg"></i> Repositories</a></li> | |||
| <li class="list-group-item{{if .PageIsConfig}} active{{end}}"><a href="/admin/config"><i class="fa fa-cogs fa-lg"></i> Configuration</a></li> | |||
| <li class="list-group-item{{if .PageIsAuths}} active{{end}}"><a href="/admin/auths"><i class="fa fa-certificate fa-lg"></i> Authentication</a></li> | |||
| <li class="list-group-item{{if .PageIsConfig}} active{{end}}"><a href="/admin/config"><i class="fa fa-cogs fa-lg"></i> Configuration</a></li> | |||
| </ul> | |||
| </div> | |||