aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Bremner <david@tethera.net>2021-02-14 09:23:44 -0400
committerDavid Bremner <david@tethera.net>2021-03-27 09:26:14 -0300
commite81dc2072f22996a07e82b9b9b2eac826410e5a7 (patch)
tree1900a4bf8abba9de2d060a974dbb8f2fdd4aae39
parent863b2431853385441f9fcbc22b9ff4e963091440 (diff)
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.
-rw-r--r--lib/config.cc48
-rwxr-xr-xtest/T590-libconfig.sh13
-rw-r--r--test/test-lib.sh7
3 files changed, 63 insertions, 5 deletions
diff --git a/lib/config.cc b/lib/config.cc
index ab45ae7b..38416632 100644
--- a/lib/config.cc
+++ b/lib/config.cc
@@ -22,6 +22,8 @@
#include "notmuch-private.h"
#include "database-private.h"
+#include <pwd.h>
+
static const std::string CONFIG_PREFIX = "C";
struct _notmuch_config_list {
@@ -452,6 +454,41 @@ notmuch_config_get_bool (notmuch_database_t *notmuch, notmuch_config_key_t key,
}
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 *
_notmuch_config_key_to_string (notmuch_config_key_t key)
{
switch (key) {
@@ -486,6 +523,7 @@ static const char *
_notmuch_config_default (notmuch_database_t *notmuch, notmuch_config_key_t key)
{
char *path;
+ const char *name;
switch (key) {
case NOTMUCH_CONFIG_DATABASE_PATH:
@@ -505,10 +543,18 @@ _notmuch_config_default (notmuch_database_t *notmuch, notmuch_config_key_t key)
return "inbox;unread";
case NOTMUCH_CONFIG_SYNC_MAILDIR_FLAGS:
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_BACKUP_DIR:
case NOTMUCH_CONFIG_NEW_IGNORE:
- case NOTMUCH_CONFIG_USER_NAME:
case NOTMUCH_CONFIG_PRIMARY_EMAIL:
case NOTMUCH_CONFIG_OTHER_EMAIL:
return NULL;
diff --git a/test/T590-libconfig.sh b/test/T590-libconfig.sh
index 49cc382a..2c6e726c 100755
--- a/test/T590-libconfig.sh
+++ b/test/T590-libconfig.sh
@@ -384,6 +384,9 @@ cat c_head - c_tail <<'EOF' | test_C ${MAIL_DIR} '' %NULL%
}
}
EOF
+
+notmuch_passwd_sanitize < OUTPUT > OUTPUT.clean
+
cat <<'EOF' >EXPECTED
== stdout ==
MAIL_DIR
@@ -396,11 +399,11 @@ NULL
true
NULL
NULL
-NULL
+USER_FULL_NAME
== stderr ==
EOF
unset MAILDIR
-test_expect_equal_file EXPECTED OUTPUT
+test_expect_equal_file EXPECTED OUTPUT.clean
backup_database
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
+
+notmuch_passwd_sanitize < OUTPUT > OUTPUT.clean
cat <<'EOF' >EXPECTED
== stdout ==
MAIL_DIR
@@ -739,10 +744,10 @@ NULL
true
NULL
NULL
-NULL
+USER_FULL_NAME
== stderr ==
EOF
-test_expect_equal_file EXPECTED OUTPUT
+test_expect_equal_file EXPECTED OUTPUT.clean
backup_database
test_begin_subtest "override config from \${HOME}/.notmuch-config (ndlc)"
diff --git a/test/test-lib.sh b/test/test-lib.sh
index fc176af8..fa2e401e 100644
--- a/test/test-lib.sh
+++ b/test/test-lib.sh
@@ -694,6 +694,13 @@ notmuch_built_with_sanitize ()
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_dir_sanitize | notmuch_built_with_sanitize