diff options
author | silverwind <me@silverwind.io> | 2020-12-03 19:46:11 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-03 19:46:11 +0100 |
commit | 9269a038a4e904bdeaf5470e76e3a4f8a2a4685b (patch) | |
tree | 59730c0dbe7b011a8cb751d135e44152e7feeec0 /modules/base | |
parent | 0d35ef5b439623774d1adddf7071d744b1116809 (diff) | |
download | gitea-9269a038a4e904bdeaf5470e76e3a4f8a2a4685b.tar.gz gitea-9269a038a4e904bdeaf5470e76e3a4f8a2a4685b.zip |
Direct avatar rendering (#13649)
* Direct avatar rendering
This adds new template helpers for avatar rendering which output image
elements with direct links to avatars which makes them cacheable by the
browsers.
This should be a major performance improvment for pages with many avatars.
* fix avatars of other user's profile pages
* fix top border on user avatar name
* uncircle avatars
* remove old incomplete avatar selector
* use title attribute for name and add it back on blame
* minor refactor
* tweak comments
* fix url path join and adjust test to new result
* dedupe functions
Diffstat (limited to 'modules/base')
-rw-r--r-- | modules/base/tool.go | 89 | ||||
-rw-r--r-- | modules/base/tool_test.go | 41 |
2 files changed, 0 insertions, 130 deletions
diff --git a/modules/base/tool.go b/modules/base/tool.go index a21fd9b0f4..2cc09fb25d 100644 --- a/modules/base/tool.go +++ b/modules/base/tool.go @@ -12,9 +12,7 @@ import ( "encoding/hex" "fmt" "net/http" - "net/url" "os" - "path" "path/filepath" "runtime" "strconv" @@ -134,93 +132,6 @@ func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string return code } -// HashEmail hashes email address to MD5 string. -// https://en.gravatar.com/site/implement/hash/ -func HashEmail(email string) string { - return EncodeMD5(strings.ToLower(strings.TrimSpace(email))) -} - -// DefaultAvatarLink the default avatar link -func DefaultAvatarLink() string { - return setting.AppSubURL + "/img/avatar_default.png" -} - -// 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("LibravatarService.FromEmail(email=%s): error %v", email, err) - return nil, err - } - u, err := url.Parse(urlStr) - if err != nil { - log.Error("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 { - 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 = ©OfGravatarSourceURL - 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() -} - -// 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 = ©OfGravatarSourceURL - 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. func FileSize(s int64) string { return humanize.IBytes(uint64(s)) diff --git a/modules/base/tool_test.go b/modules/base/tool_test.go index f765fd0db0..0c5bd66579 100644 --- a/modules/base/tool_test.go +++ b/modules/base/tool_test.go @@ -5,11 +5,8 @@ package base import ( - "net/url" "testing" - "code.gitea.io/gitea/modules/setting" - "github.com/stretchr/testify/assert" ) @@ -56,44 +53,6 @@ func TestBasicAuthEncode(t *testing.T) { // TODO: Test VerifyTimeLimitCode() // TODO: Test CreateTimeLimitCode() -func TestHashEmail(t *testing.T) { - assert.Equal(t, - "d41d8cd98f00b204e9800998ecf8427e", - HashEmail(""), - ) - assert.Equal(t, - "353cbad9b58e69c96154ad99f92bedc7", - HashEmail("gitea@example.com"), - ) -} - -const gravatarSource = "https://secure.gravatar.com/avatar/" - -func disableGravatar() { - setting.EnableFederatedAvatar = false - setting.LibravatarService = nil - setting.DisableGravatar = true -} - -func enableGravatar(t *testing.T) { - setting.DisableGravatar = false - var err error - setting.GravatarSourceURL, err = url.Parse(gravatarSource) - assert.NoError(t, err) -} - -func TestSizedAvatarLink(t *testing.T) { - disableGravatar() - assert.Equal(t, "/img/avatar_default.png", - SizedAvatarLink("gitea@example.com", 100)) - - enableGravatar(t) - assert.Equal(t, - "https://secure.gravatar.com/avatar/353cbad9b58e69c96154ad99f92bedc7?d=identicon&s=100", - SizedAvatarLink("gitea@example.com", 100), - ) -} - func TestFileSize(t *testing.T) { var size int64 = 512 assert.Equal(t, "512 B", FileSize(size)) |