2020-04-07 10:42:42 +02:00
|
|
|
package remote
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"net/url"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/photoprism/photoprism/pkg/txt"
|
|
|
|
)
|
|
|
|
|
2023-08-15 13:01:50 +02:00
|
|
|
// Account represents remote service details.
|
2020-04-07 10:42:42 +02:00
|
|
|
type Account struct {
|
|
|
|
AccName string
|
|
|
|
AccURL string
|
|
|
|
AccType string
|
|
|
|
AccKey string
|
|
|
|
AccUser string
|
|
|
|
AccPass string
|
|
|
|
}
|
|
|
|
|
2023-08-15 13:01:50 +02:00
|
|
|
// Discover performs a service lookup based on the URL and credentials provided and returns an Account if successful.
|
2020-04-07 10:42:42 +02:00
|
|
|
func Discover(rawUrl, user, pass string) (result Account, err error) {
|
|
|
|
if rawUrl == "" {
|
|
|
|
return result, errors.New("service URL is empty")
|
|
|
|
}
|
|
|
|
|
|
|
|
u, err := url.Parse(rawUrl)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return result, err
|
|
|
|
}
|
|
|
|
|
|
|
|
u.Host = strings.ToLower(u.Host)
|
|
|
|
|
|
|
|
result.AccUser = u.User.Username()
|
|
|
|
result.AccPass, _ = u.User.Password()
|
|
|
|
|
|
|
|
// Extract user info
|
|
|
|
if user != "" {
|
|
|
|
result.AccUser = user
|
|
|
|
}
|
|
|
|
|
|
|
|
if pass != "" {
|
|
|
|
result.AccPass = pass
|
|
|
|
}
|
|
|
|
|
|
|
|
if user != "" || pass != "" {
|
|
|
|
u.User = url.UserPassword(result.AccUser, result.AccPass)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set default scheme
|
|
|
|
if u.Scheme == "" {
|
|
|
|
u.Scheme = "https"
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, h := range Heuristics {
|
|
|
|
if !h.MatchDomain(u.Host) {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if serviceUrl := h.Discover(u.String(), result.AccUser); serviceUrl != nil {
|
|
|
|
serviceUrl.User = nil
|
|
|
|
|
|
|
|
if w := txt.Keywords(serviceUrl.Host); len(w) > 0 {
|
2022-04-15 09:42:07 +02:00
|
|
|
result.AccName = txt.Title(w[0])
|
2020-04-07 10:42:42 +02:00
|
|
|
} else {
|
|
|
|
result.AccName = serviceUrl.Host
|
|
|
|
}
|
|
|
|
|
|
|
|
result.AccType = h.ServiceType
|
|
|
|
result.AccURL = serviceUrl.String()
|
|
|
|
|
|
|
|
return result, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result, errors.New("could not connect")
|
|
|
|
}
|