pomerium/proxy/portal/logo_provider.go
Caleb Doxsey 3e90f1e244
proxy: well known service icons (#5453)
* proxy: add logo discovery

* use a static url for testing

* well known service icons

* better fitting avatars
2025-01-30 08:52:59 -07:00

53 lines
1.2 KiB
Go

package portal
import (
"context"
"encoding/base64"
"errors"
)
// errors
var ErrLogoNotFound = errors.New("logo not found")
// A LogoProvider gets logo urls for routes.
type LogoProvider interface {
GetLogoURL(ctx context.Context, from, to string) (string, error)
}
// NewLogoProvider creates a new LogoProvider.
func NewLogoProvider() LogoProvider {
return multiLogoProvider{newWellKnownLogoProvider(), newFaviconDiscoveryLogoProvider()}
}
type multiLogoProvider []LogoProvider
func (p multiLogoProvider) GetLogoURL(ctx context.Context, from, to string) (string, error) {
for _, pp := range p {
url, err := pp.GetLogoURL(ctx, from, to)
if errors.Is(err, ErrLogoNotFound) {
continue
} else if err != nil {
return "", err
}
return url, nil
}
return "", ErrLogoNotFound
}
const (
mediaTypePNG = "image/png"
mediaTypeSVG = "image/svg+xml"
)
func isSupportedImageType(mtype string) bool {
return mtype == "image/vnd.microsoft.icon" ||
mtype == mediaTypePNG ||
mtype == mediaTypeSVG ||
mtype == "image/jpeg" ||
mtype == "image/gif"
}
func dataURL(mimeType string, data []byte) string {
return "data:" + mimeType + ";base64," + base64.StdEncoding.EncodeToString(data)
}