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 )