ftpdsupp.h
来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C头文件 代码 · 共 314 行
H
314 行
/* ftpdsupp.h: ftpd support _code_ */#ifndef _FTPDSUPP_H#define _FTPDSUPP_H#define directory_exists(p) (file_size(p)==-2)#define file_exists(p) (file_size(p)>0)/* * debugging macros */#ifdef DEBUG#define TP(STR) if ( find_player( TP_CRE ) ) \ tell_object( find_player( TP_CRE ), STR )#define DEBUG_SEND /* define to debug data_write_callback() */#else#define TP(STR)#define DEBUG_SEND#endif /* DEBUG */#define CHECK_LOGIN() \ if ( !socket_info[ fd ][ LOGGED_IN ] ) { \ socket_write( fd, "530 Please login with USER and PASS.\n" ); \ break; \ }#define CHECK_CMD(x) \ if ( sizeof(command) == x) { \ socket_write( fd, sprintf("500 '%s': command not understood.\n", \ command[ 0 ]) ); \ break; \ } /* * check_access determines who is allowed to use ftp (assuming the correct * password is known). if check_access() returns 0 then the user is * disallowed even if the user knows the password. */int check_access(string name){#ifdef FTP_USERS if (!sizeof(FTP_USERS)) return 0; return (member_array(name, FTP_USERS) != -1) ? 1 : 0;#else#ifdef ANONYMOUS_FTP if ( name == "anonymous" ) return 1;#endif /* ANONYMOUS_FTP */#ifdef GUEST_WIZARD_FTP return wizhood(name) != "(player)";#else // This is if you require users to have a home directory // in order to use ftp. return directory_exists(HOME_DIR(name)); /* tmi-2 simul_efun */#endif#endif /* FTP_USERS */}/* * return 1 if user named 'name' has password of 'plaintext' */int check_password(string name, string plaintext){ string fancytext, cpass; object login_ob;#ifdef ANONYMOUS_FTP if ( name == "anonymous" ) { // Currently guest's email address is not verified from USITE; // consider supporting: // name@some.ip.dot.address (from USITE and/or socket_address(fd)) // name@some.domain.name (from USITE) // name@some-mud (reverse DNS lookup) if (!plaintext || plaintext == "") return 0; else if( sizeof(plaintext) < 12 ) return 0; else if( plaintext[sizeof(plaintext)-1..sizeof(plaintext)] == "@") return 0; else if (member_array(plaintext, ({ "none", "guest", "anon", "anonymous", "none@none"}) ) != -1) return 0; else return 1; }#endif /* ANONYMOUS_FTP */ /* * This is a good example of differences in mudlib design * 1) export_uid() vs creator_file() on setting a new object's uid * 2) query_password() vs query("password") */#if 0 seteuid(name) login_ob = new(LOGIN_OB); seteuid(getuid()); login_ob->load_me(name); fancytext = (string)login_ob->query_password();#else seteuid(getuid()); login_ob = new(LOGIN_OB); // set login object's uid seteuid(name); export_uid(login_ob); // now set login object's name seteuid( getuid() ); login_ob->set("id", name); // get login object's password login_ob->restore(); fancytext = (string)login_ob->query("password");#endif reload_object(login_ob); destruct(login_ob); if (!fancytext || !plaintext) { return 0; } cpass = crypt(plaintext, fancytext); return (cpass == fancytext);}/* * determines if "who" is allowed to connect from this site * by using the same args used by the user in his/her .login file for * the sitecheck command */#ifdef CHECK_SITE/* * 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 */static 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;}int check_site(string who, int fd) { int wildcard_flag; string site, site_num; string arg; string *sites; object ob; int i, s, l1, l2; string *site_dots, *match_dots; site = USITE; /* * get site list (if any) */ if (site && site != "" && file_size(HOME_DIR(who)) == -2 && file_size(HOME_DIR(who) + ".login") > 0) { arg = read_file(HOME_DIR(who) + ".login"); if (arg && strlen(arg)) { sites = explode(arg, "\n"); sites = regexp(sites, "^sitecheck "); if (sites && sizeof(sites)) { arg = sites[0][10..-1]; /* * parse command line args */ arg = replace_string(arg, ",", " "); sites = explode(lower_case(arg), " "); /* * check for options */ if (sites[0][0] == '-') { // at the moment, we don't respect the presence of // the -t (test) flag (ie allow the user to login // anyways), and we don't respect the absense of the // -d (destruct) flag, choosing to always drop the // connection if the site check fails if (strsrch(sites[0], 'w') != -1) wildcard_flag = 1; } /* * check list of accepted sites * 1) check for perfect match */ site = lower_case(site); if (member_array(site, sites) != -1) return 1; /* * 2) check ip number (from ip name) */ if (sscanf(site, "%*d.%*d.%*d.%*d") != 4) { site_num = socket_address(fd); sscanf( site_num, "%s %*s", site_num ); if (member_array(site_num, sites) != -1) return 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 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 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 1; } } } } return 0; } } } return 1;}#endif /* SITE_CHECK */#endif /* _FTPDSUPP_H */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?