reflect docs and sample to new structure

This commit is contained in:
Clément DOUIN 2024-10-26 11:39:09 +02:00
parent 3b271c3e67
commit 0101f7bf34
No known key found for this signature in database
GPG key ID: 353E4A18EE0FAB72
7 changed files with 247 additions and 162 deletions

View file

@ -30,21 +30,60 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed ### Changed
- Refactored IMAP and SMTP auth config API - Improved error messages when missing cargo features. For example, if a TOML configuration uses the IMAP backend without the `imap` cargo features, the error `missing "imap" feature` is displayed. [#20](https://github.com/pimalaya/core/issues/20)
- Normalized enum-based configurations, using the [internally tagged representation](https://serde.rs/enum-representations.html#internally-tagged) `type =`. It should reduce issues due to misconfiguration, and improve othe error messages. Yet it is not perfect, see [#802](https://github.com/toml-rs/toml/issues/802):
The IMAP and SMTP auth config option is now explicit, in order to improve error messages: - `imap.*`, `maildir.*` and `notmuch.*` moved to `backend.*`:
```toml ```toml
# before # before
imap.password.cmd = "pass show example" imap.host = "localhost"
smtp.oauth2.method = "xoauth2" imap.port = 143
# after # after
imap.auth.type = "password" backend.type = "imap"
imap.auth.cmd = "pass show example" backend.host = "localhost"
smtp.auth.type = "oauth2" backend.port = 143
smtp.auth.method = "xoauth2" ```
```
- `smtp.*` and `sendmail.*` moved to `message.send.backend.*`:
```toml
# before
smtp.host = "localhost"
smtp.port = 25
# after
message.send.backend.type = "smtp"
message.send.backend.host = "localhost"
message.send.backend.port = 25
```
- `pgp.backend` renamed `pgp.type`:
```toml
# before
pgp.backend = "commands"
pgp.encrypt-cmd = "gpg --encrypt --quiet --armor <recipients>"
# after
pgp.type = "commands"
pgp.encrypt-cmd = "gpg --encrypt --quiet --armor <recipients>"
```
- `{imap,smtp}.auth` moved as well:
```toml
# before
imap.password.cmd = "pass show example"
smtp.oauth2.method = "xoauth2"
# after
backend.auth.type = "password"
backend.auth.cmd = "pass show example"
message.send.backend.auth.type = "oauth2"
message.send.backend.auth.method = "xoauth2"
```
## [1.0.0-beta.4] - 2024-04-16 ## [1.0.0-beta.4] - 2024-04-16
@ -849,18 +888,3 @@ Few major concepts changed:
[0.2.1]: https://github.com/soywod/himalaya/compare/v0.2.0...v0.2.1 [0.2.1]: https://github.com/soywod/himalaya/compare/v0.2.0...v0.2.1
[0.2.0]: https://github.com/soywod/himalaya/compare/v0.1.0...v0.2.0 [0.2.0]: https://github.com/soywod/himalaya/compare/v0.1.0...v0.2.0
[0.1.0]: https://github.com/soywod/himalaya/releases/tag/v0.1.0 [0.1.0]: https://github.com/soywod/himalaya/releases/tag/v0.1.0
[#39]: https://todo.sr.ht/~soywod/pimalaya/39
[#41]: https://todo.sr.ht/~soywod/pimalaya/41
[#43]: https://todo.sr.ht/~soywod/pimalaya/43
[#54]: https://todo.sr.ht/~soywod/pimalaya/54
[#58]: https://todo.sr.ht/~soywod/pimalaya/58
[#59]: https://todo.sr.ht/~soywod/pimalaya/59
[#60]: https://todo.sr.ht/~soywod/pimalaya/60
[#95]: https://todo.sr.ht/~soywod/pimalaya/95
[#172]: https://todo.sr.ht/~soywod/pimalaya/172
[#173]: https://todo.sr.ht/~soywod/pimalaya/173
[#184]: https://todo.sr.ht/~soywod/pimalaya/184
[#188]: https://todo.sr.ht/~soywod/pimalaya/188
[#194]: https://todo.sr.ht/~soywod/pimalaya/194
[#195]: https://todo.sr.ht/~soywod/pimalaya/195

64
Cargo.lock generated
View file

@ -99,9 +99,9 @@ dependencies = [
[[package]] [[package]]
name = "anstream" name = "anstream"
version = "0.6.15" version = "0.6.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" checksum = "23a1e53f0f5d86382dafe1cf314783b2044280f406e7e1506368220ad11b1338"
dependencies = [ dependencies = [
"anstyle", "anstyle",
"anstyle-parse", "anstyle-parse",
@ -114,36 +114,36 @@ dependencies = [
[[package]] [[package]]
name = "anstyle" name = "anstyle"
version = "1.0.8" version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" checksum = "8365de52b16c035ff4fcafe0092ba9390540e3e352870ac09933bebcaa2c8c56"
[[package]] [[package]]
name = "anstyle-parse" name = "anstyle-parse"
version = "0.2.5" version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
dependencies = [ dependencies = [
"utf8parse", "utf8parse",
] ]
[[package]] [[package]]
name = "anstyle-query" name = "anstyle-query"
version = "1.1.1" version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
dependencies = [ dependencies = [
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
name = "anstyle-wincon" name = "anstyle-wincon"
version = "3.0.4" version = "3.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125"
dependencies = [ dependencies = [
"anstyle", "anstyle",
"windows-sys 0.52.0", "windows-sys 0.59.0",
] ]
[[package]] [[package]]
@ -679,9 +679,9 @@ dependencies = [
[[package]] [[package]]
name = "colorchoice" name = "colorchoice"
version = "1.0.2" version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
[[package]] [[package]]
name = "combine" name = "combine"
@ -1194,7 +1194,7 @@ dependencies = [
[[package]] [[package]]
name = "email-lib" name = "email-lib"
version = "1.0.0" version = "1.0.0"
source = "git+https://github.com/pimalaya/core#3d94ec45b2cbdda4f1bd75d83f4adc9837d5f3bd" source = "git+https://github.com/pimalaya/core#79a960a684274537788d1193fe3db5bcf66cfb7e"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"chrono", "chrono",
@ -1251,9 +1251,6 @@ name = "email_address"
version = "0.2.9" version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "encoding_rs" name = "encoding_rs"
@ -1753,24 +1750,15 @@ name = "himalaya"
version = "1.0.0" version = "1.0.0"
dependencies = [ dependencies = [
"ariadne", "ariadne",
"async-trait",
"clap", "clap",
"clap_complete", "clap_complete",
"clap_mangen", "clap_mangen",
"color-eyre", "color-eyre",
"comfy-table",
"crossterm 0.27.0",
"dirs 4.0.0",
"email-lib", "email-lib",
"email_address",
"mail-builder", "mail-builder",
"md5",
"mml-lib", "mml-lib",
"oauth-lib",
"once_cell", "once_cell",
"petgraph",
"pimalaya-tui", "pimalaya-tui",
"process-lib",
"secret-lib", "secret-lib",
"serde", "serde",
"serde_json", "serde_json",
@ -1837,7 +1825,7 @@ dependencies = [
[[package]] [[package]]
name = "http-lib" name = "http-lib"
version = "1.0.0" version = "1.0.0"
source = "git+https://github.com/pimalaya/core#3d94ec45b2cbdda4f1bd75d83f4adc9837d5f3bd" source = "git+https://github.com/pimalaya/core#79a960a684274537788d1193fe3db5bcf66cfb7e"
dependencies = [ dependencies = [
"thiserror", "thiserror",
"tokio", "tokio",
@ -2105,7 +2093,7 @@ dependencies = [
[[package]] [[package]]
name = "keyring" name = "keyring"
version = "3.5.0" version = "3.5.0"
source = "git+https://github.com/soywod/keyring-rs.git?branch=secret-service-with-keyutils#16236b85f92733550cce0a5e06fe4e63cf835b71" source = "git+https://github.com/soywod/keyring-rs.git?branch=secret-service-with-keyutils#f59afd50e4b9be4e333e6c050ac8f97f51fe632d"
dependencies = [ dependencies = [
"byteorder", "byteorder",
"dbus-secret-service", "dbus-secret-service",
@ -2121,7 +2109,7 @@ dependencies = [
[[package]] [[package]]
name = "keyring-lib" name = "keyring-lib"
version = "1.0.0" version = "1.0.0"
source = "git+https://github.com/pimalaya/core#3d94ec45b2cbdda4f1bd75d83f4adc9837d5f3bd" source = "git+https://github.com/pimalaya/core#79a960a684274537788d1193fe3db5bcf66cfb7e"
dependencies = [ dependencies = [
"keyring", "keyring",
"once_cell", "once_cell",
@ -2401,7 +2389,7 @@ dependencies = [
[[package]] [[package]]
name = "mml-lib" name = "mml-lib"
version = "1.1.0" version = "1.1.0"
source = "git+https://github.com/pimalaya/core#3d94ec45b2cbdda4f1bd75d83f4adc9837d5f3bd" source = "git+https://github.com/pimalaya/core#79a960a684274537788d1193fe3db5bcf66cfb7e"
dependencies = [ dependencies = [
"async-recursion", "async-recursion",
"chumsky", "chumsky",
@ -2600,7 +2588,7 @@ dependencies = [
[[package]] [[package]]
name = "oauth-lib" name = "oauth-lib"
version = "1.0.0" version = "1.0.0"
source = "git+https://github.com/pimalaya/core#3d94ec45b2cbdda4f1bd75d83f4adc9837d5f3bd" source = "git+https://github.com/pimalaya/core#79a960a684274537788d1193fe3db5bcf66cfb7e"
dependencies = [ dependencies = [
"http-lib", "http-lib",
"oauth2", "oauth2",
@ -2873,7 +2861,7 @@ dependencies = [
[[package]] [[package]]
name = "pgp-lib" name = "pgp-lib"
version = "1.0.0" version = "1.0.0"
source = "git+https://github.com/pimalaya/core#3d94ec45b2cbdda4f1bd75d83f4adc9837d5f3bd" source = "git+https://github.com/pimalaya/core#79a960a684274537788d1193fe3db5bcf66cfb7e"
dependencies = [ dependencies = [
"async-recursion", "async-recursion",
"futures", "futures",
@ -2891,7 +2879,7 @@ dependencies = [
[[package]] [[package]]
name = "pimalaya-tui" name = "pimalaya-tui"
version = "1.0.0" version = "1.0.0"
source = "git+https://github.com/pimalaya/tui#1f83c115d7aa3d12ff278a7b4bc10d4b7157286f" source = "git+https://github.com/pimalaya/tui#d3664c02dce63fe0f91b7e47a49e68bbe86f5bfc"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"clap", "clap",
@ -3050,7 +3038,7 @@ dependencies = [
[[package]] [[package]]
name = "process-lib" name = "process-lib"
version = "1.0.0" version = "1.0.0"
source = "git+https://github.com/pimalaya/core#3d94ec45b2cbdda4f1bd75d83f4adc9837d5f3bd" source = "git+https://github.com/pimalaya/core#79a960a684274537788d1193fe3db5bcf66cfb7e"
dependencies = [ dependencies = [
"serde", "serde",
"thiserror", "thiserror",
@ -3154,9 +3142,9 @@ dependencies = [
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.11.0" version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
@ -3499,7 +3487,7 @@ dependencies = [
[[package]] [[package]]
name = "secret-lib" name = "secret-lib"
version = "1.0.0" version = "1.0.0"
source = "git+https://github.com/pimalaya/core#3d94ec45b2cbdda4f1bd75d83f4adc9837d5f3bd" source = "git+https://github.com/pimalaya/core#79a960a684274537788d1193fe3db5bcf66cfb7e"
dependencies = [ dependencies = [
"keyring-lib", "keyring-lib",
"process-lib", "process-lib",

View file

@ -37,8 +37,8 @@ smtp = ["email-lib/smtp", "pimalaya-tui/smtp"]
sendmail = ["email-lib/sendmail", "pimalaya-tui/sendmail"] sendmail = ["email-lib/sendmail", "pimalaya-tui/sendmail"]
keyring = ["email-lib/keyring", "pimalaya-tui/keyring", "secret-lib/keyring"] keyring = ["email-lib/keyring", "pimalaya-tui/keyring", "secret-lib/keyring"]
oauth2 = ["dep:oauth-lib", "email-lib/oauth2", "pimalaya-tui/oauth2", "keyring"] oauth2 = ["email-lib/oauth2", "pimalaya-tui/oauth2", "keyring"]
wizard = ["dep:email_address", "email-lib/autoconfig", "pimalaya-tui/wizard"] wizard = ["email-lib/autoconfig", "pimalaya-tui/wizard"]
pgp = [] pgp = []
pgp-commands = ["email-lib/pgp-commands", "mml-lib/pgp-commands", "pimalaya-tui/pgp-commands", "pgp"] pgp-commands = ["email-lib/pgp-commands", "mml-lib/pgp-commands", "pimalaya-tui/pgp-commands", "pgp"]
@ -47,24 +47,15 @@ pgp-native = ["email-lib/pgp-native", "mml-lib/pgp-native", "pimalaya-tui/pgp-na
[dependencies] [dependencies]
ariadne = "0.2" ariadne = "0.2"
async-trait = "0.1"
clap = { version = "4.4", features = ["derive", "env", "wrap_help"] } clap = { version = "4.4", features = ["derive", "env", "wrap_help"] }
clap_complete = "4.4" clap_complete = "4.4"
clap_mangen = "0.2" clap_mangen = "0.2"
color-eyre = "0.6" color-eyre = "0.6"
comfy-table = "7.1"
crossterm = { version = "0.27", features = ["serde"] }
dirs = "4"
email-lib = { version = "1", default-features = false, features = ["tokio-rustls", "derive", "thread"] } email-lib = { version = "1", default-features = false, features = ["tokio-rustls", "derive", "thread"] }
email_address = { version = "0.2", optional = true }
mail-builder = "0.3" mail-builder = "0.3"
md5 = "0.7"
mml-lib = { version = "1", default-features = false, features = ["derive"] } mml-lib = { version = "1", default-features = false, features = ["derive"] }
oauth-lib = { version = "1", optional = true }
once_cell = "1.16" once_cell = "1.16"
petgraph = "0.6"
pimalaya-tui = { version = "1", default-features = false, features = ["email", "path", "cli", "himalaya", "tracing", "sled"] } pimalaya-tui = { version = "1", default-features = false, features = ["email", "path", "cli", "himalaya", "tracing", "sled"] }
process-lib = { version = "1", features = ["derive"] }
secret-lib = { version = "1", default-features = false, features = ["tokio", "rustls", "command", "derive"] } secret-lib = { version = "1", default-features = false, features = ["tokio", "rustls", "command", "derive"] }
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
serde_json = "1" serde_json = "1"
@ -83,8 +74,11 @@ imap-client = { git = "https://github.com/pimalaya/imap-client" }
# Pimalaya core # Pimalaya core
email-lib = { git = "https://github.com/pimalaya/core" } email-lib = { git = "https://github.com/pimalaya/core" }
http-lib = { git = "https://github.com/pimalaya/core" }
keyring-lib = { git = "https://github.com/pimalaya/core" }
mml-lib = { git = "https://github.com/pimalaya/core" } mml-lib = { git = "https://github.com/pimalaya/core" }
oauth-lib = { git = "https://github.com/pimalaya/core" } oauth-lib = { git = "https://github.com/pimalaya/core" }
pgp-lib = { git = "https://github.com/pimalaya/core" }
process-lib = { git = "https://github.com/pimalaya/core" } process-lib = { git = "https://github.com/pimalaya/core" }
secret-lib = { git = "https://github.com/pimalaya/core" } secret-lib = { git = "https://github.com/pimalaya/core" }

View file

@ -621,12 +621,13 @@ You can also manually edit your own configuration, from scratch:
## Sponsoring ## Sponsoring
[![nlnet](https://nlnet.nl/logo/banner-160x60.png)](https://nlnet.nl/project/Himalaya/index.html) [![nlnet](https://nlnet.nl/logo/banner-160x60.png)](https://nlnet.nl/)
Special thanks to the [NLnet foundation](https://nlnet.nl/project/Himalaya/index.html) and the [European Commission](https://www.ngi.eu/) that helped the project to receive financial support from: Special thanks to the [NLnet foundation](https://nlnet.nl/) and the [European Commission](https://www.ngi.eu/) that helped the project to receive financial support from various programs:
- [NGI Assure](https://nlnet.nl/assure/) in 2022 - [NGI Assure](https://nlnet.nl/project/Himalaya/) in 2022
- [NGI Zero Entrust](https://nlnet.nl/entrust/) in 2023 - [NGI Zero Entrust](https://nlnet.nl/project/Pimalaya/) in 2023
- [NGI Zero Core](https://nlnet.nl/project/Pimalaya-PIM/) in 2024 *(still ongoing)*
If you appreciate the project, feel free to donate using one of the following providers: If you appreciate the project, feel free to donate using one of the following providers:

View file

@ -288,13 +288,80 @@ template.forward.signature-style = "inlined"
template.forward.quote-headline = "-------- Forwarded Message --------\n" template.forward.quote-headline = "-------- Forwarded Message --------\n"
######################################## ########################################
#### PGP configuration ################# #### GPG-based PGP configuration #######
######################################## ########################################
# TODO # Enables PGP using GPG bindings. It requires the GPG lib to be
#pgp.backend = "commands" # installed on the system, and the `pgp-gpg` cargo feature on.
#pgp.backend = "gpg" #
#pgp.backend = "native" #pgp.type = "gpg"
########################################
#### Command-based PGP configuration ###
########################################
# Enables PGP using shell commands. A PGP client needs to be installed
# on the system, like gpg. It also requires the `pgp-commands` cargo
# feature.
#
#pgp.type = "commands"
# Defines the encrypt command. The special placeholder `<recipients>`
# represents the list of recipients, formatted by
# `pgp.encrypt-recipient-fmt`.
#
#pgp.encrypt-cmd = "gpg --encrypt --quiet --armor <recipients>"
# Formats recipients for `pgp.encrypt-cmd`. The special placeholder
# `<recipient>` is replaced by an actual recipient at runtime.
#
#pgp.encrypt-recipient-fmt = "--recipient <recipient>"
# Defines the separator used between formatted recipients
# `pgp.encrypt-recipient-fmt`.
#
#pgp.encrypt-recipients-sep = " "
# Defines the decrypt command.
#
#pgp.decrypt-cmd = "gpg --decrypt --quiet"
# Defines the sign command.
#
#pgp.sign-cmd = "gpg --sign --quiet --armor"
# Defines the verify command.
#
#pgp.verify-cmd = "gpg --verify --quiet"
########################################
#### Native PGP configuration ##########
########################################
# Enables the native Rust implementation of PGP. It requires the
# `pgp-native` cargo feature.
#
#pgp.type = "native"
# Defines where to find the PGP secret key.
#
#pgp.secret-key.path = "/path/to/secret.key"
#pgp.secret-key.keyring = "my-pgp-secret-key"
# Defines how to retrieve the PGP secret key passphrase.
#
#pgp.secret-key-passphrase.raw = "p@assw0rd"
#pgp.secret-key-passphrase.keyring = "my-pgp-passphrase"
#pgp.secret-key-passphrase.cmd = "pass show pgp-passphrase"
# Enables the Web Key Discovery protocol to discover recipients'
# public key based on their email address.
#
#pgp.wkd = true
# Enables public key servers discovery.
#
#pgp.key-servers = ["hkps://keys.openpgp.org", "hkps://keys.mailvelope.com"]
######################################## ########################################
#### IMAP configuration ################ #### IMAP configuration ################
@ -302,54 +369,54 @@ template.forward.quote-headline = "-------- Forwarded Message --------\n"
# Defines the IMAP backend as the default one for all features. # Defines the IMAP backend as the default one for all features.
# #
backend = "imap" backend.type = "imap"
# IMAP server host name. # IMAP server host name.
# #
imap.host = "localhost" backend.host = "localhost"
# IMAP server port. # IMAP server port.
# #
#imap.port = 143 #backend.port = 143
imap.port = 993 backend.port = 993
# IMAP server encryption. # IMAP server encryption.
# #
#imap.encryption = "none" # or false #backend.encryption = "none" # or false
#imap.encryption = "start-tls" #backend.encryption = "start-tls"
imap.encryption = "tls" # or true backend.encryption = "tls" # or true
# IMAP server login. # IMAP server login.
# #
imap.login = "example@localhost" backend.login = "example@localhost"
# IMAP server password authentication configuration. # IMAP server password authentication configuration.
# #
imap.auth.type = "password" backend.auth.type = "password"
# #
# Password can be inlined (not recommended). # Password can be inlined (not recommended).
# #
#imap.auth.raw = "p@assw0rd" #backend.auth.raw = "p@assw0rd"
# #
# Password can be stored inside your system global keyring (requires # Password can be stored inside your system global keyring (requires
# the keyring cargo feature). You must run at least once `himalaya # the keyring cargo feature). You must run at least once `himalaya
# account configure` to set up the password. # account configure` to set up the password.
# #
#imap.auth.keyring = "example-imap" #backend.auth.keyring = "example-imap"
# #
# Password can be retrieved from a shell command. # Password can be retrieved from a shell command.
# #
imap.auth.cmd = "pass show example-imap" backend.auth.cmd = "pass show example-imap"
# IMAP server OAuth 2.0 authorization configuration. # IMAP server OAuth 2.0 authorization configuration.
# #
#imap.auth.type = "oauth2" #backend.auth.type = "oauth2"
# #
# Client identifier issued to the client during the registration # Client identifier issued to the client during the registration
# process described in RFC6749. # process described in RFC6749.
# See <https://datatracker.ietf.org/doc/html/rfc6749#section-2.2>. # See <https://datatracker.ietf.org/doc/html/rfc6749#section-2.2>.
# #
#imap.auth.client-id = "client-id" #backend.auth.client-id = "client-id"
# #
# Client password issued to the client during the registration process # Client password issued to the client during the registration process
# described in RFC6749. # described in RFC6749.
@ -357,23 +424,23 @@ imap.auth.cmd = "pass show example-imap"
# Defaults to keyring "<account-name>-imap-client-secret". # Defaults to keyring "<account-name>-imap-client-secret".
# See <https://datatracker.ietf.org/doc/html/rfc6749#section-2.2>. # See <https://datatracker.ietf.org/doc/html/rfc6749#section-2.2>.
# #
#imap.auth.client-secret.raw = "<raw-client-secret>" #backend.auth.client-secret.raw = "<raw-client-secret>"
#imap.auth.client-secret.keyring = "example-imap-client-secret" #backend.auth.client-secret.keyring = "example-imap-client-secret"
#imap.auth.client-secret.cmd = "pass show example-imap-client-secret" #backend.auth.client-secret.cmd = "pass show example-imap-client-secret"
# #
# Method for presenting an OAuth 2.0 bearer token to a service for # Method for presenting an OAuth 2.0 bearer token to a service for
# authentication. # authentication.
# #
#imap.auth.method = "oauthbearer" #backend.auth.method = "oauthbearer"
#imap.auth.method = "xoauth2" #backend.auth.method = "xoauth2"
# #
# URL of the authorization server's authorization endpoint. # URL of the authorization server's authorization endpoint.
# #
#imap.auth.auth-url = "https://accounts.google.com/o/oauth2/v2/auth" #backend.auth.auth-url = "https://accounts.google.com/o/oauth2/v2/auth"
# #
# URL of the authorization server's token endpoint. # URL of the authorization server's token endpoint.
# #
#imap.auth.token-url = "https://www.googleapis.com/oauth2/v3/token" #backend.auth.token-url = "https://www.googleapis.com/oauth2/v3/token"
# #
# Access token returned by the token endpoint and used to access # Access token returned by the token endpoint and used to access
# protected resources. It is recommended to use the keyring variant, # protected resources. It is recommended to use the keyring variant,
@ -381,9 +448,9 @@ imap.auth.cmd = "pass show example-imap"
# #
# Defaults to keyring "<account-name>-imap-access-token". # Defaults to keyring "<account-name>-imap-access-token".
# #
#imap.auth.access-token.raw = "<raw-access-token>" #backend.auth.access-token.raw = "<raw-access-token>"
#imap.auth.access-token.keyring = "example-imap-access-token" #backend.auth.access-token.keyring = "example-imap-access-token"
#imap.auth.access-token.cmd = "pass show example-imap-access-token" #backend.auth.access-token.cmd = "pass show example-imap-access-token"
# #
# Refresh token used to obtain a new access token (if supported by the # Refresh token used to obtain a new access token (if supported by the
# authorization server). It is recommended to use the keyring variant, # authorization server). It is recommended to use the keyring variant,
@ -391,30 +458,35 @@ imap.auth.cmd = "pass show example-imap"
# #
# Defaults to keyring "<account-name>-imap-refresh-token". # Defaults to keyring "<account-name>-imap-refresh-token".
# #
#imap.auth.refresh-token.raw = "<raw-refresh-token>" #backend.auth.refresh-token.raw = "<raw-refresh-token>"
#imap.auth.refresh-token.keyring = "example-imap-refresh-token" #backend.auth.refresh-token.keyring = "example-imap-refresh-token"
#imap.auth.refresh-token.cmd = "pass show example-imap-refresh-token" #backend.auth.refresh-token.cmd = "pass show example-imap-refresh-token"
# #
# Enable the protection, as defined in RFC7636. # Enable the protection, as defined in RFC7636.
# #
# See <https://datatracker.ietf.org/doc/html/rfc7636>. # See <https://datatracker.ietf.org/doc/html/rfc7636>.
# #
#imap.auth.pkce = true #backend.auth.pkce = true
# #
# Access token scope(s), as defined by the authorization server. # Access token scope(s), as defined by the authorization server.
# #
#imap.auth.scope = "unique scope" #backend.auth.scope = "unique scope"
#imap.auth.scopes = ["multiple", "scopes"] #backend.auth.scopes = ["multiple", "scopes"]
#
# URL scheme of the redirect server.
# Defaults to http.
#
#backend.auth.redirect-scheme = "http"
# #
# Host name of the redirect server. # Host name of the redirect server.
# Defaults to localhost. # Defaults to localhost.
# #
#imap.auth.redirect-host = "localhost" #backend.auth.redirect-host = "localhost"
# #
# Port of the redirect server. # Port of the redirect server.
# Defaults to the first available one. # Defaults to the first available one.
# #
#imap.auth.redirect-port = 9999 #backend.auth.redirect-port = 9999
######################################## ########################################
#### Maildir configuration ############# #### Maildir configuration #############
@ -422,18 +494,18 @@ imap.auth.cmd = "pass show example-imap"
# Defines the Maildir backend as the default one for all features. # Defines the Maildir backend as the default one for all features.
# #
#backend = "maildir" #backend.type = "maildir"
# The Maildir root directory. The path should point to the root level # The Maildir root directory. The path should point to the root level
# of the Maildir directory. # of the Maildir directory.
# #
#maildir.root-dir = "~/.Mail/example" #backend.root-dir = "~/.Mail/example"
# Does the Maildir folder follows the Maildir++ standard? # Does the Maildir folder follows the Maildir++ standard?
# #
# See <https://en.wikipedia.org/wiki/Maildir#Maildir++>. # See <https://en.wikipedia.org/wiki/Maildir#Maildir++>.
# #
#maildir.maildirpp = false #backend.maildirpp = false
######################################## ########################################
#### Notmuch configuration ############# #### Notmuch configuration #############
@ -441,25 +513,25 @@ imap.auth.cmd = "pass show example-imap"
# Defines the Notmuch backend as the default one for all features. # Defines the Notmuch backend as the default one for all features.
# #
#backend = "notmuch" #backend.type = "notmuch"
# The path to the Notmuch database. The path should point to the root # The path to the Notmuch database. The path should point to the root
# directory containing the Notmuch database (usually the root Maildir # directory containing the Notmuch database (usually the root Maildir
# directory). # directory).
# #
#notmuch.db-path = "~/.Mail/example" #backend.db-path = "~/.Mail/example"
# Overrides the default path to the Maildir folder. # Overrides the default path to the Maildir folder.
# #
#notmuch.maildir-path = "~/.Mail/example" #backend.maildir-path = "~/.Mail/example"
# Overrides the default Notmuch configuration file path. # Overrides the default Notmuch configuration file path.
# #
#notmuch.config-path = "~/.notmuchrc" #backend.config-path = "~/.notmuchrc"
# Override the default Notmuch profile name. # Override the default Notmuch profile name.
# #
#notmuch.profile = "example" #backend.profile = "example"
######################################## ########################################
#### SMTP configuration ################ #### SMTP configuration ################
@ -467,55 +539,55 @@ imap.auth.cmd = "pass show example-imap"
# Defines the SMTP backend for the message sending feature. # Defines the SMTP backend for the message sending feature.
# #
message.send.backend = "smtp" message.send.backend.type = "smtp"
# SMTP server host name. # SMTP server host name.
# #
smtp.host = "localhost" message.send.backend.host = "localhost"
# SMTP server port. # SMTP server port.
# #
#smtp.port = 25 #message.send.backend.port = 25
#smtp.port = 465 #message.send.backend.port = 465
smtp.port = 587 message.send.backend.port = 587
# SMTP server encryption. # SMTP server encryption.
# #
#smtp.encryption = "none" # or false #message.send.backend.encryption = "none" # or false
#smtp.encryption = "start-tls" #message.send.backend.encryption = "start-tls"
smtp.encryption = "tls" # or true message.send.backend.encryption = "tls" # or true
# SMTP server login. # SMTP server login.
# #
smtp.login = "example@localhost" message.send.backend.login = "example@localhost"
# SMTP server password authentication configuration. # SMTP server password authentication configuration.
# #
smtp.auth.type = "password" message.send.backend.auth.type = "password"
# #
# Password can be inlined (not recommended). # Password can be inlined (not recommended).
# #
#smtp.auth.raw = "p@assw0rd" #message.send.backend.auth.raw = "p@assw0rd"
# #
# Password can be stored inside your system global keyring (requires # Password can be stored inside your system global keyring (requires
# the keyring cargo feature). You must run at least once `himalaya # the keyring cargo feature). You must run at least once `himalaya
# account configure` to set up the password. # account configure` to set up the password.
# #
#smtp.auth.keyring = "example-smtp" #message.send.backend.auth.keyring = "example-smtp"
# #
# Password can be retrieved from a shell command. # Password can be retrieved from a shell command.
# #
smtp.auth.cmd = "pass show example-smtp" message.send.backend.auth.cmd = "pass show example-smtp"
# SMTP server OAuth 2.0 authorization configuration. # SMTP server OAuth 2.0 authorization configuration.
# #
#smtp.auth.type = "oauth2" #message.send.backend.auth.type = "oauth2"
# #
# Client identifier issued to the client during the registration # Client identifier issued to the client during the registration
# process described in RFC6749. # process described in RFC6749.
# See <https://datatracker.ietf.org/doc/html/rfc6749#section-2.2>. # See <https://datatracker.ietf.org/doc/html/rfc6749#section-2.2>.
# #
#smtp.auth.client-id = "client-id" #message.send.backend.auth.client-id = "client-id"
# #
# Client password issued to the client during the registration process # Client password issued to the client during the registration process
# described in RFC6749. # described in RFC6749.
@ -523,23 +595,23 @@ smtp.auth.cmd = "pass show example-smtp"
# Defaults to keyring "<account-name>-smtp-client-secret". # Defaults to keyring "<account-name>-smtp-client-secret".
# See <https://datatracker.ietf.org/doc/html/rfc6749#section-2.2>. # See <https://datatracker.ietf.org/doc/html/rfc6749#section-2.2>.
# #
#smtp.auth.client-secret.raw = "<raw-client-secret>" #message.send.backend.auth.client-secret.raw = "<raw-client-secret>"
#smtp.auth.client-secret.keyring = "example-smtp-client-secret" #message.send.backend.auth.client-secret.keyring = "example-smtp-client-secret"
#smtp.auth.client-secret.cmd = "pass show example-smtp-client-secret" #message.send.backend.auth.client-secret.cmd = "pass show example-smtp-client-secret"
# #
# Method for presenting an OAuth 2.0 bearer token to a service for # Method for presenting an OAuth 2.0 bearer token to a service for
# authentication. # authentication.
# #
#smtp.auth.method = "oauthbearer" #message.send.backend.auth.method = "oauthbearer"
#smtp.auth.method = "xoauth2" #message.send.backend.auth.method = "xoauth2"
# #
# URL of the authorization server's authorization endpoint. # URL of the authorization server's authorization endpoint.
# #
#smtp.auth.auth-url = "https://accounts.google.com/o/oauth2/v2/auth" #message.send.backend.auth.auth-url = "https://accounts.google.com/o/oauth2/v2/auth"
# #
# URL of the authorization server's token endpoint. # URL of the authorization server's token endpoint.
# #
#smtp.auth.token-url = "https://www.googleapis.com/oauth2/v3/token" #message.send.backend.auth.token-url = "https://www.googleapis.com/oauth2/v3/token"
# #
# Access token returned by the token endpoint and used to access # Access token returned by the token endpoint and used to access
# protected resources. It is recommended to use the keyring variant, # protected resources. It is recommended to use the keyring variant,
@ -547,9 +619,9 @@ smtp.auth.cmd = "pass show example-smtp"
# #
# Defaults to keyring "<account-name>-smtp-access-token". # Defaults to keyring "<account-name>-smtp-access-token".
# #
#smtp.auth.access-token.raw = "<raw-access-token>" #message.send.backend.auth.access-token.raw = "<raw-access-token>"
#smtp.auth.access-token.keyring = "example-smtp-access-token" #message.send.backend.auth.access-token.keyring = "example-smtp-access-token"
#smtp.auth.access-token.cmd = "pass show example-smtp-access-token" #message.send.backend.auth.access-token.cmd = "pass show example-smtp-access-token"
# #
# Refresh token used to obtain a new access token (if supported by the # Refresh token used to obtain a new access token (if supported by the
# authorization server). It is recommended to use the keyring variant, # authorization server). It is recommended to use the keyring variant,
@ -557,30 +629,35 @@ smtp.auth.cmd = "pass show example-smtp"
# #
# Defaults to keyring "<account-name>-smtp-refresh-token". # Defaults to keyring "<account-name>-smtp-refresh-token".
# #
#smtp.auth.refresh-token.raw = "<raw-refresh-token>" #message.send.backend.auth.refresh-token.raw = "<raw-refresh-token>"
#smtp.auth.refresh-token.keyring = "example-smtp-refresh-token" #message.send.backend.auth.refresh-token.keyring = "example-smtp-refresh-token"
#smtp.auth.refresh-token.cmd = "pass show example-smtp-refresh-token" #message.send.backend.auth.refresh-token.cmd = "pass show example-smtp-refresh-token"
# #
# Enable the protection, as defined in RFC7636. # Enable the protection, as defined in RFC7636.
# #
# See <https://datatracker.ietf.org/doc/html/rfc7636>. # See <https://datatracker.ietf.org/doc/html/rfc7636>.
# #
#smtp.auth.pkce = true #message.send.backend.auth.pkce = true
# #
# Access token scope(s), as defined by the authorization server. # Access token scope(s), as defined by the authorization server.
# #
#smtp.auth.scope = "unique scope" #message.send.backend.auth.scope = "unique scope"
#smtp.auth.scopes = ["multiple", "scopes"] #message.send.backend.auth.scopes = ["multiple", "scopes"]
#
# URL scheme of the redirect server.
# Defaults to http.
#
#message.send.backend.auth.redirect-scheme = "http"
# #
# Host name of the redirect server. # Host name of the redirect server.
# Defaults to localhost. # Defaults to localhost.
# #
#smtp.auth.redirect-host = "localhost" #message.send.backend.auth.redirect-host = "localhost"
# #
# Port of the redirect server. # Port of the redirect server.
# Defaults to the first available one. # Defaults to the first available one.
# #
#smtp.auth.redirect-port = 9999 #message.send.backend.auth.redirect-port = 9999
######################################## ########################################
#### Sendmail configuration ############ #### Sendmail configuration ############
@ -588,8 +665,8 @@ smtp.auth.cmd = "pass show example-smtp"
# Defines the Sendmail backend for the message sending feature. # Defines the Sendmail backend for the message sending feature.
# #
#message.send.backend = "sendmail" #message.send.backend.type = "sendmail"
# Customizes the sendmail shell command. # Customizes the sendmail shell command.
# #
#sendmail.cmd = "/usr/bin/sendmail" #message.send.backend.cmd = "/usr/bin/sendmail"

View file

@ -57,7 +57,7 @@ impl AccountConfigureCommand {
#[cfg(feature = "smtp")] #[cfg(feature = "smtp")]
{ {
let reset = match toml_account_config.smtp_auth_config() { let reset = match toml_account_config.smtp_auth_config() {
Some(SmtpAuthConfig::Passwd(config)) => config.reset().await, Some(SmtpAuthConfig::Password(config)) => config.reset().await,
#[cfg(feature = "oauth2")] #[cfg(feature = "oauth2")]
Some(SmtpAuthConfig::OAuth2(config)) => config.reset().await, Some(SmtpAuthConfig::OAuth2(config)) => config.reset().await,
_ => Ok(()), _ => Ok(()),
@ -93,7 +93,7 @@ impl AccountConfigureCommand {
#[cfg(feature = "smtp")] #[cfg(feature = "smtp")]
match toml_account_config.smtp_auth_config() { match toml_account_config.smtp_auth_config() {
Some(SmtpAuthConfig::Passwd(config)) => { Some(SmtpAuthConfig::Password(config)) => {
config config
.configure(|| Ok(prompt::password("SMTP password")?)) .configure(|| Ok(prompt::password("SMTP password")?))
.await .await

View file

@ -161,6 +161,7 @@ impl ListEnvelopesCommand {
.with_list_envelopes(BackendFeatureSource::Context) .with_list_envelopes(BackendFeatureSource::Context)
}, },
) )
.without_sending_backend()
.build() .build()
.await?; .await?;