/* -*- LPC -*- */ /* * $Locker: $ * $Id: resetpw.c,v 1.7 2003/03/25 20:58:32 ceres Exp $ */ #include <parser.h> #include <liaison.h> #include <player_handler.h> inherit "/cmds/base"; string basename; string file; int do_reset(string player, string newpw) { string password; string *bits, t1, t2; int i; if(base_name(previous_object())[0..12] != "/secure/login" && base_name(previous_object())[0..13] != "/secure/nlogin") { if (!sizeof(filter(previous_object(-1), (: interactive($1) :)))) { unguarded((: write_file, "/log/CHEAT", ctime( time() ) + ": illegal attempt to reset password.\nTrace: " + back_trace() :)); return 0; } if (!master()->high_programmer(previous_object(-1)) && !(master()->query_director(previous_object(-1)) && this_player(1)->query_name() == "/d/liaison/master"->query_lord())) { unguarded((: write_file, "/log/CHEAT", ctime( time() ) + ": illegal attempt to reset password.\nTrace: " + back_trace() :)); return 0; } } seteuid("Root"); /* Restore them... */ if (PLAYER_HANDLER->test_user(player)) { basename = "/save/ramdisk/players/" + player[0..0] + "/" + player; if(file_size(basename+".o.gz")>0 || file_size(basename+".o")>0) { unguarded((: uncompress_file(basename+".o.gz") :)); } else { basename = "/save/players/" + player[0..0] + "/" + player; if(file_size(basename+".o.gz")>0 || file_size(basename + ".o") > 0) { unguarded((: uncompress_file(basename+".o.gz") :)); } else { // Player might be set to delete basename = "/save/players/delete/" + player; if(file_size(basename+".o.gz")>0) { unguarded((: uncompress_file(basename+".o.gz") :)); } } } file = unguarded( (: read_file(basename + ".o") :)); if(!file) { write("Error reading file " + basename + ".\n"); return notify_fail("Error reading file " + basename +".o\n"); } bits = explode(file, "\n"); for (i = 0; i < sizeof(bits); i++) { if (bits[i][0..strlen("password")-1] == "password") { t1 = bits[i]; password = restore_variable(bits[i][strlen("password") + 1..]); break; } } password = crypt(newpw, newpw[0..1]); t2 = "password " + save_variable(password); file = replace(file, t1, t2); unguarded( (: rm(basename + ".old") :) ); unguarded( (: rename(basename+".o", basename+".old") :) ); unguarded( (: write_file(basename + ".o", file) :)); unguarded( (: compress_file(basename+".o") :)); PLAYER_HANDLER->remove_cache_entry(player); return 1; } return 0; } /* * This will reset a players password. */ mixed cmd(string player, string newpw) { if(!newpw || newpw == "") return notify_fail("Syntax: resetpw <player> <new password>\n"); if(do_reset(player, newpw)) { write(sprintf("Reset password for %s to %s\n", player, newpw)); } else { write("Unable to find player "+player+".\n"); } return 1; } /* cmd() */ mixed *query_patterns() { return ({ "<word> <string>", (: cmd($4[0], $4[1]) :), }); } /* query_patterns() */