Browse Source

Update strk.kbt.io/projects/go/libravatar to latest; closes #7860 (#8429)

tags/v1.10.0-rc1
guillep2k 4 years ago
parent
commit
f05a3353f4

+ 1
- 1
go.mod View File

gopkg.in/stretchr/testify.v1 v1.2.2 // indirect gopkg.in/stretchr/testify.v1 v1.2.2 // indirect
gopkg.in/testfixtures.v2 v2.5.0 gopkg.in/testfixtures.v2 v2.5.0
mvdan.cc/xurls/v2 v2.0.0 mvdan.cc/xurls/v2 v2.0.0
strk.kbt.io/projects/go/libravatar v0.0.0-20160628055650-5eed7bff870a
strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251
xorm.io/builder v0.3.6 xorm.io/builder v0.3.6
xorm.io/core v0.7.2 xorm.io/core v0.7.2
) )

+ 2
- 2
go.sum View File

mvdan.cc/xurls/v2 v2.0.0 h1:r1zSOSNS/kqtpmATyMMMvaZ4/djsesbYz5kr0+qMRWc= mvdan.cc/xurls/v2 v2.0.0 h1:r1zSOSNS/kqtpmATyMMMvaZ4/djsesbYz5kr0+qMRWc=
mvdan.cc/xurls/v2 v2.0.0/go.mod h1:2/webFPYOXN9jp/lzuj0zuAVlF+9g4KPFJANH1oJhRU= mvdan.cc/xurls/v2 v2.0.0/go.mod h1:2/webFPYOXN9jp/lzuj0zuAVlF+9g4KPFJANH1oJhRU=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
strk.kbt.io/projects/go/libravatar v0.0.0-20160628055650-5eed7bff870a h1:8q33ShxKXRwQ7JVd1ZnhIU3hZhwwn0Le+4fTeAackuM=
strk.kbt.io/projects/go/libravatar v0.0.0-20160628055650-5eed7bff870a/go.mod h1:FJGmPh3vz9jSos1L/F91iAgnC/aejc0wIIrF2ZwJxdY=
strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251 h1:mUcz5b3FJbP5Cvdq7Khzn6J9OCUQJaBwgBkCR+MOwSs=
strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:FJGmPh3vz9jSos1L/F91iAgnC/aejc0wIIrF2ZwJxdY=
xorm.io/builder v0.3.6 h1:ha28mQ2M+TFx96Hxo+iq6tQgnkC9IZkM6D8w9sKHHF8= xorm.io/builder v0.3.6 h1:ha28mQ2M+TFx96Hxo+iq6tQgnkC9IZkM6D8w9sKHHF8=
xorm.io/builder v0.3.6/go.mod h1:LEFAPISnRzG+zxaxj2vPicRwz67BdhFreKg8yv8/TgU= xorm.io/builder v0.3.6/go.mod h1:LEFAPISnRzG+zxaxj2vPicRwz67BdhFreKg8yv8/TgU=
xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb h1:msX3zG3BPl8Ti+LDzP33/9K7BzO/WqFXk610K1kYKfo= xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb h1:msX3zG3BPl8Ti+LDzP33/9K7BzO/WqFXk610K1kYKfo=

+ 1
- 1
vendor/modules.txt View File

gopkg.in/yaml.v2 gopkg.in/yaml.v2
# mvdan.cc/xurls/v2 v2.0.0 # mvdan.cc/xurls/v2 v2.0.0
mvdan.cc/xurls/v2 mvdan.cc/xurls/v2
# strk.kbt.io/projects/go/libravatar v0.0.0-20160628055650-5eed7bff870a
# strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251
strk.kbt.io/projects/go/libravatar strk.kbt.io/projects/go/libravatar
# xorm.io/builder v0.3.6 # xorm.io/builder v0.3.6
xorm.io/builder xorm.io/builder

+ 12
- 0
vendor/strk.kbt.io/projects/go/libravatar/Makefile View File

PACKAGES ?= $(shell go list ./...)

.PHONY: check
check: lint
go test

.PHONY: lint
lint:
@which golint > /dev/null; if [ $$? -ne 0 ]; then \
go get -u github.com/golang/lint/golint; \
fi
@for PKG in $(PACKAGES); do golint -set_exit_status $$PKG || exit 1; done;

+ 4
- 2
vendor/strk.kbt.io/projects/go/libravatar/README.md View File

Simple [golang](https://www.golang.org) library for serving Simple [golang](https://www.golang.org) library for serving
[federated avatars](https://www.libravatar.org) [federated avatars](https://www.libravatar.org)


[![trunk](https://goreportcard.com/badge/strk.kbt.io/projects/go/libravatar)]
(https://goreportcard.com/report/strk.kbt.io/projects/go/libravatar)

# Use # Use


```sh ```sh
go get strk.kbt.io/projects/go/libravatar go get strk.kbt.io/projects/go/libravatar
cd $GOPATH/src/strk.kbt.io/projects/go/libravatar
go doc
go doc strk.kbt.io/projects/go/libravatar
``` ```


# Contribute # Contribute

+ 41
- 31
vendor/strk.kbt.io/projects/go/libravatar/libravatar.go View File

// Implements support for federated avatars lookup. // Implements support for federated avatars lookup.
// See https://wiki.libravatar.org/api/ // See https://wiki.libravatar.org/api/


package libravatar
package libravatar // import "strk.kbt.io/projects/go/libravatar"


import ( import (
"crypto/md5" "crypto/md5"
"net/mail" "net/mail"
"net/url" "net/url"
"strings" "strings"
"sync"
"time" "time"
) )


) )


var ( var (
// Default object, enabling object-less function calls
// DefaultLibravatar is a default Libravatar object,
// enabling object-less function calls
DefaultLibravatar = New() DefaultLibravatar = New()
) )


checkedAt time.Time checkedAt time.Time
} }


// Libravatar is an opaque structure holding service configuration
type Libravatar struct { type Libravatar struct {
defUrl string // default url
defURL string // default url
picSize int // picture size picSize int // picture size
fallbackHost string // default fallback URL fallbackHost string // default fallback URL
secureFallbackHost string // default fallback URL for secure connections secureFallbackHost string // default fallback URL for secure connections
useHTTPS bool useHTTPS bool
nameCache map[cacheKey]cacheValue nameCache map[cacheKey]cacheValue
nameCacheDuration time.Duration nameCacheDuration time.Duration
nameCacheMutex *sync.Mutex
minSize uint // smallest image dimension allowed minSize uint // smallest image dimension allowed
maxSize uint // largest image dimension allowed maxSize uint // largest image dimension allowed
size uint // what dimension should be used size uint // what dimension should be used
secureServiceBase string // SRV record to be queried for federation with secure servers secureServiceBase string // SRV record to be queried for federation with secure servers
} }


// Instanciate a library handle
// New instanciates a new Libravatar object (handle)
func New() *Libravatar { func New() *Libravatar {
// According to https://wiki.libravatar.org/running_your_own/ // According to https://wiki.libravatar.org/running_your_own/
// the time-to-live (cache expiry) should be set to at least 1 day. // the time-to-live (cache expiry) should be set to at least 1 day.
secureServiceBase: `avatars-sec`, secureServiceBase: `avatars-sec`,
nameCache: make(map[cacheKey]cacheValue), nameCache: make(map[cacheKey]cacheValue),
nameCacheDuration: 24 * time.Hour, nameCacheDuration: 24 * time.Hour,
nameCacheMutex: &sync.Mutex{},
} }
} }


// Set the hostname for fallbacks in case no avatar service is defined
// for a domain
// SetFallbackHost sets the hostname for fallbacks in case no avatar
// service is defined for a domain
func (v *Libravatar) SetFallbackHost(host string) { func (v *Libravatar) SetFallbackHost(host string) {
v.fallbackHost = host v.fallbackHost = host
} }


// Set the hostname for fallbacks in case no avatar service is defined
// for a domain, when requiring secure domains
// SetSecureFallbackHost sets the hostname for fallbacks in case no
// avatar service is defined for a domain, when requiring secure domains
func (v *Libravatar) SetSecureFallbackHost(host string) { func (v *Libravatar) SetSecureFallbackHost(host string) {
v.secureFallbackHost = host v.secureFallbackHost = host
} }


// Set useHTTPS flag
// SetUseHTTPS sets flag requesting use of https for fetching avatars
func (v *Libravatar) SetUseHTTPS(use bool) { func (v *Libravatar) SetUseHTTPS(use bool) {
v.useHTTPS = use v.useHTTPS = use
} }


// Set Avatars image dimension (0 for default)
// SetAvatarSize sets avatars image dimension (0 for default)
func (v *Libravatar) SetAvatarSize(size uint) { func (v *Libravatar) SetAvatarSize(size uint) {
v.size = size v.size = size
} }
res := fmt.Sprintf("%s/avatar/%s", URL, v.genHash(email, openid)) res := fmt.Sprintf("%s/avatar/%s", URL, v.genHash(email, openid))


values := make(url.Values) values := make(url.Values)
if v.defUrl != "" {
values.Add("d", v.defUrl)
if v.defURL != "" {
values.Add("d", v.defURL)
} }
if v.size > 0 { if v.size > 0 {
values.Add("s", fmt.Sprintf("%d", v.size)) values.Add("s", fmt.Sprintf("%d", v.size))
host := v.getDomain(email, openid) host := v.getDomain(email, openid)
key := cacheKey{service, host} key := cacheKey{service, host}
now := time.Now() now := time.Now()
v.nameCacheMutex.Lock()
val, found := v.nameCache[key] val, found := v.nameCache[key]
v.nameCacheMutex.Unlock()
if found && now.Sub(val.checkedAt) <= v.nameCacheDuration { if found && now.Sub(val.checkedAt) <= v.nameCacheDuration {
return protocol + val.target, nil return protocol + val.target, nil
} }
} }


var ( var (
total_weight uint16
records []record
top_priority = addrs[0].Priority
top_record *net.SRV
totalWeight uint16
records []record
topPriority = addrs[0].Priority
topRecord *net.SRV
) )


for _, rr := range addrs { for _, rr := range addrs {
if rr.Priority > top_priority {
if rr.Priority > topPriority {
continue continue
} else if rr.Priority < top_priority {
} else if rr.Priority < topPriority {
// won't happen, because net sorts // won't happen, because net sorts
// by priority, but just in case // by priority, but just in case
total_weight = 0
totalWeight = 0
records = nil records = nil
top_priority = rr.Priority
topPriority = rr.Priority
} }


total_weight += rr.Weight
totalWeight += rr.Weight


if rr.Weight > 0 { if rr.Weight > 0 {
records = append(records, record{rr, total_weight})
records = append(records, record{rr, totalWeight})
} else if rr.Weight == 0 { } else if rr.Weight == 0 {
records = append([]record{record{srv: rr, weight: total_weight}}, records...)
records = append([]record{record{srv: rr, weight: totalWeight}}, records...)
} }
} }


if len(records) == 1 { if len(records) == 1 {
top_record = records[0].srv
topRecord = records[0].srv
} else { } else {
randnum := uint16(rand.Intn(int(total_weight)))
randnum := uint16(rand.Intn(int(totalWeight)))


for _, rr := range records { for _, rr := range records {
if rr.weight >= randnum { if rr.weight >= randnum {
top_record = rr.srv
topRecord = rr.srv
break break
} }
} }
} }


domain = fmt.Sprintf("%s:%d", top_record.Target, top_record.Port)
domain = fmt.Sprintf("%s:%d", topRecord.Target, topRecord.Port)
} }


v.nameCacheMutex.Lock()
v.nameCache[key] = cacheValue{checkedAt: now, target: domain} v.nameCache[key] = cacheValue{checkedAt: now, target: domain}
v.nameCacheMutex.Unlock()
return protocol + domain, nil return protocol + domain, nil
} }


// Return url of the avatar for the given email
// FromEmail returns the url of the avatar for the given email
func (v *Libravatar) FromEmail(email string) (string, error) { func (v *Libravatar) FromEmail(email string) (string, error) {
addr, err := mail.ParseAddress(email) addr, err := mail.ParseAddress(email)
if err != nil { if err != nil {
return link, nil return link, nil
} }


// Object-less call to DefaultLibravatar for an email adders
// FromEmail is the object-less call to DefaultLibravatar for an email adders
func FromEmail(email string) (string, error) { func FromEmail(email string) (string, error) {
return DefaultLibravatar.FromEmail(email) return DefaultLibravatar.FromEmail(email)
} }


// Return url of the avatar for the given url (typically for OpenID)
// FromURL returns the url of the avatar for the given url (typically
// for OpenID)
func (v *Libravatar) FromURL(openid string) (string, error) { func (v *Libravatar) FromURL(openid string) (string, error) {
ourl, err := url.Parse(openid) ourl, err := url.Parse(openid)
if err != nil { if err != nil {
return link, nil return link, nil
} }


// Object-less call to DefaultLibravatar for a URL
// FromURL is the object-less call to DefaultLibravatar for a URL
func FromURL(openid string) (string, error) { func FromURL(openid string) (string, error) {
return DefaultLibravatar.FromURL(openid) return DefaultLibravatar.FromURL(openid)
} }

Loading…
Cancel
Save