* discovery: use opaque error type for DnsSdError
This helps to decouple discovery and core by not leaking implementation
details of the zeroconf backend into Error conversion impls in core.
* discovery: map all MDNS/DNS-SD errors to DiscoveryError::DnsSdError
previously, libmdns errors would use a generic conversion
from std::io::Error to core::Error
* discovery: use an opaque type for the handle to the DNS-SD service
* discovery: make features additive
i.e. add with-libmdns instead of using not(with-dns-sd).
The logic is such that enabling with-dns-sd in addition to the default
with-libmdns will still end up using dns-sd, as before.
If only with-libmdns is enabled, that will be the default.
If none of the features is enabled, attempting to build a `Discovery`
will yield an error.
* discovery: add --zeroconf-backend CLI flag
* discovery: Add minimal Avahi zeroconf backend
* bump MSRV to 1.75
required by zbus >= 4
* discovery: ensure that server and dns-sd backend shutdown gracefully
Previously, on drop the the shutdown_tx/close_tx, it wasn't guaranteed
the corresponding tasks would continue to be polled until they actually
completed their shutdown.
Since dns_sd::Service is not Send and non-async, and because libmdns is
non-async, put them on their own threads.
* discovery: use a shared channel for server and zeroconf status messages
* discovery: add Avahi reconnection logic
This deals gracefully with the case where the Avahi daemon is restarted
or not running initially.
* discovery: allow running when compiled without zeroconf backend...
...but exit with an error if there's no way to authenticate
* better error messages for invalid options with no short flag
* core: Obtain spclient access token using login5 instead of keymaster (Fixes#1179)
* core: move solving hashcash into util
* login5: add login for mobile
---------
Co-authored-by: Nick Steel <nick@nsteel.co.uk>
* core: Create credentials from access token via OAuth2
* core: Credentials.username is optional: not required for token auth.
* core: store auth data within session. We might need this later if need to re-auth and original creds are no longer valid/available.
* bin: New --token arg for using Spotify access token. Specify 0 to manually enter the auth code (headless).
* bin: Added --enable-oauth / -j option. Using --password / -p option will error and exit.
* core: reconnect session if using token authentication
Token authenticated sessions cannot use keymaster. So reconnect using the reusable credentials we just obtained. Can perhaps remove this
workaround once keymaster is replaced with login5.
* examples: replace password login with token login
hyper's `server` feature is not always enabled. The `hyper::Error::is_parse_too_large` function isn't included when `server` isn't enabled.
Fortunately, it doesn't matter to us: `Error:is_parse` matches `parse_too_large` errors, so removing this check does not change behavior whatsoever.
A SpotifyId is expected to be a 128 bits integer and can be parsed from a
base 62 or 16 string. However the parsing functions only checked the validity of
the characters of the string, but not its length. This could result in integer
overflows or the parsing of incorrect strings as Spotify ids.
This commit add some checks to the length of the input string passed to the
parse functions, and also checks for integer overflows in case of base62
encoded strings.