diff options
author | Ethan Koenig <ethantkoenig@gmail.com> | 2017-12-03 03:55:13 -0800 |
---|---|---|
committer | Lunny Xiao <xiaolunwen@gmail.com> | 2017-12-03 19:55:13 +0800 |
commit | ab62da283aa20475109eba907324f55123d7e3c6 (patch) | |
tree | a08bb1753ff39d9ecc74afc42374ba614c67d8bb /modules/base/tool.go | |
parent | 7bab3d2fb1d75ac29ad6a9b11203ea358b1979d3 (diff) | |
download | gitea-ab62da283aa20475109eba907324f55123d7e3c6.tar.gz gitea-ab62da283aa20475109eba907324f55123d7e3c6.zip |
Fix avatar URLs (#3069)
* Fix avatar URLs
* import order
Diffstat (limited to 'modules/base/tool.go')
-rw-r--r-- | modules/base/tool.go | 57 |
1 files changed, 47 insertions, 10 deletions
diff --git a/modules/base/tool.go b/modules/base/tool.go index 194db772cf..1316b8fad3 100644 --- a/modules/base/tool.go +++ b/modules/base/tool.go @@ -16,6 +16,8 @@ import ( "math" "math/big" "net/http" + "net/url" + "path" "strconv" "strings" "time" @@ -197,24 +199,59 @@ func DefaultAvatarLink() string { return setting.AppSubURL + "/img/avatar_default.png" } -// AvatarLink returns relative avatar link to the site domain by given email, -// which includes app sub-url as prefix. However, it is possible -// to return full URL if user enables Gravatar-like service. -func AvatarLink(email string) string { +// DefaultAvatarSize is a sentinel value for the default avatar size, as +// determined by the avatar-hosting service. +const DefaultAvatarSize = -1 + +// libravatarURL returns the URL for the given email. This function should only +// be called if a federated avatar service is enabled. +func libravatarURL(email string) (*url.URL, error) { + urlStr, err := setting.LibravatarService.FromEmail(email) + if err != nil { + log.Error(4, "LibravatarService.FromEmail(email=%s): error %v", email, err) + return nil, err + } + u, err := url.Parse(urlStr) + if err != nil { + log.Error(4, "Failed to parse libravatar url(%s): error %v", urlStr, err) + return nil, err + } + return u, nil +} + +// SizedAvatarLink returns a sized link to the avatar for the given email +// address. +func SizedAvatarLink(email string, size int) string { + var avatarURL *url.URL if setting.EnableFederatedAvatar && setting.LibravatarService != nil { - url, err := setting.LibravatarService.FromEmail(email) + var err error + avatarURL, err = libravatarURL(email) if err != nil { - log.Error(4, "LibravatarService.FromEmail(email=%s): error %v", email, err) return DefaultAvatarLink() } - return url + } else if !setting.DisableGravatar { + // copy GravatarSourceURL, because we will modify its Path. + copyOfGravatarSourceURL := *setting.GravatarSourceURL + avatarURL = ©OfGravatarSourceURL + avatarURL.Path = path.Join(avatarURL.Path, HashEmail(email)) + } else { + return DefaultAvatarLink() } - if !setting.DisableGravatar { - return setting.GravatarSource + HashEmail(email) + "?d=identicon" + vals := avatarURL.Query() + vals.Set("d", "identicon") + if size != DefaultAvatarSize { + vals.Set("s", strconv.Itoa(size)) } + avatarURL.RawQuery = vals.Encode() + return avatarURL.String() +} - return DefaultAvatarLink() +// AvatarLink returns relative avatar link to the site domain by given email, +// which includes app sub-url as prefix. However, it is possible +// to return full URL if user enables Gravatar-like service. +func AvatarLink(email string) string { + return SizedAvatarLink(email, DefaultAvatarSize) } // Seconds-based time units |