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 <pwd.h>
#include <netdb.h>
static const std::string CONFIG_PREFIX = "C";
@ -488,6 +489,63 @@ _get_name_from_passwd_file (void *ctx)
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 *
_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)
{
char *path;
const char *name;
const char *name, *email;
switch (key) {
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);
else
name = _get_name_from_passwd_file (notmuch);
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_BACKUP_DIR:
case NOTMUCH_CONFIG_NEW_IGNORE:
case NOTMUCH_CONFIG_PRIMARY_EMAIL:
case NOTMUCH_CONFIG_OTHER_EMAIL:
return NULL;
default:

View file

@ -397,7 +397,7 @@ MAIL_DIR/.notmuch/backups
inbox;unread
NULL
true
NULL
USERNAME@FQDN
NULL
USER_FULL_NAME
== stderr ==
@ -626,9 +626,6 @@ EOF
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%
{
EXPECT0(notmuch_database_get_config (db, "test.key1", &val));
@ -742,7 +739,7 @@ MAIL_DIR/.notmuch/backups
inbox;unread
NULL
true
NULL
USERNAME@FQDN
NULL
USER_FULL_NAME
== stderr ==

View file

@ -107,6 +107,9 @@ unset GREP_OPTIONS
# For emacsclient
unset ALTERNATE_EDITOR
# for reproducibility
unset EMAIL
add_gnupg_home ()
{
[ -e "${GNUPGHOME}/gpg.conf" ] && return
@ -697,8 +700,9 @@ notmuch_built_with_sanitize ()
notmuch_passwd_sanitize ()
{
local user=$(id -un)
local fqdn=$(hostname -f)
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 ()