MOO-cows Mailing List Archive

[Prev][Next][Index][Thread]

Re: MOO trojan horse (was Re: more questions)



At 13:17 -0600 2/24/97, Brack wrote:
>> A more robust approach would be:
>>
>> if ($perm_utils:controls (caller_perms(), this) && (player == this.owner))
>> [...]
>
>Thanks. A related question : how would you implement a similar check for
>a verb that can be called both from the command level and deeper in the
>stack ? Is that what caller is for ? I'm still wondering about what that's
>for.
>
>instead of caller_perms(), try:
>valid(caller_perms()) ? caller_perms() | player
>since caller_perms() is #-1 if it's called from the command line.

Since it's #-1 the test should be: (caller_perms() == #-1) ? player |
caller_perms()

Of course to be really rigourous it would need something like this

@verb $perm_utils:secure_call_or_command tnt rxd
@program $perm_utils:secure_call_or_command
{perms, what, ?who=player} = args;
if (valid(perms))
  return $petm_utils:controls(perms, what);
  "That's a verb call.";
elseif (length(c = callers()) == 1 && c[1][1] == #-1)
  return $petm_utils:controls(who, what);
  "That's a command.";
else
  return 0;
  "That's not normal => that's not secure.";
endif
.

Then your test would be:

if (!$perm_utils:secure_call_or_command(caller_perms(), this))
  return callers() ? raise(E_PERM) | player:notify("Sorry you can't do that.");
else
 /* your code here */
endif

Just my $0.02

Richard




References:

Home | Subject Index | Thread Index