summaryrefslogtreecommitdiff
path: root/plugin/auth_pipe
diff options
context:
space:
mode:
authorVladislav Vaintroub <wlad@mariadb.com>2016-01-27 15:23:42 +0100
committerVladislav Vaintroub <wlad@mariadb.com>2016-01-27 16:34:05 +0100
commit4b31e6dc95c7c008cd318822eb9d5a1e845b288c (patch)
tree30214bff590f8cb3f4de34ac32eb56a70af159ec /plugin/auth_pipe
parentc1bf5ba27ef2ec189fe890283e68dbd9bd2efca9 (diff)
downloadmariadb-git-4b31e6dc95c7c008cd318822eb9d5a1e845b288c.tar.gz
Address review comments, add unit test
Diffstat (limited to 'plugin/auth_pipe')
-rw-r--r--plugin/auth_pipe/CMakeLists.txt18
-rw-r--r--plugin/auth_pipe/auth_pipe.c72
2 files changed, 21 insertions, 69 deletions
diff --git a/plugin/auth_pipe/CMakeLists.txt b/plugin/auth_pipe/CMakeLists.txt
index 0a2eacad264..bbc44d0f5e2 100644
--- a/plugin/auth_pipe/CMakeLists.txt
+++ b/plugin/auth_pipe/CMakeLists.txt
@@ -1,19 +1,3 @@
-# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
-#
-# 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; version 2 of the
-# License.
-#
-# 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
-
IF(WIN32)
- MYSQL_ADD_PLUGIN(auth_pipe auth_pipe.c MODULE_ONLY)
+ MYSQL_ADD_PLUGIN(auth_named_pipe auth_pipe.c)
ENDIF()
diff --git a/plugin/auth_pipe/auth_pipe.c b/plugin/auth_pipe/auth_pipe.c
index 43ae25a9415..20c33c07e84 100644
--- a/plugin/auth_pipe/auth_pipe.c
+++ b/plugin/auth_pipe/auth_pipe.c
@@ -17,44 +17,27 @@
/**
@file
- auth_pipd authentication plugin.
+ auth_pipe authentication plugin.
- Authentication is successful if the connection is done via a named pip and
- the owner of the client process matches the user name that was used when
- connecting to mysqld.
+ Authentication is successful if the connection is done via a named pipe
+ pipe peer name matches mysql user name
*/
-
#include <mysql/plugin_auth.h>
#include <string.h>
#include <lmcons.h>
-
-
-
/**
- perform the named pipeŽbased authentication
-
- This authentication callback performs a named pipe based authentication -
- it gets the uid of the client process and considers the user authenticated
- if it uses username of this uid. That is - if the user is already
- authenticated to the OS (if she is logged in) - she can use MySQL as herself
+ This authentication callback obtains user name using named pipe impersonation
*/
-
static int pipe_auth(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info)
{
unsigned char *pkt;
- PTOKEN_USER pTokenUser= NULL;
- HANDLE hToken;
MYSQL_PLUGIN_VIO_INFO vio_info;
- DWORD dLength= 0;
- int Ret= CR_ERROR;
- TCHAR username[UNLEN + 1];
- DWORD username_length= UNLEN + 1;
- char domainname[DNLEN + 1];
- DWORD domainsize=DNLEN + 1;
- SID_NAME_USE sidnameuse;
+ char username[UNLEN + 1];
+ size_t username_length;
+ int ret;
/* no user name yet ? read the client handshake packet with the user name */
if (info->user_name == 0)
@@ -62,41 +45,26 @@ static int pipe_auth(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info)
if (vio->read_packet(vio, &pkt) < 0)
return CR_ERROR;
}
-
info->password_used= PASSWORD_USED_NO_MENTION;
-
vio->info(vio, &vio_info);
if (vio_info.protocol != MYSQL_VIO_PIPE)
return CR_ERROR;
- /* get the UID of the client process */
+ /* Impersonate the named pipe peer, and retrieve the user name */
if (!ImpersonateNamedPipeClient(vio_info.handle))
return CR_ERROR;
-
- if (!OpenThreadToken(GetCurrentThread(), TOKEN_ALL_ACCESS, TRUE, &hToken))
- goto end;
-
- /* determine length of TokenUser */
- GetTokenInformation(hToken, TokenUser, NULL, 0, &dLength);
- if (!dLength)
- goto end;
-
- if (!(pTokenUser= (PTOKEN_USER)LocalAlloc(0, dLength)))
- goto end;
-
- if (!GetTokenInformation(hToken, TokenUser, (PVOID)pTokenUser, dLength, &dLength))
- goto end;
-
- if (!LookupAccountSid(NULL, pTokenUser->User.Sid, username, &username_length, domainname, &domainsize, &sidnameuse))
- goto end;
- Ret= strcmp(username, info->user_name) ? CR_ERROR : CR_OK;
-end:
- if (pTokenUser)
- LocalFree(pTokenUser);
+ username_length= sizeof(username) - 1;
+ ret= CR_ERROR;
+ if (GetUserName(username, &username_length))
+ {
+ /* Always compare names case-insensitive on Windows.*/
+ if (_stricmp(username, info->user_name) == 0)
+ ret= CR_OK;
+ }
RevertToSelf();
- /* now it's simple as that */
- return Ret;
+
+ return ret;
}
static struct st_mysql_auth pipe_auth_handler=
@@ -106,11 +74,11 @@ static struct st_mysql_auth pipe_auth_handler=
pipe_auth
};
-maria_declare_plugin(socket_auth)
+maria_declare_plugin(auth_named_pipe)
{
MYSQL_AUTHENTICATION_PLUGIN,
&pipe_auth_handler,
- "windows_pipe",
+ "named_pipe",
"Vladislav Vaintroub, Georg Richter",
"Windows named pipe based authentication",
PLUGIN_LICENSE_GPL,