tmi2_fluffos_v2/
tmi2_fluffos_v2/bin/
tmi2_fluffos_v2/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/ChangeLog.old/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/Win32/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/simuls/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/clone/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/command/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/data/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/master/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/log/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/compiler/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/efuns/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/operators/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/u/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/tmp/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/windows/
tmi2_fluffos_v2/lib/
tmi2_fluffos_v2/lib/adm/
tmi2_fluffos_v2/lib/adm/daemons/languages/
tmi2_fluffos_v2/lib/adm/daemons/network/I3/
tmi2_fluffos_v2/lib/adm/daemons/virtual/
tmi2_fluffos_v2/lib/adm/daemons/virtual/template/
tmi2_fluffos_v2/lib/adm/news/
tmi2_fluffos_v2/lib/adm/obj/
tmi2_fluffos_v2/lib/adm/obj/master/
tmi2_fluffos_v2/lib/adm/priv/
tmi2_fluffos_v2/lib/adm/shell/
tmi2_fluffos_v2/lib/adm/tmp/
tmi2_fluffos_v2/lib/cmds/
tmi2_fluffos_v2/lib/d/
tmi2_fluffos_v2/lib/d/Conf/
tmi2_fluffos_v2/lib/d/Conf/adm/
tmi2_fluffos_v2/lib/d/Conf/boards/
tmi2_fluffos_v2/lib/d/Conf/cmds/
tmi2_fluffos_v2/lib/d/Conf/data/
tmi2_fluffos_v2/lib/d/Conf/logs/
tmi2_fluffos_v2/lib/d/Conf/obj/
tmi2_fluffos_v2/lib/d/Conf/text/help/
tmi2_fluffos_v2/lib/d/Fooland/adm/
tmi2_fluffos_v2/lib/d/Fooland/data/
tmi2_fluffos_v2/lib/d/Fooland/data/attic/
tmi2_fluffos_v2/lib/d/Fooland/items/
tmi2_fluffos_v2/lib/d/TMI/
tmi2_fluffos_v2/lib/d/TMI/adm/
tmi2_fluffos_v2/lib/d/TMI/boards/
tmi2_fluffos_v2/lib/d/TMI/data/
tmi2_fluffos_v2/lib/d/TMI/rooms/
tmi2_fluffos_v2/lib/d/grid/
tmi2_fluffos_v2/lib/d/grid/adm/
tmi2_fluffos_v2/lib/d/grid/data/
tmi2_fluffos_v2/lib/d/std/
tmi2_fluffos_v2/lib/d/std/adm/
tmi2_fluffos_v2/lib/data/adm/
tmi2_fluffos_v2/lib/data/adm/daemons/
tmi2_fluffos_v2/lib/data/adm/daemons/doc_d/
tmi2_fluffos_v2/lib/data/adm/daemons/emoted/
tmi2_fluffos_v2/lib/data/adm/daemons/network/http/
tmi2_fluffos_v2/lib/data/adm/daemons/network/services/mail_q/
tmi2_fluffos_v2/lib/data/adm/daemons/network/smtp/
tmi2_fluffos_v2/lib/data/adm/daemons/news/archives/
tmi2_fluffos_v2/lib/data/attic/connection/
tmi2_fluffos_v2/lib/data/attic/user/
tmi2_fluffos_v2/lib/data/std/connection/b/
tmi2_fluffos_v2/lib/data/std/connection/l/
tmi2_fluffos_v2/lib/data/std/user/a/
tmi2_fluffos_v2/lib/data/std/user/b/
tmi2_fluffos_v2/lib/data/std/user/d/
tmi2_fluffos_v2/lib/data/std/user/f/
tmi2_fluffos_v2/lib/data/std/user/l/
tmi2_fluffos_v2/lib/data/std/user/x/
tmi2_fluffos_v2/lib/data/u/d/dm/working/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/smtp/
tmi2_fluffos_v2/lib/doc/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/interactive/
tmi2_fluffos_v2/lib/doc/driverdoc/concepts/
tmi2_fluffos_v2/lib/doc/driverdoc/driver/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/arrays/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/buffers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/compile/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/ed/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/filesystem/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/floats/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/functions/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/general/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/mappings/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/numbers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/parsing/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/constructs/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/preprocessor/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/types/
tmi2_fluffos_v2/lib/doc/driverdoc/platforms/
tmi2_fluffos_v2/lib/doc/mudlib/
tmi2_fluffos_v2/lib/ftp/
tmi2_fluffos_v2/lib/include/driver/
tmi2_fluffos_v2/lib/log/
tmi2_fluffos_v2/lib/log/driver/
tmi2_fluffos_v2/lib/obj/net/
tmi2_fluffos_v2/lib/obj/shells/
tmi2_fluffos_v2/lib/obj/tools/
tmi2_fluffos_v2/lib/std/adt/
tmi2_fluffos_v2/lib/std/board/
tmi2_fluffos_v2/lib/std/body/
tmi2_fluffos_v2/lib/std/fun/
tmi2_fluffos_v2/lib/std/living/
tmi2_fluffos_v2/lib/std/object/
tmi2_fluffos_v2/lib/std/shop/
tmi2_fluffos_v2/lib/std/socket/
tmi2_fluffos_v2/lib/std/user/
tmi2_fluffos_v2/lib/std/virtual/
tmi2_fluffos_v2/lib/student/
tmi2_fluffos_v2/lib/student/kalypso/
tmi2_fluffos_v2/lib/student/kalypso/armor/
tmi2_fluffos_v2/lib/student/kalypso/rooms/
tmi2_fluffos_v2/lib/student/kalypso/weapons/
tmi2_fluffos_v2/lib/u/l/leto/
tmi2_fluffos_v2/lib/u/l/leto/cmds/
tmi2_fluffos_v2/lib/www/errors/
tmi2_fluffos_v2/lib/www/gateways/
tmi2_fluffos_v2/lib/www/images/
tmi2_fluffos_v2/old/
tmi2_fluffos_v2/win32/
/*
// File:     /adm/obj/master/access.c
// Purpose:  Convert /adm/etc/access to a form the master.c can understand
// Credits:
// 92-12-21  Huthar wrote most of this, as part of TMI-2's distribution mudlib.
//           Please retain this header if you use any of this code.
// 93-06-28  Pallando converted it to use domain_master()
*/
#include <uid.h>
inherit "/adm/obj/master/groups";

#define ACCESS_FILE "/adm/etc/access"
#define GROUP "/adm/obj/master"
#define READ 1
#define WRITE 2

// #define DEBUG

mapping access = ([]);


void error_out( string msg, int line )
{
    write( "ERROR! " + ACCESS_FILE + " contains bad " + msg + " in line " +
      line + "\n" );
}

mapping load_access()
{
    string *lines;
    string file;
    int i, j;
    string *rest;
    int setbits;
    string path;
    string tmp, name;
    
    access = ([]);
    seteuid( ROOT_UID );
    if( ( file = read_file( ACCESS_FILE ) ) == "" )
    {
        write( "Error loading access file!\n" );
        return copy( access );
    }
    
    lines = explode( file, "\n" );
    
    for( i = 0 ; i < sizeof( lines ) ; i++ )
    {
       lines[i] = remove_whitespace( lines[i] );
        if( lines[i][0] == '#' || lines[i] == "" )
            continue;
        if( !sscanf( lines[i], "(%s)%s", path, lines[i] ) )
        {
            error_out( "path", i + 1 );
            return ([]);
        }
        rest = explode( lines[i], ":" );
        for( j = 0; j <sizeof( rest ); j++ )
        {
            if( !sscanf( rest[j], "%s[%s]", name, tmp ) )
            {
                error_out( "name", i + 1 );
                return 0;
            }
            
            if( name[0] == '(' && name[strlen( name ) - 1] == ')' )
                name = "@" + name[1 .. strlen( name ) - 2];
            
            if( !access[path] )
                access[path] = ([]);
            if( !access[path][name] )
                access[path] += ([  name : 0  ]);
            
            switch( tmp )
            {
                case "w":
                    access[path][name] |= WRITE;
                    break;
                case "r":
                    access[path][name] |= READ;
                    break;
                case "wr":
                case "rw":
                    access[path][name] |= READ | WRITE;
                    break;
            }
        }
    }
    return copy( access );
}

mapping query_access( string str )
{
    return copy( access[str] );
}

int check_groups( mixed *grps, string eff_user, string path )
{
    int i, res, found;
    string tmp;
    
    for( i = 0 ; i < sizeof( grps ) ; i++ )
    {
        if( grps[i][0] != '@' )
        {
            if( grps[i] == eff_user )
            {
                found = 1;
                res |= access[path][eff_user];
            }
        } else {
            tmp = grps[i][1..strlen( grps[i] ) - 1];
            if( tmp == "all" || GROUP-> query_member_group( eff_user, tmp ) )
            {
                found = 1;
                res |= access[path][grps[i]];
            }
        }
    }
    return found ? res : -1;
}

int check_access( string str, object act_ob )
{
    string *pth;
    string eff_user, tmp;
    int res;
    
    eff_user = geteuid( act_ob );
    if( !eff_user ) return 0; // this is kind of important -Sulam
    if( sscanf( str, user_path( eff_user ) + "%s", tmp ) == 1 )
        return( READ | WRITE );
  pth = strsrch( str, "/" ) != -1 ? explode( str, "/" ) : ({str});
    if( !pth ) pth = ({ });
    
    // The following bit added by Pallando for domain-master-object hook:
    if( ( 1 < sizeof( pth ) ) && ( pth[0] == "d" ) &&
        ( tmp = domain_master( pth[1] ) )             )
    {
        if( eff_user == ROOT_UID ) return( READ | WRITE );
        if( adminp(eff_user) ) return( READ | WRITE );
        return (int)call_other( tmp, "valid_access",
	implode( pth[2 .. <1], "/" ), eff_user );
    }
    
    if( eff_user == BACKBONE_UID &&
      ( pth[0] == "obj" || pth[0] == "data" ) )
        return( READ | WRITE );
    while( 1 )
    {
        if( !sizeof( pth ) )
            str = "/";
        else
            str = "/" + implode( pth, "/" );
        if( access[str] )
        {
            res = check_groups( keys( access[str] ), eff_user, str );
            if( res >= 0 )
            {
                return res;
            }
        }
        if( str == "/" )
            break;
	pth = pth[0..<2];
    }
    return 0;
}