lib/config: set defaults for user full name

This just copies code from from the CLI into the library. New test
infrastructure is needed because apparently we have never tested this
code path.
This commit is contained in:
David Bremner 2021-02-14 09:23:44 -04:00
parent 863b243185
commit e81dc2072f
3 changed files with 63 additions and 5 deletions

View file

@ -22,6 +22,8 @@
#include "notmuch-private.h" #include "notmuch-private.h"
#include "database-private.h" #include "database-private.h"
#include <pwd.h>
static const std::string CONFIG_PREFIX = "C"; static const std::string CONFIG_PREFIX = "C";
struct _notmuch_config_list { struct _notmuch_config_list {
@ -451,6 +453,41 @@ notmuch_config_get_bool (notmuch_database_t *notmuch, notmuch_config_key_t key,
return NOTMUCH_STATUS_SUCCESS; return NOTMUCH_STATUS_SUCCESS;
} }
static const char *
_get_name_from_passwd_file (void *ctx)
{
long pw_buf_size;
char *pw_buf;
struct passwd passwd, *ignored;
const 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_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) {
char *comma = strchr (passwd.pw_gecos, ',');
if (comma)
name = talloc_strndup (ctx, passwd.pw_gecos,
comma - passwd.pw_gecos);
else
name = talloc_strdup (ctx, passwd.pw_gecos);
} else {
name = talloc_strdup (ctx, "");
}
talloc_free (pw_buf);
return name;
}
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)
{ {
@ -486,6 +523,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;
switch (key) { switch (key) {
case NOTMUCH_CONFIG_DATABASE_PATH: case NOTMUCH_CONFIG_DATABASE_PATH:
@ -505,10 +543,18 @@ _notmuch_config_default (notmuch_database_t *notmuch, notmuch_config_key_t key)
return "inbox;unread"; return "inbox;unread";
case NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS: case NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS:
return "true"; return "true";
case NOTMUCH_CONFIG_USER_NAME:
name = getenv ("NAME");
if (name)
name = talloc_strdup (notmuch, name);
else
name = _get_name_from_passwd_file (notmuch);
return name;
break;
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_USER_NAME:
case NOTMUCH_CONFIG_PRIMARY_EMAIL: case NOTMUCH_CONFIG_PRIMARY_EMAIL:
case NOTMUCH_CONFIG_OTHER_EMAIL: case NOTMUCH_CONFIG_OTHER_EMAIL:
return NULL; return NULL;

View file

@ -384,6 +384,9 @@ cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} '' %NULL%
} }
} }
EOF EOF
notmuch_passwd_sanitize < OUTPUT > OUTPUT.clean
cat <<'EOF' >EXPECTED cat <<'EOF' >EXPECTED
== stdout == == stdout ==
MAIL_DIR MAIL_DIR
@ -396,11 +399,11 @@ NULL
true true
NULL NULL
NULL NULL
NULL USER_FULL_NAME
== stderr == == stderr ==
EOF EOF
unset MAILDIR unset MAILDIR
test_expect_equal_file EXPECTED OUTPUT test_expect_equal_file EXPECTED OUTPUT.clean
backup_database backup_database
test_begin_subtest "override config from \${NOTMUCH_CONFIG}" test_begin_subtest "override config from \${NOTMUCH_CONFIG}"
@ -727,6 +730,8 @@ cat c_head2 - c_tail <<'EOF' | test_C ${MAIL_DIR} /nonexistent %NULL%
} }
} }
EOF EOF
notmuch_passwd_sanitize < OUTPUT > OUTPUT.clean
cat <<'EOF' >EXPECTED cat <<'EOF' >EXPECTED
== stdout == == stdout ==
MAIL_DIR MAIL_DIR
@ -739,10 +744,10 @@ NULL
true true
NULL NULL
NULL NULL
NULL USER_FULL_NAME
== stderr == == stderr ==
EOF EOF
test_expect_equal_file EXPECTED OUTPUT test_expect_equal_file EXPECTED OUTPUT.clean
backup_database backup_database
test_begin_subtest "override config from \${HOME}/.notmuch-config (ndlc)" test_begin_subtest "override config from \${HOME}/.notmuch-config (ndlc)"

View file

@ -694,6 +694,13 @@ notmuch_built_with_sanitize ()
sed 's/^built_with[.]\(.*\)=.*$/built_with.\1=something/' sed 's/^built_with[.]\(.*\)=.*$/built_with.\1=something/'
} }
notmuch_passwd_sanitize ()
{
local user=$(id -un)
local full_name=$(getent passwd $user | cut -d: -f 5 | cut -d, -f1)
sed "s/$full_name/USER_FULL_NAME/"
}
notmuch_config_sanitize () notmuch_config_sanitize ()
{ {
notmuch_dir_sanitize | notmuch_built_with_sanitize notmuch_dir_sanitize | notmuch_built_with_sanitize