aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorRené 'Necoro' Neumann <necoro@necoro.eu>2020-04-19 19:10:41 +0200
committerRené 'Necoro' Neumann <necoro@necoro.eu>2020-04-19 19:10:41 +0200
commit9f5a52b14d142fe3aae6c3b8be67cb622f0c93f6 (patch)
tree74f7c1a079832be3809775b867551a89d5a86e16 /internal
parent40f5d435e5f92abc8b64dae1c029f67d620db1f2 (diff)
downloadfeed2imap-go-9f5a52b14d142fe3aae6c3b8be67cb622f0c93f6.tar.gz
feed2imap-go-9f5a52b14d142fe3aae6c3b8be67cb622f0c93f6.tar.bz2
feed2imap-go-9f5a52b14d142fe3aae6c3b8be67cb622f0c93f6.zip
Improved IMAP
Diffstat (limited to 'internal')
-rw-r--r--internal/imap/imap.go91
1 files changed, 88 insertions, 3 deletions
diff --git a/internal/imap/imap.go b/internal/imap/imap.go
index 18039d3..94e92ed 100644
--- a/internal/imap/imap.go
+++ b/internal/imap/imap.go
@@ -15,9 +15,23 @@ const (
imapPort = "143"
)
+type folders map[string]*imap.MailboxInfo
+
+func (f folders) contains(elem string) bool {
+ _, ok := f[elem]
+ return ok
+}
+
+func (f folders) add(elem *imap.MailboxInfo) {
+ name := elem.Name
+ f[name] = elem
+}
+
type Client struct {
- c *imapClient.Client
- host string
+ c *imapClient.Client
+ host string
+ folders folders
+ delimiter string
}
func forceTLS(url *url.URL) bool {
@@ -70,6 +84,69 @@ func (client *Client) Disconnect() {
}
}
+func (client *Client) createFolder(folder string) error {
+ return nil
+}
+
+func (client *Client) list(folder string) (*imap.MailboxInfo, int, error) {
+ mailboxes := make(chan *imap.MailboxInfo, 10)
+ done := make(chan error, 1)
+ go func() {
+ done <- client.c.List("", folder, mailboxes)
+ }()
+
+ found := 0
+ var mbox *imap.MailboxInfo
+ for m := range mailboxes {
+ if found == 0 {
+ mbox = m
+ }
+ found++
+ }
+
+ if err := <-done; err != nil {
+ return nil, 0, fmt.Errorf("while listing '%s': %w", folder, err)
+ }
+
+ return mbox, found, nil
+}
+
+func (client *Client) fetchDelimiter() error {
+ mbox, _, err := client.list("")
+ if err != nil {
+ return err
+ }
+
+ client.delimiter = mbox.Delimiter
+ return nil
+}
+
+func (client *Client) EnsureFolder(folder string) error {
+ if folder[0] == '/' {
+ folder = folder[1:]
+ }
+
+ if client.folders.contains(folder) {
+ return nil
+ }
+
+ log.Printf("Checking for folder '%s'", folder)
+
+ mbox, found, err := client.list(folder)
+
+ switch {
+ case err != nil:
+ return err
+ case found == 0:
+ return client.createFolder(folder)
+ case found == 1:
+ client.folders.add(mbox)
+ return nil
+ default:
+ return fmt.Errorf("Found multiple folders matching '%s'.", folder)
+ }
+}
+
func Connect(url *url.URL) (*Client, error) {
var c *imapClient.Client
var err error
@@ -91,7 +168,7 @@ func Connect(url *url.URL) (*Client, error) {
}
}
- var client = Client{c, url.Host}
+ var client = Client{c: c, host: url.Host, folders: folders{}}
defer func() {
if err != nil {
@@ -122,5 +199,13 @@ func Connect(url *url.URL) (*Client, error) {
return nil, fmt.Errorf("login to %s: %w", url.Host, err)
}
+ if err = client.fetchDelimiter(); err != nil {
+ return nil, fmt.Errorf("fetching delimiter: %w", err)
+ }
+
+ if err = client.EnsureFolder(url.Path); err != nil {
+ return nil, err
+ }
+
return &client, nil
}
kout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] <support@github.com> 2023-08-26Bump golang.org/x/net from 0.12.0 to 0.14.0dependabot[bot]2-6/+6 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.12.0 to 0.14.0. - [Commits](https://github.com/golang/net/compare/v0.12.0...v0.14.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> 2023-08-26Bump github.com/antonmedv/expr from 1.12.6 to 1.14.0dependabot[bot]2-3/+3 Bumps [github.com/antonmedv/expr](https://github.com/antonmedv/expr) from 1.12.6 to 1.14.0. - [Release notes](https://github.com/antonmedv/expr/releases) - [Commits](https://github.com/antonmedv/expr/compare/v1.12.6...v1.14.0) --- updated-dependencies: - dependency-name: github.com/antonmedv/expr dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> 2023-07-15Upgrade depsRené 'Necoro' Neumann2-15/+12 2023-06-13Version Changelog entryv1.7.0René 'Necoro' Neumann1-1/+4 2023-06-13Prepare v1.7.0René 'Necoro' Neumann2-2/+2 2023-06-05Improve changelogRené 'Necoro' Neumann1-2/+4 2023-06-05IMAP client does not need to know about max number of connectionsRené 'Necoro' Neumann2-19/+12 2023-06-04ChangelogRené 'Necoro' Neumann1-0/+4 2023-06-04Add new config option to set max number of IMAP connections.René 'Necoro' Neumann5-20/+26 Default is 5 (as was the hard-coded value before). Closes issue #98. 2023-06-04Improve locking around IMAP connect/disconnect.René 'Necoro' Neumann1-10/+26 This ensures that no connect happens _after_ a disconnect has been issued. Closes issue #97. 2023-05-20Bump golang.org/x/net from 0.9.0 to 0.10.0dependabot[bot]2-2/+3 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.9.0 to 0.10.0. - [Commits](https://github.com/golang/net/compare/v0.9.0...v0.10.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> 2023-05-12Amend changelogRené 'Necoro' Neumann1-0/+1 2023-05-12Issue #95 Add warning when config can be read globally.René 'Necoro' Neumann1-0/+11 2023-05-11Issue #95: Change cache ownership.René 'Necoro' Neumann1-0/+4 There is no need for the cache to be accessible by anyone who is not us. Thus enforce the cache to be stored with 0600. 2023-05-11Issue #95: Add hint about sensible access rights.René 'Necoro' Neumann1-0/+1 2023-04-23[workflow] Port changes also to releaseRené 'Necoro' Neumann1-6/+5 2023-04-23[workflow] Checkout before go setupRené 'Necoro' Neumann1-3/+3 2023-04-23[workflow] determine go version from go.modRené 'Necoro' Neumann1-3/+2 2023-04-23Improve test to also validate error messageRené 'Necoro' Neumann1-42/+39 2023-04-22Fix/improve testsRené 'Necoro' Neumann1-59/+104 2023-04-22Improve error handlingRené 'Necoro' Neumann1-1/+11 2023-04-21Fix workflow: '1.20' needs to be quotedRené 'Necoro' Neumann2-2/+2