* golint fixed for modules/setting * typo fixed and renamed UNIXSOCKET to UnixSockettags/v1.0.0
m.Use(gzip.Gziper()) | m.Use(gzip.Gziper()) | ||||
} | } | ||||
if setting.Protocol == setting.FCGI { | if setting.Protocol == setting.FCGI { | ||||
m.SetURLPrefix(setting.AppSubUrl) | |||||
m.SetURLPrefix(setting.AppSubURL) | |||||
} | } | ||||
m.Use(macaron.Static( | m.Use(macaron.Static( | ||||
path.Join(setting.StaticRootPath, "public"), | path.Join(setting.StaticRootPath, "public"), | ||||
localFiles[name] = bindata.MustAsset("conf/locale/" + name) | localFiles[name] = bindata.MustAsset("conf/locale/" + name) | ||||
} | } | ||||
m.Use(i18n.I18n(i18n.Options{ | m.Use(i18n.I18n(i18n.Options{ | ||||
SubURL: setting.AppSubUrl, | |||||
SubURL: setting.AppSubURL, | |||||
Files: localFiles, | Files: localFiles, | ||||
CustomDirectory: path.Join(setting.CustomPath, "conf/locale"), | CustomDirectory: path.Join(setting.CustomPath, "conf/locale"), | ||||
Langs: setting.Langs, | Langs: setting.Langs, | ||||
Interval: setting.CacheInterval, | Interval: setting.CacheInterval, | ||||
})) | })) | ||||
m.Use(captcha.Captchaer(captcha.Options{ | m.Use(captcha.Captchaer(captcha.Options{ | ||||
SubURL: setting.AppSubUrl, | |||||
SubURL: setting.AppSubURL, | |||||
})) | })) | ||||
m.Use(session.Sessioner(setting.SessionConfig)) | m.Use(session.Sessioner(setting.SessionConfig)) | ||||
m.Use(csrf.Csrfer(csrf.Options{ | m.Use(csrf.Csrfer(csrf.Options{ | ||||
Cookie: setting.CSRFCookieName, | Cookie: setting.CSRFCookieName, | ||||
SetCookie: true, | SetCookie: true, | ||||
Header: "X-Csrf-Token", | Header: "X-Csrf-Token", | ||||
CookiePath: setting.AppSubUrl, | |||||
CookiePath: setting.AppSubURL, | |||||
})) | })) | ||||
m.Use(toolbox.Toolboxer(m, toolbox.Options{ | m.Use(toolbox.Toolboxer(m, toolbox.Options{ | ||||
HealthCheckFuncs: []*toolbox.HealthCheckFuncDesc{ | HealthCheckFuncs: []*toolbox.HealthCheckFuncDesc{ | ||||
m.Get("/", ignSignIn, routers.Home) | m.Get("/", ignSignIn, routers.Home) | ||||
m.Group("/explore", func() { | m.Group("/explore", func() { | ||||
m.Get("", func(ctx *context.Context) { | m.Get("", func(ctx *context.Context) { | ||||
ctx.Redirect(setting.AppSubUrl + "/explore/repos") | |||||
ctx.Redirect(setting.AppSubURL + "/explore/repos") | |||||
}) | }) | ||||
m.Get("/repos", routers.ExploreRepos) | m.Get("/repos", routers.ExploreRepos) | ||||
m.Get("/users", routers.ExploreUsers) | m.Get("/users", routers.ExploreUsers) | ||||
// Flag for port number in case first time run conflict. | // Flag for port number in case first time run conflict. | ||||
if ctx.IsSet("port") { | if ctx.IsSet("port") { | ||||
setting.AppUrl = strings.Replace(setting.AppUrl, setting.HTTPPort, ctx.String("port"), 1) | |||||
setting.AppURL = strings.Replace(setting.AppURL, setting.HTTPPort, ctx.String("port"), 1) | |||||
setting.HTTPPort = ctx.String("port") | setting.HTTPPort = ctx.String("port") | ||||
} | } | ||||
var listenAddr string | var listenAddr string | ||||
if setting.Protocol == setting.UNIX_SOCKET { | |||||
if setting.Protocol == setting.UnixSocket { | |||||
listenAddr = fmt.Sprintf("%s", setting.HTTPAddr) | listenAddr = fmt.Sprintf("%s", setting.HTTPAddr) | ||||
} else { | } else { | ||||
listenAddr = fmt.Sprintf("%s:%s", setting.HTTPAddr, setting.HTTPPort) | listenAddr = fmt.Sprintf("%s:%s", setting.HTTPAddr, setting.HTTPPort) | ||||
} | } | ||||
log.Info("Listen: %v://%s%s", setting.Protocol, listenAddr, setting.AppSubUrl) | |||||
log.Info("Listen: %v://%s%s", setting.Protocol, listenAddr, setting.AppSubURL) | |||||
var err error | var err error | ||||
switch setting.Protocol { | switch setting.Protocol { | ||||
err = server.ListenAndServeTLS(setting.CertFile, setting.KeyFile) | err = server.ListenAndServeTLS(setting.CertFile, setting.KeyFile) | ||||
case setting.FCGI: | case setting.FCGI: | ||||
err = fcgi.Serve(nil, m) | err = fcgi.Serve(nil, m) | ||||
case setting.UNIX_SOCKET: | |||||
case setting.UnixSocket: | |||||
os.Remove(listenAddr) | os.Remove(listenAddr) | ||||
var listener *net.UnixListener | var listener *net.UnixListener |
// GetRepoLink returns relative link to action repository. | // GetRepoLink returns relative link to action repository. | ||||
func (a *Action) GetRepoLink() string { | func (a *Action) GetRepoLink() string { | ||||
if len(setting.AppSubUrl) > 0 { | |||||
return path.Join(setting.AppSubUrl, a.GetRepoPath()) | |||||
if len(setting.AppSubURL) > 0 { | |||||
return path.Join(setting.AppSubURL, a.GetRepoPath()) | |||||
} | } | ||||
return "/" + a.GetRepoPath() | return "/" + a.GetRepoPath() | ||||
} | } | ||||
Ref: opts.RefFullName, | Ref: opts.RefFullName, | ||||
Before: opts.OldCommitID, | Before: opts.OldCommitID, | ||||
After: opts.NewCommitID, | After: opts.NewCommitID, | ||||
CompareURL: setting.AppUrl + opts.Commits.CompareURL, | |||||
CompareURL: setting.AppURL + opts.Commits.CompareURL, | |||||
Commits: opts.Commits.ToAPIPayloadCommits(repo.HTMLURL()), | Commits: opts.Commits.ToAPIPayloadCommits(repo.HTMLURL()), | ||||
Repo: apiRepo, | Repo: apiRepo, | ||||
Pusher: apiPusher, | Pusher: apiPusher, |
Ref: git.BRANCH_PREFIX + pr.BaseBranch, | Ref: git.BRANCH_PREFIX + pr.BaseBranch, | ||||
Before: pr.MergeBase, | Before: pr.MergeBase, | ||||
After: pr.MergedCommitID, | After: pr.MergedCommitID, | ||||
CompareURL: setting.AppUrl + pr.BaseRepo.ComposeCompareURL(pr.MergeBase, pr.MergedCommitID), | |||||
CompareURL: setting.AppURL + pr.BaseRepo.ComposeCompareURL(pr.MergeBase, pr.MergedCommitID), | |||||
Commits: ListToPushCommits(l).ToAPIPayloadCommits(pr.BaseRepo.HTMLURL()), | Commits: ListToPushCommits(l).ToAPIPayloadCommits(pr.BaseRepo.HTMLURL()), | ||||
Repo: pr.BaseRepo.APIFormat(nil), | Repo: pr.BaseRepo.APIFormat(nil), | ||||
Pusher: pr.HeadRepo.MustOwner().APIFormat(), | Pusher: pr.HeadRepo.MustOwner().APIFormat(), |
} | } | ||||
func (repo *Repository) HTMLURL() string { | func (repo *Repository) HTMLURL() string { | ||||
return setting.AppUrl + repo.FullName() | |||||
return setting.AppURL + repo.FullName() | |||||
} | } | ||||
// Arguments that are allowed to be nil: permission | // Arguments that are allowed to be nil: permission | ||||
} | } | ||||
func (repo *Repository) Link() string { | func (repo *Repository) Link() string { | ||||
return setting.AppSubUrl + "/" + repo.FullName() | |||||
return setting.AppSubURL + "/" + repo.FullName() | |||||
} | } | ||||
func (repo *Repository) ComposeCompareURL(oldCommitID, newCommitID string) string { | func (repo *Repository) ComposeCompareURL(oldCommitID, newCommitID string) string { | ||||
// ComposeHTTPSCloneURL returns HTTPS clone URL based on given owner and repository name. | // ComposeHTTPSCloneURL returns HTTPS clone URL based on given owner and repository name. | ||||
func ComposeHTTPSCloneURL(owner, repo string) string { | func ComposeHTTPSCloneURL(owner, repo string) string { | ||||
return fmt.Sprintf("%s%s/%s.git", setting.AppUrl, owner, repo) | |||||
return fmt.Sprintf("%s%s/%s.git", setting.AppURL, owner, repo) | |||||
} | } | ||||
func (repo *Repository) cloneLink(isWiki bool) *CloneLink { | func (repo *Repository) cloneLink(isWiki bool) *CloneLink { |
// DashboardLink returns the user dashboard page link. | // DashboardLink returns the user dashboard page link. | ||||
func (u *User) DashboardLink() string { | func (u *User) DashboardLink() string { | ||||
if u.IsOrganization() { | if u.IsOrganization() { | ||||
return setting.AppSubUrl + "/org/" + u.Name + "/dashboard/" | |||||
return setting.AppSubURL + "/org/" + u.Name + "/dashboard/" | |||||
} | } | ||||
return setting.AppSubUrl + "/" | |||||
return setting.AppSubURL + "/" | |||||
} | } | ||||
// HomeLink returns the user or organization home page link. | // HomeLink returns the user or organization home page link. | ||||
func (u *User) HomeLink() string { | func (u *User) HomeLink() string { | ||||
return setting.AppSubUrl + "/" + u.Name | |||||
return setting.AppSubURL + "/" + u.Name | |||||
} | } | ||||
// GenerateEmailActivateCode generates an activate code based on user information and given e-mail. | // GenerateEmailActivateCode generates an activate code based on user information and given e-mail. | ||||
// which includes app sub-url as prefix. However, it is possible | // which includes app sub-url as prefix. However, it is possible | ||||
// to return full URL if user enables Gravatar-like service. | // to return full URL if user enables Gravatar-like service. | ||||
func (u *User) RelAvatarLink() string { | func (u *User) RelAvatarLink() string { | ||||
defaultImgUrl := setting.AppSubUrl + "/img/avatar_default.png" | |||||
defaultImgUrl := setting.AppSubURL + "/img/avatar_default.png" | |||||
if u.ID == -1 { | if u.ID == -1 { | ||||
return defaultImgUrl | return defaultImgUrl | ||||
} | } | ||||
if !com.IsExist(u.CustomAvatarPath()) { | if !com.IsExist(u.CustomAvatarPath()) { | ||||
return defaultImgUrl | return defaultImgUrl | ||||
} | } | ||||
return setting.AppSubUrl + "/avatars/" + com.ToStr(u.ID) | |||||
return setting.AppSubURL + "/avatars/" + com.ToStr(u.ID) | |||||
case setting.DisableGravatar, setting.OfflineMode: | case setting.DisableGravatar, setting.OfflineMode: | ||||
if !com.IsExist(u.CustomAvatarPath()) { | if !com.IsExist(u.CustomAvatarPath()) { | ||||
if err := u.GenerateRandomAvatar(); err != nil { | if err := u.GenerateRandomAvatar(); err != nil { | ||||
} | } | ||||
} | } | ||||
return setting.AppSubUrl + "/avatars/" + com.ToStr(u.ID) | |||||
return setting.AppSubURL + "/avatars/" + com.ToStr(u.ID) | |||||
} | } | ||||
return base.AvatarLink(u.AvatarEmail) | return base.AvatarLink(u.AvatarEmail) | ||||
} | } | ||||
func (u *User) AvatarLink() string { | func (u *User) AvatarLink() string { | ||||
link := u.RelAvatarLink() | link := u.RelAvatarLink() | ||||
if link[0] == '/' && link[1] != '/' { | if link[0] == '/' && link[1] != '/' { | ||||
return setting.AppUrl + strings.TrimPrefix(link, setting.AppSubUrl)[1:] | |||||
return setting.AppURL + strings.TrimPrefix(link, setting.AppSubURL)[1:] | |||||
} | } | ||||
return link | return link | ||||
} | } |
} | } | ||||
func getSlackPullRequestPayload(p *api.PullRequestPayload, slack *SlackMeta) (*SlackPayload, error) { | func getSlackPullRequestPayload(p *api.PullRequestPayload, slack *SlackMeta) (*SlackPayload, error) { | ||||
senderLink := SlackLinkFormatter(setting.AppUrl+p.Sender.UserName, p.Sender.UserName) | |||||
senderLink := SlackLinkFormatter(setting.AppURL+p.Sender.UserName, p.Sender.UserName) | |||||
titleLink := SlackLinkFormatter(fmt.Sprintf("%s/pulls/%d", p.Repository.HTMLURL, p.Index), | titleLink := SlackLinkFormatter(fmt.Sprintf("%s/pulls/%d", p.Repository.HTMLURL, p.Index), | ||||
fmt.Sprintf("#%d %s", p.Index, p.PullRequest.Title)) | fmt.Sprintf("#%d %s", p.Index, p.PullRequest.Title)) | ||||
var text, title, attachmentText string | var text, title, attachmentText string | ||||
attachmentText = SlackTextFormatter(p.PullRequest.Body) | attachmentText = SlackTextFormatter(p.PullRequest.Body) | ||||
case api.HookIssueAssigned: | case api.HookIssueAssigned: | ||||
text = fmt.Sprintf("[%s] Pull request assigned to %s: %s by %s", p.Repository.FullName, | text = fmt.Sprintf("[%s] Pull request assigned to %s: %s by %s", p.Repository.FullName, | ||||
SlackLinkFormatter(setting.AppUrl+p.PullRequest.Assignee.UserName, p.PullRequest.Assignee.UserName), | |||||
SlackLinkFormatter(setting.AppURL+p.PullRequest.Assignee.UserName, p.PullRequest.Assignee.UserName), | |||||
titleLink, senderLink) | titleLink, senderLink) | ||||
case api.HookIssueUnassigned: | case api.HookIssueUnassigned: | ||||
text = fmt.Sprintf("[%s] Pull request unassigned: %s by %s", p.Repository.FullName, titleLink, senderLink) | text = fmt.Sprintf("[%s] Pull request unassigned: %s by %s", p.Repository.FullName, titleLink, senderLink) |
return setting.GravatarSource + HashEmail(email) | return setting.GravatarSource + HashEmail(email) | ||||
} | } | ||||
return setting.AppSubUrl + "/img/avatar_default.png" | |||||
return setting.AppSubURL + "/img/avatar_default.png" | |||||
} | } | ||||
// Seconds-based time units | // Seconds-based time units |
page := paginater.New(total, pageSize, ctx.QueryInt("page"), 0) | page := paginater.New(total, pageSize, ctx.QueryInt("page"), 0) | ||||
links := make([]string, 0, 4) | links := make([]string, 0, 4) | ||||
if page.HasNext() { | if page.HasNext() { | ||||
links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"next\"", setting.AppUrl, ctx.Req.URL.Path[1:], page.Next())) | |||||
links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"next\"", setting.AppURL, ctx.Req.URL.Path[1:], page.Next())) | |||||
} | } | ||||
if !page.IsLast() { | if !page.IsLast() { | ||||
links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"last\"", setting.AppUrl, ctx.Req.URL.Path[1:], page.TotalPages())) | |||||
links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"last\"", setting.AppURL, ctx.Req.URL.Path[1:], page.TotalPages())) | |||||
} | } | ||||
if !page.IsFirst() { | if !page.IsFirst() { | ||||
links = append(links, fmt.Sprintf("<%s%s?page=1>; rel=\"first\"", setting.AppUrl, ctx.Req.URL.Path[1:])) | |||||
links = append(links, fmt.Sprintf("<%s%s?page=1>; rel=\"first\"", setting.AppURL, ctx.Req.URL.Path[1:])) | |||||
} | } | ||||
if page.HasPrevious() { | if page.HasPrevious() { | ||||
links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"prev\"", setting.AppUrl, ctx.Req.URL.Path[1:], page.Previous())) | |||||
links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"prev\"", setting.AppURL, ctx.Req.URL.Path[1:], page.Previous())) | |||||
} | } | ||||
if len(links) > 0 { | if len(links) > 0 { |
return func(ctx *Context) { | return func(ctx *Context) { | ||||
// Cannot view any page before installation. | // Cannot view any page before installation. | ||||
if !setting.InstallLock { | if !setting.InstallLock { | ||||
ctx.Redirect(setting.AppSubUrl + "/install") | |||||
ctx.Redirect(setting.AppSubURL + "/install") | |||||
return | return | ||||
} | } | ||||
} | } | ||||
// Check non-logged users landing page. | // Check non-logged users landing page. | ||||
if !ctx.IsSigned && ctx.Req.RequestURI == "/" && setting.LandingPageURL != setting.LANDING_PAGE_HOME { | |||||
ctx.Redirect(setting.AppSubUrl + string(setting.LandingPageURL)) | |||||
if !ctx.IsSigned && ctx.Req.RequestURI == "/" && setting.LandingPageURL != setting.LandingPageHome { | |||||
ctx.Redirect(setting.AppSubURL + string(setting.LandingPageURL)) | |||||
return | return | ||||
} | } | ||||
// Redirect to dashboard if user tries to visit any non-login page. | // Redirect to dashboard if user tries to visit any non-login page. | ||||
if options.SignOutRequired && ctx.IsSigned && ctx.Req.RequestURI != "/" { | if options.SignOutRequired && ctx.IsSigned && ctx.Req.RequestURI != "/" { | ||||
ctx.Redirect(setting.AppSubUrl + "/") | |||||
ctx.Redirect(setting.AppSubURL + "/") | |||||
return | return | ||||
} | } | ||||
return | return | ||||
} | } | ||||
ctx.SetCookie("redirect_to", url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI), 0, setting.AppSubUrl) | |||||
ctx.Redirect(setting.AppSubUrl + "/user/login") | |||||
ctx.SetCookie("redirect_to", url.QueryEscape(setting.AppSubURL+ctx.Req.RequestURI), 0, setting.AppSubURL) | |||||
ctx.Redirect(setting.AppSubURL + "/user/login") | |||||
return | return | ||||
} else if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm { | } else if !ctx.User.IsActive && setting.Service.RegisterEmailConfirm { | ||||
ctx.Data["Title"] = ctx.Tr("auth.active_your_account") | ctx.Data["Title"] = ctx.Tr("auth.active_your_account") | ||||
// Redirect to log in page if auto-signin info is provided and has not signed in. | // Redirect to log in page if auto-signin info is provided and has not signed in. | ||||
if !options.SignOutRequired && !ctx.IsSigned && !auth.IsAPIPath(ctx.Req.URL.Path) && | if !options.SignOutRequired && !ctx.IsSigned && !auth.IsAPIPath(ctx.Req.URL.Path) && | ||||
len(ctx.GetCookie(setting.CookieUserName)) > 0 { | len(ctx.GetCookie(setting.CookieUserName)) > 0 { | ||||
ctx.SetCookie("redirect_to", url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI), 0, setting.AppSubUrl) | |||||
ctx.Redirect(setting.AppSubUrl + "/user/login") | |||||
ctx.SetCookie("redirect_to", url.QueryEscape(setting.AppSubURL+ctx.Req.RequestURI), 0, setting.AppSubURL) | |||||
ctx.Redirect(setting.AppSubURL + "/user/login") | |||||
return | return | ||||
} | } | ||||
Org: &Organization{}, | Org: &Organization{}, | ||||
} | } | ||||
// Compute current URL for real-time change language. | // Compute current URL for real-time change language. | ||||
ctx.Data["Link"] = setting.AppSubUrl + strings.TrimSuffix(ctx.Req.URL.Path, "/") | |||||
ctx.Data["Link"] = setting.AppSubURL + strings.TrimSuffix(ctx.Req.URL.Path, "/") | |||||
ctx.Data["PageStartTime"] = time.Now() | ctx.Data["PageStartTime"] = time.Now() | ||||
ctx.Data["IsOrganizationOwner"] = ctx.Org.IsOwner | ctx.Data["IsOrganizationOwner"] = ctx.Org.IsOwner | ||||
ctx.Data["IsOrganizationMember"] = ctx.Org.IsMember | ctx.Data["IsOrganizationMember"] = ctx.Org.IsMember | ||||
ctx.Org.OrgLink = setting.AppSubUrl + "/org/" + org.Name | |||||
ctx.Org.OrgLink = setting.AppSubURL + "/org/" + org.Name | |||||
ctx.Data["OrgLink"] = ctx.Org.OrgLink | ctx.Data["OrgLink"] = ctx.Org.OrgLink | ||||
// Team. | // Team. |
// composeGoGetImport returns go-get-import meta content. | // composeGoGetImport returns go-get-import meta content. | ||||
func composeGoGetImport(owner, repo string) string { | func composeGoGetImport(owner, repo string) string { | ||||
return path.Join(setting.Domain, setting.AppSubUrl, owner, repo) | |||||
return path.Join(setting.Domain, setting.AppSubURL, owner, repo) | |||||
} | } | ||||
// earlyResponseForGoGetMeta responses appropriate go-get meta with status 200 | // earlyResponseForGoGetMeta responses appropriate go-get meta with status 200 | ||||
if ctx.Query("go-get") == "1" { | if ctx.Query("go-get") == "1" { | ||||
ctx.Data["GoGetImport"] = composeGoGetImport(owner.Name, repo.Name) | ctx.Data["GoGetImport"] = composeGoGetImport(owner.Name, repo.Name) | ||||
prefix := setting.AppUrl + path.Join(owner.Name, repo.Name, "src", ctx.Repo.BranchName) | |||||
prefix := setting.AppURL + path.Join(owner.Name, repo.Name, "src", ctx.Repo.BranchName) | |||||
ctx.Data["GoDocDirectory"] = prefix + "{/dir}" | ctx.Data["GoDocDirectory"] = prefix + "{/dir}" | ||||
ctx.Data["GoDocFile"] = prefix + "{/dir}/{file}#L{line}" | ctx.Data["GoDocFile"] = prefix + "{/dir}/{file}#L{line}" | ||||
} | } |
// Since this method could only possibly serve one link at a time, | // Since this method could only possibly serve one link at a time, | ||||
// we do not need to find all. | // we do not need to find all. | ||||
if bytes.HasPrefix(link, []byte(setting.AppUrl)) { | |||||
if bytes.HasPrefix(link, []byte(setting.AppURL)) { | |||||
m := CommitPattern.Find(link) | m := CommitPattern.Find(link) | ||||
if m != nil { | if m != nil { | ||||
m = bytes.TrimSpace(m) | m = bytes.TrimSpace(m) | ||||
if prefix[i] == '/' { | if prefix[i] == '/' { | ||||
count++ | count++ | ||||
} | } | ||||
if count >= 3+setting.AppSubUrlDepth { | |||||
if count >= 3+setting.AppSubURLDepth { | |||||
return prefix[:i] | return prefix[:i] | ||||
} | } | ||||
} | } | ||||
for _, m := range ms { | for _, m := range ms { | ||||
m = m[bytes.Index(m, []byte("@")):] | m = m[bytes.Index(m, []byte("@")):] | ||||
rawBytes = bytes.Replace(rawBytes, m, | rawBytes = bytes.Replace(rawBytes, m, | ||||
[]byte(fmt.Sprintf(`<a href="%s/%s">%s</a>`, setting.AppSubUrl, m[1:], m)), -1) | |||||
[]byte(fmt.Sprintf(`<a href="%s/%s">%s</a>`, setting.AppSubURL, m[1:], m)), -1) | |||||
} | } | ||||
rawBytes = RenderIssueIndexPattern(rawBytes, urlPrefix, metas) | rawBytes = RenderIssueIndexPattern(rawBytes, urlPrefix, metas) |
urlPrefix = "/prefix" | urlPrefix = "/prefix" | ||||
metas map[string]string = nil | metas map[string]string = nil | ||||
) | ) | ||||
setting.AppSubUrlDepth = 0 | |||||
setting.AppSubURLDepth = 0 | |||||
Convey("To the internal issue tracker", func() { | Convey("To the internal issue tracker", func() { | ||||
Convey("It should not render anything when there are no mentions", func() { | Convey("It should not render anything when there are no mentions", func() { | ||||
}) | }) | ||||
Convey("Rendering an issue URL", t, func() { | Convey("Rendering an issue URL", t, func() { | ||||
setting.AppUrl = "http://localhost:3000/" | |||||
setting.AppURL = "http://localhost:3000/" | |||||
htmlFlags := 0 | htmlFlags := 0 | ||||
htmlFlags |= blackfriday.HTML_SKIP_STYLE | htmlFlags |= blackfriday.HTML_SKIP_STYLE | ||||
htmlFlags |= blackfriday.HTML_OMIT_CONTENTS | htmlFlags |= blackfriday.HTML_OMIT_CONTENTS | ||||
}) | }) | ||||
Convey("Rendering a commit URL", t, func() { | Convey("Rendering a commit URL", t, func() { | ||||
setting.AppUrl = "http://localhost:3000/" | |||||
setting.AppURL = "http://localhost:3000/" | |||||
htmlFlags := 0 | htmlFlags := 0 | ||||
htmlFlags |= blackfriday.HTML_SKIP_STYLE | htmlFlags |= blackfriday.HTML_SKIP_STYLE | ||||
htmlFlags |= blackfriday.HTML_OMIT_CONTENTS | htmlFlags |= blackfriday.HTML_OMIT_CONTENTS |
"time" | "time" | ||||
"github.com/Unknwon/com" | "github.com/Unknwon/com" | ||||
_ "github.com/go-macaron/cache/memcache" | |||||
_ "github.com/go-macaron/cache/memcache" // memcache plugin for cache | |||||
_ "github.com/go-macaron/cache/redis" | _ "github.com/go-macaron/cache/redis" | ||||
"github.com/go-macaron/session" | "github.com/go-macaron/session" | ||||
_ "github.com/go-macaron/session/redis" | |||||
_ "github.com/go-macaron/session/redis" // redis plugin for store session | |||||
"gopkg.in/ini.v1" | "gopkg.in/ini.v1" | ||||
"strk.kbt.io/projects/go/libravatar" | "strk.kbt.io/projects/go/libravatar" | ||||
"code.gitea.io/gitea/modules/user" | "code.gitea.io/gitea/modules/user" | ||||
) | ) | ||||
// Scheme describes protocol types | |||||
type Scheme string | type Scheme string | ||||
// enumerates all the scheme types | |||||
const ( | const ( | ||||
HTTP Scheme = "http" | |||||
HTTPS Scheme = "https" | |||||
FCGI Scheme = "fcgi" | |||||
UNIX_SOCKET Scheme = "unix" | |||||
HTTP Scheme = "http" | |||||
HTTPS Scheme = "https" | |||||
FCGI Scheme = "fcgi" | |||||
UnixSocket Scheme = "unix" | |||||
) | ) | ||||
// LandingPage describes the default page | |||||
type LandingPage string | type LandingPage string | ||||
// enumerates all the landing page types | |||||
const ( | const ( | ||||
LANDING_PAGE_HOME LandingPage = "/" | |||||
LANDING_PAGE_EXPLORE LandingPage = "/explore" | |||||
LandingPageHome LandingPage = "/" | |||||
LandingPageExplore LandingPage = "/explore" | |||||
) | ) | ||||
// settings | |||||
var ( | var ( | ||||
// Build information should only be set by -ldflags. | |||||
// BuildTime information should only be set by -ldflags. | |||||
BuildTime string | BuildTime string | ||||
BuildGitHash string | BuildGitHash string | ||||
// App settings | |||||
// AppVer settings | |||||
AppVer string | AppVer string | ||||
AppName string | AppName string | ||||
AppUrl string | |||||
AppSubUrl string | |||||
AppSubUrlDepth int // Number of slashes | |||||
AppURL string | |||||
AppSubURL string | |||||
AppSubURLDepth int // Number of slashes | |||||
AppPath string | AppPath string | ||||
AppDataPath string | AppDataPath string | ||||
// Server settings | // Server settings | ||||
Protocol Scheme | Protocol Scheme | ||||
Domain string | Domain string | ||||
HTTPAddr, HTTPPort string | |||||
HTTPAddr string | |||||
HTTPPort string | |||||
LocalURL string | LocalURL string | ||||
OfflineMode bool | OfflineMode bool | ||||
DisableRouterLog bool | DisableRouterLog bool | ||||
CertFile, KeyFile string | |||||
CertFile string | |||||
KeyFile string | |||||
StaticRootPath string | StaticRootPath string | ||||
EnableGzip bool | EnableGzip bool | ||||
LandingPageURL LandingPage | LandingPageURL LandingPage | ||||
} | } | ||||
// I18n settings | // I18n settings | ||||
Langs, Names []string | |||||
dateLangs map[string]string | |||||
Langs []string | |||||
Names []string | |||||
dateLangs map[string]string | |||||
// Highlight settings are loaded in modules/template/hightlight.go | // Highlight settings are loaded in modules/template/hightlight.go | ||||
sec := Cfg.Section("server") | sec := Cfg.Section("server") | ||||
AppName = Cfg.Section("").Key("APP_NAME").MustString("Gogs: Go Git Service") | AppName = Cfg.Section("").Key("APP_NAME").MustString("Gogs: Go Git Service") | ||||
AppUrl = sec.Key("ROOT_URL").MustString("http://localhost:3000/") | |||||
if AppUrl[len(AppUrl)-1] != '/' { | |||||
AppUrl += "/" | |||||
AppURL = sec.Key("ROOT_URL").MustString("http://localhost:3000/") | |||||
if AppURL[len(AppURL)-1] != '/' { | |||||
AppURL += "/" | |||||
} | } | ||||
// Check if has app suburl. | // Check if has app suburl. | ||||
url, err := url.Parse(AppUrl) | |||||
url, err := url.Parse(AppURL) | |||||
if err != nil { | if err != nil { | ||||
log.Fatal(4, "Invalid ROOT_URL '%s': %s", AppUrl, err) | |||||
log.Fatal(4, "Invalid ROOT_URL '%s': %s", AppURL, err) | |||||
} | } | ||||
// Suburl should start with '/' and end without '/', such as '/{subpath}'. | // Suburl should start with '/' and end without '/', such as '/{subpath}'. | ||||
// This value is empty if site does not have sub-url. | // This value is empty if site does not have sub-url. | ||||
AppSubUrl = strings.TrimSuffix(url.Path, "/") | |||||
AppSubUrlDepth = strings.Count(AppSubUrl, "/") | |||||
AppSubURL = strings.TrimSuffix(url.Path, "/") | |||||
AppSubURLDepth = strings.Count(AppSubURL, "/") | |||||
Protocol = HTTP | Protocol = HTTP | ||||
if sec.Key("PROTOCOL").String() == "https" { | if sec.Key("PROTOCOL").String() == "https" { | ||||
} else if sec.Key("PROTOCOL").String() == "fcgi" { | } else if sec.Key("PROTOCOL").String() == "fcgi" { | ||||
Protocol = FCGI | Protocol = FCGI | ||||
} else if sec.Key("PROTOCOL").String() == "unix" { | } else if sec.Key("PROTOCOL").String() == "unix" { | ||||
Protocol = UNIX_SOCKET | |||||
Protocol = UnixSocket | |||||
UnixSocketPermissionRaw := sec.Key("UNIX_SOCKET_PERMISSION").MustString("666") | UnixSocketPermissionRaw := sec.Key("UNIX_SOCKET_PERMISSION").MustString("666") | ||||
UnixSocketPermissionParsed, err := strconv.ParseUint(UnixSocketPermissionRaw, 8, 32) | UnixSocketPermissionParsed, err := strconv.ParseUint(UnixSocketPermissionRaw, 8, 32) | ||||
if err != nil || UnixSocketPermissionParsed > 0777 { | if err != nil || UnixSocketPermissionParsed > 0777 { | ||||
switch sec.Key("LANDING_PAGE").MustString("home") { | switch sec.Key("LANDING_PAGE").MustString("home") { | ||||
case "explore": | case "explore": | ||||
LandingPageURL = LANDING_PAGE_EXPLORE | |||||
LandingPageURL = LandingPageExplore | |||||
default: | default: | ||||
LandingPageURL = LANDING_PAGE_HOME | |||||
LandingPageURL = LandingPageHome | |||||
} | } | ||||
SSH.RootPath = path.Join(homeDir, ".ssh") | SSH.RootPath = path.Join(homeDir, ".ssh") | ||||
HasRobotsTxt = com.IsFile(path.Join(CustomPath, "robots.txt")) | HasRobotsTxt = com.IsFile(path.Join(CustomPath, "robots.txt")) | ||||
} | } | ||||
// Service settings | |||||
var Service struct { | var Service struct { | ||||
ActiveCodeLives int | ActiveCodeLives int | ||||
ResetPwdCodeLives int | ResetPwdCodeLives int | ||||
[]string{"memory", "file", "redis", "mysql"}) | []string{"memory", "file", "redis", "mysql"}) | ||||
SessionConfig.ProviderConfig = strings.Trim(Cfg.Section("session").Key("PROVIDER_CONFIG").String(), "\" ") | SessionConfig.ProviderConfig = strings.Trim(Cfg.Section("session").Key("PROVIDER_CONFIG").String(), "\" ") | ||||
SessionConfig.CookieName = Cfg.Section("session").Key("COOKIE_NAME").MustString("i_like_gogits") | SessionConfig.CookieName = Cfg.Section("session").Key("COOKIE_NAME").MustString("i_like_gogits") | ||||
SessionConfig.CookiePath = AppSubUrl | |||||
SessionConfig.CookiePath = AppSubURL | |||||
SessionConfig.Secure = Cfg.Section("session").Key("COOKIE_SECURE").MustBool() | SessionConfig.Secure = Cfg.Section("session").Key("COOKIE_SECURE").MustBool() | ||||
SessionConfig.Gclifetime = Cfg.Section("session").Key("GC_INTERVAL_TIME").MustInt64(86400) | SessionConfig.Gclifetime = Cfg.Section("session").Key("GC_INTERVAL_TIME").MustInt64(86400) | ||||
SessionConfig.Maxlifetime = Cfg.Section("session").Key("SESSION_LIFE_TIME").MustInt64(86400) | SessionConfig.Maxlifetime = Cfg.Section("session").Key("SESSION_LIFE_TIME").MustInt64(86400) | ||||
} | } | ||||
var ( | var ( | ||||
// MailService the global mailer | |||||
MailService *Mailer | MailService *Mailer | ||||
) | ) | ||||
Webhook.PagingNum = sec.Key("PAGING_NUM").MustInt(10) | Webhook.PagingNum = sec.Key("PAGING_NUM").MustInt(10) | ||||
} | } | ||||
// NewServices initializes the services | |||||
func NewServices() { | func NewServices() { | ||||
newService() | newService() | ||||
newLogService() | newLogService() |
return strings.Title(runtime.Version()) | return strings.Title(runtime.Version()) | ||||
}, | }, | ||||
"UseHTTPS": func() bool { | "UseHTTPS": func() bool { | ||||
return strings.HasPrefix(setting.AppUrl, "https") | |||||
return strings.HasPrefix(setting.AppURL, "https") | |||||
}, | }, | ||||
"AppName": func() string { | "AppName": func() string { | ||||
return setting.AppName | return setting.AppName | ||||
}, | }, | ||||
"AppSubUrl": func() string { | "AppSubUrl": func() string { | ||||
return setting.AppSubUrl | |||||
return setting.AppSubURL | |||||
}, | }, | ||||
"AppUrl": func() string { | "AppUrl": func() string { | ||||
return setting.AppUrl | |||||
return setting.AppURL | |||||
}, | }, | ||||
"AppVer": func() string { | "AppVer": func() string { | ||||
return setting.AppVer | return setting.AppVer |
} else { | } else { | ||||
ctx.Flash.Success(success) | ctx.Flash.Success(success) | ||||
} | } | ||||
ctx.Redirect(setting.AppSubUrl + "/admin") | |||||
ctx.Redirect(setting.AppSubURL + "/admin") | |||||
return | return | ||||
} | } | ||||
ctx.Flash.Info(ctx.Tr("admin.config.test_mail_sent", email)) | ctx.Flash.Info(ctx.Tr("admin.config.test_mail_sent", email)) | ||||
} | } | ||||
ctx.Redirect(setting.AppSubUrl + "/admin/config") | |||||
ctx.Redirect(setting.AppSubURL + "/admin/config") | |||||
} | } | ||||
// Config show admin config page | // Config show admin config page | ||||
ctx.Data["PageIsAdmin"] = true | ctx.Data["PageIsAdmin"] = true | ||||
ctx.Data["PageIsAdminConfig"] = true | ctx.Data["PageIsAdminConfig"] = true | ||||
ctx.Data["AppUrl"] = setting.AppUrl | |||||
ctx.Data["AppUrl"] = setting.AppURL | |||||
ctx.Data["Domain"] = setting.Domain | ctx.Data["Domain"] = setting.Domain | ||||
ctx.Data["OfflineMode"] = setting.OfflineMode | ctx.Data["OfflineMode"] = setting.OfflineMode | ||||
ctx.Data["DisableRouterLog"] = setting.DisableRouterLog | ctx.Data["DisableRouterLog"] = setting.DisableRouterLog |
log.Trace("Authentication created by admin(%s): %s", ctx.User.Name, form.Name) | log.Trace("Authentication created by admin(%s): %s", ctx.User.Name, form.Name) | ||||
ctx.Flash.Success(ctx.Tr("admin.auths.new_success", form.Name)) | ctx.Flash.Success(ctx.Tr("admin.auths.new_success", form.Name)) | ||||
ctx.Redirect(setting.AppSubUrl + "/admin/auths") | |||||
ctx.Redirect(setting.AppSubURL + "/admin/auths") | |||||
} | } | ||||
// EditAuthSource render editing auth source page | // EditAuthSource render editing auth source page | ||||
log.Trace("Authentication changed by admin(%s): %s", ctx.User.Name, source.ID) | log.Trace("Authentication changed by admin(%s): %s", ctx.User.Name, source.ID) | ||||
ctx.Flash.Success(ctx.Tr("admin.auths.update_success")) | ctx.Flash.Success(ctx.Tr("admin.auths.update_success")) | ||||
ctx.Redirect(setting.AppSubUrl + "/admin/auths/" + com.ToStr(form.ID)) | |||||
ctx.Redirect(setting.AppSubURL + "/admin/auths/" + com.ToStr(form.ID)) | |||||
} | } | ||||
// DeleteAuthSource response for deleting an auth source | // DeleteAuthSource response for deleting an auth source | ||||
ctx.Flash.Error(fmt.Sprintf("DeleteSource: %v", err)) | ctx.Flash.Error(fmt.Sprintf("DeleteSource: %v", err)) | ||||
} | } | ||||
ctx.JSON(200, map[string]interface{}{ | ctx.JSON(200, map[string]interface{}{ | ||||
"redirect": setting.AppSubUrl + "/admin/auths/" + ctx.Params(":authid"), | |||||
"redirect": setting.AppSubURL + "/admin/auths/" + ctx.Params(":authid"), | |||||
}) | }) | ||||
return | return | ||||
} | } | ||||
ctx.Flash.Success(ctx.Tr("admin.auths.deletion_success")) | ctx.Flash.Success(ctx.Tr("admin.auths.deletion_success")) | ||||
ctx.JSON(200, map[string]interface{}{ | ctx.JSON(200, map[string]interface{}{ | ||||
"redirect": setting.AppSubUrl + "/admin/auths", | |||||
"redirect": setting.AppSubURL + "/admin/auths", | |||||
}) | }) | ||||
} | } |
log.Trace("System notices deleted by admin (%s): [start: %d]", ctx.User.Name, 0) | log.Trace("System notices deleted by admin (%s): [start: %d]", ctx.User.Name, 0) | ||||
ctx.Flash.Success(ctx.Tr("admin.notices.delete_success")) | ctx.Flash.Success(ctx.Tr("admin.notices.delete_success")) | ||||
ctx.Redirect(setting.AppSubUrl + "/admin/notices") | |||||
ctx.Redirect(setting.AppSubURL + "/admin/notices") | |||||
} | } |
ctx.Flash.Success(ctx.Tr("repo.settings.deletion_success")) | ctx.Flash.Success(ctx.Tr("repo.settings.deletion_success")) | ||||
ctx.JSON(200, map[string]interface{}{ | ctx.JSON(200, map[string]interface{}{ | ||||
"redirect": setting.AppSubUrl + "/admin/repos?page=" + ctx.Query("page"), | |||||
"redirect": setting.AppSubURL + "/admin/repos?page=" + ctx.Query("page"), | |||||
}) | }) | ||||
} | } |
} | } | ||||
ctx.Flash.Success(ctx.Tr("admin.users.new_success", u.Name)) | ctx.Flash.Success(ctx.Tr("admin.users.new_success", u.Name)) | ||||
ctx.Redirect(setting.AppSubUrl + "/admin/users/" + com.ToStr(u.ID)) | |||||
ctx.Redirect(setting.AppSubURL + "/admin/users/" + com.ToStr(u.ID)) | |||||
} | } | ||||
func prepareUserInfo(ctx *context.Context) *models.User { | func prepareUserInfo(ctx *context.Context) *models.User { | ||||
log.Trace("Account profile updated by admin (%s): %s", ctx.User.Name, u.Name) | 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.Flash.Success(ctx.Tr("admin.users.update_profile_success")) | ||||
ctx.Redirect(setting.AppSubUrl + "/admin/users/" + ctx.Params(":userid")) | |||||
ctx.Redirect(setting.AppSubURL + "/admin/users/" + ctx.Params(":userid")) | |||||
} | } | ||||
// DeleteUser response for deleting a user | // DeleteUser response for deleting a user | ||||
case models.IsErrUserOwnRepos(err): | case models.IsErrUserOwnRepos(err): | ||||
ctx.Flash.Error(ctx.Tr("admin.users.still_own_repo")) | ctx.Flash.Error(ctx.Tr("admin.users.still_own_repo")) | ||||
ctx.JSON(200, map[string]interface{}{ | ctx.JSON(200, map[string]interface{}{ | ||||
"redirect": setting.AppSubUrl + "/admin/users/" + ctx.Params(":userid"), | |||||
"redirect": setting.AppSubURL + "/admin/users/" + ctx.Params(":userid"), | |||||
}) | }) | ||||
case models.IsErrUserHasOrgs(err): | case models.IsErrUserHasOrgs(err): | ||||
ctx.Flash.Error(ctx.Tr("admin.users.still_has_org")) | ctx.Flash.Error(ctx.Tr("admin.users.still_has_org")) | ||||
ctx.JSON(200, map[string]interface{}{ | ctx.JSON(200, map[string]interface{}{ | ||||
"redirect": setting.AppSubUrl + "/admin/users/" + ctx.Params(":userid"), | |||||
"redirect": setting.AppSubURL + "/admin/users/" + ctx.Params(":userid"), | |||||
}) | }) | ||||
default: | default: | ||||
ctx.Handle(500, "DeleteUser", err) | ctx.Handle(500, "DeleteUser", err) | ||||
ctx.Flash.Success(ctx.Tr("admin.users.deletion_success")) | ctx.Flash.Success(ctx.Tr("admin.users.deletion_success")) | ||||
ctx.JSON(200, map[string]interface{}{ | ctx.JSON(200, map[string]interface{}{ | ||||
"redirect": setting.AppSubUrl + "/admin/users", | |||||
"redirect": setting.AppSubURL + "/admin/users", | |||||
}) | }) | ||||
} | } |
) | ) | ||||
func composeDeployKeysAPILink(repoPath string) string { | func composeDeployKeysAPILink(repoPath string) string { | ||||
return setting.AppUrl + "api/v1/repos/" + repoPath + "/keys/" | |||||
return setting.AppURL + "api/v1/repos/" + repoPath + "/keys/" | |||||
} | } | ||||
// ListDeployKeys list all the deploy keys of a repository | // ListDeployKeys list all the deploy keys of a repository |
} | } | ||||
func composePublicKeysAPILink() string { | func composePublicKeysAPILink() string { | ||||
return setting.AppUrl + "api/v1/user/keys/" | |||||
return setting.AppURL + "api/v1/user/keys/" | |||||
} | } | ||||
func listPublicKeys(ctx *context.APIContext, uid int64) { | func listPublicKeys(ctx *context.APIContext, uid int64) { |
ctx.Data["User"] = models.User{Name: "Unknown"} | ctx.Data["User"] = models.User{Name: "Unknown"} | ||||
ctx.Data["AppName"] = setting.AppName | ctx.Data["AppName"] = setting.AppName | ||||
ctx.Data["AppVer"] = setting.AppVer | ctx.Data["AppVer"] = setting.AppVer | ||||
ctx.Data["AppUrl"] = setting.AppUrl | |||||
ctx.Data["AppUrl"] = setting.AppURL | |||||
ctx.Data["Code"] = "2014031910370000009fff6782aadb2162b4a997acb69d4400888e0b9274657374" | ctx.Data["Code"] = "2014031910370000009fff6782aadb2162b4a997acb69d4400888e0b9274657374" | ||||
ctx.Data["ActiveCodeLives"] = setting.Service.ActiveCodeLives / 60 | ctx.Data["ActiveCodeLives"] = setting.Service.ActiveCodeLives / 60 | ||||
ctx.Data["ResetPwdCodeLives"] = setting.Service.ResetPwdCodeLives / 60 | ctx.Data["ResetPwdCodeLives"] = setting.Service.ResetPwdCodeLives / 60 |
// Check auto-login. | // Check auto-login. | ||||
uname := ctx.GetCookie(setting.CookieUserName) | uname := ctx.GetCookie(setting.CookieUserName) | ||||
if len(uname) != 0 { | if len(uname) != 0 { | ||||
ctx.Redirect(setting.AppSubUrl + "/user/login") | |||||
ctx.Redirect(setting.AppSubURL + "/user/login") | |||||
return | return | ||||
} | } | ||||
form.Domain = setting.Domain | form.Domain = setting.Domain | ||||
form.SSHPort = setting.SSH.Port | form.SSHPort = setting.SSH.Port | ||||
form.HTTPPort = setting.HTTPPort | form.HTTPPort = setting.HTTPPort | ||||
form.AppUrl = setting.AppUrl | |||||
form.AppUrl = setting.AppURL | |||||
form.LogRootPath = setting.LogRootPath | form.LogRootPath = setting.LogRootPath | ||||
// E-mail service settings | // E-mail service settings |
if ctx.Params(":action") != "leave" { | if ctx.Params(":action") != "leave" { | ||||
ctx.Redirect(ctx.Org.OrgLink + "/members") | ctx.Redirect(ctx.Org.OrgLink + "/members") | ||||
} else { | } else { | ||||
ctx.Redirect(setting.AppSubUrl + "/") | |||||
ctx.Redirect(setting.AppSubURL + "/") | |||||
} | } | ||||
} | } | ||||
} | } | ||||
log.Trace("Organization created: %s", org.Name) | log.Trace("Organization created: %s", org.Name) | ||||
ctx.Redirect(setting.AppSubUrl + "/org/" + form.OrgName + "/dashboard") | |||||
ctx.Redirect(setting.AppSubURL + "/org/" + form.OrgName + "/dashboard") | |||||
} | } |
return | return | ||||
} | } | ||||
// reset ctx.org.OrgLink with new name | // reset ctx.org.OrgLink with new name | ||||
ctx.Org.OrgLink = setting.AppSubUrl + "/org/" + form.Name | |||||
ctx.Org.OrgLink = setting.AppSubURL + "/org/" + form.Name | |||||
log.Trace("Organization name changed: %s -> %s", org.Name, form.Name) | log.Trace("Organization name changed: %s -> %s", org.Name, form.Name) | ||||
} | } | ||||
// In case it's just a case change. | // In case it's just a case change. | ||||
} | } | ||||
} else { | } else { | ||||
log.Trace("Organization deleted: %s", org.Name) | log.Trace("Organization deleted: %s", org.Name) | ||||
ctx.Redirect(setting.AppSubUrl + "/") | |||||
ctx.Redirect(setting.AppSubURL + "/") | |||||
} | } | ||||
return | return | ||||
} | } |
ctx.Data["Diff"] = diff | ctx.Data["Diff"] = diff | ||||
ctx.Data["Parents"] = parents | ctx.Data["Parents"] = parents | ||||
ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0 | ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0 | ||||
ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(userName, repoName, "src", commitID) | |||||
ctx.Data["SourcePath"] = setting.AppSubURL + "/" + path.Join(userName, repoName, "src", commitID) | |||||
if commit.ParentCount() > 0 { | if commit.ParentCount() > 0 { | ||||
ctx.Data["BeforeSourcePath"] = setting.AppSubUrl + "/" + path.Join(userName, repoName, "src", parents[0]) | |||||
ctx.Data["BeforeSourcePath"] = setting.AppSubURL + "/" + path.Join(userName, repoName, "src", parents[0]) | |||||
} | } | ||||
ctx.Data["RawPath"] = setting.AppSubUrl + "/" + path.Join(userName, repoName, "raw", commitID) | |||||
ctx.Data["RawPath"] = setting.AppSubURL + "/" + path.Join(userName, repoName, "raw", commitID) | |||||
ctx.HTML(200, tplDiff) | ctx.HTML(200, tplDiff) | ||||
} | } | ||||
ctx.Data["Commit"] = commit | ctx.Data["Commit"] = commit | ||||
ctx.Data["Diff"] = diff | ctx.Data["Diff"] = diff | ||||
ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0 | ctx.Data["DiffNotAvailable"] = diff.NumFiles() == 0 | ||||
ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(userName, repoName, "src", afterCommitID) | |||||
ctx.Data["BeforeSourcePath"] = setting.AppSubUrl + "/" + path.Join(userName, repoName, "src", beforeCommitID) | |||||
ctx.Data["RawPath"] = setting.AppSubUrl + "/" + path.Join(userName, repoName, "raw", afterCommitID) | |||||
ctx.Data["SourcePath"] = setting.AppSubURL + "/" + path.Join(userName, repoName, "src", afterCommitID) | |||||
ctx.Data["BeforeSourcePath"] = setting.AppSubURL + "/" + path.Join(userName, repoName, "src", beforeCommitID) | |||||
ctx.Data["RawPath"] = setting.AppSubURL + "/" + path.Join(userName, repoName, "raw", afterCommitID) | |||||
ctx.HTML(200, tplDiff) | ctx.HTML(200, tplDiff) | ||||
} | } |
ctx.Data["MarkdownFileExts"] = strings.Join(setting.Markdown.FileExtensions, ",") | ctx.Data["MarkdownFileExts"] = strings.Join(setting.Markdown.FileExtensions, ",") | ||||
ctx.Data["LineWrapExtensions"] = strings.Join(setting.Repository.Editor.LineWrapExtensions, ",") | ctx.Data["LineWrapExtensions"] = strings.Join(setting.Repository.Editor.LineWrapExtensions, ",") | ||||
ctx.Data["PreviewableFileModes"] = strings.Join(setting.Repository.Editor.PreviewableFileModes, ",") | ctx.Data["PreviewableFileModes"] = strings.Join(setting.Repository.Editor.PreviewableFileModes, ",") | ||||
ctx.Data["EditorconfigURLPrefix"] = fmt.Sprintf("%s/api/v1/repos/%s/editorconfig/", setting.AppSubUrl, ctx.Repo.Repository.FullName()) | |||||
ctx.Data["EditorconfigURLPrefix"] = fmt.Sprintf("%s/api/v1/repos/%s/editorconfig/", setting.AppSubURL, ctx.Repo.Repository.FullName()) | |||||
ctx.HTML(200, tplEditFile) | ctx.HTML(200, tplEditFile) | ||||
} | } |
// Must sign in to see issues about you. | // Must sign in to see issues about you. | ||||
if viewType != "all" && !ctx.IsSigned { | if viewType != "all" && !ctx.IsSigned { | ||||
ctx.SetCookie("redirect_to", "/"+url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI), 0, setting.AppSubUrl) | |||||
ctx.Redirect(setting.AppSubUrl + "/user/login") | |||||
ctx.SetCookie("redirect_to", "/"+url.QueryEscape(setting.AppSubURL+ctx.Req.RequestURI), 0, setting.AppSubURL) | |||||
ctx.Redirect(setting.AppSubURL + "/user/login") | |||||
return | return | ||||
} | } | ||||
ctx.Data["NumParticipants"] = len(participants) | ctx.Data["NumParticipants"] = len(participants) | ||||
ctx.Data["Issue"] = issue | ctx.Data["Issue"] = issue | ||||
ctx.Data["IsIssueOwner"] = ctx.Repo.IsWriter() || (ctx.IsSigned && issue.IsPoster(ctx.User.ID)) | ctx.Data["IsIssueOwner"] = ctx.Repo.IsWriter() || (ctx.IsSigned && issue.IsPoster(ctx.User.ID)) | ||||
ctx.Data["SignInLink"] = setting.AppSubUrl + "/user/login?redirect_to=" + ctx.Data["Link"].(string) | |||||
ctx.Data["SignInLink"] = setting.AppSubURL + "/user/login?redirect_to=" + ctx.Data["Link"].(string) | |||||
ctx.HTML(200, tplIssueView) | ctx.HTML(200, tplIssueView) | ||||
} | } | ||||
repo, has := models.HasForkedRepo(ctxUser.ID, forkRepo.ID) | repo, has := models.HasForkedRepo(ctxUser.ID, forkRepo.ID) | ||||
if has { | if has { | ||||
ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + repo.Name) | |||||
ctx.Redirect(setting.AppSubURL + "/" + ctxUser.Name + "/" + repo.Name) | |||||
return | return | ||||
} | } | ||||
} | } | ||||
log.Trace("Repository forked[%d]: %s/%s", forkRepo.ID, ctxUser.Name, repo.Name) | log.Trace("Repository forked[%d]: %s/%s", forkRepo.ID, ctxUser.Name, repo.Name) | ||||
ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + repo.Name) | |||||
ctx.Redirect(setting.AppSubURL + "/" + ctxUser.Name + "/" + repo.Name) | |||||
} | } | ||||
func checkPullInfo(ctx *context.Context) *models.Issue { | func checkPullInfo(ctx *context.Context) *models.Issue { | ||||
ctx.Data["Username"] = pull.HeadUserName | ctx.Data["Username"] = pull.HeadUserName | ||||
ctx.Data["Reponame"] = pull.HeadRepo.Name | ctx.Data["Reponame"] = pull.HeadRepo.Name | ||||
ctx.Data["IsImageFile"] = commit.IsImageFile | ctx.Data["IsImageFile"] = commit.IsImageFile | ||||
ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", endCommitID) | |||||
ctx.Data["BeforeSourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", startCommitID) | |||||
ctx.Data["RawPath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "raw", endCommitID) | |||||
ctx.Data["SourcePath"] = setting.AppSubURL + "/" + path.Join(headTarget, "src", endCommitID) | |||||
ctx.Data["BeforeSourcePath"] = setting.AppSubURL + "/" + path.Join(headTarget, "src", startCommitID) | |||||
ctx.Data["RawPath"] = setting.AppSubURL + "/" + path.Join(headTarget, "raw", endCommitID) | |||||
ctx.Data["RequireHighlightJS"] = true | ctx.Data["RequireHighlightJS"] = true | ||||
ctx.HTML(200, tplPullFiles) | ctx.HTML(200, tplPullFiles) | ||||
ctx.Data["IsImageFile"] = headCommit.IsImageFile | ctx.Data["IsImageFile"] = headCommit.IsImageFile | ||||
headTarget := path.Join(headUser.Name, repo.Name) | headTarget := path.Join(headUser.Name, repo.Name) | ||||
ctx.Data["SourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", headCommitID) | |||||
ctx.Data["BeforeSourcePath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "src", prInfo.MergeBase) | |||||
ctx.Data["RawPath"] = setting.AppSubUrl + "/" + path.Join(headTarget, "raw", headCommitID) | |||||
ctx.Data["SourcePath"] = setting.AppSubURL + "/" + path.Join(headTarget, "src", headCommitID) | |||||
ctx.Data["BeforeSourcePath"] = setting.AppSubURL + "/" + path.Join(headTarget, "src", prInfo.MergeBase) | |||||
ctx.Data["RawPath"] = setting.AppSubURL + "/" + path.Join(headTarget, "raw", headCommitID) | |||||
return false | return false | ||||
} | } | ||||
}) | }) | ||||
if err == nil { | if err == nil { | ||||
log.Trace("Repository created [%d]: %s/%s", repo.ID, ctxUser.Name, repo.Name) | log.Trace("Repository created [%d]: %s/%s", repo.ID, ctxUser.Name, repo.Name) | ||||
ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + repo.Name) | |||||
ctx.Redirect(setting.AppSubURL + "/" + ctxUser.Name + "/" + repo.Name) | |||||
return | return | ||||
} | } | ||||
}) | }) | ||||
if err == nil { | if err == nil { | ||||
log.Trace("Repository migrated [%d]: %s/%s", repo.ID, ctxUser.Name, form.RepoName) | log.Trace("Repository migrated [%d]: %s/%s", repo.ID, ctxUser.Name, form.RepoName) | ||||
ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + form.RepoName) | |||||
ctx.Redirect(setting.AppSubURL + "/" + ctxUser.Name + "/" + form.RepoName) | |||||
return | return | ||||
} | } | ||||
} | } | ||||
log.Trace("Repository converted from mirror to regular: %s/%s", ctx.Repo.Owner.Name, repo.Name) | log.Trace("Repository converted from mirror to regular: %s/%s", ctx.Repo.Owner.Name, repo.Name) | ||||
ctx.Flash.Success(ctx.Tr("repo.settings.convert_succeed")) | ctx.Flash.Success(ctx.Tr("repo.settings.convert_succeed")) | ||||
ctx.Redirect(setting.AppSubUrl + "/" + ctx.Repo.Owner.Name + "/" + repo.Name) | |||||
ctx.Redirect(setting.AppSubURL + "/" + ctx.Repo.Owner.Name + "/" + repo.Name) | |||||
case "transfer": | case "transfer": | ||||
if !ctx.Repo.IsOwner() { | if !ctx.Repo.IsOwner() { | ||||
} | } | ||||
log.Trace("Repository transfered: %s/%s -> %s", ctx.Repo.Owner.Name, repo.Name, newOwner) | log.Trace("Repository transfered: %s/%s -> %s", ctx.Repo.Owner.Name, repo.Name, newOwner) | ||||
ctx.Flash.Success(ctx.Tr("repo.settings.transfer_succeed")) | ctx.Flash.Success(ctx.Tr("repo.settings.transfer_succeed")) | ||||
ctx.Redirect(setting.AppSubUrl + "/" + newOwner + "/" + repo.Name) | |||||
ctx.Redirect(setting.AppSubURL + "/" + newOwner + "/" + repo.Name) | |||||
case "delete": | case "delete": | ||||
if !ctx.Repo.IsOwner() { | if !ctx.Repo.IsOwner() { | ||||
func CollaborationPost(ctx *context.Context) { | func CollaborationPost(ctx *context.Context) { | ||||
name := strings.ToLower(ctx.Query("collaborator")) | name := strings.ToLower(ctx.Query("collaborator")) | ||||
if len(name) == 0 || ctx.Repo.Owner.LowerName == name { | if len(name) == 0 || ctx.Repo.Owner.LowerName == name { | ||||
ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path) | |||||
ctx.Redirect(setting.AppSubURL + ctx.Req.URL.Path) | |||||
return | return | ||||
} | } | ||||
if err != nil { | if err != nil { | ||||
if models.IsErrUserNotExist(err) { | if models.IsErrUserNotExist(err) { | ||||
ctx.Flash.Error(ctx.Tr("form.user_not_exist")) | ctx.Flash.Error(ctx.Tr("form.user_not_exist")) | ||||
ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path) | |||||
ctx.Redirect(setting.AppSubURL + ctx.Req.URL.Path) | |||||
} else { | } else { | ||||
ctx.Handle(500, "GetUserByName", err) | ctx.Handle(500, "GetUserByName", err) | ||||
} | } | ||||
// Organization is not allowed to be added as a collaborator. | // Organization is not allowed to be added as a collaborator. | ||||
if u.IsOrganization() { | if u.IsOrganization() { | ||||
ctx.Flash.Error(ctx.Tr("repo.settings.org_not_allowed_to_be_collaborator")) | ctx.Flash.Error(ctx.Tr("repo.settings.org_not_allowed_to_be_collaborator")) | ||||
ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path) | |||||
ctx.Redirect(setting.AppSubURL + ctx.Req.URL.Path) | |||||
return | return | ||||
} | } | ||||
} | } | ||||
ctx.Flash.Success(ctx.Tr("repo.settings.add_collaborator_success")) | ctx.Flash.Success(ctx.Tr("repo.settings.add_collaborator_success")) | ||||
ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path) | |||||
ctx.Redirect(setting.AppSubURL + ctx.Req.URL.Path) | |||||
} | } | ||||
// ChangeCollaborationAccessMode response for changing access of a collaboration | // ChangeCollaborationAccessMode response for changing access of a collaboration |
defer func() { | defer func() { | ||||
if !isSucceed { | if !isSucceed { | ||||
log.Trace("auto-login cookie cleared: %s", uname) | log.Trace("auto-login cookie cleared: %s", uname) | ||||
ctx.SetCookie(setting.CookieUserName, "", -1, setting.AppSubUrl) | |||||
ctx.SetCookie(setting.CookieRememberName, "", -1, setting.AppSubUrl) | |||||
ctx.SetCookie(setting.CookieUserName, "", -1, setting.AppSubURL) | |||||
ctx.SetCookie(setting.CookieRememberName, "", -1, setting.AppSubURL) | |||||
} | } | ||||
}() | }() | ||||
isSucceed = true | isSucceed = true | ||||
ctx.Session.Set("uid", u.ID) | ctx.Session.Set("uid", u.ID) | ||||
ctx.Session.Set("uname", u.Name) | ctx.Session.Set("uname", u.Name) | ||||
ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubUrl) | |||||
ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL) | |||||
return true, nil | return true, nil | ||||
} | } | ||||
redirectTo := ctx.Query("redirect_to") | redirectTo := ctx.Query("redirect_to") | ||||
if len(redirectTo) > 0 { | if len(redirectTo) > 0 { | ||||
ctx.SetCookie("redirect_to", redirectTo, 0, setting.AppSubUrl) | |||||
ctx.SetCookie("redirect_to", redirectTo, 0, setting.AppSubURL) | |||||
} else { | } else { | ||||
redirectTo, _ = url.QueryUnescape(ctx.GetCookie("redirect_to")) | redirectTo, _ = url.QueryUnescape(ctx.GetCookie("redirect_to")) | ||||
} | } | ||||
if isSucceed { | if isSucceed { | ||||
if len(redirectTo) > 0 { | if len(redirectTo) > 0 { | ||||
ctx.SetCookie("redirect_to", "", -1, setting.AppSubUrl) | |||||
ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL) | |||||
ctx.Redirect(redirectTo) | ctx.Redirect(redirectTo) | ||||
} else { | } else { | ||||
ctx.Redirect(setting.AppSubUrl + "/") | |||||
ctx.Redirect(setting.AppSubURL + "/") | |||||
} | } | ||||
return | return | ||||
} | } | ||||
if form.Remember { | if form.Remember { | ||||
days := 86400 * setting.LogInRememberDays | days := 86400 * setting.LogInRememberDays | ||||
ctx.SetCookie(setting.CookieUserName, u.Name, days, setting.AppSubUrl) | |||||
ctx.SetCookie(setting.CookieUserName, u.Name, days, setting.AppSubURL) | |||||
ctx.SetSuperSecureCookie(base.EncodeMD5(u.Rands+u.Passwd), | ctx.SetSuperSecureCookie(base.EncodeMD5(u.Rands+u.Passwd), | ||||
setting.CookieRememberName, u.Name, days, setting.AppSubUrl) | |||||
setting.CookieRememberName, u.Name, days, setting.AppSubURL) | |||||
} | } | ||||
ctx.Session.Set("uid", u.ID) | ctx.Session.Set("uid", u.ID) | ||||
ctx.Session.Set("uname", u.Name) | ctx.Session.Set("uname", u.Name) | ||||
// Clear whatever CSRF has right now, force to generate a new one | // Clear whatever CSRF has right now, force to generate a new one | ||||
ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubUrl) | |||||
ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL) | |||||
// Register last login | // Register last login | ||||
u.SetLastLogin() | u.SetLastLogin() | ||||
} | } | ||||
if redirectTo, _ := url.QueryUnescape(ctx.GetCookie("redirect_to")); len(redirectTo) > 0 { | if redirectTo, _ := url.QueryUnescape(ctx.GetCookie("redirect_to")); len(redirectTo) > 0 { | ||||
ctx.SetCookie("redirect_to", "", -1, setting.AppSubUrl) | |||||
ctx.SetCookie("redirect_to", "", -1, setting.AppSubURL) | |||||
ctx.Redirect(redirectTo) | ctx.Redirect(redirectTo) | ||||
return | return | ||||
} | } | ||||
ctx.Redirect(setting.AppSubUrl + "/") | |||||
ctx.Redirect(setting.AppSubURL + "/") | |||||
} | } | ||||
// SignOut sign out from login status | // SignOut sign out from login status | ||||
ctx.Session.Delete("socialId") | ctx.Session.Delete("socialId") | ||||
ctx.Session.Delete("socialName") | ctx.Session.Delete("socialName") | ||||
ctx.Session.Delete("socialEmail") | ctx.Session.Delete("socialEmail") | ||||
ctx.SetCookie(setting.CookieUserName, "", -1, setting.AppSubUrl) | |||||
ctx.SetCookie(setting.CookieRememberName, "", -1, setting.AppSubUrl) | |||||
ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubUrl) | |||||
ctx.Redirect(setting.AppSubUrl + "/") | |||||
ctx.SetCookie(setting.CookieUserName, "", -1, setting.AppSubURL) | |||||
ctx.SetCookie(setting.CookieRememberName, "", -1, setting.AppSubURL) | |||||
ctx.SetCookie(setting.CSRFCookieName, "", -1, setting.AppSubURL) | |||||
ctx.Redirect(setting.AppSubURL + "/") | |||||
} | } | ||||
// SignUp render the register page | // SignUp render the register page | ||||
return | return | ||||
} | } | ||||
ctx.Redirect(setting.AppSubUrl + "/user/login") | |||||
ctx.Redirect(setting.AppSubURL + "/user/login") | |||||
} | } | ||||
// Activate render activate user page | // Activate render activate user page | ||||
ctx.Session.Set("uid", user.ID) | ctx.Session.Set("uid", user.ID) | ||||
ctx.Session.Set("uname", user.Name) | ctx.Session.Set("uname", user.Name) | ||||
ctx.Redirect(setting.AppSubUrl + "/") | |||||
ctx.Redirect(setting.AppSubURL + "/") | |||||
return | return | ||||
} | } | ||||
ctx.Flash.Success(ctx.Tr("settings.add_email_success")) | ctx.Flash.Success(ctx.Tr("settings.add_email_success")) | ||||
} | } | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings/email") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings/email") | |||||
return | return | ||||
} | } | ||||
} | } | ||||
log.Trace("User password reset: %s", u.Name) | log.Trace("User password reset: %s", u.Name) | ||||
ctx.Redirect(setting.AppSubUrl + "/user/login") | |||||
ctx.Redirect(setting.AppSubURL + "/user/login") | |||||
return | return | ||||
} | } | ||||
} | } | ||||
return | return | ||||
} | } | ||||
ctx.Redirect(setting.AppSubUrl + "/user/" + u.Name) | |||||
ctx.Redirect(setting.AppSubURL + "/user/" + u.Name) | |||||
} | } |
switch { | switch { | ||||
case models.IsErrUserAlreadyExist(err): | case models.IsErrUserAlreadyExist(err): | ||||
ctx.Flash.Error(ctx.Tr("newName_been_taken")) | ctx.Flash.Error(ctx.Tr("newName_been_taken")) | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings") | |||||
case models.IsErrEmailAlreadyUsed(err): | case models.IsErrEmailAlreadyUsed(err): | ||||
ctx.Flash.Error(ctx.Tr("form.email_been_used")) | ctx.Flash.Error(ctx.Tr("form.email_been_used")) | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings") | |||||
case models.IsErrNameReserved(err): | case models.IsErrNameReserved(err): | ||||
ctx.Flash.Error(ctx.Tr("user.newName_reserved")) | ctx.Flash.Error(ctx.Tr("user.newName_reserved")) | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings") | |||||
case models.IsErrNamePatternNotAllowed(err): | case models.IsErrNamePatternNotAllowed(err): | ||||
ctx.Flash.Error(ctx.Tr("user.newName_pattern_not_allowed")) | ctx.Flash.Error(ctx.Tr("user.newName_pattern_not_allowed")) | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings") | |||||
default: | default: | ||||
ctx.Handle(500, "ChangeUserName", err) | ctx.Handle(500, "ChangeUserName", err) | ||||
} | } | ||||
log.Trace("User settings updated: %s", ctx.User.Name) | log.Trace("User settings updated: %s", ctx.User.Name) | ||||
ctx.Flash.Success(ctx.Tr("settings.update_profile_success")) | ctx.Flash.Success(ctx.Tr("settings.update_profile_success")) | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings") | |||||
} | } | ||||
// UpdateAvatarSetting update user's avatar | // UpdateAvatarSetting update user's avatar | ||||
ctx.Flash.Success(ctx.Tr("settings.update_avatar_success")) | ctx.Flash.Success(ctx.Tr("settings.update_avatar_success")) | ||||
} | } | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings/avatar") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings/avatar") | |||||
} | } | ||||
// SettingsDeleteAvatar render delete avatar page | // SettingsDeleteAvatar render delete avatar page | ||||
ctx.Flash.Error(err.Error()) | ctx.Flash.Error(err.Error()) | ||||
} | } | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings/avatar") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings/avatar") | |||||
} | } | ||||
// SettingsPassword render change user's password page | // SettingsPassword render change user's password page | ||||
ctx.Flash.Success(ctx.Tr("settings.change_password_success")) | ctx.Flash.Success(ctx.Tr("settings.change_password_success")) | ||||
} | } | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings/password") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings/password") | |||||
} | } | ||||
// SettingsEmails render user's emails page | // SettingsEmails render user's emails page | ||||
} | } | ||||
log.Trace("Email made primary: %s", ctx.User.Name) | log.Trace("Email made primary: %s", ctx.User.Name) | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings/email") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings/email") | |||||
return | return | ||||
} | } | ||||
} | } | ||||
log.Trace("Email address added: %s", email.Email) | log.Trace("Email address added: %s", email.Email) | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings/email") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings/email") | |||||
} | } | ||||
// DeleteEmail reponse for delete user's email | // DeleteEmail reponse for delete user's email | ||||
ctx.Flash.Success(ctx.Tr("settings.email_deletion_success")) | ctx.Flash.Success(ctx.Tr("settings.email_deletion_success")) | ||||
ctx.JSON(200, map[string]interface{}{ | ctx.JSON(200, map[string]interface{}{ | ||||
"redirect": setting.AppSubUrl + "/user/settings/email", | |||||
"redirect": setting.AppSubURL + "/user/settings/email", | |||||
}) | }) | ||||
} | } | ||||
ctx.Flash.Info(ctx.Tr("form.unable_verify_ssh_key")) | ctx.Flash.Info(ctx.Tr("form.unable_verify_ssh_key")) | ||||
} else { | } else { | ||||
ctx.Flash.Error(ctx.Tr("form.invalid_ssh_key", err.Error())) | ctx.Flash.Error(ctx.Tr("form.invalid_ssh_key", err.Error())) | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings/ssh") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings/ssh") | |||||
return | return | ||||
} | } | ||||
} | } | ||||
} | } | ||||
ctx.Flash.Success(ctx.Tr("settings.add_key_success", form.Title)) | ctx.Flash.Success(ctx.Tr("settings.add_key_success", form.Title)) | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings/ssh") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings/ssh") | |||||
} | } | ||||
// DeleteSSHKey response for delete user's SSH key | // DeleteSSHKey response for delete user's SSH key | ||||
} | } | ||||
ctx.JSON(200, map[string]interface{}{ | ctx.JSON(200, map[string]interface{}{ | ||||
"redirect": setting.AppSubUrl + "/user/settings/ssh", | |||||
"redirect": setting.AppSubURL + "/user/settings/ssh", | |||||
}) | }) | ||||
} | } | ||||
ctx.Flash.Success(ctx.Tr("settings.generate_token_succees")) | ctx.Flash.Success(ctx.Tr("settings.generate_token_succees")) | ||||
ctx.Flash.Info(t.Sha1) | ctx.Flash.Info(t.Sha1) | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings/applications") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings/applications") | |||||
} | } | ||||
// SettingsDeleteApplication response for delete user access token | // SettingsDeleteApplication response for delete user access token | ||||
} | } | ||||
ctx.JSON(200, map[string]interface{}{ | ctx.JSON(200, map[string]interface{}{ | ||||
"redirect": setting.AppSubUrl + "/user/settings/applications", | |||||
"redirect": setting.AppSubURL + "/user/settings/applications", | |||||
}) | }) | ||||
} | } | ||||
switch { | switch { | ||||
case models.IsErrUserOwnRepos(err): | case models.IsErrUserOwnRepos(err): | ||||
ctx.Flash.Error(ctx.Tr("form.still_own_repo")) | ctx.Flash.Error(ctx.Tr("form.still_own_repo")) | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings/delete") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings/delete") | |||||
case models.IsErrUserHasOrgs(err): | case models.IsErrUserHasOrgs(err): | ||||
ctx.Flash.Error(ctx.Tr("form.still_has_org")) | ctx.Flash.Error(ctx.Tr("form.still_has_org")) | ||||
ctx.Redirect(setting.AppSubUrl + "/user/settings/delete") | |||||
ctx.Redirect(setting.AppSubURL + "/user/settings/delete") | |||||
default: | default: | ||||
ctx.Handle(500, "DeleteUser", err) | ctx.Handle(500, "DeleteUser", err) | ||||
} | } | ||||
} else { | } else { | ||||
log.Trace("Account deleted: %s", ctx.User.Name) | log.Trace("Account deleted: %s", ctx.User.Name) | ||||
ctx.Redirect(setting.AppSubUrl + "/") | |||||
ctx.Redirect(setting.AppSubURL + "/") | |||||
} | } | ||||
return | return | ||||
} | } |