CGI-Bus
view release on metacpan or search on metacpan
lib/CGI/Bus/uauth.pm view on Meta::CPAN
my %i;
my $l;
if ($o =~/g/ && Win32API::Net::GroupEnum($srv, \@g)) {
@g =map {&{$fg}($p) ? ($_) : ()} @g if $fg;
if (ref($r) eq 'ARRAY') {
push(@$r, @g)
}
else {
foreach my $g (@g) {
%i =() if !Win32API::Net::GroupGetInfo($srv,$g,1,\%i);
$l =$i{comment} ||'';
$r->{$g} =$g .($l ? ', ' .$l :'');
}
}
}
if ($o =~/g/ && Win32API::Net::LocalGroupEnum($srv, \@g)) {
@g =map {&{$fg}($p) ? ($_) : ()} @g if $fg;
if (ref($r) eq 'ARRAY') {
push(@$r, @g)
}
else {
foreach my $g (@g) {
%i =() if !Win32API::Net::LocalGroupGetInfo($srv,$g,1,\%i);
$l =$i{comment} ||'';
$r->{$g} =$g .($l ? ', ' .$l :'');
}
}
}
if ($o =~/u/ && Win32API::Net::UserEnum($srv, \@g)) {
@g =map {&{$fu}($p) ? ($_) : ()} @g if $fu;
if (ref($r) eq 'ARRAY') {
push(@$r, @g)
}
else {
foreach my $g (@g) {
%i =() if !Win32API::Net::UserGetInfo($srv,$g,10,\%i);
$l =$i{fullName} || $i{usrComment} ||$i{comment} ||'';
$r->{$g} =$g .($l ? ', ' .$l :'');
}
}
}
}
else {
}
$r
}
sub w32adaf { # Win32 AD Auth Files write/refresh
return(undef) if $^O ne 'MSWin32';
my $s =$_[0]; # self object
$s =$s->parent if $s && !$s->isa('CGI::Bus');
my $fs =$_[1] ||$s->dpath('uauth'); # filesystem
my $mo =$_[2]; # mandatory operation
my $df =$_[3] ||$s->{-udflt} ||sub{1}; # domain filter
my $fg =$fs .'/' .'uagroup'; # file 'group'
my $fl =$fs .'/' .'ualist'; # file list
return(1) # update frequency
if (defined($s->{-w32adaf}) && $s->{-w32adaf}==0)
|| ((-f $fg) && (time() -[stat($fg)]->[9] <
($s->{-w32adaf}||(60*60*4)))); # 60*60);
if (!$mo) { # check mode
if (!-f $fg) { # immediate interactive
$s->pushmsg($s->pushlog('w32adaf new ' .$fg));
$s->fut->mkdir($s->dpath('uauth'));
}
elsif ($mo =$s && $s->{-endh}) {# end request handlers
$mo->{w32adaf} =sub{w32adaf($_[0],$fs,'q',$df)};
return(1)
}
}
elsif ($mo eq 'q') { # queued mode
if (ref($s) # reverted reject
&& $s->{-w32IISdpsn} && ($s->{-w32IISdpsn} <2)
&& $s->{-cache} && $s->{-cache}->{-RevertToSelf}) {
return(0)
}
elsif (1) { # inline
}
elsif (eval("use Thread; 1") # threads
&& ($mo =eval{Thread->new(sub{w32adaf(undef,$fs,'t',$df)})})
) {
$mo->detach;
return(1);
}
elsif ($mo =fork) { # fork parent success
$SIG{CHLD} ='IGNORE';
return(1);
}
elsif (!defined($mo)) { # fork error, immediate interactive
}
else { # fork child
$mo ='f';
w32adaf(undef,$fs,$mo,$df);
exit(0);
}
}
local(*FG, *FL, *FW);
open(FG, "+>>$fg.tmp")
|| ($s && $s->die($s->lng(0, 'w32adaf') .": open('$fg.tmp') -> $!"))
|| croak("open('<$fg.tmp') -> $!");
open(FL, "+>>$fl.tmp")
|| ($s && $s->die($s->lng(0, 'w32adaf') .": open('$fl.tmp') -> $!"))
|| croak("open('<$fl.tmp') -> $!");
while (!flock(FG,2|4) ||!flock(FL,2|4)) { # LOCK_EX | LOCK_NB
next if !-f $fg;
flock(FG,8); close(FG); # LOCK_UN
flock(FL,8); close(FL);
return(1)
}
truncate(FG,0); truncate(FL,0);
seek(FG,0,0); seek(FL,0,0);
eval('use Win32::OLE'); Win32::OLE->Option('Warn'=>0);
my $od =Win32::OLE->GetObject('WinNT://' .(Win32::NodeName()) .',computer');
my $hdu=$od && $od->{Name} || ''; # host domain name
my $hdn=$od && lc($od->{Name}) || ''; # host domain name
my $hdp=$od && $od->{ADsPath} || ''; # host domain path
my $hdc=lc($hdp); # host domain comparable
my $ldp=$od && $od->{Parent} || ''; # local domain path
$od =Win32::OLE->GetObject("$ldp,domain");
( run in 1.798 second using v1.01-cache-2.11-cpan-d8267643d1d )