mirror of
https://github.com/samba-team/samba.git
synced 2024-12-22 13:34:15 +03:00
se_access_check() tests.
This commit is contained in:
parent
e84607eedf
commit
bba912cad8
24
testsuite/smbd/Makefile.se_access_check
Normal file
24
testsuite/smbd/Makefile.se_access_check
Normal file
@ -0,0 +1,24 @@
|
||||
#
|
||||
# Makefile for se_access_check tests
|
||||
#
|
||||
|
||||
include ../../source/Makefile
|
||||
|
||||
# Objects common to all tests
|
||||
|
||||
SE_ACCESS_CHECK_OBJ1 = $(LIB_OBJ) $(UBIQX_OBJ) $(PARAM_OBJ) $(RPC_PARSE_OBJ) \
|
||||
$(LIBSMB_OBJ) lib/util_seaccess.o nsswitch/common.o
|
||||
|
||||
SE_ACCESS_CHECK_OBJS = $(SE_ACCESS_CHECK_OBJ1:%=$(srcdir)/%) \
|
||||
se_access_check_utils.o
|
||||
|
||||
# Targets for individual tests
|
||||
|
||||
se_access_check_nullsd: $(SE_ACCESS_CHECK_OBJS) se_access_check_nullsd.o
|
||||
se_access_check_everyone: $(SE_ACCESS_CHECK_OBJS) se_access_check_everyone.o
|
||||
se_access_check_allowall: $(SE_ACCESS_CHECK_OBJS) se_access_check_allowall.o
|
||||
se_access_check_denyall: $(SE_ACCESS_CHECK_OBJS) se_access_check_denyall.o
|
||||
se_access_check_allowsome: $(SE_ACCESS_CHECK_OBJS) se_access_check_allowsome.o
|
||||
se_access_check_denysome: $(SE_ACCESS_CHECK_OBJS) se_access_check_denysome.o
|
||||
se_access_check_empty: $(SE_ACCESS_CHECK_OBJS) se_access_check_empty.o
|
||||
se_access_check_printer: $(SE_ACCESS_CHECK_OBJS) se_access_check_printer.o
|
54
testsuite/smbd/se_access_check.exp
Normal file
54
testsuite/smbd/se_access_check.exp
Normal file
@ -0,0 +1,54 @@
|
||||
#
|
||||
# @(#) Test se_access_check() function
|
||||
#
|
||||
|
||||
#
|
||||
# Unix SMB/Netbios implementation.
|
||||
# Copyright (C) Tim Potter 2000
|
||||
#
|
||||
# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
#
|
||||
|
||||
load_lib "compile.exp"
|
||||
load_lib "util-defs.exp"
|
||||
|
||||
# Run tests from C source files
|
||||
|
||||
set se_access_check_tests [list \
|
||||
{ "null security descriptor" "se_access_check_nullsd" } \
|
||||
{ "security descriptor allow everyone" "se_access_check_allowall" } \
|
||||
{ "security descriptor allow everyone" "se_access_check_allowall" } \
|
||||
{ "security descriptor deny everyone" "se_access_check_denyall" } \
|
||||
{ "empty security descriptor" "se_access_check_empty" } \
|
||||
{ "allow some users access" "se_access_check_allowsome" } \
|
||||
{ "deny some users access" "se_access_check_denysome" } \
|
||||
{ "printer access permissions" "se_access_check_printer" } \
|
||||
]
|
||||
|
||||
foreach { test } $se_access_check_tests {
|
||||
set test_desc [lindex $test 0]
|
||||
set test_file [lindex $test 1]
|
||||
|
||||
simple_make "se_access_check" $test_file
|
||||
set output [util_start "$srcdir/$subdir/$test_file" ]
|
||||
|
||||
if { [regexp "PASS" $output] } {
|
||||
pass $test_desc
|
||||
file delete "$srcdir/$subdir/$test_file" "$srcdir/$subdir/$test_file.o"
|
||||
} else {
|
||||
fail $test_desc
|
||||
puts $output
|
||||
}
|
||||
}
|
87
testsuite/smbd/se_access_check_allowall.c
Normal file
87
testsuite/smbd/se_access_check_allowall.c
Normal file
@ -0,0 +1,87 @@
|
||||
/*
|
||||
Unix SMB/Netbios implementation.
|
||||
Version 1.9.
|
||||
Security context tests
|
||||
Copyright (C) Tim Potter 2000
|
||||
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "se_access_check_utils.h"
|
||||
|
||||
/* Globals */
|
||||
|
||||
BOOL failed;
|
||||
SEC_DESC *sd;
|
||||
|
||||
struct ace_entry acl_allowall[] = {
|
||||
{ SEC_ACE_TYPE_ACCESS_ALLOWED, SEC_ACE_FLAG_CONTAINER_INHERIT,
|
||||
GENERIC_ALL_ACCESS, "S-1-1-0" },
|
||||
{ 0, 0, 0, NULL}
|
||||
};
|
||||
|
||||
/* Check that access is always allowed for a NULL security descriptor */
|
||||
|
||||
BOOL allowall_check(struct passwd *pw, int ngroups, gid_t *groups)
|
||||
{
|
||||
uint32 acc_granted, status;
|
||||
BOOL result;
|
||||
|
||||
result = se_access_check(sd, pw->pw_uid, pw->pw_gid,
|
||||
ngroups, groups,
|
||||
SEC_RIGHTS_MAXIMUM_ALLOWED,
|
||||
&acc_granted, &status);
|
||||
|
||||
if (!result || status != NT_STATUS_NO_PROBLEMO ||
|
||||
acc_granted != GENERIC_ALL_ACCESS) {
|
||||
printf("FAIL: allowall se_access_check %d/%d\n",
|
||||
pw->pw_uid, pw->pw_gid);
|
||||
failed = True;
|
||||
}
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
/* Main function */
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
/* Initialisation */
|
||||
|
||||
generate_wellknown_sids();
|
||||
|
||||
/* Create security descriptor */
|
||||
|
||||
sd = build_sec_desc(acl_allowall, NULL, NULL_SID, NULL_SID);
|
||||
|
||||
if (!sd) {
|
||||
printf("FAIL: could not build security descriptor\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Run test */
|
||||
|
||||
visit_pwdb(allowall_check);
|
||||
|
||||
/* Return */
|
||||
|
||||
if (!failed) {
|
||||
printf("PASS\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
104
testsuite/smbd/se_access_check_allowsome.c
Normal file
104
testsuite/smbd/se_access_check_allowsome.c
Normal file
@ -0,0 +1,104 @@
|
||||
/*
|
||||
Unix SMB/Netbios implementation.
|
||||
Version 1.9.
|
||||
Security context tests
|
||||
Copyright (C) Tim Potter 2000
|
||||
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "se_access_check_utils.h"
|
||||
|
||||
/* Globals */
|
||||
|
||||
BOOL failed;
|
||||
SEC_DESC *sd;
|
||||
|
||||
struct ace_entry acl_allowsome[] = {
|
||||
{ SEC_ACE_TYPE_ACCESS_ALLOWED, SEC_ACE_FLAG_CONTAINER_INHERIT,
|
||||
GENERIC_ALL_ACCESS, "user0" },
|
||||
{ SEC_ACE_TYPE_ACCESS_ALLOWED, SEC_ACE_FLAG_CONTAINER_INHERIT,
|
||||
GENERIC_ALL_ACCESS, "user2" },
|
||||
{ 0, 0, 0, NULL}
|
||||
};
|
||||
|
||||
BOOL allowsome_check(struct passwd *pw, int ngroups, gid_t *groups)
|
||||
{
|
||||
uint32 acc_granted, status;
|
||||
fstring name;
|
||||
BOOL result;
|
||||
int len1, len2;
|
||||
|
||||
/* Check only user0 and user2 allowed access */
|
||||
|
||||
result = se_access_check(sd, pw->pw_uid, pw->pw_gid,
|
||||
ngroups, groups,
|
||||
SEC_RIGHTS_MAXIMUM_ALLOWED,
|
||||
&acc_granted, &status);
|
||||
|
||||
len1 = (int)strlen(pw->pw_name) - strlen("user0");
|
||||
len2 = (int)strlen(pw->pw_name) - strlen("user2");
|
||||
|
||||
if ((strncmp("user0", &pw->pw_name[MAX(len1, 0)],
|
||||
strlen("user0")) == 0) ||
|
||||
(strncmp("user2", &pw->pw_name[MAX(len2, 0)],
|
||||
strlen("user2")) == 0)) {
|
||||
if (!result || acc_granted != GENERIC_ALL_ACCESS) {
|
||||
printf("FAIL: access not granted for %s\n",
|
||||
pw->pw_name);
|
||||
}
|
||||
} else {
|
||||
if (result || acc_granted != 0) {
|
||||
printf("FAIL: access granted for %s\n", pw->pw_name);
|
||||
}
|
||||
}
|
||||
|
||||
printf("result %s for user %s\n", result ? "allowed" : "denied",
|
||||
pw->pw_name);
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
/* Main function */
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
/* Initialisation */
|
||||
|
||||
generate_wellknown_sids();
|
||||
|
||||
/* Create security descriptor */
|
||||
|
||||
sd = build_sec_desc(acl_allowsome, NULL, NULL_SID, NULL_SID);
|
||||
|
||||
if (!sd) {
|
||||
printf("FAIL: could not build security descriptor\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Run test */
|
||||
|
||||
visit_pwdb(allowsome_check);
|
||||
|
||||
/* Return */
|
||||
|
||||
if (!failed) {
|
||||
printf("PASS\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
86
testsuite/smbd/se_access_check_denyall.c
Normal file
86
testsuite/smbd/se_access_check_denyall.c
Normal file
@ -0,0 +1,86 @@
|
||||
/*
|
||||
Unix SMB/Netbios implementation.
|
||||
Version 1.9.
|
||||
Security context tests
|
||||
Copyright (C) Tim Potter 2000
|
||||
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "se_access_check_utils.h"
|
||||
|
||||
/* Globals */
|
||||
|
||||
BOOL failed;
|
||||
SEC_DESC *sd;
|
||||
|
||||
struct ace_entry acl_denyall[] = {
|
||||
{ SEC_ACE_TYPE_ACCESS_DENIED, SEC_ACE_FLAG_CONTAINER_INHERIT,
|
||||
GENERIC_ALL_ACCESS, "S-1-1-0" },
|
||||
{ 0, 0, 0, NULL}
|
||||
};
|
||||
|
||||
/* Check that access is always allowed for a NULL security descriptor */
|
||||
|
||||
BOOL denyall_check(struct passwd *pw, int ngroups, gid_t *groups)
|
||||
{
|
||||
uint32 acc_granted, status;
|
||||
BOOL result;
|
||||
|
||||
result = se_access_check(sd, pw->pw_uid, pw->pw_gid,
|
||||
ngroups, groups,
|
||||
SEC_RIGHTS_MAXIMUM_ALLOWED,
|
||||
&acc_granted, &status);
|
||||
|
||||
if (result || acc_granted != 0) {
|
||||
printf("FAIL: denyall se_access_check %d/%d\n",
|
||||
pw->pw_uid, pw->pw_gid);
|
||||
failed = True;
|
||||
}
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
/* Main function */
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
/* Initialisation */
|
||||
|
||||
generate_wellknown_sids();
|
||||
|
||||
/* Create security descriptor */
|
||||
|
||||
sd = build_sec_desc(acl_denyall, NULL, NULL_SID, NULL_SID);
|
||||
|
||||
if (!sd) {
|
||||
printf("FAIL: could not build security descriptor\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Run test */
|
||||
|
||||
visit_pwdb(denyall_check);
|
||||
|
||||
/* Return */
|
||||
|
||||
if (!failed) {
|
||||
printf("PASS\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
106
testsuite/smbd/se_access_check_denysome.c
Normal file
106
testsuite/smbd/se_access_check_denysome.c
Normal file
@ -0,0 +1,106 @@
|
||||
/*
|
||||
Unix SMB/Netbios implementation.
|
||||
Version 1.9.
|
||||
Security context tests
|
||||
Copyright (C) Tim Potter 2000
|
||||
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "se_access_check_utils.h"
|
||||
|
||||
/* Globals */
|
||||
|
||||
BOOL failed;
|
||||
SEC_DESC *sd;
|
||||
|
||||
struct ace_entry acl_denysome[] = {
|
||||
{ SEC_ACE_TYPE_ACCESS_DENIED, SEC_ACE_FLAG_CONTAINER_INHERIT,
|
||||
GENERIC_ALL_ACCESS, "user1" },
|
||||
{ SEC_ACE_TYPE_ACCESS_DENIED, SEC_ACE_FLAG_CONTAINER_INHERIT,
|
||||
GENERIC_ALL_ACCESS, "user3" },
|
||||
{ SEC_ACE_TYPE_ACCESS_ALLOWED, SEC_ACE_FLAG_CONTAINER_INHERIT,
|
||||
GENERIC_ALL_ACCESS, "S-1-1-0" },
|
||||
{ 0, 0, 0, NULL}
|
||||
};
|
||||
|
||||
BOOL denysome_check(struct passwd *pw, int ngroups, gid_t *groups)
|
||||
{
|
||||
uint32 acc_granted, status;
|
||||
fstring name;
|
||||
BOOL result;
|
||||
int len1, len2;
|
||||
|
||||
/* Check only user1 and user3 denied access */
|
||||
|
||||
result = se_access_check(sd, pw->pw_uid, pw->pw_gid,
|
||||
ngroups, groups,
|
||||
SEC_RIGHTS_MAXIMUM_ALLOWED,
|
||||
&acc_granted, &status);
|
||||
|
||||
len1 = (int)strlen(pw->pw_name) - strlen("user1");
|
||||
len2 = (int)strlen(pw->pw_name) - strlen("user3");
|
||||
|
||||
if ((strncmp("user1", &pw->pw_name[MAX(len1, 0)],
|
||||
strlen("user1")) == 0) ||
|
||||
(strncmp("user3", &pw->pw_name[MAX(len2, 0)],
|
||||
strlen("user3")) == 0)) {
|
||||
if (result || acc_granted != 0) {
|
||||
printf("FAIL: access not denied for %s\n",
|
||||
pw->pw_name);
|
||||
}
|
||||
} else {
|
||||
if (!result || acc_granted != GENERIC_ALL_ACCESS) {
|
||||
printf("FAIL: access denied for %s\n", pw->pw_name);
|
||||
}
|
||||
}
|
||||
|
||||
printf("result %s for user %s\n", result ? "allowed" : "denied",
|
||||
pw->pw_name);
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
/* Main function */
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
/* Initialisation */
|
||||
|
||||
generate_wellknown_sids();
|
||||
|
||||
/* Create security descriptor */
|
||||
|
||||
sd = build_sec_desc(acl_denysome, NULL, NULL_SID, NULL_SID);
|
||||
|
||||
if (!sd) {
|
||||
printf("FAIL: could not build security descriptor\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Run test */
|
||||
|
||||
visit_pwdb(denysome_check);
|
||||
|
||||
/* Return */
|
||||
|
||||
if (!failed) {
|
||||
printf("PASS\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
109
testsuite/smbd/se_access_check_empty.c
Normal file
109
testsuite/smbd/se_access_check_empty.c
Normal file
@ -0,0 +1,109 @@
|
||||
/*
|
||||
Unix SMB/Netbios implementation.
|
||||
Version 1.9.
|
||||
Security context tests
|
||||
Copyright (C) Tim Potter 2000
|
||||
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "se_access_check_utils.h"
|
||||
|
||||
/* Globals */
|
||||
|
||||
BOOL failed;
|
||||
SEC_DESC *sd;
|
||||
|
||||
struct ace_entry acl_empty[] = {
|
||||
{ 0, 0, 0, NULL}
|
||||
};
|
||||
|
||||
/* Check that access is always allowed for a NULL security descriptor */
|
||||
|
||||
BOOL emptysd_check(struct passwd *pw, int ngroups, gid_t *groups)
|
||||
{
|
||||
uint32 acc_granted, status;
|
||||
BOOL result;
|
||||
|
||||
/* For no DACL, access is allowed and the desired access mask is
|
||||
returned */
|
||||
|
||||
result = se_access_check(sd, pw->pw_uid, pw->pw_gid,
|
||||
ngroups, groups,
|
||||
SEC_RIGHTS_MAXIMUM_ALLOWED,
|
||||
&acc_granted, &status);
|
||||
|
||||
if (!result || !(acc_granted == SEC_RIGHTS_MAXIMUM_ALLOWED)) {
|
||||
printf("FAIL: no dacl for %s (%d/%d)\n", pw->pw_name,
|
||||
pw->pw_uid, pw->pw_gid);
|
||||
failed = True;
|
||||
}
|
||||
|
||||
result = se_access_check(sd, pw->pw_uid, pw->pw_gid,
|
||||
ngroups, groups, 0x1234,
|
||||
&acc_granted, &status);
|
||||
|
||||
if (!result || !(acc_granted == 0x1234)) {
|
||||
printf("FAIL: no dacl2 for %s (%d/%d)\n", pw->pw_name,
|
||||
pw->pw_uid, pw->pw_gid);
|
||||
failed = True;
|
||||
}
|
||||
|
||||
/* If desired access mask is empty then no access is allowed */
|
||||
|
||||
result = se_access_check(sd, pw->pw_uid, pw->pw_gid,
|
||||
ngroups, groups, 0,
|
||||
&acc_granted, &status);
|
||||
|
||||
if (result) {
|
||||
printf("FAIL: zero desired access for %s (%d/%d)\n",
|
||||
pw->pw_name, pw->pw_uid, pw->pw_gid);
|
||||
failed = True;
|
||||
}
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
/* Main function */
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
/* Initialisation */
|
||||
|
||||
generate_wellknown_sids();
|
||||
|
||||
/* Create security descriptor */
|
||||
|
||||
sd = build_sec_desc(acl_empty, NULL, NULL_SID, NULL_SID);
|
||||
|
||||
if (!sd) {
|
||||
printf("FAIL: could not build security descriptor\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Run test */
|
||||
|
||||
visit_pwdb(emptysd_check);
|
||||
|
||||
/* Return */
|
||||
|
||||
if (!failed) {
|
||||
printf("PASS\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
74
testsuite/smbd/se_access_check_nullsd.c
Normal file
74
testsuite/smbd/se_access_check_nullsd.c
Normal file
@ -0,0 +1,74 @@
|
||||
/*
|
||||
Unix SMB/Netbios implementation.
|
||||
Version 1.9.
|
||||
Security context tests
|
||||
Copyright (C) Tim Potter 2000
|
||||
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "se_access_check_utils.h"
|
||||
|
||||
/* Globals */
|
||||
|
||||
BOOL failed;
|
||||
|
||||
/* Check that access is always allowed for a NULL security descriptor */
|
||||
|
||||
BOOL nullsd_check(struct passwd *pw, int ngroups, gid_t *groups)
|
||||
{
|
||||
uint32 acc_granted, status;
|
||||
BOOL result;
|
||||
|
||||
result = se_access_check(NULL, pw->pw_uid, pw->pw_gid,
|
||||
ngroups, groups,
|
||||
SEC_RIGHTS_MAXIMUM_ALLOWED,
|
||||
&acc_granted, &status);
|
||||
|
||||
if (!result || status != NT_STATUS_NO_PROBLEMO ||
|
||||
acc_granted != SEC_RIGHTS_MAXIMUM_ALLOWED) {
|
||||
printf("FAIL: null se_access_check %d/%d\n",
|
||||
pw->pw_uid, pw->pw_gid);
|
||||
failed = True;
|
||||
}
|
||||
|
||||
printf("access check passed for user %s (%d/%d)\n",
|
||||
pw->pw_name, pw->pw_uid, pw->pw_gid);
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
/* Main function */
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
/* Initialisation */
|
||||
|
||||
generate_wellknown_sids();
|
||||
|
||||
/* Run test */
|
||||
|
||||
visit_pwdb(nullsd_check);
|
||||
|
||||
/* Return */
|
||||
|
||||
if (!failed) {
|
||||
printf("PASS\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
212
testsuite/smbd/se_access_check_printer.c
Normal file
212
testsuite/smbd/se_access_check_printer.c
Normal file
@ -0,0 +1,212 @@
|
||||
/*
|
||||
Unix SMB/Netbios implementation.
|
||||
Version 1.9.
|
||||
Security context tests
|
||||
Copyright (C) Tim Potter 2000
|
||||
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "se_access_check_utils.h"
|
||||
|
||||
/* Globals */
|
||||
|
||||
BOOL failed;
|
||||
SEC_DESC *sd;
|
||||
|
||||
struct ace_entry acl_printer[] = {
|
||||
|
||||
/* Everyone is allowed to print */
|
||||
|
||||
{ SEC_ACE_TYPE_ACCESS_ALLOWED, SEC_ACE_FLAG_CONTAINER_INHERIT,
|
||||
PRINTER_ACE_PRINT, "S-1-1-0" },
|
||||
|
||||
/* Except for user0 who uses too much paper */
|
||||
|
||||
{ SEC_ACE_TYPE_ACCESS_DENIED, SEC_ACE_FLAG_CONTAINER_INHERIT,
|
||||
PRINTER_ACE_FULL_CONTROL, "user0" },
|
||||
|
||||
/* Users 1 and 2 can manage documents */
|
||||
|
||||
{ SEC_ACE_TYPE_ACCESS_ALLOWED, SEC_ACE_FLAG_CONTAINER_INHERIT,
|
||||
PRINTER_ACE_MANAGE_DOCUMENTS, "user1" },
|
||||
|
||||
{ SEC_ACE_TYPE_ACCESS_ALLOWED, SEC_ACE_FLAG_CONTAINER_INHERIT,
|
||||
PRINTER_ACE_MANAGE_DOCUMENTS, "user2" },
|
||||
|
||||
/* Domain Admins can also manage documents */
|
||||
|
||||
{ SEC_ACE_TYPE_ACCESS_ALLOWED, SEC_ACE_FLAG_CONTAINER_INHERIT,
|
||||
PRINTER_ACE_MANAGE_DOCUMENTS, "Domain Admins" },
|
||||
|
||||
/* User 3 is da man */
|
||||
|
||||
{ SEC_ACE_TYPE_ACCESS_ALLOWED, SEC_ACE_FLAG_CONTAINER_INHERIT,
|
||||
PRINTER_ACE_FULL_CONTROL, "user3" },
|
||||
|
||||
{ 0, 0, 0, NULL}
|
||||
};
|
||||
|
||||
BOOL test_user(char *username, uint32 acc_desired, uint32 *acc_granted)
|
||||
{
|
||||
struct passwd *pw;
|
||||
uint32 status;
|
||||
|
||||
if (!(pw = getpwnam(username))) {
|
||||
printf("FAIL: could not lookup user info for %s\n",
|
||||
username);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
return se_access_check(sd, pw->pw_uid, pw->pw_gid, 0, NULL,
|
||||
acc_desired, acc_granted, &status);
|
||||
}
|
||||
|
||||
static char *pace_str(uint32 ace_flags)
|
||||
{
|
||||
if ((ace_flags & PRINTER_ACE_FULL_CONTROL) ==
|
||||
PRINTER_ACE_FULL_CONTROL) return "full control";
|
||||
|
||||
if ((ace_flags & PRINTER_ACE_MANAGE_DOCUMENTS) ==
|
||||
PRINTER_ACE_MANAGE_DOCUMENTS) return "manage documents";
|
||||
|
||||
if ((ace_flags & PRINTER_ACE_PRINT) == PRINTER_ACE_PRINT)
|
||||
return "print";
|
||||
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
uint32 perms[] = {
|
||||
PRINTER_ACE_PRINT,
|
||||
PRINTER_ACE_FULL_CONTROL,
|
||||
PRINTER_ACE_MANAGE_DOCUMENTS,
|
||||
0
|
||||
};
|
||||
|
||||
void runtest(void)
|
||||
{
|
||||
uint32 acc_granted;
|
||||
BOOL result;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; perms[i]; i++) {
|
||||
|
||||
/* Test 10 users */
|
||||
|
||||
for (j = 0; j < 10; j++) {
|
||||
fstring name;
|
||||
|
||||
/* Test user against ACL */
|
||||
|
||||
snprintf(name, sizeof(fstring), "%s/user%d",
|
||||
getenv("TEST_WORKGROUP"), j);
|
||||
|
||||
result = test_user(name, perms[i], &acc_granted);
|
||||
|
||||
printf("%s: %s %s 0x%08x\n", name,
|
||||
pace_str(perms[i]),
|
||||
result ? "TRUE " : "FALSE", acc_granted);
|
||||
|
||||
/* Check results */
|
||||
|
||||
switch (perms[i]) {
|
||||
|
||||
case PRINTER_ACE_PRINT: {
|
||||
if (!result || acc_granted !=
|
||||
PRINTER_ACE_PRINT) {
|
||||
printf("FAIL: user %s can't print\n",
|
||||
name);
|
||||
failed = True;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case PRINTER_ACE_FULL_CONTROL: {
|
||||
if (j == 3) {
|
||||
if (!result || acc_granted !=
|
||||
PRINTER_ACE_FULL_CONTROL) {
|
||||
printf("FAIL: user %s doesn't "
|
||||
"have full control\n",
|
||||
name);
|
||||
failed = True;
|
||||
}
|
||||
} else {
|
||||
if (result || acc_granted != 0) {
|
||||
printf("FAIL: user %s has full "
|
||||
"control\n", name);
|
||||
failed = True;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PRINTER_ACE_MANAGE_DOCUMENTS: {
|
||||
if (j == 1 || j == 2) {
|
||||
if (!result || acc_granted !=
|
||||
PRINTER_ACE_MANAGE_DOCUMENTS) {
|
||||
printf("FAIL: user %s can't "
|
||||
"manage documents\n",
|
||||
name);
|
||||
failed = True;
|
||||
}
|
||||
} else {
|
||||
if (result || acc_granted != 0) {
|
||||
printf("FAIL: user %s can "
|
||||
"manage documents\n",
|
||||
name);
|
||||
failed = True;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
printf("FAIL: internal error\n");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Main function */
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
/* Initialisation */
|
||||
|
||||
generate_wellknown_sids();
|
||||
|
||||
/* Create security descriptor */
|
||||
|
||||
sd = build_sec_desc(acl_printer, NULL, NULL_SID, NULL_SID);
|
||||
|
||||
if (!sd) {
|
||||
printf("FAIL: could not build security descriptor\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Run test */
|
||||
|
||||
runtest();
|
||||
|
||||
/* Return */
|
||||
|
||||
if (!failed) {
|
||||
printf("PASS\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
158
testsuite/smbd/se_access_check_utils.c
Normal file
158
testsuite/smbd/se_access_check_utils.c
Normal file
@ -0,0 +1,158 @@
|
||||
/*
|
||||
Unix SMB/Netbios implementation.
|
||||
Version 1.9.
|
||||
Security context tests
|
||||
Copyright (C) Tim Potter 2000
|
||||
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
#include "se_access_check_utils.h"
|
||||
|
||||
void char_to_sid(DOM_SID *sid, char *sid_str)
|
||||
{
|
||||
/* If it looks like a SID, call string_to_sid() else look it up
|
||||
using wbinfo. */
|
||||
|
||||
if (strncmp(sid_str, "S-", 2) == 0) {
|
||||
string_to_sid(sid, sid_str);
|
||||
} else {
|
||||
struct winbindd_request request;
|
||||
struct winbindd_response response;
|
||||
|
||||
/* Send off request */
|
||||
|
||||
ZERO_STRUCT(request);
|
||||
ZERO_STRUCT(response);
|
||||
|
||||
fstrcpy(request.data.name, sid_str);
|
||||
if (winbindd_request(WINBINDD_LOOKUPNAME, &request,
|
||||
&response) != NSS_STATUS_SUCCESS) {
|
||||
printf("FAIL: unable to look up sid for name %s\n",
|
||||
sid_str);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
string_to_sid(sid, response.data.sid.sid);
|
||||
printf("converted char %s to sid %s\n", sid_str,
|
||||
response.data.sid.sid);
|
||||
}
|
||||
}
|
||||
|
||||
/* Construct an ACL from a list of ace_entry structures */
|
||||
|
||||
SEC_ACL *build_acl(struct ace_entry *ace_list)
|
||||
{
|
||||
SEC_ACE *aces = NULL;
|
||||
SEC_ACL *result;
|
||||
int num_aces = 0;
|
||||
|
||||
if (ace_list == NULL) return NULL;
|
||||
|
||||
/* Create aces */
|
||||
|
||||
while(ace_list->sid) {
|
||||
SEC_ACCESS sa;
|
||||
DOM_SID sid;
|
||||
|
||||
/* Create memory for new ACE */
|
||||
|
||||
if (!(aces = Realloc(aces,
|
||||
sizeof(SEC_ACE) * (num_aces + 1)))) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Create ace */
|
||||
|
||||
init_sec_access(&sa, ace_list->mask);
|
||||
|
||||
char_to_sid(&sid, ace_list->sid);
|
||||
init_sec_ace(&aces[num_aces], &sid, ace_list->type,
|
||||
sa, ace_list->flags);
|
||||
|
||||
num_aces++;
|
||||
ace_list++;
|
||||
}
|
||||
|
||||
/* Create ACL from list of ACEs */
|
||||
|
||||
result = make_sec_acl(ACL_REVISION, num_aces, aces);
|
||||
free(aces);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Make a security descriptor */
|
||||
|
||||
SEC_DESC *build_sec_desc(struct ace_entry *dacl, struct ace_entry *sacl,
|
||||
char *owner_sid, char *group_sid)
|
||||
{
|
||||
DOM_SID the_owner_sid, the_group_sid;
|
||||
SEC_ACL *the_dacl, *the_sacl;
|
||||
SEC_DESC *result;
|
||||
size_t size;
|
||||
|
||||
/* Build up bits of security descriptor */
|
||||
|
||||
char_to_sid(&the_owner_sid, owner_sid);
|
||||
char_to_sid(&the_group_sid, group_sid);
|
||||
|
||||
the_dacl = build_acl(dacl);
|
||||
the_sacl = build_acl(sacl);
|
||||
|
||||
result = make_sec_desc(SEC_DESC_REVISION,
|
||||
SEC_DESC_SELF_RELATIVE | SEC_DESC_DACL_PRESENT,
|
||||
&the_owner_sid, &the_group_sid,
|
||||
the_sacl, the_dacl, &size);
|
||||
|
||||
free_sec_acl(&the_dacl);
|
||||
free_sec_acl(&the_sacl);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Iterate over password database and call a user-specified function */
|
||||
|
||||
void visit_pwdb(BOOL (*fn)(struct passwd *pw, int ngroups, gid_t *groups))
|
||||
{
|
||||
struct passwd *pw;
|
||||
int ngroups;
|
||||
gid_t *groups;
|
||||
|
||||
setpwent();
|
||||
|
||||
while ((pw = getpwent())) {
|
||||
BOOL result;
|
||||
|
||||
/* Get grouplist */
|
||||
|
||||
ngroups = getgroups(0, NULL);
|
||||
|
||||
groups = malloc(sizeof(gid_t) * ngroups);
|
||||
getgroups(ngroups, groups);
|
||||
|
||||
/* Call function */
|
||||
|
||||
result = fn(pw, ngroups, groups);
|
||||
if (!result) break;
|
||||
|
||||
/* Clean up */
|
||||
|
||||
free(groups);
|
||||
}
|
||||
|
||||
endpwent();
|
||||
}
|
46
testsuite/smbd/se_access_check_utils.h
Normal file
46
testsuite/smbd/se_access_check_utils.h
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
Unix SMB/Netbios implementation.
|
||||
Version 1.9.
|
||||
Security context tests
|
||||
Copyright (C) Tim Potter 2000
|
||||
|
||||
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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#ifndef _SE_ACCESS_CHECK_UTILS_H
|
||||
#define _SE_ACCESS_CHECK_UTILS_H
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
/* Structure to build ACE lists from */
|
||||
|
||||
struct ace_entry {
|
||||
uint8 type, flags;
|
||||
uint32 mask;
|
||||
char *sid;
|
||||
};
|
||||
|
||||
#define NULL_SID "S-1-0-0"
|
||||
#define WORLD_SID "S-1-1-0"
|
||||
|
||||
/* Function prototypes */
|
||||
|
||||
SEC_ACL *build_acl(struct ace_entry *ace_list);
|
||||
SEC_DESC *build_sec_desc(struct ace_entry *dacl, struct ace_entry *sacl,
|
||||
char *owner_sid, char *group_sid);
|
||||
|
||||
void visit_pwdb(BOOL (*fn)(struct passwd *pw, int ngroups, gid_t *groups));
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user