summary refs log tree commit diff stats
path: root/worker
Commit message (Collapse)AuthorAgeFilesLines
* Add notmuch backendReto Brunner2019-08-083-0/+521
| | | | | | | | | | | | This commit introduces the notmuch backend. The backend is conditionally compiled in if the "notmuch" tag is provided. Most of the message types are implemented, with the notable exceptions of DeleteMessages as well as any copy / move / append type. Reason being, that those aren't normally applicable in a notmuch based workflow. Changes v2 --> v3, based on review comments * Use account config for configuration
* Extract message parsing to common worker moduleReto Brunner2019-08-082-220/+256
| | | | | | | Things like FetchEntityPartReader etc can be reused by most workers working with raw email files from disk (or any reader for that matter). This patch extract that common functionality in a separate package.
* Don't print imap errors to uiJelle Besseling2019-08-081-0/+1
| | | | | | | | This fixes ~sircmpwn/aerc2#245. This sets up the imap client to send error messages to the logger of the worker. Errors now end up in the bottom status line. https://todo.sr.ht/~sircmpwn/aerc2/245
* Clean maildirs when openedBen Burwell2019-08-021-0/+4
| | | | This removes old aborted deliveries from the tmp directory.
* Fix error handling in maildir workerNicolai Dagestad2019-07-191-14/+7
|
* Register worker in init.Reto Brunner2019-07-195-20/+53
| | | | | This allows backends which can't always be compiled due to missing dependencies (say libnotmuch) to be compiled conditionally with buildflags.
* maildir: Watch for new messagesBen Burwell2019-07-172-14/+73
| | | | | | | | When a directory is opened, start watching its "new" subdirectory for incoming messages using the fsnotify library. When creation events are detected, run the Unseen routine to move the message from new to cur and add new UIDs to the store, updating the UI's list of directory contents as we go.
* Fix header decodingBen Burwell2019-07-171-13/+16
| | | | | | | | | | | | | Email headers can be encoded with different charsets, which is signalled using a special character sequence. The go-message package provides two different methods for accessing header values, Get(key) (actually inherited from the embedded textproto.Header) which returns the raw header value and Text(key), which returns the header's value decoded as UTF-8. Before, in the maildir backend, we were using the Get method which sometimes resulted in encoded headers being displayed in the UI. This patch replaces the incorrect usage of Get() with Text().
* Fix missing format fields in maildir/container.goDrew DeVault2019-07-131-2/+2
|
* Implement maildir copyBen Burwell2019-07-122-2/+41
| | | | | Create a delivery in the destination directory with the content of the source message.
* Add maildir backend workerBen Burwell2019-07-124-0/+783
| | | | | | | | | | | | | Add the initial implementation of a backend for Maildir accounts. Much of the functionality required is implemented in the go-message and go-maildir libraries, so we use them as much as possible. The maildir worker hooks into a new maildir:// URL scheme in the accounts.conf file which points to a container of several maildir directories. From there, the OpenDirectory, FetchDirectoryContents, etc messages work on subdirectories. This is implemented as a Container struct which handles mapping between the symbolic email folder names and UIDs to the concrete directories and file names.
* #190 Handle gmail duplicate folderDaniel Bridges2019-07-112-4/+2
|
* Support imaps with oauthbearer authentication (Gmail)Frode Aannevik2019-07-111-6/+28
| | | | | | | | | | | | | | | | | | | | | | | | | | | imaps+oauthbearer://user:token@host?token_endpoint=... - the config Source password is used as access token if no token_endpoint parameter is set - the config Source password is used as refresh token if token_endpoint parameter is set, and used to exchange with an access token The implementation has only been tested with Gmail. source = imaps+oauthbearer://{username}:{refersh_token}@imap.gmail.com:993? \ client_id=XX&\ client_secret=XX&\ token_endpoint=https%3A%2F%2Faccounts.google.com%2Fo%2Foauth2%2Ftoken client credentials created with https://console.developers.google.com/apis/credentials refresh token created with https://github.com/google/gmail-oauth2-tools/blob/master/python/oauth2.py rel: https://todo.sr.ht/~sircmpwn/aerc2/42
* Factor IMAP-specific structs out of UI modelsBen Burwell2019-07-083-8/+83
| | | | | | | Before, we were using several IMAP-specific concepts to represent information being displayed in the UI. Factor these structures out of the IMAP package to make it easier for other backends to provide the required information.
* Use []uint32 instead of imap.SeqSetBen Burwell2019-07-085-16/+30
| | | | | | | | A sequence-set is an IMAP-specific implementation detail. Throughout the UI, aerc simply operates using lists of opaque identifiers. In order to loosen the coupling between the UI and IMAP in particular, replace most usages of imap.SeqSet with []uint32, leaving the translation to a SeqSet to the IMAP backend as needed.
* Factor UI models out of the worker message packageBen Burwell2019-07-084-49/+55
| | | | | | | | Before, the information needed to display different parts of the UI was tightly coupled to the specific messages being sent back and forth to the backend worker. Separating out a models package allows us to be more specific about exactly what a backend is able to and required to provide for the UI.
* Sort out dirstore once and for allDrew DeVault2019-07-041-13/+0
|
* worker/imap: rig up search directory handlerDrew DeVault2019-06-241-0/+2
|
* worker/imap: implement searchDrew DeVault2019-06-242-0/+26
|
* imap: block until directory list is fully receivedDrew DeVault2019-06-141-0/+1
| | | | This fixes issues with INBOX mysteriously not being present at times
* imap: respect the folder config optionReto Brunner2019-06-142-1/+16
|
* Add :read and :unread commandsDrew DeVault2019-06-093-0/+26
|
* Update our message flags when server updates themDrew DeVault2019-06-092-2/+34
|
* Add archive commandRobert Günzler2019-06-093-0/+29
| | | | | | | | | | | | | | | Adds an archive command that moves the current message into the folder specified in the account config entry. Supports three layouts at this point: - flat: puts all messages next to each other - year: creates a folder per year - month: same as above, plus folders per month This also adds a "-p" argument to "cp" and "mv" that works like "--parents" on mkdir(1). We use this to auto-create the directories for the archive layout.
* Fetch headers w/peek to leave emails unreadYash Srivastav2019-06-081-0/+1
|
* implements ability to view headers in message viewYash Srivastav2019-06-072-1/+22
|
* Wait for listing to complete before sending DoneDrew DeVault2019-06-021-0/+3
|
* Don't send Done until finished fetching messagesDrew DeVault2019-06-021-0/+3
|
* Remove worker callbacks when Done is receivedDrew DeVault2019-06-022-5/+13
|
* Skip non selectable mailboxes in directory listingReto Brunner2019-05-261-0/+13
| | | | | | | | | | | | | | | | If a MailboxInfo has the attribute \Noselect, it is not possible to use this name as a selectable mailbox. Therefore it should not be passed to the directory handlers. The issue pops up if one has a hierarchy like this: INBOX INBOX/lists/stuff INBOX/lists/otherStuff Even though lists is not a valid inbox (doesn't contain mail, only other maildirs) it will show up in the directory listing, when we iterate over the MailboxInfo. It does have the corresponding attribute set though and we can simply filter it out.
* Load IMAP worker for imap+insecureDrew DeVault2019-05-202-3/+8
|
* Flesh out multipart switcherDrew DeVault2019-05-202-2/+2
|
* Verify TLS certificatesDrew DeVault2019-05-201-11/+0
| | | | | | I was partway done implementing a UI for users to approve untrusted certs with, but let's just make them configure their servers right instead.
* asdfDrew DeVault2019-05-201-42/+2
|
* worker/types/worker: remove mutexSimon Ser2019-05-191-36/+21
| | | | | | | | | | Worker.callbacks contains two types of callbacks: some are action callbacks, some are message callbacks. Each of those is access from one side of the communication channel (UI goroutine vs. worker goroutine). Instead of using a channel, we can use two different maps for each kind. This simplifies the code and also ensures we don't call an action callback instead of a message callback (or the other way around).
* worker/types/worker: make ID allocation atomicSimon Ser2019-05-192-10/+11
| | | | | | | | Message IDs are allocated for both messages from UI to workers and the other way around. Hence, the global nextId variable is accessed from multiple goroutines. Instead, use atomic to access the global counter.
* worker/types/worker: set ID before sending messageSimon Ser2019-05-191-3/+9
| | | | | The previous code set the message ID after sending it, which could result in the receiver reading the ID before it's set.
* s/aerc2/aerc/gDrew DeVault2019-05-178-9/+9
|
* Copy sent emails to the Sent folderDrew DeVault2019-05-154-4/+63
| | | | Or rather, to a user-specified folder
* Implement move, mv commandsDrew DeVault2019-05-141-6/+0
|
* Implement :copy (aka :cp)Drew DeVault2019-05-143-0/+30
|
* Handle external message deletionsDrew DeVault2019-05-131-0/+7
|
* Handle incoming emails gracefullyDrew DeVault2019-05-132-3/+23
|
* worker/imap: use the IMAP connection from a single goroutineSimon Ser2019-04-293-86/+77
| | | | | | | | | | | | | Unfortunately, the IMAP protocol hasn't been designed to be used from multiple goroutines at the same time. For instance, if you fetch twice the same message from two different goroutines, it's not possible to tell whether the response is for one receiver or the other. For this reason, go-imap clients aren't safe to use from multiple goroutines. This commit changes the IMAP workers to be synchronous again (a command is executed only after the previous one has completed). To use IMAP from different threads, popular clients (e.g. Thunderbird) typically open multiple connections.
* worker/types: fix Worker.Callbacks race conditionSimon Ser2019-04-272-21/+42
| | | | | | | | | | | | | Worker.Process* functions were called in different goroutines than Worker.Post*. Protect the map with a mutex. Also make the map unexported to prevent external unprotected accesses. Worker.Process* functions used to delete items from the map. However they didn't delete the element they retrieved: callbacks[msg.InResponseTo()] was read while callbacks[msg] was deleted. I'm not sure I understand why. I tried to delete the element that was accessed - but this broke everything (UI froze at "Connecting..."). I don't believe any elements were actually removed from the map, so the new code just doesn't remove anything.
* Make message viewer real, part twoDrew DeVault2019-03-311-11/+14
|
* Rename FetchMessageBodies to FetchFullMessagesDrew DeVault2019-03-313-14/+14
|
* Make the message viewer real, part oneDrew DeVault2019-03-312-6/+28
|
* Don't parse mail in worker; send a reader insteadDrew DeVault2019-03-312-14/+5
|
* Pull BodyStructure up from IMAP workerDrew DeVault2019-03-312-9/+25
|