pwrap: wrap pam_putenv, pam_getenv, pam_getenvlist
authorJakub Hrozek <jakub.hrozek@posteo.se>
Sun, 20 Sep 2015 05:54:03 +0000 (07:54 +0200)
committerAndreas Schneider <asn@samba.org>
Thu, 10 Dec 2015 12:31:18 +0000 (13:31 +0100)
src/pam_wrapper.c
tests/test_pam_wrapper.c

index 04863827b14a2e822b1cddaa6efd61133c146ba7..68c800545e0c8bdb498ea08c83ad198e2cb8e59b 100644 (file)
@@ -154,6 +154,12 @@ typedef int (*__libpam_pam_authenticate)(pam_handle_t *pamh, int flags);
 
 typedef int (*__libpam_pam_acct_mgmt)(pam_handle_t *pamh, int flags);
 
+typedef int (*__libpam_pam_putenv)(pam_handle_t *pamh, const char *name_value);
+
+typedef const char * (*__libpam_pam_getenv)(pam_handle_t *pamh, const char *name);
+
+typedef char ** (*__libpam_pam_getenvlist)(pam_handle_t *pamh);
+
 #define PWRAP_SYMBOL_ENTRY(i) \
        union { \
                __libpam_##i f; \
@@ -165,6 +171,9 @@ struct pwrap_libpam_symbols {
        PWRAP_SYMBOL_ENTRY(pam_end);
        PWRAP_SYMBOL_ENTRY(pam_authenticate);
        PWRAP_SYMBOL_ENTRY(pam_acct_mgmt);
+       PWRAP_SYMBOL_ENTRY(pam_putenv);
+       PWRAP_SYMBOL_ENTRY(pam_getenv);
+       PWRAP_SYMBOL_ENTRY(pam_getenvlist);
 };
 
 struct pwrap {
@@ -303,6 +312,27 @@ static int libpam_pam_acct_mgmt(pam_handle_t *pamh, int flags)
        return pwrap.libpam.symbols._libpam_pam_acct_mgmt.f(pamh, flags);
 }
 
+static int libpam_pam_putenv(pam_handle_t *pamh, const char *name_value)
+{
+       pwrap_bind_symbol_libpam(pam_putenv);
+
+       return pwrap.libpam.symbols._libpam_pam_putenv.f(pamh, name_value);
+}
+
+static const char *libpam_pam_getenv(pam_handle_t *pamh, const char *name)
+{
+       pwrap_bind_symbol_libpam(pam_getenv);
+
+       return pwrap.libpam.symbols._libpam_pam_getenv.f(pamh, name);
+}
+
+static char **libpam_pam_getenvlist(pam_handle_t *pamh)
+{
+       pwrap_bind_symbol_libpam(pam_getenvlist);
+
+       return pwrap.libpam.symbols._libpam_pam_getenvlist.f(pamh);
+}
+
 /*********************************************************
  * PWRAP INIT
  *********************************************************/
@@ -662,6 +692,39 @@ int pam_acct_mgmt(pam_handle_t *pamh, int flags)
        return pwrap_pam_acct_mgmt(pamh, flags);
 }
 
+static int pwrap_pam_putenv(pam_handle_t *pamh, const char *name_value)
+{
+       PWRAP_LOG(PWRAP_LOG_TRACE, "pwrap_putenv name_value=%s", name_value);
+       return libpam_pam_putenv(pamh, name_value);
+}
+
+int pam_putenv(pam_handle_t *pamh, const char *name_value)
+{
+       return pwrap_pam_putenv(pamh, name_value);
+}
+
+static const char *pwrap_pam_getenv(pam_handle_t *pamh, const char *name)
+{
+       PWRAP_LOG(PWRAP_LOG_TRACE, "pwrap_getenv name=%s", name);
+       return libpam_pam_getenv(pamh, name);
+}
+
+const char *pam_getenv(pam_handle_t *pamh, const char *name)
+{
+       return pwrap_pam_getenv(pamh, name);
+}
+
+static char **pwrap_pam_getenvlist(pam_handle_t *pamh)
+{
+       PWRAP_LOG(PWRAP_LOG_TRACE, "pwrap_getenvlist called");
+       return libpam_pam_getenvlist(pamh);
+}
+
+char **pam_getenvlist(pam_handle_t *pamh)
+{
+       return pwrap_pam_getenvlist(pamh);
+}
+
 /****************************
  * DESTRUCTOR
  ***************************/
index 3890dab394d91f9c0b28be87e61ba90369e7570b..64a9d1a0be6fc40eb8a10c145fac21a24dec5f07 100644 (file)
@@ -175,6 +175,66 @@ static void test_pam_acct_err(void **state)
        assert_int_equal(rv, PAM_PERM_DENIED);
 }
 
+static inline void free_vlist(char **vlist)
+{
+       free(vlist[0]);
+       free(vlist[1]);
+       free(vlist);
+}
+
+static void test_pam_env_functions(void **state)
+{
+       int rv;
+       const char *v;
+       char **vlist;
+       struct pwrap_test_ctx *test_ctx;
+
+       test_ctx = (struct pwrap_test_ctx *) *state;
+
+       rv = pam_putenv(test_ctx->ph, "KEY=value");
+       assert_int_equal(rv, PAM_SUCCESS);
+       rv = pam_putenv(test_ctx->ph, "KEY2=value2");
+       assert_int_equal(rv, PAM_SUCCESS);
+
+       v = pam_getenv(test_ctx->ph, "KEY");
+       assert_non_null(v);
+       assert_string_equal(v, "value");
+
+       v = pam_getenv(test_ctx->ph, "KEY2");
+       assert_non_null(v);
+       assert_string_equal(v, "value2");
+
+       vlist = pam_getenvlist(test_ctx->ph);
+       assert_non_null(vlist);
+       assert_non_null(vlist[0]);
+       assert_string_equal(vlist[0], "KEY=value");
+       assert_non_null(vlist[1]);
+       assert_string_equal(vlist[1], "KEY2=value2");
+       assert_null(vlist[2]);
+       free_vlist(vlist);
+
+       rv = pam_putenv(test_ctx->ph, "KEY2=");
+       assert_int_equal(rv, PAM_SUCCESS);
+
+       vlist = pam_getenvlist(test_ctx->ph);
+       assert_non_null(vlist);
+       assert_non_null(vlist[0]);
+       assert_string_equal(vlist[0], "KEY=value");
+       assert_non_null(vlist[1]);
+       assert_string_equal(vlist[1], "KEY2=");
+       assert_null(vlist[2]);
+       free_vlist(vlist);
+
+       rv = pam_putenv(test_ctx->ph, "KEY2");
+       assert_int_equal(rv, PAM_SUCCESS);
+
+       vlist = pam_getenvlist(test_ctx->ph);
+       assert_non_null(vlist);
+       assert_non_null(vlist[0]);
+       assert_string_equal(vlist[0], "KEY=value");
+       assert_null(vlist[1]);
+       free_vlist(vlist);
+}
 
 int main(void) {
        int rc;
@@ -195,6 +255,9 @@ int main(void) {
                cmocka_unit_test_setup_teardown(test_pam_acct_err,
                                                setup_simple,
                                                teardown),
+               cmocka_unit_test_setup_teardown(test_pam_env_functions,
+                                               setup,
+                                               teardown),
        };
 
        rc = cmocka_run_group_tests(init_tests, NULL, NULL);