mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-11-03 20:36:07 +01:00 
			
		
		
		
	Alwaywas return local url for users avatar (#8245)
* Always return local url for users avatar Avoids having to wait for DNS lookups when libravatar is activated fixing #6046 * Avoid double slash in avatar link * Move avatar route to the correct place
This commit is contained in:
		
				
					committed by
					
						
						techknowlogick
					
				
			
			
				
	
			
			
			
						parent
						
							b2b927808b
						
					
				
				
					commit
					d958b9db4f
				
			@@ -173,7 +173,7 @@ func TestPushCommits_AvatarLink(t *testing.T) {
 | 
			
		||||
	pushCommits.Len = len(pushCommits.Commits)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t,
 | 
			
		||||
		"https://secure.gravatar.com/avatar/ab53a2911ddf9b4817ac01ddcd3d975f?d=identicon",
 | 
			
		||||
		"/suburl/user/avatar/user2/-1",
 | 
			
		||||
		pushCommits.AvatarLink("user2@example.com"))
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t,
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@ import (
 | 
			
		||||
	"image/png"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
	"unicode/utf8"
 | 
			
		||||
@@ -374,9 +375,20 @@ func (u *User) generateRandomAvatar(e Engine) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SizedRelAvatarLink returns a relative link to the user's avatar. When
 | 
			
		||||
// applicable, the link is for an avatar of the indicated size (in pixels).
 | 
			
		||||
// SizedRelAvatarLink returns a link to the user's avatar via
 | 
			
		||||
// the local explore page. Function returns immediately.
 | 
			
		||||
// When applicable, the link is for an avatar of the indicated size (in pixels).
 | 
			
		||||
func (u *User) SizedRelAvatarLink(size int) string {
 | 
			
		||||
	return strings.TrimRight(setting.AppSubURL, "/") + "/user/avatar/" + u.Name + "/" + strconv.Itoa(size)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RealSizedAvatarLink returns a link to the user's avatar. When
 | 
			
		||||
// applicable, the link is for an avatar of the indicated size (in pixels).
 | 
			
		||||
//
 | 
			
		||||
// This function make take time to return when federated avatars
 | 
			
		||||
// are in use, due to a DNS lookup need
 | 
			
		||||
//
 | 
			
		||||
func (u *User) RealSizedAvatarLink(size int) string {
 | 
			
		||||
	if u.ID == -1 {
 | 
			
		||||
		return base.DefaultAvatarLink()
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -404,6 +404,7 @@ func RegisterRoutes(m *macaron.Macaron) {
 | 
			
		||||
		// r.Get("/feeds", binding.Bind(auth.FeedsForm{}), user.Feeds)
 | 
			
		||||
		m.Any("/activate", user.Activate, reqSignIn)
 | 
			
		||||
		m.Any("/activate_email", user.ActivateEmail)
 | 
			
		||||
		m.Get("/avatar/:username/:size", user.Avatar)
 | 
			
		||||
		m.Get("/email2user", user.Email2User)
 | 
			
		||||
		m.Get("/recover_account", user.ResetPasswd)
 | 
			
		||||
		m.Post("/recover_account", user.ResetPasswdPost)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										37
									
								
								routers/user/avatar.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								routers/user/avatar.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
// Copyright 2019 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 user
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"strconv"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models"
 | 
			
		||||
	"code.gitea.io/gitea/modules/context"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Avatar redirect browser to user avatar of requested size
 | 
			
		||||
func Avatar(ctx *context.Context) {
 | 
			
		||||
	userName := ctx.Params(":username")
 | 
			
		||||
	size, err := strconv.Atoi(ctx.Params(":size"))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.ServerError("Invalid avatar size", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log.Debug("Asked avatar for user %v and size %v", userName, size)
 | 
			
		||||
 | 
			
		||||
	user, err := models.GetUserByName(userName)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if models.IsErrUserNotExist(err) {
 | 
			
		||||
			ctx.ServerError("Requested avatar for invalid user", err)
 | 
			
		||||
		} else {
 | 
			
		||||
			ctx.ServerError("Retrieving user by name", err)
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx.Redirect(user.RealSizedAvatarLink(size))
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user