Hello,
Thanks for the solution Bob.
Changed some stuff and have 2 questions open.
my $line;
my (%u, %g);
open(FILE, "< ${dir}/user.perm") or print "Failed opening file $!"; ## 1
while ($line = <FILE>) { ## 2
if ($line =~ /^user:/) {
$u{$_} = 1 for split(/,/, substr($line, 6)); ## 3
}
if ($line =~ /^group:/) {
$g{$_} = 1 for split(/,/, substr($line, 7)); ## 4
}
}
close(FILE);
print "Invalid login"; exit unless $u{$pwuser} || $g{$group}; ## 5
1) I don't like to die in my script as there are many files to read. And if I
can't open the current file I just want to continue with the rest of the files
So I always prefer printing.
2) while my $line (<FILE>) didn't work, just a notation error.
3) I don't need to split on spaces. The script that fills the user.perm is
designed to always : "user: vdgeerd,and,other ## Never mind.
BUT, What do you do with the <1> ?? Changing it to $1 doesn't matter too.
I keep empty places when doing a " foreach my $value(%u) { print $value; } "
chomp %u; didn't work either.
4) Same as 3
5) I changed the && into || cause the user can have acces due to group or user
rights.
BUT, how do I combine a printing error message and an exit within the unless ?
Right now it always prints, and only exits when I have no permissions.
Thanks for all your previous help!!
Regs David
> >
> >
> >
> > Hi,
> >
> > I need some help on the following.
> > In my script I show users some infodocs after they are
> > verified to be valid users.
> > Users can have the permissions following the ruleset:
> > - user (all perm)
> > - group (all perm),
> > - descr (Not allowed to actualy open this document).
> >
> > Now I do the following in my script :
> >
> > # -------------
> > open(FILE, "< ${dir}/user.perm");
> > my @users = <FILE>;
> > close FILE;
> > chomp (@users);
> >
> > my @out = grep {/$pwuser/} @users;
> > my @out1 = grep {/$group/} @users;
> > if ((!(@out)) && (!(@out1))) { print "Sorry $pwuser you have
> > no acces to this IP-Block"; exit; }
> > # --------------
> >
> > But if a user with description access enters the complete
> > link right now,
> > he can view the entire document.
> > Anyway, How do I build in an if-statement in here ??
> > I know I can change the foreach loop and build the if
> > statement within the loop,
> > but isn't there something like :
> >
> > my @out = if (m/user:/) { grep {/$pwuser/} } @users; ## This
> > doesn't work
> > my @out1 = if (m/group:/) { grep {/$group/} } @users; ##
> > This doesn't work
> >
> > an example of the file user.perm would be :
>
> I think you need to parse this file into some structures rather
> than using the simple regex approach. Even if you check only the
> user: line, your logic would allow user names like 'user', or 'v',
> or ',' or even ''.
>
> I would do something like this:
>
> my (%u, %g);
> open(FILE, "< ${dir}/user.perm") or die $!;
> while my $line (<FILE>) {
> if ($line =~ /^user:/) {
> $u{$_} = 1 for split(/\s*,\s*/, substr($line, 5));
> }
> if ($line =~ /^group:/) {
> $g{$_} = 1 for split(/\s*,\s*/, substr($line, 6));
> }
> }
> close(FILE);
>
> Now you can check for a valid user/group like this:
>
> print "Invalid login" unless $u{$user} && $g{$group};
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]