// SendIssueMentionMail sends mail notification for who are mentioned in issue. func SendIssueMentionMail(r macaron.Render, u, owner *models.User, repo *models.Repository, issue *models.Issue, tos []string) error { if len(tos) == 0 { return nil } subject := fmt.Sprintf("[%s] %s (#%d)", repo.Name, issue.Name, issue.Index) data := ComposeTplData(nil) data["IssueLink"] = fmt.Sprintf("%s/%s/issues/%d", owner.Name, repo.Name, issue.Index) data["Subject"] = subject data["ActUserName"] = u.DisplayName() data["Content"] = string(markdown.RenderSpecialLink([]byte(issue.Content), owner.Name+"/"+repo.Name, repo.ComposeMetas())) body, err := r.HTMLString(string(NOTIFY_MENTION), data) if err != nil { return fmt.Errorf("HTMLString: %v", err) } msg := NewMessage(tos, subject, body) msg.Info = fmt.Sprintf("Subject: %s, issue mention", subject) SendAsync(msg) return nil }
func checkUserFollowing(ctx *context.APIContext, u *models.User, followID int64) { if u.IsFollowing(followID) { ctx.Status(204) } else { ctx.Status(404) } }
func listUserFollowing(ctx *context.APIContext, u *models.User) { users, err := u.GetFollowing(ctx.QueryInt("page")) if err != nil { ctx.Error(500, "GetFollowing", err) return } responseApiUsers(ctx, users) }
func ToOrganization(org *models.User) *api.Organization { return &api.Organization{ ID: org.Id, AvatarUrl: org.AvatarLink(), UserName: org.Name, FullName: org.FullName, Description: org.Description, Website: org.Website, Location: org.Location, } }
func listUserOrgs(ctx *context.APIContext, u *models.User, all bool) { if err := u.GetOrganizations(all); err != nil { ctx.Error(500, "GetOrganizations", err) return } apiOrgs := make([]*api.Organization, len(u.Orgs)) for i := range u.Orgs { apiOrgs[i] = convert.ToOrganization(u.Orgs[i]) } ctx.JSON(200, &apiOrgs) }
func ToUser(u *models.User) *api.User { if u == nil { return nil } return &api.User{ ID: u.Id, UserName: u.Name, FullName: u.FullName, Email: u.Email, AvatarUrl: u.AvatarLink(), } }
// SendActivateAccountMail sends confirmation e-mail. func SendActivateEmailMail(c *macaron.Context, u *models.User, email *models.EmailAddress) { data := ComposeTplData(u) data["Code"] = u.GenerateEmailActivateCode(email.Email) data["Email"] = email.Email body, err := c.HTMLString(string(AUTH_ACTIVATE_EMAIL), data) if err != nil { log.Error(4, "HTMLString: %v", err) return } msg := NewMessage([]string{email.Email}, c.Tr("mail.activate_email"), body) msg.Info = fmt.Sprintf("UID: %d, activate email", u.Id) SendAsync(msg) }
func handleCreateError(ctx *context.Context, owner *models.User, err error, name string, tpl base.TplName, form interface{}) { switch { case models.IsErrReachLimitOfRepo(err): ctx.RenderWithErr(ctx.Tr("repo.form.reach_limit_of_creation", owner.RepoCreationNum()), tpl, form) case models.IsErrRepoAlreadyExist(err): ctx.Data["Err_RepoName"] = true ctx.RenderWithErr(ctx.Tr("form.repo_name_been_taken"), tpl, form) case models.IsErrNameReserved(err): ctx.Data["Err_RepoName"] = true ctx.RenderWithErr(ctx.Tr("repo.form.name_reserved", err.(models.ErrNameReserved).Name), tpl, form) case models.IsErrNamePatternNotAllowed(err): ctx.Data["Err_RepoName"] = true ctx.RenderWithErr(ctx.Tr("repo.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), tpl, form) default: ctx.Handle(500, name, err) } }
func parseLoginSource(ctx *context.APIContext, u *models.User, sourceID int64, loginName string) { if sourceID == 0 { return } source, err := models.GetLoginSourceByID(sourceID) if err != nil { if models.IsErrAuthenticationNotExist(err) { ctx.Error(422, "", err) } else { ctx.Error(500, "GetLoginSourceByID", err) } return } u.LoginType = source.Type u.LoginSource = source.ID u.LoginName = loginName }
// ParseRemoteAddr checks if given remote address is valid, // and returns composed URL with needed username and passowrd. // It also checks if given user has permission when remote address // is actually a local path. func (f MigrateRepoForm) ParseRemoteAddr(user *models.User) (string, error) { remoteAddr := strings.TrimSpace(f.CloneAddr) // Remote address can be HTTP/HTTPS/Git URL or local path. if strings.HasPrefix(remoteAddr, "http://") || strings.HasPrefix(remoteAddr, "https://") || strings.HasPrefix(remoteAddr, "git://") { u, err := url.Parse(remoteAddr) if err != nil { return "", models.ErrInvalidCloneAddr{IsURLError: true} } if len(f.AuthUsername)+len(f.AuthPassword) > 0 { u.User = url.UserPassword(f.AuthUsername, f.AuthPassword) } remoteAddr = u.String() } else if !user.CanImportLocal() { return "", models.ErrInvalidCloneAddr{IsPermissionDenied: true} } else if !com.IsDir(remoteAddr) { return "", models.ErrInvalidCloneAddr{IsInvalidPath: true} } return remoteAddr, nil }
// FIXME: limit size. func UpdateAvatarSetting(ctx *context.Context, form auth.UploadAvatarForm, ctxUser *models.User) error { ctxUser.UseCustomAvatar = form.Enable if form.Avatar != nil { fr, err := form.Avatar.Open() if err != nil { return fmt.Errorf("Avatar.Open: %v", err) } defer fr.Close() data, err := ioutil.ReadAll(fr) if err != nil { return fmt.Errorf("ioutil.ReadAll: %v", err) } if _, ok := base.IsImageFile(data); !ok { return errors.New(ctx.Tr("settings.uploaded_avatar_not_a_image")) } if err = ctxUser.UploadAvatar(data); err != nil { return fmt.Errorf("UploadAvatar: %v", err) } } else { // No avatar is uploaded but setting has been changed to enable, // generate a random one when needed. if form.Enable && !com.IsFile(ctxUser.CustomAvatarPath()) { if err := ctxUser.GenerateRandomAvatar(); err != nil { log.Error(4, "GenerateRandomAvatar[%d]: %v", ctxUser.Id, err) } } } if err := models.UpdateUser(ctxUser); err != nil { return fmt.Errorf("UpdateUser: %v", err) } return nil }
// SendResetPasswordMail sends reset password e-mail. func SendResetPasswordMail(c *macaron.Context, u *models.User) { SendUserMail(c, u, AUTH_RESET_PASSWORD, u.GenerateActivateCode(), c.Tr("mail.reset_password"), "reset password") }
func SendActivateAccountMail(c *macaron.Context, u *models.User) { SendUserMail(c, u, AUTH_ACTIVATE, u.GenerateActivateCode(), c.Tr("mail.activate_account"), "activate account") }