|  | @@ -14,6 +14,7 @@ import (
 | 
	
		
			
				|  |  |  	"github.com/gogits/gogs/modules/auth"
 | 
	
		
			
				|  |  |  	"github.com/gogits/gogs/modules/base"
 | 
	
		
			
				|  |  |  	"github.com/gogits/gogs/modules/log"
 | 
	
		
			
				|  |  | +	"github.com/gogits/gogs/modules/mailer"
 | 
	
		
			
				|  |  |  	"github.com/gogits/gogs/modules/middleware"
 | 
	
		
			
				|  |  |  	"github.com/gogits/gogs/modules/setting"
 | 
	
		
			
				|  |  |  )
 | 
	
	
		
			
				|  | @@ -21,6 +22,7 @@ import (
 | 
	
		
			
				|  |  |  const (
 | 
	
		
			
				|  |  |  	SETTINGS_PROFILE      base.TplName = "user/settings/profile"
 | 
	
		
			
				|  |  |  	SETTINGS_PASSWORD     base.TplName = "user/settings/password"
 | 
	
		
			
				|  |  | +	SETTINGS_EMAILS       base.TplName = "user/settings/email"
 | 
	
		
			
				|  |  |  	SETTINGS_SSH_KEYS     base.TplName = "user/settings/sshkeys"
 | 
	
		
			
				|  |  |  	SETTINGS_SOCIAL       base.TplName = "user/settings/social"
 | 
	
		
			
				|  |  |  	SETTINGS_APPLICATIONS base.TplName = "user/settings/applications"
 | 
	
	
		
			
				|  | @@ -126,6 +128,112 @@ func SettingsAvatar(ctx *middleware.Context, form auth.UploadAvatarForm) {
 | 
	
		
			
				|  |  |  	ctx.Flash.Success(ctx.Tr("settings.update_avatar_success"))
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +func SettingsEmails(ctx *middleware.Context) {
 | 
	
		
			
				|  |  | +	ctx.Data["Title"] = ctx.Tr("settings")
 | 
	
		
			
				|  |  | +	ctx.Data["PageIsUserSettings"] = true
 | 
	
		
			
				|  |  | +	ctx.Data["PageIsSettingsEmails"] = true
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	var err error
 | 
	
		
			
				|  |  | +	ctx.Data["Emails"], err = models.GetEmailAddresses(ctx.User.Id)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		ctx.Handle(500, "email.GetEmailAddresses", err)
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	ctx.HTML(200, SETTINGS_EMAILS)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func SettingsEmailPost(ctx *middleware.Context, form auth.AddEmailForm) {
 | 
	
		
			
				|  |  | +	ctx.Data["Title"] = ctx.Tr("settings")
 | 
	
		
			
				|  |  | +	ctx.Data["PageIsUserSettings"] = true
 | 
	
		
			
				|  |  | +	ctx.Data["PageIsSettingsEmails"] = true
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	var err error
 | 
	
		
			
				|  |  | +	ctx.Data["Emails"], err = models.GetEmailAddresses(ctx.User.Id)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		ctx.Handle(500, "email.GetEmailAddresses", err)
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Delete Email address.
 | 
	
		
			
				|  |  | +	if ctx.Query("_method") == "DELETE" {
 | 
	
		
			
				|  |  | +		id := com.StrTo(ctx.Query("id")).MustInt64()
 | 
	
		
			
				|  |  | +		if id <= 0 {
 | 
	
		
			
				|  |  | +			return
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if err = models.DeleteEmailAddress(&models.EmailAddress{Id: id}); err != nil {
 | 
	
		
			
				|  |  | +			ctx.Handle(500, "DeleteEmail", err)
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +			log.Trace("Email address deleted: %s", ctx.User.Name)
 | 
	
		
			
				|  |  | +			ctx.Redirect(setting.AppSubUrl + "/user/settings/email")
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Make emailaddress primary.
 | 
	
		
			
				|  |  | +	if ctx.Query("_method") == "PRIMARY" {
 | 
	
		
			
				|  |  | +		id := com.StrTo(ctx.Query("id")).MustInt64()
 | 
	
		
			
				|  |  | +		if id <= 0 {
 | 
	
		
			
				|  |  | +			return
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if err = models.MakeEmailPrimary(&models.EmailAddress{Id: id}); err != nil {
 | 
	
		
			
				|  |  | +			ctx.Handle(500, "MakeEmailPrimary", err)
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +			log.Trace("Email made primary: %s", ctx.User.Name)
 | 
	
		
			
				|  |  | +			ctx.Redirect(setting.AppSubUrl + "/user/settings/email")
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Add Email address.
 | 
	
		
			
				|  |  | +	if ctx.Req.Method == "POST" {
 | 
	
		
			
				|  |  | +		if ctx.HasError() {
 | 
	
		
			
				|  |  | +			ctx.HTML(200, SETTINGS_EMAILS)
 | 
	
		
			
				|  |  | +			return
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		cleanEmail := strings.Replace(form.Email, "\n", "", -1)
 | 
	
		
			
				|  |  | +		e := &models.EmailAddress{
 | 
	
		
			
				|  |  | +			OwnerId:     ctx.User.Id,
 | 
	
		
			
				|  |  | +			Email:       cleanEmail,
 | 
	
		
			
				|  |  | +			IsActivated: !setting.Service.RegisterEmailConfirm,
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if err := models.AddEmailAddress(e); err != nil {
 | 
	
		
			
				|  |  | +			if err == models.ErrEmailAlreadyUsed {
 | 
	
		
			
				|  |  | +				ctx.RenderWithErr(ctx.Tr("form.email_has_been_used"), SETTINGS_EMAILS, &form)
 | 
	
		
			
				|  |  | +				return
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			ctx.Handle(500, "email.AddEmailAddress", err)
 | 
	
		
			
				|  |  | +			return
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// Send confirmation e-mail
 | 
	
		
			
				|  |  | +			if setting.Service.RegisterEmailConfirm {
 | 
	
		
			
				|  |  | +				mailer.SendActivateEmail(ctx.Render, ctx.User, e)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				if err := ctx.Cache.Put("MailResendLimit_"+ctx.User.LowerName, ctx.User.LowerName, 180); err != nil {
 | 
	
		
			
				|  |  | +					log.Error(4, "Set cache(MailResendLimit) fail: %v", err)
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				ctx.Flash.Success(ctx.Tr("settings.add_email_success_confirmation_email_sent"))
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				ctx.Flash.Success(ctx.Tr("settings.add_email_success"))
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			log.Trace("Email address added: %s", e.Email)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			ctx.Redirect(setting.AppSubUrl + "/user/settings/email")
 | 
	
		
			
				|  |  | +			return
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	ctx.HTML(200, SETTINGS_EMAILS)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  func SettingsPassword(ctx *middleware.Context) {
 | 
	
		
			
				|  |  |  	ctx.Data["Title"] = ctx.Tr("settings")
 | 
	
		
			
				|  |  |  	ctx.Data["PageIsUserSettings"] = true
 |