lib/config: set default for primary user email

This is mainly copying code from the CLI into the lib. The CLI copy
will be deleted in a later commit.
This commit is contained in:
David Bremner 2021-02-14 09:55:42 -04:00
parent e81dc2072f
commit 2e9ee47072
3 changed files with 73 additions and 10 deletions

View file

@ -23,6 +23,7 @@
#include "database-private.h" #include "database-private.h"
#include <pwd.h> #include <pwd.h>
#include <netdb.h>
static const std::string CONFIG_PREFIX = "C"; static const std::string CONFIG_PREFIX = "C";
@ -488,6 +489,63 @@ _get_name_from_passwd_file (void *ctx)
return name; return name;
} }
static char *
_get_username_from_passwd_file (void *ctx)
{
long pw_buf_size;
char *pw_buf;
struct passwd passwd, *ignored;
char *name;
int e;
pw_buf_size = sysconf (_SC_GETPW_R_SIZE_MAX);
if (pw_buf_size == -1) pw_buf_size = 64;
pw_buf = (char *) talloc_zero_size (ctx, pw_buf_size);
while ((e = getpwuid_r (getuid (), &passwd, pw_buf,
pw_buf_size, &ignored)) == ERANGE) {
pw_buf_size = pw_buf_size * 2;
pw_buf = (char *) talloc_zero_size (ctx, pw_buf_size);
}
if (e == 0)
name = talloc_strdup (ctx, passwd.pw_name);
else
name = talloc_strdup (ctx, "");
talloc_free (pw_buf);
return name;
}
static const char *
_get_email_from_passwd_file (void *ctx)
{
char hostname[256];
struct hostent *hostent;
const char *domainname;
char *email;
char *username = _get_username_from_passwd_file (ctx);
gethostname (hostname, 256);
hostname[255] = '\0';
hostent = gethostbyname (hostname);
if (hostent && (domainname = strchr (hostent->h_name, '.')))
domainname += 1;
else
domainname = "(none)";
email = talloc_asprintf (ctx, "%s@%s.%s",
username, hostname, domainname);
talloc_free (username);
talloc_free (email);
return email;
}
static const char * static const char *
_notmuch_config_key_to_string (notmuch_config_key_t key) _notmuch_config_key_to_string (notmuch_config_key_t key)
{ {
@ -523,7 +581,7 @@ static const char *
_notmuch_config_default (notmuch_database_t *notmuch, notmuch_config_key_t key) _notmuch_config_default (notmuch_database_t *notmuch, notmuch_config_key_t key)
{ {
char *path; char *path;
const char *name; const char *name, *email;
switch (key) { switch (key) {
case NOTMUCH_CONFIG_DATABASE_PATH: case NOTMUCH_CONFIG_DATABASE_PATH:
@ -549,13 +607,17 @@ _notmuch_config_default (notmuch_database_t *notmuch, notmuch_config_key_t key)
name = talloc_strdup (notmuch, name); name = talloc_strdup (notmuch, name);
else else
name = _get_name_from_passwd_file (notmuch); name = _get_name_from_passwd_file (notmuch);
return name; return name;
break; case NOTMUCH_CONFIG_PRIMARY_EMAIL:
email = getenv ("EMAIL");
if (email)
email = talloc_strdup (notmuch, email);
else
email = _get_email_from_passwd_file (notmuch);
return email;
case NOTMUCH_CONFIG_HOOK_DIR: case NOTMUCH_CONFIG_HOOK_DIR:
case NOTMUCH_CONFIG_BACKUP_DIR: case NOTMUCH_CONFIG_BACKUP_DIR:
case NOTMUCH_CONFIG_NEW_IGNORE: case NOTMUCH_CONFIG_NEW_IGNORE:
case NOTMUCH_CONFIG_PRIMARY_EMAIL:
case NOTMUCH_CONFIG_OTHER_EMAIL: case NOTMUCH_CONFIG_OTHER_EMAIL:
return NULL; return NULL;
default: default:

View file

@ -397,7 +397,7 @@ MAIL_DIR/.notmuch/backups
inbox;unread inbox;unread
NULL NULL
true true
NULL USERNAME@FQDN
NULL NULL
USER_FULL_NAME USER_FULL_NAME
== stderr == == stderr ==
@ -626,9 +626,6 @@ EOF
test_begin_subtest "notmuch_database_get_config (ndlc)" test_begin_subtest "notmuch_database_get_config (ndlc)"
echo NOTMUCH_CONFIG=$NOTMUCH_CONFIG
echo NOTMUCH_PROFILE=$NOTMUCH_PROFILE
echo HOME=$HOME
cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL% cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} %NULL% %NULL%
{ {
EXPECT0(notmuch_database_get_config (db, "test.key1", &val)); EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
@ -742,7 +739,7 @@ MAIL_DIR/.notmuch/backups
inbox;unread inbox;unread
NULL NULL
true true
NULL USERNAME@FQDN
NULL NULL
USER_FULL_NAME USER_FULL_NAME
== stderr == == stderr ==

View file

@ -107,6 +107,9 @@ unset GREP_OPTIONS
# For emacsclient # For emacsclient
unset ALTERNATE_EDITOR unset ALTERNATE_EDITOR
# for reproducibility
unset EMAIL
add_gnupg_home () add_gnupg_home ()
{ {
[ -e "${GNUPGHOME}/gpg.conf" ] && return [ -e "${GNUPGHOME}/gpg.conf" ] && return
@ -697,8 +700,9 @@ notmuch_built_with_sanitize ()
notmuch_passwd_sanitize () notmuch_passwd_sanitize ()
{ {
local user=$(id -un) local user=$(id -un)
local fqdn=$(hostname -f)
local full_name=$(getent passwd $user | cut -d: -f 5 | cut -d, -f1) local full_name=$(getent passwd $user | cut -d: -f 5 | cut -d, -f1)
sed "s/$full_name/USER_FULL_NAME/" sed -e "s/$user/USERNAME/" -e "s/$fqdn/FQDN/" -e "s/$full_name/USER_FULL_NAME/"
} }
notmuch_config_sanitize () notmuch_config_sanitize ()