187
189
return PAM_SUCCESS;
192
static struct passwd *fetch_pwd(pam_handle_t *pamh)
195
const char *username = NULL;
196
struct passwd *pwd = NULL;
198
rc = pam_get_user(pamh, &username, NULL);
199
if (rc != PAM_SUCCESS || username == NULL) {
200
syslog(LOG_ERR, "Error getting passwd info for user [%s]; "
201
"rc = [%ld]\n", username, rc);
204
pwd = getpwnam(username);
206
syslog(LOG_ERR, "Error getting passwd info for user [%s]; "
207
"rc = [%ld]\n", username, rc);
213
static int private_dir(pam_handle_t *pamh, int mount)
216
struct passwd *pwd = NULL;
217
char *sigfile = NULL;
223
if ((pwd = fetch_pwd(pamh)) == NULL) {
224
/* fetch_pwd() logged a message */
228
(asprintf(&sigfile, "%s/.ecryptfs/%s.sig", pwd->pw_dir,
229
PRIVATE_DIR) < 0) || sigfile == NULL) {
230
syslog(LOG_ERR, "Error allocating memory for sigfile name");
233
if (stat(sigfile, &s) != 0) {
234
syslog(LOG_ERR, "Error allocating memory for sigfile name");
237
if (!S_ISREG(s.st_mode)) {
238
/* No sigfile, no need to mount private dir */
241
if ((pid = fork()) < 0) {
242
syslog(LOG_ERR, "Error setting up private mount");
247
/* run mount.ecryptfs_private as the user */
248
setresuid(pwd->pw_uid, pwd->pw_uid, pwd->pw_uid);
249
execl("/sbin/mount.ecryptfs_private",
250
"mount.ecryptfs_private", NULL);
252
/* run umount.ecryptfs_private as the user */
253
setresuid(pwd->pw_uid, pwd->pw_uid, pwd->pw_uid);
254
execl("/sbin/umount.ecryptfs_private",
255
"umount.ecryptfs_private", NULL);
261
"Mount of private directory return code [%d]", rc);
268
static int mount_private_dir(pam_handle_t *pamh)
270
return private_dir(pamh, 1);
273
static int umount_private_dir(pam_handle_t *pamh)
275
return private_dir(pamh, 0);
191
279
pam_sm_open_session(pam_handle_t *pamh, int flags,
192
280
int argc, const char *argv[])
282
mount_private_dir(pamh);
194
283
return PAM_SUCCESS;