Initial release of the Cygwin subauthentication DLL.
* ChangeLog: New file. * Makefile.in: Ditto. * configure: Ditto. Generated from configure.in. * configure.in: Ditto. * cygsuba.c: Ditto. * cygsuba.din: Ditto.
This commit is contained in:
parent
3c1fb7ac9d
commit
af16358f88
|
@ -0,0 +1,9 @@
|
|||
Fri May 4 15:06:00 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
Initial release of the Cygwin subauthentication DLL.
|
||||
* ChangeLog: New file.
|
||||
* Makefile.in: Ditto.
|
||||
* configure: Ditto. Generated from configure.in.
|
||||
* configure.in: Ditto.
|
||||
* cygsuba.c: Ditto.
|
||||
* cygsuba.din: Ditto.
|
|
@ -0,0 +1,89 @@
|
|||
# Copyright (c) 2001, Red Hat, Inc.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# A copy of the GNU General Public License can be found at
|
||||
# http://www.gnu.org/
|
||||
#
|
||||
# Written by Corinna Vinschen <vinschen@redhat.de>
|
||||
#
|
||||
# Makefile for Cygwin subauthentication DLL.
|
||||
|
||||
SHELL := @SHELL@
|
||||
|
||||
srcdir := @srcdir@
|
||||
VPATH := @srcdir@
|
||||
prefix := @prefix@
|
||||
exec_prefix := @exec_prefix@
|
||||
|
||||
bindir := @bindir@
|
||||
etcdir := $(exec_prefix)/etc
|
||||
|
||||
program_transform_name := @program_transform_name@
|
||||
|
||||
INSTALL := @INSTALL@
|
||||
INSTALL_PROGRAM := @INSTALL_PROGRAM@
|
||||
INSTALL_DATA := @INSTALL_DATA@
|
||||
|
||||
CC := @CC@
|
||||
CC_FOR_TARGET := $(CC)
|
||||
|
||||
CFLAGS := @CFLAGS@ -nostdinc
|
||||
|
||||
include $(srcdir)/../Makefile.common
|
||||
|
||||
WIN32_COMMON := -mno-cygwin
|
||||
WIN32_INCLUDES := -I. -I$(srcdir) -I$(w32api_include)
|
||||
WIN32_CFLAGS := $(CFLAGS) $(WIN32_COMMON) $(WIN32_INCLUDES)
|
||||
WIN32_LDFLAGS := $(CFLAGS) $(WIN32_COMMON) -L$(mingw_build) -nostdlib -Wl,-shared
|
||||
|
||||
STARTFILE := $(mingw_build)/dllcrt2.o
|
||||
LIBS := -lmingw32 -lkernel32
|
||||
|
||||
DLL := cygsuba.dll
|
||||
DEF_FILE:= cygsuba.def
|
||||
|
||||
OBJ = cygsuba.o
|
||||
|
||||
.SUFFIXES:
|
||||
.NOEXPORT:
|
||||
|
||||
all: Makefile $(DLL)
|
||||
|
||||
$(DEF_FILE): cygsuba.din config.status
|
||||
$(SHELL) config.status
|
||||
|
||||
$(DLL): $(OBJ) $(DEF_FILE)
|
||||
ifdef VERBOSE
|
||||
$(CC) -s $(WIN32_LDFLAGS) -o $@ $(DEF_FILE) $(STARTFILE) $(OBJ) $(LIBS)
|
||||
else
|
||||
@echo $(CC) .. -o $@ $(OBJ)
|
||||
@$(CC) -s $(WIN32_LDFLAGS) -o $@ $(DEF_FILE) $(STARTFILE) $(OBJ) $(LIBS)
|
||||
endif
|
||||
|
||||
.PHONY: all install clean realclean
|
||||
|
||||
realclean: clean
|
||||
rm -f Makefile config.cache
|
||||
|
||||
clean:
|
||||
rm *.o *.dll
|
||||
|
||||
install: all
|
||||
$(SHELL) $(updir1)/mkinstalldirs $(bindir)
|
||||
for i in $(PROGS) ; do \
|
||||
n=`echo $$i | sed '$(program_transform_name)'`; \
|
||||
$(INSTALL_PROGRAM) $$i $(bindir)/$$n; \
|
||||
done
|
||||
|
||||
%.o: %.c
|
||||
ifdef VERBOSE
|
||||
$(CC) $(WIN32_CFLAGS) -c -o $@ $<
|
||||
else
|
||||
@echo $(CC) -c $(CFLAGS) ... $(<F)
|
||||
@$(CC) $(WIN32_CFLAGS) -c -o $@ $<
|
||||
endif
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,91 @@
|
|||
dnl Copyright (c) 2001, Red Hat, Inc.
|
||||
dnl
|
||||
dnl This program is free software; you can redistribute it and/or modify
|
||||
dnl it under the terms of the GNU General Public License as published by
|
||||
dnl the Free Software Foundation; either version 2 of the License, or
|
||||
dnl (at your option) any later version.
|
||||
dnl
|
||||
dnl A copy of the GNU General Public License can be found at
|
||||
dnl http://www.gnu.org/
|
||||
dnl
|
||||
dnl Written by Christopher Faylor <cgf@redhat.com>
|
||||
dnl Changed for subauth subdir by Corinna Vinschen <vinschen@redhat.com>
|
||||
|
||||
dnl Autoconf configure script for Cygwin utilities.
|
||||
dnl
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ(2.12)
|
||||
|
||||
AC_INIT(Makefile.in)
|
||||
|
||||
dnl FIXME: We temporarily define our own version of AC_PROG_CC. This is
|
||||
dnl copied from autoconf 2.12, but does not call AC_PROG_CC_WORKS. We
|
||||
dnl are probably using a cross compiler, which will not be able to fully
|
||||
dnl link an executable. This should really be fixed in autoconf
|
||||
dnl itself.
|
||||
|
||||
AC_DEFUN(LIB_AC_PROG_CC,
|
||||
[AC_BEFORE([$0], [AC_PROG_CPP])dnl
|
||||
AC_CHECK_PROG(CC, gcc, gcc)
|
||||
if test -z "$CC"; then
|
||||
AC_CHECK_PROG(CC, cc, cc, , , /usr/ucb/cc)
|
||||
test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
|
||||
fi
|
||||
|
||||
AC_PROG_CC_GNU
|
||||
|
||||
if test $ac_cv_prog_gcc = yes; then
|
||||
GCC=yes
|
||||
dnl Check whether -g works, even if CFLAGS is set, in case the package
|
||||
dnl plays around with CFLAGS (such as to build both debugging and
|
||||
dnl normal versions of a library), tasteless as that idea is.
|
||||
ac_test_CFLAGS="${CFLAGS+set}"
|
||||
ac_save_CFLAGS="$CFLAGS"
|
||||
CFLAGS=
|
||||
AC_PROG_CC_G
|
||||
if test "$ac_test_CFLAGS" = set; then
|
||||
CFLAGS="$ac_save_CFLAGS"
|
||||
elif test $ac_cv_prog_cc_g = yes; then
|
||||
CFLAGS="-g -O2"
|
||||
else
|
||||
CFLAGS="-O2"
|
||||
fi
|
||||
else
|
||||
GCC=
|
||||
test "${CFLAGS+set}" = set || CFLAGS="-g"
|
||||
fi
|
||||
])
|
||||
|
||||
AC_DEFUN(LIB_AC_PROG_CXX,
|
||||
[AC_BEFORE([$0], [AC_PROG_CPP])dnl
|
||||
AC_CHECK_TOOL(CXX, g++, g++)
|
||||
if test -z "$CXX"; then
|
||||
AC_CHECK_PROG(CXX, c++, c++, , , )
|
||||
test -z "$CC" && AC_MSG_ERROR([no acceptable cc found in \$PATH])
|
||||
fi
|
||||
|
||||
CXXFLAGS='$(CFLAGS)'
|
||||
])
|
||||
|
||||
AC_CANONICAL_SYSTEM
|
||||
|
||||
LIB_AC_PROG_CC
|
||||
LIB_AC_PROG_CXX
|
||||
|
||||
AC_ARG_PROGRAM
|
||||
|
||||
if test "x$cross_compiling" = "xyes"; then
|
||||
if test "x$program_transform_name" = "xs,x,x,"; then
|
||||
program_transform_name=""
|
||||
fi
|
||||
if test "x$program_transform_name" = "x"; then
|
||||
program_transform_name="s,^,$host-,"
|
||||
else
|
||||
program_transform_name="$program_transform_name -e s,^,$host-,"
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_PROG_INSTALL
|
||||
|
||||
AC_OUTPUT(Makefile cygsuba.def:cygsuba.din)
|
|
@ -0,0 +1,141 @@
|
|||
/* cygsuba.c: Minimal subauthentication functionality to support
|
||||
logon without password.
|
||||
|
||||
Copyright 2001 Red Hat, Inc.
|
||||
|
||||
Written by Corinna Vinschen <vinschen@redhat.com>
|
||||
|
||||
This file is part of Cygwin.
|
||||
|
||||
This software is a copyrighted work licensed under the terms of the
|
||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||
details. */
|
||||
|
||||
#include <windows.h>
|
||||
#include <subauth.h>
|
||||
#include <ntsecapi.h>
|
||||
|
||||
NTSTATUS NTAPI
|
||||
Msv1_0SubAuthenticationRoutine (NETLOGON_LOGON_INFO_CLASS logon_level,
|
||||
VOID *logon_inf,
|
||||
ULONG flags,
|
||||
USER_ALL_INFORMATION *usr_inf,
|
||||
ULONG *which,
|
||||
ULONG *usr_flags,
|
||||
BOOLEAN *auth,
|
||||
LARGE_INTEGER *logoff,
|
||||
LARGE_INTEGER *kickoff)
|
||||
{
|
||||
ULONG valid_account = USER_NORMAL_ACCOUNT;
|
||||
if (!(flags & MSV1_0_PASSTHRU))
|
||||
valid_account |= USER_TEMP_DUPLICATE_ACCOUNT;
|
||||
|
||||
*which = *usr_flags = 0;
|
||||
|
||||
/* Not a Network logon?
|
||||
TODO: How do I manage an interactive logon using a subauthentication
|
||||
package??? The logon_level "interactive" is available but I never
|
||||
got it working. I assume that's the reason I don't get a legal
|
||||
logon session so that I can connect to network drives. */
|
||||
if (logon_level != NetlogonNetworkInformation)
|
||||
{
|
||||
*auth = TRUE;
|
||||
return STATUS_INVALID_INFO_CLASS;
|
||||
}
|
||||
|
||||
/* Account type ok? */
|
||||
if (!(usr_inf->UserAccountControl & valid_account))
|
||||
{
|
||||
*auth = FALSE;
|
||||
return STATUS_NO_SUCH_USER;
|
||||
}
|
||||
|
||||
/* Guest logon? */
|
||||
if (flags & MSV1_0_GUEST_LOGON)
|
||||
*usr_flags = LOGON_GUEST;
|
||||
|
||||
#if defined (SSHD)
|
||||
/* The same code could be used to allow the DLL checking for
|
||||
SSH RSA/DSA keys. For that purpose, SSH would need it's
|
||||
own implementation with the below field used to transport
|
||||
the keys which have to be checked. This could be used to
|
||||
allow secure logon with RSA/DSA instead of passwords.
|
||||
Of course that needs lots of additions to the code... */
|
||||
{
|
||||
PNETLOGON_NETWORK_INFO nw_inf = (PNETLOGON_NETWORK_INFO) logon_inf;
|
||||
|
||||
/*
|
||||
nw_inf->LmChallenge.data <=>
|
||||
MSV1_0_LM20_LOGON::ChallengeToClient
|
||||
nw_inf->NtChallengeResponse <=>
|
||||
MSV1_0_LM20_LOGON::CaseSensitiveChallengeResponse
|
||||
nw_inf->LmChallengeResponse <=>
|
||||
MSV1_0_LM20_LOGON::CaseInsensitiveChallengeResponse
|
||||
*/
|
||||
if (authentication_failed)
|
||||
{
|
||||
*auth = (usr_inf->UserAccountControl & USER_ACCOUNT_DISABLED) ?
|
||||
FALSE : TRUE;
|
||||
return STATUS_WRONG_PASSWORD;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* All accounts except for the local admin are checked for being
|
||||
locked out or disabled or expired. */
|
||||
if (usr_inf->UserId != DOMAIN_USER_RID_ADMIN)
|
||||
{
|
||||
SYSTEMTIME CurrentTime;
|
||||
LARGE_INTEGER LogonTime;
|
||||
|
||||
/* Account locked out? */
|
||||
if (usr_inf->UserAccountControl & USER_ACCOUNT_AUTO_LOCKED)
|
||||
{
|
||||
*auth = (usr_inf->UserAccountControl & USER_ACCOUNT_DISABLED) ?
|
||||
FALSE : TRUE;
|
||||
return STATUS_ACCOUNT_LOCKED_OUT;
|
||||
}
|
||||
|
||||
/* Account disabled? */
|
||||
if (usr_inf->UserAccountControl & USER_ACCOUNT_DISABLED)
|
||||
{
|
||||
*auth = FALSE;
|
||||
return STATUS_ACCOUNT_DISABLED;
|
||||
}
|
||||
|
||||
/* Account expired? */
|
||||
GetSystemTime (&CurrentTime);
|
||||
SystemTimeToFileTime(&CurrentTime, (LPFILETIME) &LogonTime);
|
||||
if (usr_inf->AccountExpires.QuadPart &&
|
||||
LogonTime.QuadPart >= usr_inf->AccountExpires.QuadPart)
|
||||
{
|
||||
*auth = TRUE;
|
||||
return STATUS_ACCOUNT_EXPIRED;
|
||||
}
|
||||
}
|
||||
|
||||
/* Don't force logout. */
|
||||
logoff->HighPart = 0x7FFFFFFF;
|
||||
logoff->LowPart = 0xFFFFFFFF;
|
||||
kickoff->HighPart = 0x7FFFFFFF;
|
||||
kickoff->LowPart = 0xFFFFFFFF;
|
||||
|
||||
*auth = TRUE;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
NTSTATUS NTAPI
|
||||
Msv1_0SubAuthenticationFilter (NETLOGON_LOGON_INFO_CLASS logon_level,
|
||||
VOID *logon_inf,
|
||||
ULONG flags,
|
||||
USER_ALL_INFORMATION *usr_inf,
|
||||
ULONG *which,
|
||||
ULONG *usr_flags,
|
||||
BOOLEAN *auth,
|
||||
LARGE_INTEGER *logoff,
|
||||
LARGE_INTEGER *kickoff)
|
||||
{
|
||||
return Msv1_0SubAuthenticationRoutine (logon_level, logon_inf, flags,
|
||||
usr_inf, which, usr_flags,
|
||||
auth, logoff, kickoff);
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
LIBRARY "cygsuba"
|
||||
|
||||
EXPORTS
|
||||
Msv1_0SubAuthenticationRoutine = Msv1_0SubAuthenticationRoutine@36
|
||||
Msv1_0SubAuthenticationFilter = Msv1_0SubAuthenticationFilter@36
|
Loading…
Reference in New Issue