my $opt_libresolv_wrapper_so_path = "";
my $opt_libsocket_wrapper_so_path = "";
my $opt_libuid_wrapper_so_path = "";
+my $opt_libpam_wrapper_so_path = "";
+my $opt_libpam_matrix_so_path = "";
my $opt_libasan_so_path = "";
my $opt_libcrypt_so_path = "";
my $opt_use_dns_faking = 0;
'resolv_wrapper_so_path=s' => \$opt_libresolv_wrapper_so_path,
'socket_wrapper_so_path=s' => \$opt_libsocket_wrapper_so_path,
'uid_wrapper_so_path=s' => \$opt_libuid_wrapper_so_path,
+ 'pam_wrapper_so_path=s' => \$opt_libpam_wrapper_so_path,
+ 'pam_matrix_so_path=s' => \$opt_libpam_matrix_so_path,
'asan_so_path=s' => \$opt_libasan_so_path,
'crypt_so_path=s' => \$opt_libcrypt_so_path,
'use-dns-faking' => \$opt_use_dns_faking
}
}
+if ($opt_libpam_wrapper_so_path) {
+ if ($ld_preload) {
+ $ld_preload = "$ld_preload:$opt_libpam_wrapper_so_path";
+ } else {
+ $ld_preload = "$opt_libpam_wrapper_so_path";
+ }
+}
+
if (defined($ENV{USE_NAMESPACES})) {
print "Using linux containerization for selftest testenv(s)...\n";
$target = new Samba($bindir, $srcdir, $server_maxtime,
$opt_socket_wrapper_pcap,
$opt_socket_wrapper_keep_pcap,
+ $opt_libpam_matrix_so_path,
$opt_default_ldb_backend);
unless ($opt_list) {
if ($opt_target eq "samba") {
sub new($$$$$) {
my ($classname, $bindir, $srcdir, $server_maxtime,
$opt_socket_wrapper_pcap, $opt_socket_wrapper_keep_pcap,
+ $opt_libpam_matrix_so_path,
$default_ldb_backend) = @_;
my $self = {
opt_socket_wrapper_pcap => $opt_socket_wrapper_pcap,
opt_socket_wrapper_keep_pcap => $opt_socket_wrapper_keep_pcap,
+ opt_libpam_matrix_so_path => $opt_libpam_matrix_so_path,
};
$self->{samba3} = new Samba3($self, $bindir, $srcdir, $server_maxtime);
$self->{samba4} = new Samba4($self, $bindir, $srcdir, $server_maxtime, $default_ldb_backend);
return $ret;
}
+sub pam_matrix_so_path($) {
+ my ($self) = @_;
+ my $SambaCtx = $self;
+ $SambaCtx = $self->{SambaCtx} if defined($self->{SambaCtx});
+
+ return $SambaCtx->{opt_libpam_matrix_so_path};
+}
+
sub copy_file_content($$)
{
my ($in, $out) = @_;
if (defined($env_vars->{OPENSSL_FORCE_FIPS_MODE})) {
$proc_envs->{OPENSSL_FORCE_FIPS_MODE} = $env_vars->{OPENSSL_FORCE_FIPS_MODE};
}
+
+ if (defined($env_vars->{PAM_WRAPPER})) {
+ $proc_envs->{PAM_WRAPPER} = $env_vars->{PAM_WRAPPER};
+ }
+ if (defined($env_vars->{PAM_WRAPPER_KEEP_DIR})) {
+ $proc_envs->{PAM_WRAPPER_KEEP_DIR} = $env_vars->{PAM_WRAPPER_KEEP_DIR};
+ }
+ if (defined($env_vars->{PAM_WRAPPER_SERVICE_DIR})) {
+ $proc_envs->{PAM_WRAPPER_SERVICE_DIR} = $env_vars->{PAM_WRAPPER_SERVICE_DIR};
+ }
+ if (defined($env_vars->{PAM_WRAPPER_DEBUGLEVEL})) {
+ $proc_envs->{PAM_WRAPPER_DEBUGLEVEL} = $env_vars->{PAM_WRAPPER_DEBUGLEVEL};
+ }
+
return $proc_envs;
}
$vars or return undef;
+ my $pam_service_dir = "$prefix_abs/pam_services";
+ remove_tree($pam_service_dir);
+ mkdir($pam_service_dir, 0777);
+ my $pam_service_file = "$pam_service_dir/samba";
+ my $pam_matrix_passdb = "$pam_service_dir/samba_pam_matrix_passdb";
+ my $pam_matrix_so_path = Samba::pam_matrix_so_path($self);
+
+ open(FILE, "> $pam_service_file");
+ print FILE "auth required ${pam_matrix_so_path} passdb=${pam_matrix_passdb} verbose\n";
+ print FILE "account required ${pam_matrix_so_path} passdb=${pam_matrix_passdb} verbose\n";
+ close(FILE);
+
+ my $tmpusername = $vars->{USERNAME};
+ my $tmppassword = $vars->{PASSWORD};
+ open(FILE, "> $pam_matrix_passdb");
+ print FILE "$tmpusername:$tmppassword:samba";
+ close(FILE);
+
+ $vars->{PAM_WRAPPER} = "1";
+ $vars->{PAM_WRAPPER_KEEP_DIR} = "1";
+ $vars->{PAM_WRAPPER_SERVICE_DIR} = $pam_service_dir;
+ $vars->{PAM_WRAPPER_DEBUGLEVEL} = "3";
+
if (not $self->check_or_start(
env_vars => $vars,
nmbd => "yes",
env.OPTIONS += " --nss_wrapper_so_path=" + CONFIG_GET(opt, 'LIBNSS_WRAPPER_SO_PATH')
env.OPTIONS += " --resolv_wrapper_so_path=" + CONFIG_GET(opt, 'LIBRESOLV_WRAPPER_SO_PATH')
env.OPTIONS += " --uid_wrapper_so_path=" + CONFIG_GET(opt, 'LIBUID_WRAPPER_SO_PATH')
+ env.OPTIONS += " --pam_wrapper_so_path=" + CONFIG_GET(opt, 'LIBPAM_WRAPPER_SO_PATH')
+ env.OPTIONS += " --pam_matrix_so_path=" + CONFIG_GET(opt, 'PAM_MATRIX_SO_PATH')
# selftest can optionally use kernel namespaces instead of socket-wrapper
if os.environ.get('USE_NAMESPACES') is None: