Files
nix-files/hosts/common/programs/evolution-data-server.nix

227 lines
8.6 KiB
Nix

# evolution-data-server (e-d-s) exposes DBus services for managing contacts and calendars.
#
# common users include:
# - `folks` (for contacts only, used in turn by `gnome-calls`, `gnome-contacts`, et al.)
# - `gnome-calendars`, along with several other calendar or todo/tasking apps
#
# by default, e-d-s can interface with:
# - addressbooks:
# - local (~/.local/share/evolution/addressbook/system/{contacts.db,photos}
# - sqlite db
# - LDAP
# - CardDAV
# - calendars:
# - CalDAV
# - contacts (meta "birthdays" and "anniversaries" calendars populated from fields in whatever addressbooks e-d-s was configured for)
# - file (~/.local/share/evolution/calendar/system/calendar.ics)
# - gtasks (Google Tasks webservice)
# - http (webcal; might be nerfed?)
# - weather (gweather)
# - weather for the current day, plus a daily forecast: temperature low/high, fog/clouds/overcast/snow/storm, textual summary
# - webdav-notes (.txt or .md)
# - it also has a pluggable backend system ("extensions"), though external extensions are very difficult to find.
# - evolution-ews extension adds Microsoft Exchange support
# - evolution itself acts as an extension
# the internals/data flow are obtuse enough that writing an extension in C is a *bad* idea
# however e-d-s has gobject-introspection (g-i-r) bindings; it *may* be possible to write extensions in Python.
#
# utilities:
# - `libexec/evolution-data-server/addressbook-export` can (supposedly) export an address book to vcard or csv format
# - `src/examples/cursor/cursor-example` (not installed) when run will import a directory of .vcf cards into a `local` addressbook (creating the addressbook if it doesn't exist)
# - `evolution /path/to/vcard.vcf` imports a vcf into the primary e-d-s addressbook, but requires UI interaction
# - `gnome-contacts-parser vcard /my/vcard.vcf` from ${gnome-contacts}/libexec/gnome-contacts: transforms a vcard into a gvariant
# that's used internally; there doesn't appear a way to plumb that gvariant down into the database without going through the UI
#
# noteworthy build-time config options:
# - ENABLA_VALA_BINDINGS
# - ENABLE_BACKEND_PER_PROCESS
# - ENABLE_BACKTRACES
# - ENABLE_EXAMPLES (it's got an example that maybe imports vcards from a directory)
# - ENABLE_GOA
# - ENABLE_GTK (for gtk3)
# - ENABLE_GTK4
# - ENABLE_OAUTH2_WEBKITGTK
# - ENABLE_OAUTH2_WEBKITGTK4
# - WITH_PRIVATE_DOCS
#
# noteworthy environment variables:
# - BOOKSQL_DEBUG
# - CALDAV_DEBUG
# - CARDDAV_DEBUG
# - EAN_DEBUG
# - EBSQL_DEBUG
# - EDS_ADDRESS_BOOK_MODULES (allows overriding the `file` backend with your own .so implementation)
# - EDS_CALENDAR_MODULES
# - EDS_EXTRA_PREFIXES
# - EDS_REGISTRY_MODULES
# - EDS_SUBPROCESS_BOOK_PATH
# - EDS_SUBPROCESS_CAL_PATH
# - EDS_TESTING
# - ERW_DEBUG
# - ESR_DEBUG
# - GDATA_DEBUG
# - GOA_DEBUG
# - LDAP_DEBUG
# - LDAP_TIMEOUT
# - OAUTH2_DEBUG
# - WEBCAL_DEBUG
# - WEBDAV_DEBUG
# - WEBDAV_NOTES_DEBUG
#
#
# should you need to reconfigure the radicale stuff (e.g. add another collection):
# - do so using `evolution`
# - it will ask to auth against radicale: enter <user>, keep password field empty
# - new `.source` files will appear under ~/.cache/evolution:
# - these represent the collections: move them into ~/.config and give them stable names
# - edit them to not have `parent=...` (this will allow them to connect w/o auth)
# - then remove the `evolution` passwords from gnome-keyring to ensure reproducibility
{ config, pkgs, ... }:
let
cfg = config.sane.programs."evolution-data-server";
in
{
sane.programs."evolution-data-server" = {
packageUnwrapped = pkgs.evolution-data-server.override {
# disable the UI; avoid a dep on webkitgtk (if this is too blunt, specify `enableOAuth2 = false;` instead)
withGtk3 = false;
withGtk4 = false;
};
suggestedPrograms = [
# "gnome-keyring" # to save the empty password for my calendar
# radicale acts as a CardDAV / CalDAV server:
# evolution speaks to it over http port 5232
# and it reads/writes vcard .vcf files to its own storage
"radicale"
];
sandbox.whitelistDbus.user = true; #< TODO: reduce
sandbox.net = "localhost"; #< to reach radicale (TODO: restrict further)
persist.byStore.ephemeral = [
".cache/evolution"
# ~/.config/evolution/sources:
# - birthdays.source
# - system-calendar.source
# - system-proxy.source
# ".config/evolution/sources"
# ".local/share/evolution"
];
persist.byStore.private = [
# ".cache/evolution/sources"
# local data stores (e.g. addressbook, calendar) live in ~/.local/share/evolution
# ".local/share/evolution"
# ".local/share/evolution/addressbook/system"
# ".local/share/evolution/calendar/system"
];
# radicale source: configured by building `evolution` and adding the account there.
# the password (empty) was presumably saved to gnome-keyring.
# fs.".config/evolution/sources/ec1438cee0ce00521a96cd266b980c20891c41cf.source".symlink.text = ''
# fs.".config/evolution/sources/pkm.source".symlink.text = ''
# [Data Source]
# DisplayName=colin
# Enabled=true
# Parent=
# [Authentication]
# Host=
# Method=plain/password
# Port=0
# ProxyUid=system-proxy
# RememberPassword=true
# User=colin
# CredentialName=
# IsExternal=false
# [Collection]
# BackendName=webdav
# CalendarEnabled=true
# ContactsEnabled=true
# Identity=colin
# MailEnabled=true
# AllowSourcesRename=false
# CalendarUrl=
# ContactsUrl=http://localhost:5232
# '';
# file created by:
# - after configuring `pkm.source` above, evolution should auto-discover collection items
# and make them available as random UUIDs in e.g. `~/.cache/evolution/sources/pkm/<UUID>.source`.
# - copy that file here, and rename it as desired.
fs.".config/evolution/sources/pkm-contacts.source".symlink.text = ''
[Data Source]
DisplayName=git-synchronized PKM
Enabled=true
# Parent=pkm
[Authentication]
Host=localhost
Method=plain/password
Port=5232
ProxyUid=system-proxy
RememberPassword=true
User=colin
CredentialName=
IsExternal=false
[Security]
Method=none
[Resource]
Identity=contacts::http://localhost:5232/colin/pkm/
[WebDAV Backend]
AvoidIfmatch=false
CalendarAutoSchedule=false
Color=
DisplayName=git-synchronized PKM
EmailAddress=
ResourcePath=/colin/pkm/
ResourceQuery=
SslTrust=
Order=4294967295
Timeout=90
[Address Book]
BackendName=carddav
Order=0
'';
gsettings."org/freedesktop/folks" = {
primary-store = "eds:pkm-contacts";
};
# e-d-s provides the following services:
# - evolution-addressbook-factory (org.gnome.evolution.dataserver.AddressBook10)
# - evolution-calendar-factory (org.gnome.evolution.dataserver.Calendar8)
# - evolution-source-registry (org.gnome.evolution.dataserver.Sources5)
# - evolution-user-prompter (org.gnome.evolution.dataserver.UserPrompter0)
services."evolution-addressbook-factory" = {
# evolution-addressbook-factory is required for gnome-contacts to add/view contacts
description = "evolution-addressbook-factory provides contacts storage/retrieval to dbus users";
dependencyOf = [ "graphical-session" ];
depends = [ "radicale" ];
command = "${cfg.package}/libexec/evolution-addressbook-factory --keep-running";
readiness.waitDbus = "org.gnome.evolution.dataserver.AddressBook10";
};
services."evolution-calendar-factory" = {
# evolution-addressbook-factory is required by gnome-calendar to add/view events
description = "evolution-calendar-factory provides calendar storage/retrieval to dbus users";
dependencyOf = [ "graphical-session" ];
depends = [ "radicale" ];
command = "${cfg.package}/libexec/evolution-calendar-factory --keep-running";
readiness.waitDbus = "org.gnome.evolution.dataserver.Calendar8";
};
services."evolution-source-registry" = {
# evolution-source-registry sits between consumers and sources;
# without it the addressbook-factory and calendar-factory are effectively useless.
description = "evolution-source-registry provides a list of available contacts/calendar sources to dbus users";
dependencyOf = [ "graphical-session" ];
command = "${cfg.package}/libexec/evolution-source-registry";
readiness.waitDbus = "org.gnome.evolution.dataserver.Sources5";
};
# services."evolution-user-prompter" = ... #< seems to not be required
};
}