Sys-Export

 view release on metacpan or  search on metacpan

lib/Sys/Export/Unix/UserDB.pm  view on Meta::CPAN

   my $g= Sys::Export::Unix::UserDB::Group->new(%attrs);
   $self->_add_group_object($g);

   # Can't store member list in group, so store these for later when a user gets added
   if (defined $members) {
      $self->_lazy_add_user_to_group($_, $attrs{name})
         for (isa_array $members? @$members
            : isa_hash $members? keys %$members
            : split / /, $members);
   }
   return $g;
}


sub add_user($self, $name_or_obj, %attrs) {
   if (isa_hash($name_or_obj) || isa_user($name_or_obj)) {
      %attrs= ( %$name_or_obj, %attrs );
   } else {
      my $name= "$name_or_obj";
      if (keys %attrs) {
         $attrs{name}= $name;
      }
      # trigger an import if just a name, and auto_import enabled
      elsif ($self->auto_import && !$self->{users}{$name}) {
         $self->user($name)
            or croak "Failed to import user $name";
         return $self;
      }
   }
   $self->_add_user_object(Sys::Export::Unix::UserDB::User->new(%attrs));
}


sub add_group($self, $name_or_obj, %attrs) {
   if (isa_hash($name_or_obj) || isa_group($name_or_obj)) {
      %attrs= ( %$name_or_obj, %attrs );
   } else {
      my $name= "$name_or_obj";
      if (keys %attrs) {
         $attrs{name}= $name;
      }
      # trigger an import if just a name, and auto_import enabled
      elsif ($self->auto_import && !$self->{groups}{$name}) {
         $self->group($name)
            or croak "Failed to import group $name";
         return $self;
      }
   }
   $self->_add_group_object(Sys::Export::Unix::UserDB::Group->new(%attrs));
}


sub user($self, $spec) {
   length $spec or return undef;
   my $u= isa_int $spec? $self->{uids}{$spec} : $self->{users}{$spec};
   if (!$u && $self->auto_import) {
      if (isa_userdb $self->auto_import) {
         my $peer_u= $self->auto_import->user($spec) // return undef;
         $u= eval { $self->import_user($peer_u) } or warn $@;
      } else {
         my $name= isa_int $spec? (getpwuid($spec) // return undef) : $spec;
         $u= eval { $self->import_user($name) } or warn $@;
      }
   }
   $u;
}

sub has_user($self, $spec) {
   defined(isa_int $spec? $self->{uids}{$spec} : $self->{users}{$spec});
}

sub group($self, $spec) {
   length $spec or return undef;
   my $g= isa_int $spec? $self->{gids}{$spec} : $self->{groups}{$spec};
   if (!$g && $self->auto_import) {
      if (isa_userdb $self->auto_import) {
         my $peer_g= $self->auto_import->group($spec) // return undef;
         $g= eval { $self->import_group($peer_g) } or warn $@;
      } else {
         my $name= isa_int $spec? (getgrgid($spec) // return undef) : $spec;
         $g= eval { $self->import_group($name) } or warn $@;
      }
   }
   $g;
}

sub has_group($self, $spec) {
   defined(isa_int $spec? $self->{gids}{$spec} : $self->{groups}{$spec});
}

# Private methods

# Allows adding user to group before user is defined
sub _lazy_add_user_to_group($self, $unam, $grnam) {
   if (my $u= $self->{users}{$unam}) {
      $u->add_group($grnam);
   } else {
      push $self->{_lazy_add_user_to_group}{$unam}->@*, $grnam;
   }
}

sub _add_user_object($self, $user) {
   my $name = $user->name;
   my $uid = $user->uid;
   $self->is_valid_name($name) or croak "Invalid user name '$name'";
   
   # Check for name conflicts
   croak "Username '$name' already exists"
      if defined $self->{users}{$name};
   
   # Warn about UID conflicts
   carp "UID $uid already exists for user '".$self->{uids}{$uid}->name."', now also used by '$name'"
      if defined $self->{uids}{$uid};

   # Check for references to non-existent groups
   # If auto_import is enabled, accessing ->group will trigger their creation.
   for ((isa_int $user->group? () : ($user->group)), keys $user->groups->%*) {
      $self->is_valid_name($_)
         or croak "Invalid group name '$_' for user '$name'";
      # add the user temporarily so auto_import feature can see it
      local $self->{users}{$name} = $user



( run in 2.344 seconds using v1.01-cache-2.11-cpan-524268b4103 )