2023-06-17 01:25:15 +08:00
// Copyright 2023 The Casdoor Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package object
import (
"bytes"
2023-06-17 11:43:46 +08:00
"fmt"
"io"
2023-08-19 02:35:45 +08:00
"mime"
2023-06-17 11:43:46 +08:00
"net/http"
2023-06-17 01:25:15 +08:00
"strings"
"github.com/casdoor/casdoor/proxy"
)
2023-06-17 11:43:46 +08:00
func downloadImage ( client * http . Client , url string ) ( * bytes . Buffer , string , error ) {
// Download the image
req , err := http . NewRequest ( "GET" , url , nil )
if err != nil {
return nil , "" , err
}
resp , err := client . Do ( req )
if err != nil {
fmt . Printf ( "downloadImage() error for url [%s]: %s\n" , url , err . Error ( ) )
2023-10-18 02:25:22 +08:00
if strings . Contains ( err . Error ( ) , "EOF" ) || strings . Contains ( err . Error ( ) , "no such host" ) || strings . Contains ( err . Error ( ) , "did not properly respond after a period of time" ) || strings . Contains ( err . Error ( ) , "unrecognized name" ) {
2023-06-17 11:43:46 +08:00
return nil , "" , nil
} else {
return nil , "" , err
}
}
defer resp . Body . Close ( )
if resp . StatusCode != http . StatusOK {
fmt . Printf ( "downloadImage() error for url [%s]: %s\n" , url , resp . Status )
if resp . StatusCode == 404 {
return nil , "" , nil
} else {
return nil , "" , fmt . Errorf ( "failed to download gravatar image: %s" , resp . Status )
}
}
// Get the content type and determine the file extension
contentType := resp . Header . Get ( "Content-Type" )
fileExtension := ""
2023-06-17 12:50:01 +08:00
if strings . Contains ( contentType , "text/html" ) {
fileExtension = ".html"
} else {
2023-08-19 02:35:45 +08:00
fileExtensions , err := mime . ExtensionsByType ( contentType )
if err != nil {
return nil , "" , err
2023-06-17 12:50:01 +08:00
}
2023-08-19 02:35:45 +08:00
if fileExtensions == nil {
return nil , "" , fmt . Errorf ( "fileExtensions is nil" )
}
fileExtension = fileExtensions [ 0 ]
2023-06-17 11:43:46 +08:00
}
// Save the image to a bytes.Buffer
buffer := & bytes . Buffer { }
_ , err = io . Copy ( buffer , resp . Body )
if err != nil {
return nil , "" , err
}
return buffer , fileExtension , nil
}
2023-06-17 01:25:15 +08:00
func ( user * User ) refreshAvatar ( ) ( bool , error ) {
var err error
var fileBuffer * bytes . Buffer
var ext string
2023-06-17 11:43:46 +08:00
// Gravatar
if ( user . AvatarType == "Auto" || user . AvatarType == "Gravatar" ) && user . Email != "" {
2023-06-17 01:25:15 +08:00
client := proxy . ProxyHttpClient
2023-06-17 11:43:46 +08:00
2023-06-17 01:25:15 +08:00
has , err := hasGravatar ( client , user . Email )
if err != nil {
return false , err
}
if has {
fileBuffer , ext , err = getGravatarFileBuffer ( client , user . Email )
if err != nil {
return false , err
}
2023-06-17 11:43:46 +08:00
if fileBuffer != nil {
user . AvatarType = "Gravatar"
}
}
}
// Favicon
if fileBuffer == nil && ( user . AvatarType == "Auto" || user . AvatarType == "Favicon" ) {
client := proxy . ProxyHttpClient
fileBuffer , ext , err = getFaviconFileBuffer ( client , user . Email )
if err != nil {
return false , err
}
if fileBuffer != nil {
user . AvatarType = "Favicon"
2023-06-17 01:25:15 +08:00
}
}
2023-06-17 11:43:46 +08:00
// Identicon
if fileBuffer == nil && ( user . AvatarType == "Auto" || user . AvatarType == "Identicon" ) {
2023-06-17 01:25:15 +08:00
fileBuffer , ext , err = getIdenticonFileBuffer ( user . Name )
if err != nil {
return false , err
}
2023-06-17 11:43:46 +08:00
if fileBuffer != nil {
user . AvatarType = "Identicon"
}
2023-06-17 01:25:15 +08:00
}
if fileBuffer != nil {
avatarUrl , err := getPermanentAvatarUrlFromBuffer ( user . Owner , user . Name , fileBuffer , ext , true )
if err != nil {
return false , err
}
user . Avatar = avatarUrl
return true , nil
}
return false , nil
}