2009-05-16 Moritz <moritz@gnu.org>
authorMoritz Schulte <mo@g10code.com>
Sat, 16 May 2009 18:16:32 +0000 (18:16 +0000)
committerMoritz Schulte <mo@g10code.com>
Sat, 16 May 2009 18:16:32 +0000 (18:16 +0000)
* scd.h (struct scd_cardinfo): New member: disp_lang.
* scd.c (learn_status_cb): Handle DISP-LANG.

2009-05-16  Moritz  <moritz@gnu.org>

* pam_poldi.c (enum opt_ids, opt_specs, pam_poldi_options_cb):
Implement new option "modify-environment".
(modify_environment_putenv, modify_environment): New functions.
(pam_sm_authenticate): Call modify_environment() if
ctx->modify_environment is true.

2009-05-16  Moritz  <moritz@gnu.org>

* ctx.h (struct poldi_ctx_s): New member: modify_environment.

2009-05-16  Moritz  <moritz@gnu.org>

* poldi.texi (XScreensaver): Added note for GNOME Screensaver.

doc/ChangeLog
doc/poldi.texi
src/pam/ChangeLog
src/pam/auth-support/ChangeLog
src/pam/auth-support/ctx.h
src/pam/pam_poldi.c
src/scd/ChangeLog
src/scd/scd.c
src/scd/scd.h

index 9c0b854..c264f9a 100644 (file)
@@ -1,3 +1,7 @@
+2009-05-16  Moritz  <moritz@gnu.org>
+
+       * poldi.texi (XScreensaver): Added note for GNOME Screensaver.
+
 2009-04-08  Marcus Brinkmann  <marcus@g10code.de>
 
        * poldi.texi (Notes on Applications): Fix section menu.
index 53bb152..bc76455 100644 (file)
@@ -607,6 +607,9 @@ works quiet well with Poldi authentication.  By combining SCDaemons
 can easily setup an environment in which the card-removal event triggers
 screen locking and the card-insertion event triggers screen unlocking.
 
+Note that this also applies to GNOME Screensaver; one only needs to use
+the gnome-screensaver-command program instead of xscreensaver-command.
+
 @node xdm
 @section xdm
 
index 1c57ce6..252086e 100644 (file)
@@ -1,3 +1,11 @@
+2009-05-16  Moritz  <moritz@gnu.org>
+
+       * pam_poldi.c (enum opt_ids, opt_specs, pam_poldi_options_cb):
+       Implement new option "modify-environment".
+       (modify_environment_putenv, modify_environment): New functions.
+       (pam_sm_authenticate): Call modify_environment() if
+       ctx->modify_environment is true.
+
 2009-02-16  Moritz  <moritz@gnu.org>
 
        * pam_poldi.c (pam_sm_authenticate): Include name of the file that
index a1a64f8..1cecb2e 100644 (file)
@@ -1,3 +1,7 @@
+2009-05-16  Moritz  <moritz@gnu.org>
+
+       * ctx.h (struct poldi_ctx_s): New member: modify_environment.
+
 2009-01-17  Moritz  <moritz@gnu.org>
 
        * ctx.h (struct poldi_ctx_s): New struct member: quiet.
index dfc8387..03c9ade 100644 (file)
@@ -63,7 +63,8 @@ struct poldi_ctx_s
   int debug;                   /* Debug flag.  If true, functions
                                   should emmit debugging
                                   messages.  */
-
+  int modify_environment;      /* Set Poldi-related variables in the
+                                  PAM environment.  */
   int quiet;                   /* Be more quiet during PAM
                                   conversation with user. */
 
index 1cec968..7822861 100644 (file)
@@ -29,6 +29,7 @@
 
 #define PAM_SM_AUTH
 #include <security/pam_modules.h>
+#include <security/pam_appl.h>
 
 #include "util/simplelog.h"
 #include "util/simpleparse.h"
@@ -81,6 +82,7 @@ enum opt_ids
     opt_auth_method,
     opt_debug,
     opt_scdaemon_program,
+    opt_modify_environment,
     opt_quiet
   };
 
@@ -95,6 +97,8 @@ static simpleparse_opt_spec_t opt_specs[] =
       0, SIMPLEPARSE_ARG_NONE,     0, "Enable debugging mode" },
     { opt_scdaemon_program, "scdaemon-program",
       0, SIMPLEPARSE_ARG_REQUIRED, 0, "Specify scdaemon executable to use" },
+    { opt_modify_environment, "modify-environment",
+      0, SIMPLEPARSE_ARG_NONE, 0, "Set Poldi related variables in the PAM environment" },
     { opt_quiet, "quiet",
       0, SIMPLEPARSE_ARG_NONE, 0, "Be more quiet during PAM conversation with user" },
     { 0 }
@@ -171,6 +175,11 @@ pam_poldi_options_cb (void *cookie, simpleparse_opt_spec_t spec, const char *arg
       ctx->debug = 1;
       log_set_min_level (ctx->loghandle, LOG_LEVEL_DEBUG);
     }
+  else if (!strcmp (spec.long_opt, "modify-environment"))
+    {
+      /* MODIFY-ENVIRONMENT.  */
+      ctx->modify_environment = 1;
+    }
   else if (!strcmp (spec.long_opt, "quiet"))
     {
       /* QUIET.  */
@@ -267,6 +276,57 @@ destroy_context (poldi_ctx_t ctx)
 \f
 
 /*
+ * Environment setting.
+ */
+
+static void
+modify_environment_putenv (pam_handle_t *pam_handle, poldi_ctx_t ctx,
+                          const char *name, const char *value)
+{
+  char *str;
+  int ret;
+
+  str = NULL;
+  ret = asprintf (&str, "%s=%s", name, value);
+  if (ret < 0)
+    {
+      log_msg_error (ctx->loghandle,
+                    _("asprintf() failed in modify_environment_putenv(): %s"),
+                    errno);
+      return;
+    }
+
+  ret = pam_putenv (pam_handle, str);
+  if (ret != PAM_SUCCESS)
+    {
+      log_msg_error (ctx->loghandle,
+                    _("pam_putenv() failed in modify_environment_putenv(): %s"),
+                    pam_strerror (pam_handle, ret));
+    }
+  free (str);
+}
+
+static void
+modify_environment (pam_handle_t *pam_handle, poldi_ctx_t ctx)
+{
+  struct scd_cardinfo *cardinfo;
+
+  assert (pam_handle);
+  assert (ctx);
+
+  cardinfo = &ctx->cardinfo;
+
+  modify_environment_putenv (pam_handle, ctx,
+                            "PAM_POLDI_AUTHENTICATED", "");
+  modify_environment_putenv (pam_handle, ctx,
+                            "PAM_POLDI_SERIALNO", cardinfo->serialno);
+  modify_environment_putenv (pam_handle, ctx,
+                            "PAM_POLDI_LANGUAGE", cardinfo->disp_lang);
+}
+
+\f
+
+/*
  * PAM interface.
  */
 
@@ -556,8 +616,13 @@ pam_sm_authenticate (pam_handle_t *pam_handle,
   /* Log result.  */
   if (err)
     log_msg_error (ctx->loghandle, _("authentication failed: %s"), gpg_strerror (err));
-  else if (ctx->debug)
-    log_msg_debug (ctx->loghandle, _("authentication succeeded"));
+  else
+    {
+      if (ctx->debug)
+       log_msg_debug (ctx->loghandle, _("authentication succeeded"));
+      if (ctx->modify_environment)
+       modify_environment (pam_handle, ctx);
+    }
 
   /* Call authentication method's deinit callback. */
   if ((ctx->auth_method >= 0)
@@ -578,7 +643,6 @@ PAM_EXTERN int
 pam_sm_setcred (pam_handle_t *pam_handle,
                int flags, int argc, const char **argv)
 {
-  /* FIXME: do we need this?  -mo */
   return PAM_SUCCESS;
 }
 
index 6e4f61b..e2c54bd 100644 (file)
@@ -1,3 +1,8 @@
+2009-05-16  Moritz  <moritz@gnu.org>
+
+       * scd.h (struct scd_cardinfo): New member: disp_lang.
+       * scd.c (learn_status_cb): Handle DISP-LANG.
+
 2008-08-08  Moritz  <moritz@gnu.org>
 
        * scd.c (scd_serialno): Removed debugging message.
index e275fbb..903114e 100644 (file)
@@ -1,6 +1,6 @@
 /* scd.c - Interface to Scdaemon
    Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc.
-   Copyright (C) 2007, 2008 g10code GmbH. 
+   Copyright (C) 2007, 2008, 2009 g10code GmbH. 
 
    This file is part of Poldi.
  
@@ -534,6 +534,11 @@ learn_status_cb (void *opaque, const char *line)
       xfree (parm->disp_name);
       parm->disp_name = unescape_status_string (line);
     }
+  else if (keywordlen == 9 && !memcmp (keyword, "DISP-LANG", keywordlen))
+    {
+      xfree (parm->disp_lang);
+      parm->disp_lang = unescape_status_string (line);
+    }
   else if (keywordlen == 10 && !memcmp (keyword, "PUBKEY-URL", keywordlen))
     {
       xfree (parm->pubkey_url);
index 0d5c8a9..0b06839 100644 (file)
@@ -1,5 +1,5 @@
 /* scd.h - Interface to Scdaemon
-   Copyright (C) 2007, 2008 g10code GmbH. 
+   Copyright (C) 2007, 2008, 2009 g10code GmbH. 
 
    This file is part of Poldi.
  
@@ -34,6 +34,7 @@ struct scd_cardinfo
   char *disp_name;   /* malloced. */
   char *pubkey_url;  /* malloced. */
   char *login_data;  /* malloced. */
+  char *disp_lang;   /* malloced. */
   char fpr1valid;
   char fpr2valid;
   char fpr3valid;