summaryrefslogtreecommitdiffstats
path: root/modules/base
diff options
context:
space:
mode:
authorzeripath <art27@cantab.net>2020-03-27 12:34:39 +0000
committerGitHub <noreply@github.com>2020-03-27 14:34:39 +0200
commite6baa656f757fd1f2f6ba20c677e0c83422a8739 (patch)
treeb2a396f41e1b8a08b796084d169f202d593f7357 /modules/base
parenta3f90948d8fa4dd5c92e15cc10e86d2fec37f6e7 (diff)
downloadgitea-e6baa656f757fd1f2f6ba20c677e0c83422a8739.tar.gz
gitea-e6baa656f757fd1f2f6ba20c677e0c83422a8739.zip
make avatar lookup occur at image request (#10540)
speed up page generation by making avatar lookup occur at the browser not at page generation * Protect against evil email address ".." * hash the complete email address Signed-off-by: Andrew Thornton <art27@cantab.net> Co-Authored-By: Lauris BH <lauris@nix.lv>
Diffstat (limited to 'modules/base')
-rw-r--r--modules/base/tool.go31
-rw-r--r--modules/base/tool_test.go11
2 files changed, 26 insertions, 16 deletions
diff --git a/modules/base/tool.go b/modules/base/tool.go
index 86606c8bee..157bd9bc3d 100644
--- a/modules/base/tool.go
+++ b/modules/base/tool.go
@@ -193,11 +193,32 @@ func SizedAvatarLink(email string, size int) string {
return avatarURL.String()
}
-// 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)
+// SizedAvatarLinkWithDomain returns a sized link to the avatar for the given email
+// address.
+func SizedAvatarLinkWithDomain(email string, size int) string {
+ var avatarURL *url.URL
+ if setting.EnableFederatedAvatar && setting.LibravatarService != nil {
+ var err error
+ avatarURL, err = libravatarURL(email)
+ if err != nil {
+ return DefaultAvatarLink()
+ }
+ } 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()
+ }
+
+ vals := avatarURL.Query()
+ vals.Set("d", "identicon")
+ if size != DefaultAvatarSize {
+ vals.Set("s", strconv.Itoa(size))
+ }
+ avatarURL.RawQuery = vals.Encode()
+ return avatarURL.String()
}
// FileSize calculates the file size and generate user-friendly string.
diff --git a/modules/base/tool_test.go b/modules/base/tool_test.go
index 075b5ed817..9c1a79e3f2 100644
--- a/modules/base/tool_test.go
+++ b/modules/base/tool_test.go
@@ -90,17 +90,6 @@ func TestSizedAvatarLink(t *testing.T) {
)
}
-func TestAvatarLink(t *testing.T) {
- disableGravatar()
- assert.Equal(t, "/img/avatar_default.png", AvatarLink("gitea@example.com"))
-
- enableGravatar(t)
- assert.Equal(t,
- "https://secure.gravatar.com/avatar/353cbad9b58e69c96154ad99f92bedc7?d=identicon",
- AvatarLink("gitea@example.com"),
- )
-}
-
func TestFileSize(t *testing.T) {
var size int64 = 512
assert.Equal(t, "512 B", FileSize(size))