summaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/auth/sso/sspi_windows.go2
-rw-r--r--modules/base/tool.go89
-rw-r--r--modules/base/tool_test.go41
-rw-r--r--modules/repository/commits.go2
-rw-r--r--modules/templates/helper.go67
5 files changed, 62 insertions, 139 deletions
diff --git a/modules/auth/sso/sspi_windows.go b/modules/auth/sso/sspi_windows.go
index 00f15d97be..62013737ca 100644
--- a/modules/auth/sso/sspi_windows.go
+++ b/modules/auth/sso/sspi_windows.go
@@ -168,7 +168,7 @@ func (s *SSPI) newUser(ctx *macaron.Context, username string, cfg *models.SSPICo
IsActive: cfg.AutoActivateUsers,
Language: cfg.DefaultLanguage,
UseCustomAvatar: true,
- Avatar: base.DefaultAvatarLink(),
+ Avatar: models.DefaultAvatarLink(),
EmailNotificationsPreference: models.EmailNotificationsDisabled,
}
if err := models.CreateUser(user); err != nil {
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 = &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()
-}
-
-// 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.
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))
diff --git a/modules/repository/commits.go b/modules/repository/commits.go
index e02f3d11ca..fd8b8d927a 100644
--- a/modules/repository/commits.go
+++ b/modules/repository/commits.go
@@ -123,7 +123,7 @@ func (pc *PushCommits) AvatarLink(email string) string {
var err error
u, err = models.GetUserByEmail(email)
if err != nil {
- pc.avatars[email] = models.AvatarLink(email)
+ pc.avatars[email] = models.HashedAvatarLink(email)
if !models.IsErrUserNotExist(err) {
log.Error("GetUserByEmail: %v", err)
return ""
diff --git a/modules/templates/helper.go b/modules/templates/helper.go
index 8b96397529..5af1addb60 100644
--- a/modules/templates/helper.go
+++ b/modules/templates/helper.go
@@ -88,7 +88,6 @@ func NewFuncMap() []template.FuncMap {
"AllowedReactions": func() []string {
return setting.UI.Reactions
},
- "AvatarLink": models.AvatarLink,
"Safe": Safe,
"SafeJS": SafeJS,
"Str2html": Str2html,
@@ -339,7 +338,9 @@ func NewFuncMap() []template.FuncMap {
}
return false
},
- "svg": SVG,
+ "svg": SVG,
+ "avatar": Avatar,
+ "avatarByEmail": AvatarByEmail,
"SortArrow": func(normSort, revSort, urlSort string, isDefault bool) template.HTML {
// if needed
if len(normSort) == 0 || len(urlSort) == 0 {
@@ -499,18 +500,38 @@ func NewTextFuncMap() []texttmpl.FuncMap {
var widthRe = regexp.MustCompile(`width="[0-9]+?"`)
var heightRe = regexp.MustCompile(`height="[0-9]+?"`)
-// SVG render icons - arguments icon name (string), size (int), class (string)
-func SVG(icon string, others ...interface{}) template.HTML {
- size := 16
+func parseOthers(defaultSize int, defaultClass string, others ...interface{}) (int, string) {
+ size := defaultSize
if len(others) > 0 && others[0].(int) != 0 {
size = others[0].(int)
}
- class := ""
+ class := defaultClass
if len(others) > 1 && others[1].(string) != "" {
- class = others[1].(string)
+ if defaultClass == "" {
+ class = others[1].(string)
+ } else {
+ class = defaultClass + " " + others[1].(string)
+ }
+ }
+
+ return size, class
+}
+
+func avatarHTML(src string, size int, class string, name string) template.HTML {
+ sizeStr := fmt.Sprintf(`%d`, size)
+
+ if name == "" {
+ name = "avatar"
}
+ return template.HTML(`<img class="` + class + `" src="` + src + `" title="` + html.EscapeString(name) + `" width="` + sizeStr + `" height="` + sizeStr + `"/>`)
+}
+
+// SVG render icons - arguments icon name (string), size (int), class (string)
+func SVG(icon string, others ...interface{}) template.HTML {
+ size, class := parseOthers(16, "", others...)
+
if svgStr, ok := svg.SVGs[icon]; ok {
if size != 16 {
svgStr = widthRe.ReplaceAllString(svgStr, fmt.Sprintf(`width="%d"`, size))
@@ -524,6 +545,38 @@ func SVG(icon string, others ...interface{}) template.HTML {
return template.HTML("")
}
+// Avatar renders user and repo avatars. args: user/repo, size (int), class (string)
+func Avatar(item interface{}, others ...interface{}) template.HTML {
+ size, class := parseOthers(28, "ui avatar image", others...)
+ if user, ok := item.(*models.User); ok {
+ src := user.RealSizedAvatarLink(size * 2) // request double size for finer rendering
+ if src != "" {
+ return avatarHTML(src, size, class, user.DisplayName())
+ }
+ }
+
+ if repo, ok := item.(*models.Repository); ok {
+ src := repo.RelAvatarLink()
+ if src != "" {
+ return avatarHTML(src, size, class, repo.FullName())
+ }
+ }
+
+ return template.HTML("")
+}
+
+// AvatarByEmail renders avatars by email address. args: email, name, size (int), class (string)
+func AvatarByEmail(email string, name string, others ...interface{}) template.HTML {
+ size, class := parseOthers(28, "ui avatar image", others...)
+ src := models.SizedAvatarLink(email, size*2) // request double size for finer rendering
+
+ if src != "" {
+ return avatarHTML(src, size, class, name)
+ }
+
+ return template.HTML("")
+}
+
// Safe render raw as HTML
func Safe(raw string) template.HTML {
return template.HTML(raw)