summaryrefslogtreecommitdiffstats
path: root/modules/base/tool.go
diff options
context:
space:
mode:
authorEthan Koenig <ethantkoenig@gmail.com>2017-12-03 03:55:13 -0800
committerLunny Xiao <xiaolunwen@gmail.com>2017-12-03 19:55:13 +0800
commitab62da283aa20475109eba907324f55123d7e3c6 (patch)
treea08bb1753ff39d9ecc74afc42374ba614c67d8bb /modules/base/tool.go
parent7bab3d2fb1d75ac29ad6a9b11203ea358b1979d3 (diff)
downloadgitea-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.go57
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 = &copyOfGravatarSourceURL
+ 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