A webmail client. Forked from https://git.sr.ht/~migadu/alps
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

77 lines
1.7 KiB

  1. package alps
  2. import (
  3. "fmt"
  4. "net"
  5. "net/url"
  6. "strings"
  7. )
  8. func discoverTCP(service, name string) (string, error) {
  9. _, addrs, err := net.LookupSRV(service, "tcp", name)
  10. if dnsErr, ok := err.(*net.DNSError); ok {
  11. if dnsErr.IsTemporary {
  12. return "", err
  13. }
  14. } else if err != nil {
  15. return "", err
  16. }
  17. if len(addrs) == 0 {
  18. return "", nil
  19. }
  20. addr := addrs[0]
  21. target := strings.TrimSuffix(addr.Target, ".")
  22. if target == "" {
  23. return "", nil
  24. }
  25. return fmt.Sprintf("%v:%v", target, addr.Port), nil
  26. }
  27. // discoverIMAP performs a DNS-based IMAP service discovery, as defined in
  28. // RFC 6186 section 3.2.
  29. func discoverIMAP(domain string) (*url.URL, error) {
  30. imapsHost, err := discoverTCP("imaps", domain)
  31. if err != nil {
  32. return nil, err
  33. }
  34. if imapsHost != "" {
  35. return &url.URL{Scheme: "imaps", Host: imapsHost}, nil
  36. }
  37. imapHost, err := discoverTCP("imap", domain)
  38. if err != nil {
  39. return nil, err
  40. }
  41. if imapHost != "" {
  42. return &url.URL{Scheme: "imap", Host: imapHost}, nil
  43. }
  44. return nil, fmt.Errorf("IMAP service discovery not configured for domain %q", domain)
  45. }
  46. // discoverSMTP performs a DNS-based SMTP submission service discovery, as
  47. // defined in RFC 6186 section 3.1. RFC 8314 section 5.1 adds a new service for
  48. // SMTP submission with implicit TLS.
  49. func discoverSMTP(domain string) (*url.URL, error) {
  50. smtpsHost, err := discoverTCP("submissions", domain)
  51. if err != nil {
  52. return nil, err
  53. }
  54. if smtpsHost != "" {
  55. return &url.URL{Scheme: "smtps", Host: smtpsHost}, nil
  56. }
  57. smtpHost, err := discoverTCP("submission", domain)
  58. if err != nil {
  59. return nil, err
  60. }
  61. if smtpHost != "" {
  62. return &url.URL{Scheme: "smtp", Host: smtpHost}, nil
  63. }
  64. return nil, fmt.Errorf("SMTP service discovery not configured for domain %q", domain)
  65. }