func Install(ctx *middleware.Context) { form := auth.InstallForm{} // Database settings form.DbHost = models.DbCfg.Host form.DbUser = models.DbCfg.User form.DbName = models.DbCfg.Name form.DbPath = models.DbCfg.Path form.DbURI = models.DbCfg.URI ctx.Data["CurDbOption"] = "MySQL" switch models.DbCfg.Type { case "postgres": ctx.Data["CurDbOption"] = "PostgreSQL" case "sqlite3": if models.EnableSQLite3 { ctx.Data["CurDbOption"] = "SQLite3" } case "tidb": if models.EnableTidb { ctx.Data["CurDbOption"] = "TiDB" } } // Application general settings form.AppName = setting.AppName form.RepoRootPath = setting.RepoRootPath // Note(unknwon): it's hard for Windows users change a running user, // so just use current one if config says default. if setting.IsWindows && setting.RunUser == "git" { form.RunUser = user.CurrentUsername() } else { form.RunUser = setting.RunUser } form.Domain = setting.Domain form.SSHPort = setting.SSHPort form.HTTPPort = setting.HttpPort form.AppUrl = setting.AppUrl // E-mail service settings if setting.MailService != nil { form.SMTPHost = setting.MailService.Host form.SMTPFrom = setting.MailService.From form.SMTPEmail = setting.MailService.User } form.RegisterConfirm = setting.Service.RegisterEmailConfirm form.MailNotify = setting.Service.EnableNotifyMail // Server and other services settings form.OfflineMode = setting.OfflineMode form.DisableGravatar = setting.DisableGravatar form.DisableRegistration = setting.Service.DisableRegistration form.EnableCaptcha = setting.Service.EnableCaptcha form.RequireSignInView = setting.Service.RequireSignInView auth.AssignForm(form, ctx.Data) ctx.HTML(200, INSTALL) }
func Install(ctx *middleware.Context) { form := auth.InstallForm{} form.DbHost = models.DbCfg.Host form.DbUser = models.DbCfg.User form.DbName = models.DbCfg.Name form.DbPath = models.DbCfg.Path form.RepoRootPath = setting.RepoRootPath // Note(unknwon): it's hard for Windows users change a running user, // so just use current one if config says default. if setting.IsWindows && setting.RunUser == "git" { form.RunUser = os.Getenv("USER") if len(form.RunUser) == 0 { form.RunUser = os.Getenv("USERNAME") } } else { form.RunUser = setting.RunUser } form.Domain = setting.Domain form.HTTPPort = setting.HttpPort form.AppUrl = setting.AppUrl curDbOp := "" if models.EnableSQLite3 { curDbOp = "SQLite3" // Default when enabled. } ctx.Data["CurDbOption"] = curDbOp auth.AssignForm(form, ctx.Data) ctx.HTML(200, INSTALL) }
// RenderWithErr used for page has form validation but need to prompt error to users. func (ctx *Context) RenderWithErr(msg string, tpl base.TplName, form interface{}) { if form != nil { auth.AssignForm(form, ctx.Data) } ctx.Flash.ErrorMsg = msg ctx.Data["Flash"] = ctx.Flash ctx.HTML(200, tpl) }
// RenderWithErr used for page has form validation but need to prompt error to users. func (ctx *Context) RenderWithErr(msg, tpl string, form auth.Form) { if form != nil { auth.AssignForm(form, ctx.Data) } ctx.Flash.ErrorMsg = msg ctx.Data["Flash"] = ctx.Flash ctx.HTML(200, tpl) }
// 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 if form != nil { auth.AssignForm(form, ctx.Data) } ctx.HTML(200, tpl) }
func Install(ctx *middleware.Context) { form := auth.InstallForm{} // Database settings form.DbHost = models.DbCfg.Host form.DbUser = models.DbCfg.User form.DbName = models.DbCfg.Name form.DbPath = models.DbCfg.Path if models.EnableSQLite3 { ctx.Data["CurDbOption"] = "SQLite3" // Default when enabled. } else { ctx.Data["CurDbOption"] = "MySQL" } // Application general settings form.AppName = setting.AppName form.RepoRootPath = setting.RepoRootPath // Note(unknwon): it's hard for Windows users change a running user, // so just use current one if config says default. if setting.IsWindows && setting.RunUser == "git" { form.RunUser = os.Getenv("USER") if len(form.RunUser) == 0 { form.RunUser = os.Getenv("USERNAME") } } else { form.RunUser = setting.RunUser } form.Domain = setting.Domain form.HTTPPort = setting.HttpPort form.AppUrl = setting.AppUrl // E-mail service settings if setting.MailService != nil { form.SMTPHost = setting.MailService.Host form.SMTPFrom = setting.MailService.From form.SMTPEmail = setting.MailService.User } form.RegisterConfirm = setting.Service.RegisterEmailConfirm form.MailNotify = setting.Service.EnableNotifyMail // Server and other services settings form.OfflineMode = setting.OfflineMode form.DisableRegistration = setting.Service.DisableRegistration form.RequireSignInView = setting.Service.RequireSignInView auth.AssignForm(form, ctx.Data) ctx.HTML(200, INSTALL) }
func NewUser(ctx *middleware.Context, form auth.RegisterForm) { ctx.Data["Title"] = "New Account" ctx.Data["PageIsUsers"] = true if ctx.Req.Method == "GET" { 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") return } u := &models.User{ Name: form.UserName, Email: form.Email, Passwd: form.Password, IsActive: true, } var err error if u, err = models.RegisterUser(u); err != nil { switch err { case models.ErrUserAlreadyExist: ctx.RenderWithErr("Username has been already taken", "admin/users/new", &form) case models.ErrEmailAlreadyUsed: ctx.RenderWithErr("E-mail address has been already used", "admin/users/new", &form) case models.ErrUserNameIllegal: ctx.RenderWithErr(models.ErrRepoNameIllegal.Error(), "admin/users/new", &form) default: ctx.Handle(200, "admin.user.NewUser", err) } return } log.Trace("%s User created by admin(%s): %s", ctx.Req.RequestURI, ctx.User.LowerName, strings.ToLower(form.UserName)) ctx.Redirect("/admin/users") }
// @router /install [get] func Install(ctx *middleware.Context, form auth.InstallForm) { if setting.InstallLock { ctx.Handle(404, "install.Install", errors.New("Installation is prohibited")) return } ctx.Data["Title"] = "Install" ctx.Data["PageIsInstall"] = true // Get and assign values to install form. if len(form.Host) == 0 { form.Host = models.DbCfg.Host } if len(form.User) == 0 { form.User = models.DbCfg.User } if len(form.Passwd) == 0 { form.Passwd = models.DbCfg.Pwd } if len(form.DatabaseName) == 0 { form.DatabaseName = models.DbCfg.Name } if len(form.DatabasePath) == 0 { form.DatabasePath = models.DbCfg.Path } if len(form.RepoRootPath) == 0 { form.RepoRootPath = setting.RepoRootPath } if len(form.RunUser) == 0 { form.RunUser = setting.RunUser } if len(form.Domain) == 0 { form.Domain = setting.Domain } if len(form.AppUrl) == 0 { form.AppUrl = setting.AppUrl } renderDbOption(ctx) curDbOp := "" if models.EnableSQLite3 { curDbOp = "SQLite3" // Default when enabled. } ctx.Data["CurDbOption"] = curDbOp auth.AssignForm(form, ctx.Data) ctx.HTML(200, INSTALL) }
func Install(ctx *middleware.Context, form auth.InstallForm) { if base.InstallLock { ctx.Handle(404, "install.Install", errors.New("Installation is prohibited")) return } ctx.Data["Title"] = "Install" ctx.Data["PageIsInstall"] = true // Get and assign value to install form. if len(form.Host) == 0 { form.Host = models.DbCfg.Host } if len(form.User) == 0 { form.User = models.DbCfg.User } if len(form.Passwd) == 0 { form.Passwd = models.DbCfg.Pwd } if len(form.DatabaseName) == 0 { form.DatabaseName = models.DbCfg.Name } if len(form.DatabasePath) == 0 { form.DatabasePath = models.DbCfg.Path } if len(form.RepoRootPath) == 0 { form.RepoRootPath = base.RepoRootPath } if len(form.RunUser) == 0 { form.RunUser = base.RunUser } if len(form.Domain) == 0 { form.Domain = base.Domain } if len(form.AppUrl) == 0 { form.AppUrl = base.AppUrl } auth.AssignForm(form, ctx.Data) ctx.HTML(200, "install") }
func Install(ctx *middleware.Context, form auth.InstallForm) { if base.InstallLock { ctx.Handle(404, "install.Install", errors.New("Installation is prohibited")) return } ctx.Data["Title"] = "Install" ctx.Data["PageIsInstall"] = true if ctx.Req.Method == "GET" { // Get and assign value to install form. if len(form.Host) == 0 { form.Host = models.DbCfg.Host } if len(form.User) == 0 { form.User = models.DbCfg.User } if len(form.Passwd) == 0 { form.Passwd = models.DbCfg.Pwd } if len(form.DatabaseName) == 0 { form.DatabaseName = models.DbCfg.Name } if len(form.DatabasePath) == 0 { form.DatabasePath = models.DbCfg.Path } if len(form.RepoRootPath) == 0 { form.RepoRootPath = base.RepoRootPath } if len(form.RunUser) == 0 { form.RunUser = base.RunUser } if len(form.Domain) == 0 { form.Domain = base.Domain } if len(form.AppUrl) == 0 { form.AppUrl = base.AppUrl } auth.AssignForm(form, ctx.Data) ctx.HTML(200, "install") return } if ctx.HasError() { ctx.HTML(200, "install") return } // Pass basic check, now test configuration. // Test database setting. dbTypes := map[string]string{"mysql": "mysql", "pgsql": "postgres", "sqlite": "sqlite3"} models.DbCfg.Type = dbTypes[form.Database] models.DbCfg.Host = form.Host models.DbCfg.User = form.User models.DbCfg.Pwd = form.Passwd models.DbCfg.Name = form.DatabaseName models.DbCfg.SslMode = form.SslMode models.DbCfg.Path = form.DatabasePath // Set test engine. var x *xorm.Engine if err := models.NewTestEngine(x); err != nil { if strings.Contains(err.Error(), `Unknown database type: sqlite3`) { ctx.RenderWithErr("Your release version does not support SQLite3, please download the official binary version "+ "from https://github.com/gogits/gogs/wiki/Install-from-binary, NOT the gobuild version.", "install", &form) } else { ctx.RenderWithErr("Database setting is not correct: "+err.Error(), "install", &form) } return } // Test repository root path. if err := os.MkdirAll(form.RepoRootPath, os.ModePerm); err != nil { ctx.RenderWithErr("Repository root path is invalid: "+err.Error(), "install", &form) return } // Check run user. curUser := os.Getenv("USERNAME") if len(curUser) == 0 { curUser = os.Getenv("USER") } // Does not check run user when the install lock is off. if form.RunUser != curUser { ctx.RenderWithErr("Run user isn't the current user: "******" -> "+curUser, "install", &form) return } // Save settings. base.Cfg.SetValue("database", "DB_TYPE", models.DbCfg.Type) base.Cfg.SetValue("database", "HOST", models.DbCfg.Host) base.Cfg.SetValue("database", "NAME", models.DbCfg.Name) base.Cfg.SetValue("database", "USER", models.DbCfg.User) base.Cfg.SetValue("database", "PASSWD", models.DbCfg.Pwd) base.Cfg.SetValue("database", "SSL_MODE", models.DbCfg.SslMode) base.Cfg.SetValue("database", "PATH", models.DbCfg.Path) base.Cfg.SetValue("repository", "ROOT", form.RepoRootPath) base.Cfg.SetValue("", "RUN_USER", form.RunUser) base.Cfg.SetValue("server", "DOMAIN", form.Domain) base.Cfg.SetValue("server", "ROOT_URL", form.AppUrl) if len(strings.TrimSpace(form.SmtpHost)) > 0 { base.Cfg.SetValue("mailer", "ENABLED", "true") base.Cfg.SetValue("mailer", "HOST", form.SmtpHost) base.Cfg.SetValue("mailer", "USER", form.SmtpEmail) base.Cfg.SetValue("mailer", "PASSWD", form.SmtpPasswd) base.Cfg.SetValue("service", "REGISTER_EMAIL_CONFIRM", base.ToStr(form.RegisterConfirm == "on")) base.Cfg.SetValue("service", "ENABLE_NOTIFY_MAIL", base.ToStr(form.MailNotify == "on")) } base.Cfg.SetValue("", "RUN_MODE", "prod") base.Cfg.SetValue("security", "INSTALL_LOCK", "true") os.MkdirAll("custom/conf", os.ModePerm) if err := goconfig.SaveConfigFile(base.Cfg, "custom/conf/app.ini"); err != nil { ctx.RenderWithErr("Fail to save configuration: "+err.Error(), "install", &form) return } GlobalInit() // Create admin account. if _, err := models.RegisterUser(&models.User{Name: form.AdminName, Email: form.AdminEmail, Passwd: form.AdminPasswd, IsAdmin: true, IsActive: true}); err != nil { if err != models.ErrUserAlreadyExist { ctx.RenderWithErr("Admin account setting is invalid: "+err.Error(), "install", &form) return } log.Info("Admin account already exist") } log.Info("First-time run install finished!") ctx.Redirect("/user/login") }
func SignUpPost(ctx *middleware.Context, form auth.RegisterForm) { ctx.Data["Title"] = "Sign Up" ctx.Data["PageIsSignUp"] = true if base.Service.DisableRegistration { ctx.Handle(403, "user.SignUpPost", nil) return } sid, isOauth := ctx.Session.Get("socialId").(int64) if isOauth { ctx.Data["IsSocialLogin"] = true } 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, "user/signup") return } u := &models.User{ Name: form.UserName, Email: form.Email, Passwd: form.Password, IsActive: !base.Service.RegisterEmailConfirm || isOauth, } var err error if u, err = models.RegisterUser(u); err != nil { switch err { case models.ErrUserAlreadyExist: ctx.RenderWithErr("Username has been already taken", "user/signup", &form) case models.ErrEmailAlreadyUsed: ctx.RenderWithErr("E-mail address has been already used", "user/signup", &form) case models.ErrUserNameIllegal: ctx.RenderWithErr(models.ErrRepoNameIllegal.Error(), "user/signup", &form) default: ctx.Handle(500, "user.SignUp(RegisterUser)", err) } return } log.Trace("%s User created: %s", ctx.Req.RequestURI, form.UserName) // Bind social account. if isOauth { if err = models.BindUserOauth2(u.Id, sid); err != nil { ctx.Handle(500, "user.SignUp(BindUserOauth2)", err) return } ctx.Session.Delete("socialId") log.Trace("%s OAuth binded: %s -> %d", ctx.Req.RequestURI, form.UserName, sid) } // Send confirmation e-mail, no need for social account. if !isOauth && base.Service.RegisterEmailConfirm && u.Id > 1 { mailer.SendRegisterMail(ctx.Render, u) ctx.Data["IsSendRegisterMail"] = true ctx.Data["Email"] = u.Email ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60 ctx.HTML(200, "user/activate") if err = ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil { log.Error("Set cache(MailResendLimit) fail: %v", err) } return } ctx.Redirect("/user/login") }
func SignUp(ctx *middleware.Context, form auth.RegisterForm) { ctx.Data["Title"] = "Sign Up" ctx.Data["PageIsSignUp"] = true if base.Service.DisenableRegisteration { ctx.Data["DisenableRegisteration"] = true ctx.HTML(200, "user/signup") return } if ctx.Req.Method == "GET" { ctx.HTML(200, "user/signup") 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, "user/signup") return } u := &models.User{ Name: form.UserName, Email: form.Email, Passwd: form.Password, IsActive: !base.Service.RegisterEmailConfirm, } var err error if u, err = models.RegisterUser(u); err != nil { switch err { case models.ErrUserAlreadyExist: ctx.RenderWithErr("Username has been already taken", "user/signup", &form) case models.ErrEmailAlreadyUsed: ctx.RenderWithErr("E-mail address has been already used", "user/signup", &form) case models.ErrUserNameIllegal: ctx.RenderWithErr(models.ErrRepoNameIllegal.Error(), "user/signup", &form) default: ctx.Handle(200, "user.SignUp", err) } return } log.Trace("%s User created: %s", ctx.Req.RequestURI, strings.ToLower(form.UserName)) // Send confirmation e-mail. if base.Service.RegisterEmailConfirm && u.Id > 1 { mailer.SendRegisterMail(ctx.Render, u) ctx.Data["IsSendRegisterMail"] = true ctx.Data["Email"] = u.Email ctx.Data["Hours"] = base.Service.ActiveCodeLives / 60 ctx.HTML(200, "user/active") if err = ctx.Cache.Put("MailResendLimit_"+u.LowerName, u.LowerName, 180); err != nil { log.Error("Set cache(MailResendLimit) fail: %v", err) } return } ctx.Redirect("/user/login") }
func CompareAndPullRequestPost(ctx *context.Context, form auth.CreateIssueForm) { ctx.Data["Title"] = ctx.Tr("repo.pulls.compare_changes") ctx.Data["PageIsComparePull"] = true ctx.Data["IsDiffCompare"] = true ctx.Data["RequireHighlightJS"] = true renderAttachmentSettings(ctx) var ( repo = ctx.Repo.Repository attachments []string ) headUser, headRepo, headGitRepo, prInfo, baseBranch, headBranch := ParseCompareInfo(ctx) if ctx.Written() { return } labelIDs, milestoneID, assigneeID := ValidateRepoMetas(ctx, form) if ctx.Written() { return } if setting.AttachmentEnabled { attachments = form.Files } if ctx.HasError() { auth.AssignForm(form, ctx.Data) // This stage is already stop creating new pull request, so it does not matter if it has // something to compare or not. PrepareCompareDiff(ctx, headUser, headRepo, headGitRepo, prInfo, baseBranch, headBranch) if ctx.Written() { return } ctx.HTML(200, COMPARE_PULL) return } patch, err := headGitRepo.GetPatch(prInfo.MergeBase, headBranch) if err != nil { ctx.Handle(500, "GetPatch", err) return } pullIssue := &models.Issue{ RepoID: repo.ID, Index: repo.NextIssueIndex(), Title: form.Title, PosterID: ctx.User.ID, Poster: ctx.User, MilestoneID: milestoneID, AssigneeID: assigneeID, IsPull: true, Content: form.Content, } pullRequest := &models.PullRequest{ HeadRepoID: headRepo.ID, BaseRepoID: repo.ID, HeadUserName: headUser.Name, HeadBranch: headBranch, BaseBranch: baseBranch, HeadRepo: headRepo, BaseRepo: repo, MergeBase: prInfo.MergeBase, Type: models.PULL_REQUEST_GOGS, } // FIXME: check error in the case two people send pull request at almost same time, give nice error prompt // instead of 500. if err := models.NewPullRequest(repo, pullIssue, labelIDs, attachments, pullRequest, patch); err != nil { ctx.Handle(500, "NewPullRequest", err) return } else if err := pullRequest.PushToBaseRepo(); err != nil { ctx.Handle(500, "PushToBaseRepo", err) return } log.Trace("Pull request created: %d/%d", repo.ID, pullIssue.ID) ctx.Redirect(ctx.Repo.RepoLink + "/pulls/" + com.ToStr(pullIssue.Index)) }