aboutsummaryrefslogtreecommitdiffstats
path: root/models/avatar.go
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 /models/avatar.go
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 'models/avatar.go')
-rw-r--r--models/avatar.go48
1 files changed, 48 insertions, 0 deletions
diff --git a/models/avatar.go b/models/avatar.go
new file mode 100644
index 0000000000..311d714629
--- /dev/null
+++ b/models/avatar.go
@@ -0,0 +1,48 @@
+// Copyright 2020 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package models
+
+import (
+ "crypto/md5"
+ "fmt"
+ "net/url"
+ "strings"
+
+ "code.gitea.io/gitea/modules/cache"
+ "code.gitea.io/gitea/modules/setting"
+)
+
+// EmailHash represents a pre-generated hash map
+type EmailHash struct {
+ Hash string `xorm:"pk varchar(32)"`
+ Email string `xorm:"UNIQUE NOT NULL"`
+}
+
+// GetEmailForHash converts a provided md5sum to the email
+func GetEmailForHash(md5Sum string) (string, error) {
+ return cache.GetString("Avatar:"+md5Sum, func() (string, error) {
+ emailHash := EmailHash{
+ Hash: strings.ToLower(strings.TrimSpace(md5Sum)),
+ }
+
+ _, err := x.Get(&emailHash)
+ return emailHash.Email, err
+ })
+}
+
+// AvatarLink returns an avatar link for a provided email
+func AvatarLink(email string) string {
+ lowerEmail := strings.ToLower(strings.TrimSpace(email))
+ sum := fmt.Sprintf("%x", md5.Sum([]byte(lowerEmail)))
+ _, _ = cache.GetString("Avatar:"+sum, func() (string, error) {
+ emailHash := &EmailHash{
+ Email: lowerEmail,
+ Hash: sum,
+ }
+ _, _ = x.Insert(emailHash)
+ return lowerEmail, nil
+ })
+ return setting.AppSubURL + "/avatar/" + url.PathEscape(sum)
+}