|
|
|
@ -35,7 +35,7 @@ func fetchConfig(addr string) (Config, Capabilities, error) {
|
|
|
|
|
if err := json.NewDecoder(res.Body).Decode(&config); err != nil {
|
|
|
|
|
return Config{}, Capabilities{}, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.Debug(res.Header)
|
|
|
|
|
cap := Capabilities{
|
|
|
|
|
AcceptEncoding: res.Header.Get("Accept-Encoding"),
|
|
|
|
|
}
|
|
|
|
@ -54,6 +54,10 @@ type Capabilities struct {
|
|
|
|
|
AcceptEncoding string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c Capabilities) String() string {
|
|
|
|
|
return fmt.Sprint("accept-encoding: ", c.AcceptEncoding)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Addr represents a Salty IM User's Address
|
|
|
|
|
type Addr struct {
|
|
|
|
|
User string
|
|
|
|
@ -78,12 +82,14 @@ func (a *Addr) MarshalJSON() ([]byte, error) {
|
|
|
|
|
Domain string
|
|
|
|
|
Key string
|
|
|
|
|
Endpoint string
|
|
|
|
|
Avatar string
|
|
|
|
|
}{
|
|
|
|
|
User: a.User,
|
|
|
|
|
Domain: a.Domain,
|
|
|
|
|
Addr: a.String(),
|
|
|
|
|
Key: a.key.ID().String(),
|
|
|
|
|
Endpoint: a.Endpoint().String(),
|
|
|
|
|
Avatar: a.Avatar(),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -94,6 +100,7 @@ func (a *Addr) UnmarshalJSON(data []byte) error {
|
|
|
|
|
Domain string
|
|
|
|
|
Key string
|
|
|
|
|
Endpoint string
|
|
|
|
|
Avatar string
|
|
|
|
|
}{}
|
|
|
|
|
|
|
|
|
|
if err := json.Unmarshal(data, &res); err != nil {
|
|
|
|
@ -114,6 +121,7 @@ func (a *Addr) UnmarshalJSON(data []byte) error {
|
|
|
|
|
return fmt.Errorf("error parsing public key %q: %w", res.Key, err)
|
|
|
|
|
}
|
|
|
|
|
a.key = key
|
|
|
|
|
a.avatar = res.Avatar
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
@ -196,6 +204,9 @@ func (a *Addr) Refresh() error {
|
|
|
|
|
a.endpoint = u
|
|
|
|
|
a.capabilities = cap
|
|
|
|
|
|
|
|
|
|
log.Debugf("Discovered endpoint: %v", a.endpoint)
|
|
|
|
|
log.Debugf("Discovered capability: %v", a.capabilities)
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -205,9 +216,9 @@ func (a *Addr) Avatar() string {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
log.Debugf("Looking up SRV record for _avatars._tcp.%s", a.Domain)
|
|
|
|
|
if target, err := resolver.LookupSRV("salty", "tcp", a.Domain); err == nil {
|
|
|
|
|
a.avatar = fmt.Sprintf("%s/avatar/%x", target, a.Hash())
|
|
|
|
|
}
|
|
|
|
|
if target, err := resolver.LookupSRV("avatars", "tcp", a.Domain); err == nil {
|
|
|
|
|
a.avatar = fmt.Sprintf("https://%s/avatar/%s", target, a.Hash())
|
|
|
|
|
} else { log.Info(target, err) }
|
|
|
|
|
|
|
|
|
|
return a.avatar
|
|
|
|
|
}
|
|
|
|
|