-
-
Notifications
You must be signed in to change notification settings - Fork 39
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
By the term "prompt-driven" I mean two-way conversation between the screensaver dialog and the PAM stack. As you probably know, PAM works by conversation with a dialog program asking the user to enter something in answer to each message it sends. In the most conventional case, the only question is "Password:" and the password is the only data the user enters. But in general, the number of questions and messages are not limited to that. The previous support of PAM helper (gs-auth-helper.c) was written and worked for the mentioned "only password" authentication scheme. For other schemes it wasn't enough. New implementation fixes that limitation. Same as the previous version of gs-auth-helper.c, the new version uses pipe interface for interprocess communication and synchronization. However, unlike the previous version, new version uses two pipes instead of a single pipe: the first one is used to transfer prompt text from PAM via the helper to the screensaver dialog, and the second one is used to transfer the user input from the dialog to helper (and then the helper replies with it back to PAM). Having that bidirectional prompt/reply channel it is possible to make as many prompt/reply passes as required by PAM. The present helper program (see the helper/ dir) is based on the helper written by okir@suse.de, which is in turn loosely based on unix_chkpwd by Andrew Morgan. All new code is untabified under the assumption the tab width is 8. Signed-off-by: Paul Wolneykien <manowar@altlinux.org>
- Loading branch information
1 parent
a2a2826
commit ed6e606
Showing
10 changed files
with
733 additions
and
135 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
## We require new-style dependency handling. | ||
AUTOMAKE_OPTIONS = 1.7 | ||
|
||
noinst_LIBRARIES = libhelper-proto.a | ||
|
||
libhelper_proto_a_CFLAGS = \ | ||
$(PAM_HELPER_CFLAGS) \ | ||
-I$(top_srcdir)/src | ||
|
||
libhelper_proto_a_SOURCES = \ | ||
helper_proto.h \ | ||
helper_proto.c | ||
|
||
pkglibexec_PROGRAMS = mate-screensaver-pam-helper | ||
|
||
mate_screensaver_pam_helper_CFLAGS = \ | ||
$(PAM_HELPER_CFLAGS) \ | ||
-I$(top_srcdir)/src | ||
|
||
mate_screensaver_pam_helper_SOURCES = \ | ||
pam-helper.c | ||
|
||
mate_screensaver_pam_helper_LDADD = \ | ||
libhelper-proto.a | ||
|
||
mate_screensaver_pam_helper_LDFLAGS = \ | ||
$(AUTH_LIBS) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,167 @@ | ||
/* Part of mate-screensaver. | ||
* | ||
* Copyright (c) 2019-2021 Paul Wolneykien <manowar@altlinux.org> | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License as | ||
* published by the Free Software Foundation; either version 2 of the | ||
* License, or (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, but | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
* 02110-1301, USA. | ||
*/ | ||
|
||
/* Provides functions for two-way communication between the screensaver | ||
* and the helper program. The idea of helper program is to be able to | ||
* run mate-screensaver-dialog without any setuid bits. | ||
*/ | ||
|
||
#include "config.h" | ||
|
||
#include <stdlib.h> | ||
#ifdef HAVE_UNISTD_H | ||
# include <unistd.h> | ||
#endif | ||
|
||
#include "helper_proto.h" | ||
|
||
static ssize_t | ||
read_all (int fd, void *buf, size_t count) | ||
{ | ||
ssize_t rd, t_rd = 0; | ||
|
||
if (0 == count) | ||
return 0; | ||
|
||
while (t_rd < count) | ||
{ | ||
rd = read (fd, buf + t_rd, count - t_rd); | ||
if (0 == rd) | ||
break; | ||
if (rd < 0) | ||
return rd; | ||
t_rd += rd; | ||
} | ||
|
||
return t_rd; | ||
} | ||
|
||
ssize_t | ||
read_msg (int fd, char *buf, size_t length) | ||
{ | ||
size_t msg_len; | ||
ssize_t rd; | ||
|
||
rd = read_all (fd, &msg_len, sizeof msg_len); | ||
if (rd < 0) | ||
return HELPER_IO_ERR; | ||
if (rd > 0 && rd != sizeof msg_len) | ||
return HELPER_LENGTH_READ_ERR; | ||
|
||
if (msg_len >= length) | ||
return HELPER_TOO_LONG_ERR; | ||
|
||
if (msg_len > 0) | ||
{ | ||
rd = read_all (fd, buf, msg_len); | ||
if (rd < 0) | ||
return HELPER_IO_ERR; | ||
if (rd != msg_len) | ||
return HELPER_MSG_READ_ERR; | ||
} | ||
else | ||
rd = 0; | ||
buf[rd] = '\0'; | ||
|
||
return rd; | ||
} | ||
|
||
int | ||
read_prompt (int fd, char *buf, size_t *length) | ||
{ | ||
int msg_type, rd; | ||
|
||
rd = read_all (fd, &msg_type, sizeof msg_type); | ||
if (0 == rd) | ||
return 0; | ||
if (rd < 0) | ||
return HELPER_IO_ERR; | ||
if (rd > 0 && rd != sizeof msg_type) | ||
return HELPER_TYPE_READ_ERR; | ||
|
||
rd = read_msg (fd, buf, *length); | ||
if (rd < 0) | ||
return rd; | ||
|
||
*length = rd; | ||
return msg_type; | ||
} | ||
|
||
static ssize_t | ||
write_all (int fd, const void *buf, size_t count) | ||
{ | ||
ssize_t wt, t_wt = 0; | ||
|
||
if (0 == count) | ||
return 0; | ||
|
||
while (t_wt < count) | ||
{ | ||
wt = write (fd, buf + t_wt, count - t_wt); | ||
if (0 == wt) | ||
break; | ||
if (wt < 0) | ||
return wt; | ||
t_wt += wt; | ||
} | ||
|
||
return t_wt; | ||
} | ||
|
||
ssize_t | ||
write_msg (int fd, const void *buf, size_t length) | ||
{ | ||
ssize_t wt; | ||
|
||
wt = write_all (fd, &length, sizeof length); | ||
if (wt < 0) | ||
return HELPER_IO_ERR; | ||
if (wt > 0 && wt != sizeof length) | ||
return HELPER_LENGTH_WRITE_ERR; | ||
|
||
if (length > 0) | ||
{ | ||
wt = write_all (fd, buf, length); | ||
if (wt < 0) | ||
return HELPER_IO_ERR; | ||
if (wt != length) | ||
return HELPER_MSG_WRITE_ERR; | ||
} | ||
else | ||
wt = 0; | ||
|
||
return wt; | ||
} | ||
|
||
int | ||
write_prompt (int fd, int msg_type, const void *buf, size_t length) | ||
{ | ||
ssize_t wt; | ||
|
||
wt = write_all (fd, &msg_type, sizeof msg_type); | ||
if (wt < 0) | ||
return HELPER_IO_ERR; | ||
if (wt > 0 && wt != sizeof msg_type) | ||
return HELPER_TYPE_WRITE_ERR; | ||
|
||
wt = write_msg (fd, buf, length); | ||
|
||
return wt; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
/* Part of mate-screensaver. | ||
* | ||
* Copyright (c) 2019-2021 Paul Wolneykien <manowar@altlinux.org> | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License as | ||
* published by the Free Software Foundation; either version 2 of the | ||
* License, or (at your option) any later version. | ||
* | ||
* This program is distributed in the hope that it will be useful, but | ||
* WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
* 02110-1301, USA. | ||
*/ | ||
|
||
/* Provides functions for two-way communication between the screensaver | ||
* and the helper program. The idea of helper program is to be able to | ||
* run mate-screensaver-dialog without any setuid bits. | ||
*/ | ||
|
||
#ifndef __HELPER_PROTO_H | ||
#define __HELPER_PROTO_H | ||
|
||
#include "config.h" | ||
|
||
#include <stdlib.h> | ||
#ifdef HAVE_UNISTD_H | ||
# include <unistd.h> | ||
#endif | ||
|
||
#define HELPER_IO_ERR -1 | ||
|
||
#define HELPER_LENGTH_READ_ERR -2 | ||
#define HELPER_TOO_LONG_ERR -3 | ||
#define HELPER_MSG_READ_ERR -4 | ||
#define HELPER_TYPE_READ_ERR -5 | ||
|
||
ssize_t read_msg (int fd, char *buf, size_t length); | ||
int read_prompt (int fd, char *buf, size_t *length); | ||
|
||
#define HELPER_LENGTH_WRITE_ERR -6 | ||
#define HELPER_MSG_WRITE_ERR -7 | ||
#define HELPER_TYPE_WRITE_ERR -8 | ||
|
||
ssize_t write_msg (int fd, const void *buf, size_t length); | ||
int write_prompt (int fd, int msg_type, const void *buf, size_t length); | ||
|
||
#endif /* __HELPER_PROTO_H */ |
Oops, something went wrong.