// checkRefs checks if given packages are still referencing this one. func checkRefs(pinfo *PkgInfo) { var buf bytes.Buffer pinfo.RefNum = 0 refIDs := strings.Split(pinfo.RefIDs, "|") for i := range refIDs { if len(refIDs[i]) == 0 { continue } fmt.Println(com.StrTo(refIDs[i][1:]).MustInt64()) pkg, _ := GetPkgInfoById(com.StrTo(refIDs[i][1:]).MustInt64()) if pkg == nil { continue } if strings.Index(pkg.ImportIDs, "$"+com.ToStr(pinfo.ID)+"|") == -1 { continue } buf.WriteString("$") buf.WriteString(com.ToStr(pkg.ID)) buf.WriteString("|") pinfo.RefNum++ } pinfo.RefIDs = buf.String() }
func CheckRepoStats() { if isCheckingRepos { return } isCheckingRepos = true defer func() { isCheckingRepos = false }() // Check count watchers results_watch, err := x.Query("SELECT r.id FROM `repository` r WHERE r.num_watches!=(SELECT count(*) FROM `watch` WHERE repo_id=r.id)") if err != nil { log.Error(4, "select repository check 'watch': %v", err) } for _, repo_id := range results_watch { log.Info("updating repository count 'watch'") repoID := com.StrTo(repo_id["id"]).MustInt64() _, err := x.Exec("UPDATE `repository` SET num_watches=(SELECT count(*) FROM `watch` WHERE repo_id=?) WHERE id=?", repoID, repoID) if err != nil { log.Error(4, "update repository check 'watch', repo %v: %v", repo_id, err) } } // Check count stars results_star, err := x.Query("SELECT s.id FROM `repository` s WHERE s.num_stars!=(SELECT count(*) FROM `star` WHERE repo_id=s.id)") if err != nil { log.Error(4, "select repository check 'star': %v", err) } for _, repo_id := range results_star { log.Info("updating repository count 'star'") repoID := com.StrTo(repo_id["id"]).MustInt64() _, err := x.Exec("UPDATE `repository` SET .num_stars=(SELECT count(*) FROM `star` WHERE repo_id=?) WHERE id=?", repoID, repoID) if err != nil { log.Error(4, "update repository check 'star', repo %v: %v", repo_id, err) } } }
// getHistory returns browse history. func getHistory(ctx *middleware.Context) []*models.PkgInfo { pairs := strings.Split(ctx.GetCookie("user_history"), "|") pkgs := make([]*models.PkgInfo, 0, len(pairs)) for _, pair := range pairs { infos := strings.Split(pair, ":") if len(infos) != 2 { continue } pid := com.StrTo(infos[0]).MustInt64() if pid == 0 { continue } pinfo, _ := models.GetPkgInfoById(pid) if pinfo == nil { continue } pinfo.LastView = com.StrTo(infos[1]).MustInt64() pkgs = append(pkgs, pinfo) } return pkgs }
// UpdateCurrentTTY swagger:route POST /codetainer/{id}/tty codetainer updateCurrentTTY // // Update the codetainer TTY height and width. // // Responses: // default: APIErrorResponse // 200: TTYBody // func RouteApiV1CodetainerUpdateCurrentTTY(ctx *Context) error { vars := mux.Vars(ctx.R) id := vars["id"] if id == "" { return jsonError(errors.New("id is required"), ctx.W) } client, err := GlobalConfig.GetDockerClient() if err != nil { return jsonError(err, ctx.W) } height := com.StrTo(ctx.R.FormValue("height")).MustInt() if height == 0 { return jsonError(errors.New("height is required"), ctx.W) } width := com.StrTo(ctx.R.FormValue("width")).MustInt() if width == 0 { return jsonError(errors.New("width is required"), ctx.W) } err = client.ResizeContainerTTY(id, height, width) if err != nil { return jsonError(err, ctx.W) } tty := TTY{Height: height, Width: width} return renderJson(map[string]interface{}{ "tty": tty, }, ctx.W) }
func SearchRepos(ctx *middleware.Context) { opt := models.SearchOption{ Keyword: path.Base(ctx.Query("q")), Uid: com.StrTo(ctx.Query("uid")).MustInt64(), Limit: com.StrTo(ctx.Query("limit")).MustInt(), } if opt.Limit == 0 { opt.Limit = 10 } // Check visibility. if ctx.IsSigned && opt.Uid > 0 { if ctx.User.Id == opt.Uid { opt.Private = true } else { u, err := models.GetUserById(opt.Uid) if err != nil { ctx.JSON(500, map[string]interface{}{ "ok": false, "error": err.Error(), }) return } if u.IsOrganization() && u.IsOwnedBy(ctx.User.Id) { opt.Private = true } // FIXME: how about collaborators? } } repos, err := models.SearchRepositoryByName(opt) if err != nil { ctx.JSON(500, map[string]interface{}{ "ok": false, "error": err.Error(), }) return } results := make([]*sdk.Repository, len(repos)) for i := range repos { if err = repos[i].GetOwner(); err != nil { ctx.JSON(500, map[string]interface{}{ "ok": false, "error": err.Error(), }) return } results[i] = &sdk.Repository{ Id: repos[i].Id, FullName: path.Join(repos[i].Owner.Name, repos[i].Name), } } ctx.JSON(200, map[string]interface{}{ "ok": true, "data": results, }) }
// https://github.com/gigforks/go-gogs-client/wiki/Repositories#search-repositories func Search(ctx *context.APIContext) { opts := &models.SearchRepoOptions{ Keyword: path.Base(ctx.Query("q")), OwnerID: com.StrTo(ctx.Query("uid")).MustInt64(), PageSize: com.StrTo(ctx.Query("limit")).MustInt(), } if opts.PageSize == 0 { opts.PageSize = 10 } // Check visibility. if ctx.IsSigned && opts.OwnerID > 0 { if ctx.User.Id == opts.OwnerID { opts.Private = true } else { u, err := models.GetUserByID(opts.OwnerID) if err != nil { ctx.JSON(500, map[string]interface{}{ "ok": false, "error": err.Error(), }) return } if u.IsOrganization() && u.IsOwnedBy(ctx.User.Id) { opts.Private = true } // FIXME: how about collaborators? } } repos, _, err := models.SearchRepositoryByName(opts) if err != nil { ctx.JSON(500, map[string]interface{}{ "ok": false, "error": err.Error(), }) return } results := make([]*api.Repository, len(repos)) for i := range repos { if err = repos[i].GetOwner(); err != nil { ctx.JSON(500, map[string]interface{}{ "ok": false, "error": err.Error(), }) return } results[i] = &api.Repository{ ID: repos[i].ID, FullName: path.Join(repos[i].Owner.Name, repos[i].Name), } } ctx.JSON(200, map[string]interface{}{ "ok": true, "data": results, }) }
func EditUserPost(ctx *context.Context, form auth.AdminEditUserForm) { ctx.Data["Title"] = ctx.Tr("admin.users.edit_account") ctx.Data["PageIsAdmin"] = true ctx.Data["PageIsAdminUsers"] = true u := prepareUserInfo(ctx) if ctx.Written() { return } if ctx.HasError() { ctx.HTML(200, USER_EDIT) return } fields := strings.Split(form.LoginType, "-") if len(fields) == 2 { loginType := models.LoginType(com.StrTo(fields[0]).MustInt()) loginSource := com.StrTo(fields[1]).MustInt64() if u.LoginSource != loginSource { u.LoginSource = loginSource u.LoginType = loginType } } if len(form.Password) > 0 { u.Passwd = form.Password u.Salt = models.GetUserSalt() u.EncodePasswd() } u.LoginName = form.LoginName u.FullName = form.FullName u.Email = form.Email u.Website = form.Website u.Location = form.Location u.MaxRepoCreation = form.MaxRepoCreation u.IsActive = form.Active u.IsAdmin = form.Admin u.AllowGitHook = form.AllowGitHook u.AllowImportLocal = form.AllowImportLocal u.ProhibitLogin = form.ProhibitLogin if err := models.UpdateUser(u); err != nil { if models.IsErrEmailAlreadyUsed(err) { ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_been_used"), USER_EDIT, &form) } else { ctx.Handle(500, "UpdateUser", err) } return } log.Trace("Account profile updated by admin (%s): %s", ctx.User.Name, u.Name) ctx.Flash.Success(ctx.Tr("admin.users.update_profile_success")) ctx.Redirect(setting.AppSubUrl + "/admin/users/" + ctx.Params(":userid")) }
func NewUserPost(ctx *middleware.Context, form auth.AdminCrateUserForm) { ctx.Data["Title"] = ctx.Tr("admin.users.new_account") ctx.Data["PageIsAdmin"] = true ctx.Data["PageIsAdminUsers"] = true sources, err := models.LoginSources() if err != nil { ctx.Handle(500, "LoginSources", err) return } ctx.Data["Sources"] = sources if ctx.HasError() { ctx.HTML(200, USER_NEW) return } u := &models.User{ Name: form.UserName, Email: form.Email, Passwd: form.Password, IsActive: true, LoginType: models.PLAIN, } if len(form.LoginType) > 0 { fields := strings.Split(form.LoginType, "-") if len(fields) == 2 { u.LoginType = models.LoginType(com.StrTo(fields[0]).MustInt()) u.LoginSource = com.StrTo(fields[1]).MustInt64() u.LoginName = form.LoginName } } if err := models.CreateUser(u); err != nil { switch { case models.IsErrUserAlreadyExist(err): ctx.Data["Err_UserName"] = true ctx.RenderWithErr(ctx.Tr("form.username_been_taken"), USER_NEW, &form) case models.IsErrEmailAlreadyUsed(err): ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_been_used"), USER_NEW, &form) case models.IsErrNameReserved(err): ctx.Data["Err_UserName"] = true ctx.RenderWithErr(ctx.Tr("user.form.name_reserved", err.(models.ErrNameReserved).Name), USER_NEW, &form) case models.IsErrNamePatternNotAllowed(err): ctx.Data["Err_UserName"] = true ctx.RenderWithErr(ctx.Tr("user.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), USER_NEW, &form) default: ctx.Handle(500, "CreateUser", err) } return } log.Trace("Account created by admin(%s): %s", ctx.User.Name, u.Name) ctx.Flash.Success(ctx.Tr("admin.users.new_success", u.Name)) ctx.Redirect(setting.AppSubUrl + "/admin/users/" + com.ToStr(u.Id)) }
func CheckRepoStats() { if isCheckingRepos { return } isCheckingRepos = true defer func() { isCheckingRepos = false }() log.Trace("Doing: CheckRepoStats") // ***** START: Watch ***** results, err := x.Query("SELECT repo.id FROM `repository` repo WHERE repo.num_watches!=(SELECT COUNT(*) FROM `watch` WHERE repo_id=repo.id)") if err != nil { log.Error(4, "Select repository check 'watch': %v", err) return } for _, watch := range results { repoID := com.StrTo(watch["id"]).MustInt64() log.Trace("Updating repository count 'watch': %d", repoID) _, err = x.Exec("UPDATE `repository` SET num_watches=(SELECT COUNT(*) FROM `watch` WHERE repo_id=?) WHERE id=?", repoID, repoID) if err != nil { log.Error(4, "Update repository check 'watch'[%d]: %v", repoID, err) } } // ***** END: Watch ***** // ***** START: Star ***** results, err = x.Query("SELECT repo.id FROM `repository` repo WHERE repo.num_stars!=(SELECT COUNT(*) FROM `star` WHERE repo_id=repo.id)") if err != nil { log.Error(4, "Select repository check 'star': %v", err) return } for _, star := range results { repoID := com.StrTo(star["id"]).MustInt64() log.Trace("Updating repository count 'star': %d", repoID) _, err = x.Exec("UPDATE `repository` SET num_stars=(SELECT COUNT(*) FROM `star` WHERE repo_id=?) WHERE id=?", repoID, repoID) if err != nil { log.Error(4, "Update repository check 'star'[%d]: %v", repoID, err) } } // ***** END: Star ***** // ***** START: Label ***** results, err = x.Query("SELECT label.id FROM `label` WHERE label.num_issues!=(SELECT COUNT(*) FROM `issue_label` WHERE label_id=label.id)") if err != nil { log.Error(4, "Select label check 'num_issues': %v", err) return } for _, label := range results { labelID := com.StrTo(label["id"]).MustInt64() log.Trace("Updating label count 'num_issues': %d", labelID) _, err = x.Exec("UPDATE `label` SET num_issues=(SELECT COUNT(*) FROM `issue_label` WHERE label_id=?) WHERE id=?", labelID, labelID) if err != nil { log.Error(4, "Update label check 'num_issues'[%d]: %v", labelID, err) } } // ***** END: Label ***** }
func NewUserPost(ctx *middleware.Context, form auth.RegisterForm) { ctx.Data["Title"] = ctx.Tr("admin.users.new_account") ctx.Data["PageIsAdmin"] = true ctx.Data["PageIsAdminUsers"] = true if ctx.HasError() { ctx.HTML(200, USER_NEW) return } if form.Password != form.Retype { ctx.Data["Err_Password"] = true ctx.RenderWithErr(ctx.Tr("form.password_not_match"), USER_NEW, &form) return } u := &models.User{ Name: form.UserName, Email: form.Email, Passwd: form.Password, IsActive: true, LoginType: models.PLAIN, } if len(form.LoginType) > 0 { // NOTE: need rewrite. fields := strings.Split(form.LoginType, "-") tp, _ := com.StrTo(fields[0]).Int() u.LoginType = models.LoginType(tp) u.LoginSource, _ = com.StrTo(fields[1]).Int64() u.LoginName = form.LoginName } if err := models.CreateUser(u); err != nil { switch { case models.IsErrUserAlreadyExist(err): ctx.Data["Err_UserName"] = true ctx.RenderWithErr(ctx.Tr("form.username_been_taken"), USER_NEW, &form) case models.IsErrEmailAlreadyUsed(err): ctx.Data["Err_Email"] = true ctx.RenderWithErr(ctx.Tr("form.email_been_used"), USER_NEW, &form) case models.IsErrNameReserved(err): ctx.Data["Err_UserName"] = true ctx.RenderWithErr(ctx.Tr("user.form.name_reserved", err.(models.ErrNameReserved).Name), USER_NEW, &form) case models.IsErrNamePatternNotAllowed(err): ctx.Data["Err_UserName"] = true ctx.RenderWithErr(ctx.Tr("user.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), USER_NEW, &form) default: ctx.Handle(500, "CreateUser", err) } return } log.Trace("Account created by admin(%s): %s", ctx.User.Name, u.Name) ctx.Redirect(setting.AppSubUrl + "/admin/users") }
func teamToTeamRepo(x *xorm.Engine) error { type TeamRepo struct { ID int64 `xorm:"pk autoincr"` OrgID int64 `xorm:"INDEX"` TeamID int64 `xorm:"UNIQUE(s)"` RepoID int64 `xorm:"UNIQUE(s)"` } teamRepos := make([]*TeamRepo, 0, 50) results, err := x.Query("SELECT `id`,`org_id`,`repo_ids` FROM `team`") if err != nil { if strings.Contains(err.Error(), "no such column") { return nil } return fmt.Errorf("select teams: %v", err) } for _, team := range results { orgID := com.StrTo(team["org_id"]).MustInt64() teamID := com.StrTo(team["id"]).MustInt64() // #1032: legacy code can have duplicated IDs for same repository. mark := make(map[int64]bool) for _, idStr := range strings.Split(string(team["repo_ids"]), "|") { repoID := com.StrTo(strings.TrimPrefix(idStr, "$")).MustInt64() if repoID == 0 || mark[repoID] { continue } mark[repoID] = true teamRepos = append(teamRepos, &TeamRepo{ OrgID: orgID, TeamID: teamID, RepoID: repoID, }) } } sess := x.NewSession() defer sessionRelease(sess) if err = sess.Begin(); err != nil { return err } if err = sess.Sync2(new(TeamRepo)); err != nil { return fmt.Errorf("sync2: %v", err) } else if _, err = sess.Insert(teamRepos); err != nil { return fmt.Errorf("insert team-repos: %v", err) } return sess.Commit() }
func trimSpace(x *xorm.Engine) error { results, e := x.Query("select id,body from site_feed") if e != nil { return e } for _, v := range results { body := strings.TrimSpace(com.StrTo(v["body"]).String()) _, e := x.Exec("update site_feed set body = ? where id = ?", body, com.StrTo(v["id"]).MustInt64()) if e != nil { return e } } return nil }
func issueToIssueLabel(x *xorm.Engine) error { type IssueLabel struct { ID int64 `xorm:"pk autoincr"` IssueID int64 `xorm:"UNIQUE(s)"` LabelID int64 `xorm:"UNIQUE(s)"` } issueLabels := make([]*IssueLabel, 0, 50) results, err := x.Query("SELECT `id`,`label_ids` FROM `issue`") if err != nil { if strings.Contains(err.Error(), "no such column") || strings.Contains(err.Error(), "Unknown column") { return nil } return fmt.Errorf("select issues: %v", err) } for _, issue := range results { issueID := com.StrTo(issue["id"]).MustInt64() // Just in case legacy code can have duplicated IDs for same label. mark := make(map[int64]bool) for _, idStr := range strings.Split(string(issue["label_ids"]), "|") { labelID := com.StrTo(strings.TrimPrefix(idStr, "$")).MustInt64() if labelID == 0 || mark[labelID] { continue } mark[labelID] = true issueLabels = append(issueLabels, &IssueLabel{ IssueID: issueID, LabelID: labelID, }) } } sess := x.NewSession() defer sessionRelease(sess) if err = sess.Begin(); err != nil { return err } if err = sess.Sync2(new(IssueLabel)); err != nil { return fmt.Errorf("sync2: %v", err) } else if _, err = sess.Insert(issueLabels); err != nil { return fmt.Errorf("insert issue-labels: %v", err) } return sess.Commit() }
func renamePullRequestFields(x *xorm.Engine) (err error) { type PullRequest struct { ID int64 `xorm:"pk autoincr"` PullID int64 `xorm:"INDEX"` PullIndex int64 HeadBarcnh string IssueID int64 `xorm:"INDEX"` Index int64 HeadBranch string } if err = x.Sync(new(PullRequest)); err != nil { return fmt.Errorf("sync: %v", err) } results, err := x.Query("SELECT `id`,`pull_id`,`pull_index`,`head_barcnh` FROM `pull_request`") if err != nil { if strings.Contains(err.Error(), "no such column") { return nil } return fmt.Errorf("select pull requests: %v", err) } sess := x.NewSession() defer sessionRelease(sess) if err = sess.Begin(); err != nil { return err } var pull *PullRequest for _, pr := range results { pull = &PullRequest{ ID: com.StrTo(pr["id"]).MustInt64(), IssueID: com.StrTo(pr["pull_id"]).MustInt64(), Index: com.StrTo(pr["pull_index"]).MustInt64(), HeadBranch: string(pr["head_barcnh"]), } if pull.Index == 0 { continue } if _, err = sess.Id(pull.ID).Update(pull); err != nil { return err } } return sess.Commit() }
// DeleteLabel delete a label of given repository. func DeleteLabel(repoId int64, strId string) error { id, _ := com.StrTo(strId).Int64() l, err := GetLabelById(id) if err != nil { if err == ErrLabelNotExist { return nil } return err } issues, err := GetIssuesByLabel(repoId, strId) if err != nil { return err } sess := x.NewSession() defer sess.Close() if err = sess.Begin(); err != nil { return err } for _, issue := range issues { issue.LabelIds = strings.Replace(issue.LabelIds, "$"+strId+"|", "", -1) if _, err = sess.Id(issue.Id).AllCols().Update(issue); err != nil { sess.Rollback() return err } } if _, err = sess.Delete(l); err != nil { sess.Rollback() return err } return sess.Commit() }
func FromFile(fpath string) (Menus, error) { var ( res Menus ) lines, e := dry.FileGetNonEmptyLines(fpath) if e != nil { return nil, e } for _, line := range lines { var m Menu arr := lineRe.FindStringSubmatch(line) if len(arr) != 4 { continue } m.Order = com.StrTo(arr[1]).MustInt() m.Title = arr[2] m.Link = arr[3] if line[0] == ' ' && line[1] == ' ' { parent := res[len(res)-1] m.Link = parent.Link + m.Link res[len(res)-1].Items = append(res[len(res)-1].Items, m) } else { res = append(res, m) } } return res, nil }
func SlackHooksEditPost(ctx *middleware.Context, form auth.NewSlackHookForm) { ctx.Data["Title"] = ctx.Tr("repo.settings") ctx.Data["PageIsSettingsHooks"] = true ctx.Data["PageIsSettingsHooksEdit"] = true hookId := com.StrTo(ctx.Params(":id")).MustInt64() if hookId == 0 { ctx.Handle(404, "SlackHooksEditPost(hookId)", nil) return } orCtx, err := getOrgRepoCtx(ctx) if err != nil { ctx.Handle(500, "SlackHooksEditPost(getOrgRepoCtx)", err) return } w, err := models.GetWebhookById(hookId) if err != nil { if err == models.ErrWebhookNotExist { ctx.Handle(404, "GetWebhookById", nil) } else { ctx.Handle(500, "GetWebhookById", err) } return } w.GetEvent() ctx.Data["Webhook"] = w if ctx.HasError() { ctx.HTML(200, orCtx.NewTemplate) return } meta, err := json.Marshal(&models.Slack{ Domain: form.Domain, Channel: form.Channel, Token: form.Token, }) if err != nil { ctx.Handle(500, "SlackHooksNewPost: JSON marshal failed: ", err) return } w.Url = models.GetSlackURL(form.Domain, form.Token) w.Meta = string(meta) w.HookEvent = &models.HookEvent{ PushOnly: form.PushOnly, } w.IsActive = form.Active if err := w.UpdateEvent(); err != nil { ctx.Handle(500, "UpdateEvent", err) return } else if err := models.UpdateWebhook(w); err != nil { ctx.Handle(500, "SlackHooksEditPost", err) return } ctx.Flash.Success(ctx.Tr("repo.settings.update_hook_success")) ctx.Redirect(fmt.Sprintf("%s/settings/hooks/%d", orCtx.Link, hookId)) }
// updateHistory updates browser history. func updateHistory(ctx *middleware.Context, id int64) { pairs := make([]string, 1, 10) pairs[0] = com.ToStr(id) + ":" + com.ToStr(time.Now().UTC().Unix()) count := 0 for _, pair := range strings.Split(ctx.GetCookie("user_history"), "|") { infos := strings.Split(pair, ":") if len(infos) != 2 { continue } pid := com.StrTo(infos[0]).MustInt64() if pid == 0 || pid == id { continue } pairs = append(pairs, pair) count++ if count == 9 { break } } ctx.SetCookie("user_history", strings.Join(pairs, "|"), 9999999) }
func NewId(id string) (SteamId, error) { valid, err := regexp.MatchString(`STEAM_[0-5]:[01]:\d+`, id) if err != nil { return SteamId(0), err } if len(fmt.Sprint(id)) != 17 && !valid { id = fmt.Sprint(Convert32to64(uint32(com.StrTo(id).MustInt()))) } if valid { id = strings.Replace(id, "STEAM_", "", -1) // remove STEAM_ splitid := strings.Split(id, ":") // split 0:1:00000000 into 0 1 00000000 universe, _ := strconv.ParseInt(splitid[0], 10, 32) if universe == 0 { //EUniverse_Invalid universe = 1 //EUniverse_Public } authServer, _ := strconv.ParseUint(splitid[1], 10, 32) accId, _ := strconv.ParseUint(splitid[2], 10, 32) accountType := int32(1) //EAccountType_Individual accountId := (uint32(accId) << 1) | uint32(authServer) return NewIdAdv(uint32(accountId), 1, int32(universe), accountType), nil } else { newid, err := strconv.ParseUint(id, 10, 64) if err != nil { return SteamId(0), err } return SteamId(newid), nil } return SteamId(0), errors.New(fmt.Sprintf("Invalid SteamId: %s\n", id)) }
func (c *LedisCacher) startGC() { if c.interval < 1 { return } kvs, err := c.c.HGetAll(defaultHSetName) if err != nil { log.Printf("cache/redis: error garbage collecting(get): %v", err) return } now := time.Now().Unix() for _, v := range kvs { expire := com.StrTo(v.Value).MustInt64() if expire == 0 || now < expire { continue } if err = c.Delete(string(v.Field)); err != nil { log.Printf("cache/redis: error garbage collecting(delete): %v", err) continue } } time.AfterFunc(time.Duration(c.interval)*time.Second, func() { c.startGC() }) }
// StartAndGC starts GC routine based on config string settings. // AdapterConfig: data_dir=./app.db,db=0 func (c *LedisCacher) StartAndGC(opts cache.Options) error { c.interval = opts.Interval cfg, err := ini.Load([]byte(strings.Replace(opts.AdapterConfig, ",", "\n", -1))) if err != nil { return err } db := 0 opt := new(config.Config) for k, v := range cfg.Section("").KeysHash() { switch k { case "data_dir": opt.DataDir = v case "db": db = com.StrTo(v).MustInt() default: return fmt.Errorf("session/ledis: unsupported option '%s'", k) } } l, err := ledis.Open(opt) if err != nil { return fmt.Errorf("session/ledis: error opening db: %v", err) } c.c, err = l.Select(db) if err != nil { return err } go c.startGC() return nil }
func Webhooks(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("org.settings") ctx.Data["PageIsSettingsHooks"] = true ctx.Data["BaseLink"] = ctx.Org.OrgLink ctx.Data["Description"] = ctx.Tr("org.settings.hooks_desc") // Delete web hook. remove := com.StrTo(ctx.Query("remove")).MustInt64() if remove > 0 { if err := models.DeleteWebhook(remove); err != nil { ctx.Handle(500, "DeleteWebhook", err) return } ctx.Flash.Success(ctx.Tr("repo.settings.remove_hook_success")) ctx.Redirect(ctx.Org.OrgLink + "/settings/hooks") return } ws, err := models.GetWebhooksByOrgId(ctx.Org.Organization.Id) if err != nil { ctx.Handle(500, "GetWebhooksByOrgId", err) return } ctx.Data["Webhooks"] = ws ctx.HTML(200, SETTINGS_HOOKS) }
func Webhooks(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("repo.settings") ctx.Data["PageIsSettingsHooks"] = true // Delete web hook. remove := com.StrTo(ctx.Query("remove")).MustInt64() if remove > 0 { if err := models.DeleteWebhook(remove); err != nil { ctx.Handle(500, "DeleteWebhook", err) return } ctx.Flash.Success(ctx.Tr("repo.settings.remove_hook_success")) ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks") return } ws, err := models.GetWebhooksByRepoId(ctx.Repo.Repository.Id) if err != nil { ctx.Handle(500, "GetWebhooksByRepoId", err) return } ctx.Data["Webhooks"] = ws ctx.HTML(200, HOOKS) }
func DeleteAuthSource(ctx *middleware.Context) { id := com.StrTo(ctx.Params(":authid")).MustInt64() if id == 0 { ctx.Handle(404, "DeleteAuthSource", nil) return } a, err := models.GetLoginSourceById(id) if err != nil { ctx.Handle(500, "GetLoginSourceById", err) return } if err = models.DelLoginSource(a); err != nil { switch err { case models.ErrAuthenticationUserUsed: ctx.Flash.Error("form.still_own_user") ctx.Redirect(setting.AppSubUrl + "/admin/auths/" + ctx.Params(":authid")) default: ctx.Handle(500, "DelLoginSource", err) } return } log.Trace("Authentication deleted by admin(%s): %s", ctx.User.Name, a.Name) ctx.Redirect(setting.AppSubUrl + "/admin/auths") }
func EditUser(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("admin.users.edit_account") ctx.Data["PageIsAdmin"] = true ctx.Data["PageIsAdminUsers"] = true uid := com.StrTo(ctx.Params(":userid")).MustInt64() if uid == 0 { ctx.Handle(404, "EditUser", nil) return } u, err := models.GetUserById(uid) if err != nil { ctx.Handle(500, "GetUserById", err) return } ctx.Data["User"] = u auths, err := models.GetAuths() if err != nil { ctx.Handle(500, "GetAuths", err) return } ctx.Data["LoginSources"] = auths ctx.HTML(200, USER_EDIT) }
// SSHKeyGenParsePublicKey extracts key type and length using ssh-keygen. func SSHKeyGenParsePublicKey(key string) (string, int, error) { // The ssh-keygen in Windows does not print key type, so no need go further. if setting.IsWindows { return "", 0, nil } tmpName, err := writeTmpKeyFile(key) if err != nil { return "", 0, fmt.Errorf("writeTmpKeyFile: %v", err) } defer os.Remove(tmpName) stdout, stderr, err := process.Exec("SSHKeyGenParsePublicKey", setting.SSH.KeygenPath, "-lf", tmpName) if err != nil { return "", 0, fmt.Errorf("Fail to parse public key: %s - %s", err, stderr) } if strings.Contains(stdout, "is not a public key file") { return "", 0, ErrKeyUnableVerify{stdout} } fields := strings.Split(stdout, " ") if len(fields) < 4 { return "", 0, fmt.Errorf("Invalid public key line: %s", stdout) } keyType := strings.Trim(fields[len(fields)-1], "()\r\n") return strings.ToLower(keyType), com.StrTo(fields[0]).MustInt(), nil }
// verify time limit code func VerifyTimeLimitCode(data string, minutes int, code string) bool { if len(code) <= 18 { return false } // split code start := code[:12] lives := code[12:18] if d, err := com.StrTo(lives).Int(); err == nil { minutes = d } // right active code retCode := CreateTimeLimitCode(data, minutes, start) if retCode == code && minutes > 0 { // check time is expired or not before, _ := time.ParseInLocation("200601021504", start, time.Local) now := time.Now() if before.Add(time.Minute*time.Duration(minutes)).Unix() > now.Unix() { return true } } return false }
func TeamsRepoAction(ctx *middleware.Context) { if !ctx.Org.IsOwner { ctx.Error(404) return } var err error switch ctx.Params(":action") { case "add": repoName := path.Base(ctx.Query("repo_name")) var repo *models.Repository repo, err = models.GetRepositoryByName(ctx.Org.Organization.Id, repoName) if err != nil { if models.IsErrRepoNotExist(err) { ctx.Flash.Error(ctx.Tr("org.teams.add_nonexistent_repo")) ctx.Redirect(ctx.Org.OrgLink + "/teams/" + ctx.Org.Team.LowerName + "/repositories") return } ctx.Handle(500, "GetRepositoryByName", err) return } err = ctx.Org.Team.AddRepository(repo) case "remove": err = ctx.Org.Team.RemoveRepository(com.StrTo(ctx.Query("repoid")).MustInt64()) } if err != nil { log.Error(3, "Action(%s): '%s' %v", ctx.Params(":action"), ctx.Org.Team.Name, err) ctx.Handle(500, "TeamsRepoAction", err) return } ctx.Redirect(ctx.Org.OrgLink + "/teams/" + ctx.Org.Team.LowerName + "/repositories") }
// StringsToInt64s converts a slice of string to a slice of int64. func StringsToInt64s(strs []string) []int64 { ints := make([]int64, len(strs)) for i := range strs { ints[i] = com.StrTo(strs[i]).MustInt64() } return ints }
func DeleteUser(ctx *middleware.Context) { uid := com.StrTo(ctx.Params(":userid")).MustInt64() if uid == 0 { ctx.Handle(404, "DeleteUser", nil) return } u, err := models.GetUserById(uid) if err != nil { ctx.Handle(500, "GetUserById", err) return } if err = models.DeleteUser(u); err != nil { switch { case models.IsErrUserOwnRepos(err): ctx.Flash.Error(ctx.Tr("admin.users.still_own_repo")) ctx.Redirect(setting.AppSubUrl + "/admin/users/" + ctx.Params(":userid")) case models.IsErrUserHasOrgs(err): ctx.Flash.Error(ctx.Tr("admin.users.still_has_org")) ctx.Redirect(setting.AppSubUrl + "/admin/users/" + ctx.Params(":userid")) default: ctx.Handle(500, "DeleteUser", err) } return } log.Trace("Account deleted by admin(%s): %s", ctx.User.Name, u.Name) ctx.Redirect(setting.AppSubUrl + "/admin/users") }