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/
/*
 * Check your login from site is "approved" by you.
 * Put this in your .login.  For added insurance, add ip numbers as well
 * (to fall back on if addr_server fails).
 *
 * 1994.05.07 [robo] created
 * 1994.05.11 [inspie] rewrote it to add wildcards
 * 1994.05.11 [robo] reformatted it, added some comments, made some changes, etc
 * 1994.05.13 [robo] inspie's idea to allow wildcard in suffix portion of
 *                   a specified site name; made this optional via -w
 * 1994.05.15 [robo] pallando's idea to test site list via -t;
 *                   some minor code changes
 */

#include <config.h>
#include <mudlib.h>
#include <logs.h>
#ifndef SITECHECK_LOG
#define SITECHECK_LOG "sitecheck.err"
#endif

inherit DAEMON;

static int destruct_flag, test_flag, wildcard_flag;
static string site, site_num;

#define SYNTAX "Syntax: sitecheck [-dtw] site [sites...]\n"

string help() {
    return(SYNTAX "\n" @ENDHELP
This command (placed in your ~.login file) checks your login is from
a site "approved" by you.  Site check failures are logged, and if the
"-d" option is specified, the caller's connection is dropped.

For added safety: in the event addr_server is unable to resolve the
caller's site (host ip/domain name), you'll want to add ip addresses
(ip numbers) to the site list.

If the "-w" option is given, this command will allow more liberal wildcard
usage in the specified site list, eg the suffix portion of a site name, or
the first three octets of an ip address.  Extreme caution is advised when
using this option.  Examples:  *.240.120.*  calvin.*  hobbes.*

The "-t" option is for testing and overrides the "-d" switch.
ENDHELP
    );
}

/*
 * compare dot portions (address components) of ip number (dotted decimal/
 * dotted quad) with an ip number pattern (ie containing wildcard(s))
 * - returns 1 if a match, 0 otherwise
 */
int dot_match(string *site, string *pattern, int flag) {
    int i, j;

    j = sizeof(pattern);
    if (j != 4)
        return 0;

    while (j--) {
        if (flag) {
            /*
             * match any octect
             */
            if (pattern[j] == "*")
                continue;
        } else {
            /*
             * be strict (last octect only)
             */
            if (j == 3 && pattern[3] == "*")
                continue;
        }

        /*
         * component doesn't match
         */
        if (site[j] != pattern[j])
            return 0;
    }

    /*
     * by process of elimination...it must match
     */
    return 1;
}

static int exit(int ok) {
    if (test_flag) {
        write(sprintf("Site check test %s: %s %s\n",
            ok ? "passed" : "failed",
            site ? site : "",
            site_num ? site_num : ""));
    } else {
        if (!ok) {
            /*
             * site not listed
             */
            log_file(SITECHECK_LOG,
                  sprintf("Site check failed: %s@%s [%s]\n",
                  geteuid(previous_object()), site ? site : site_num,
                  ctime(time())));

            if (destruct_flag) {
                previous_object()->remove();
                if (previous_object())
                    destruct(previous_object());
            }
        }
    }

    return 1;
}

int cmd_sitecheck(string arg) {
    string *sites;
    object ob;
    int i, s, l1, l2;
    string *site_dots, *match_dots;

    /*
     * if no sites listed, just return
     */
    if (!arg || arg == "")
        return 1;

    /*
     * initialize vars
     */
    site = 0; site_num = 0;
    destruct_flag = 0;
    test_flag = 0;
    wildcard_flag = 0;

    /*
     * parse command line args
     */
    arg = replace_string(arg, ",", " ");
    sites = explode(lower_case(arg), " ");

    /*
     * check for options
     */
    if (sites[0][0] == '-') {
        if (strsrch(sites[0], 'd') != -1)
            destruct_flag = 1;
        if (strsrch(sites[0], 't') != -1)
            test_flag = 1;
        if (strsrch(sites[0], 'w') != -1)
            wildcard_flag = 1;
    }

    /*
     * check list of accepted sites
     */
    ob = previous_object()->query_link();
    if (!ob)
        ob = previous_object();
    if (ob) {
        site = query_ip_name( ob );
        if (!site)
            site = query_ip_name( previous_object() );
        if (site) {
            /*
             * 1) check for perfect match
             */
            site = lower_case(site);
            if (member_array(site, sites) != -1)
                return exit(1);

            /*
             * 2) check ip number (from ip name)
             */
            if (sscanf(site, "%*d.%*d.%*d.%*d") != 4) {
                site_num = query_ip_number(ob);
                if (!site_num)
                    site_num = query_ip_number(previous_object());
                if (member_array(site_num, sites) != -1)
                    return exit(1);
            } else {
                site_num = site;
                site = 0;
            }

            /*
             * LAST: loop through wildcards in sites[]
             *   Note: sites[] is altered
             */
            if (strsrch(arg, '*') != -1) {
                /*
                 * here's a quick filter :)
                 */
                sites = regexp(sites, "\\*");
                if (sites && (s = sizeof(sites))) {
                    /*
                     * check site ip name;
                     * default only allows '*' as a prefix, ie "*.domain.name"
                     */
                    if (site) {
                        l1 = strlen(site);
                        i = s;
                        while (i--) {
                            l2 = strlen(sites[i]) - 1;
                            if (l2 > 1 && l1 > l2 &&
                                  sites[i][0..1] == "*." &&
                                  strcmp(site[l1-l2..<1], sites[i][1..<1]) == 0)
                                return exit(1);
                        }

                        if (wildcard_flag) {
                            /*
                             * handle '*' as suffix
                             */
                             i = s;
                             while (i--) {
                                 l2 = strlen(sites[i]) - 2;
                                 if (l2 > 0 && l1 > l2 &&
                                      sites[i][l2..<1] == ".*" &&
                                      strcmp(site[0..l2], sites[i][0..l2]) == 0)
                                    return exit(1);
                             }
                        }
                    }

                    /*
                     * check site ip number
                     */
                    if (site_num) {
                        site_dots = explode(site_num, ".");
                        i = s;
                        while (i--) {
                            match_dots = explode(sites[i], ".");
                            if (dot_match(site_dots, match_dots, wildcard_flag))
                                return exit(1);
                        }
                    }
                }
            }

            return exit(0);
        }
    }

    return 1;
}