mirror of
https://github.com/postgres/postgres.git
synced 2025-11-07 19:06:32 +03:00
Add BSD authentication method.
Create a "bsd" auth method that works the same as "password" so far as clients are concerned, but calls the BSD Authentication service to check the password. This is currently only available on OpenBSD. Marisa Emerson, reviewed by Thomas Munro
This commit is contained in:
@@ -88,6 +88,17 @@ static Port *pam_port_cludge; /* Workaround for passing "Port *port" into
|
||||
#endif /* USE_PAM */
|
||||
|
||||
|
||||
/*----------------------------------------------------------------
|
||||
* BSD authentication
|
||||
*----------------------------------------------------------------
|
||||
*/
|
||||
#ifdef USE_BSD_AUTH
|
||||
#include <bsd_auth.h>
|
||||
|
||||
static int CheckBSDAuth(Port *port, char *user);
|
||||
#endif /* USE_BSD_AUTH */
|
||||
|
||||
|
||||
/*----------------------------------------------------------------
|
||||
* LDAP authentication
|
||||
*----------------------------------------------------------------
|
||||
@@ -258,6 +269,9 @@ auth_failed(Port *port, int status, char *logdetail)
|
||||
case uaPAM:
|
||||
errstr = gettext_noop("PAM authentication failed for user \"%s\"");
|
||||
break;
|
||||
case uaBSD:
|
||||
errstr = gettext_noop("BSD authentication failed for user \"%s\"");
|
||||
break;
|
||||
case uaLDAP:
|
||||
errstr = gettext_noop("LDAP authentication failed for user \"%s\"");
|
||||
break;
|
||||
@@ -529,6 +543,14 @@ ClientAuthentication(Port *port)
|
||||
#endif /* USE_PAM */
|
||||
break;
|
||||
|
||||
case uaBSD:
|
||||
#ifdef USE_BSD_AUTH
|
||||
status = CheckBSDAuth(port, port->user_name);
|
||||
#else
|
||||
Assert(false);
|
||||
#endif /* USE_BSD_AUTH */
|
||||
break;
|
||||
|
||||
case uaLDAP:
|
||||
#ifdef USE_LDAP
|
||||
status = CheckLDAPAuth(port);
|
||||
@@ -1856,6 +1878,38 @@ CheckPAMAuth(Port *port, char *user, char *password)
|
||||
#endif /* USE_PAM */
|
||||
|
||||
|
||||
/*----------------------------------------------------------------
|
||||
* BSD authentication system
|
||||
*----------------------------------------------------------------
|
||||
*/
|
||||
#ifdef USE_BSD_AUTH
|
||||
static int
|
||||
CheckBSDAuth(Port *port, char *user)
|
||||
{
|
||||
char *passwd;
|
||||
int retval;
|
||||
|
||||
/* Send regular password request to client, and get the response */
|
||||
sendAuthRequest(port, AUTH_REQ_PASSWORD);
|
||||
|
||||
passwd = recv_password_packet(port);
|
||||
if (passwd == NULL)
|
||||
return STATUS_EOF;
|
||||
|
||||
/*
|
||||
* Ask the BSD auth system to verify password. Note that auth_userokay
|
||||
* will overwrite the password string with zeroes, but it's just a
|
||||
* temporary string so we don't care.
|
||||
*/
|
||||
retval = auth_userokay(user, NULL, "auth-postgresql", passwd);
|
||||
|
||||
if (!retval)
|
||||
return STATUS_ERROR;
|
||||
|
||||
return STATUS_OK;
|
||||
}
|
||||
#endif /* USE_BSD_AUTH */
|
||||
|
||||
|
||||
/*----------------------------------------------------------------
|
||||
* LDAP authentication system
|
||||
|
||||
Reference in New Issue
Block a user