/* /cmds/mortal/_passwd.c
* from Nightmare IV
* command for password changing
* created by Descartes of Borg 940304
*/
#include <std.h>
#include <daemons.h>
#include <privs.h>
#include <flags.h>
inherit DAEMON;
int cmd_passwd(string str) {
string nom, what;
if(previous_object() != this_player(1) || !userp(previous_object()))
return 0;
if((int)previous_object()->query_forced()) return 0;
if((nom = (string)previous_object()->query_name()) == "guest")
return notify_fail("Guest has no such ability.");
if(str && str != "") {
if(sscanf(str, "%s %s", str, what) != 2) return 0;
if(!user_exists(str)) return notify_fail("No such user.\n");
if(!member_group(nom, "SECURE")) return 0;
if(member_group(lower_case(str), "SECURE")) return 0;
USERS_D->change_password(str, what);
message("system", "Password changed.", this_player());
return 1;
}
message("system", sprintf("Changing %s password on %s.",
possessive_noun(capitalize(nom)), mud_name()), previous_object());
message("prompt", "Old password: ", this_player());
input_to("check_password", I_NOECHO | I_NOESC);
return 1;
}
nomask static void check_password(string pass) {
string password;
if(!pass) {
message("system", "Password change failed.", this_player());
return;
}
password = (string) this_player()->query_password();
if(password != crypt(pass, password)) {
message("system", "Password change failed.", this_player());
return;
}
message("prompt", "\nNew password: ", this_player());
input_to("new_password", I_NOECHO | I_NOESC);
}
nomask static void new_password(string pass) {
if(strlen(pass) < 5) {
message("system", "\nPasswords must contain at least 5 characters.",
this_player());
return;
}
message("prompt", "\nConfirm password: ", this_player());
input_to("confirm_password", I_NOECHO | I_NOESC, pass);
}
nomask static void confirm_password(string pass2, string pass1) {
if(pass1 != pass2) {
message("system", "\nPasswords do not match.", this_player());
return;
}
if(this_player(1) != this_player()) {
message("system", "\nThis is a bad thing.", this_player());
return;
}
this_player()->set_password(crypt(pass2, 0));
message("system", "\nPassword changed.", this_player());
}
void help() {
message("help", "Syntax: <passwd>\n\n"
"Command for changing your password. You should do this every few "
"months, or if you suspect someone else may have learned your "
"password. You are responsible for anything that happens with your "
"character, so it is in your best interest to make sure others cannot "
"access it. Passwords must be at least 5 characters in length. "
"It is recommended that your password contain a mix of numbers and "
"both upper case and lower case letters.", this_player());
if(member_group(this_player(), PRIV_SECURE))
message("help", "\n\nSuperuser help for passwd command.\n"
"In addition to changing your own password, the following "
"syntax may be used to change the password of others:\n"
"<passwd [user] [newpassword]>\n", this_player());
}