/* nickserv.c - Nick/authentication service
* Copyright 2000-2004 srvx Development Team
*
- * This file is part of srvx.
+ * This file is part of x3.
*
* srvx is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#define KEY_EMAIL_VISIBLE_LEVEL "email_visible_level"
#define KEY_EMAIL_ENABLED "email_enabled"
#define KEY_EMAIL_REQUIRED "email_required"
+#define KEY_SYNC_LOG "sync_log"
#define KEY_COOKIE_TIMEOUT "cookie_timeout"
#define KEY_ACCOUNTS_PER_EMAIL "accounts_per_email"
#define KEY_EMAIL_SEARCH_LEVEL "email_search_level"
#define NICKSERV_MIN_PARMS(N) do { \
if (argc < N) { \
reply("MSG_MISSING_PARAMS", argv[0]); \
- svccmd_send_help(user, nickserv, cmd); \
+ svccmd_send_help_brief(user, nickserv, cmd); \
return 0; \
} } while (0)
{ "NSMSG_HANDLE_TOLONG", "The account name %s is too long. Account names must be %lu charactors or less."},
{ "NSMSG_PASSWORD_SHORT", "Your password must be at least %lu characters long." },
{ "NSMSG_PASSWORD_ACCOUNT", "Your password may not be the same as your account name." },
- { "NSMSG_PASSWORD_DICTIONARY", "Your password should not be the word \"password\", or any other dictionary word." },
+ { "NSMSG_PASSWORD_DICTIONARY", "Your password is too simple. You must choose a password that is not just a word or name." },
{ "NSMSG_PASSWORD_READABLE", "Your password must have at least %lu digit(s), %lu capital letter(s), and %lu lower-case letter(s)." },
{ "NSMSG_PARTIAL_REGISTER", "Account has been registered to you; nick was already registered to someone else." },
{ "NSMSG_OREGISTER_VICTIM", "%s has registered a new account for you (named %s)." },
{ "NSMSG_COOKIE_LIVE", "Account $b%s$b already has a cookie active. Please either finish using that cookie, wait for it to expire, or auth to the account and use the $bdelcookie$b command." },
{ "NSMSG_EMAIL_UNACTIVATED", "That email address already has an unused cookie outstanding. Please use the cookie or wait for it to expire." },
{ "NSMSG_NO_COOKIE", "Your account does not have any cookie issued right now." },
+ { "NSMSG_NO_COOKIE_FOREIGN", "The account $b%s$b does not have any cookie issued right now." },
{ "NSMSG_CANNOT_COOKIE", "You cannot use that kind of cookie when you are logged in." },
{ "NSMSG_BAD_COOKIE", "That cookie is not the right one. Please make sure you are copying it EXACTLY from the email; it is case-sensitive, so $bABC$b is different from $babc$b." },
{ "NSMSG_HANDLE_ACTIVATED", "Your account is now activated (with the password you entered when you registered). You are now authenticated to your account." },
{ "NSMSG_BAD_COOKIE_TYPE", "Your account had bad cookie type %d; sorry. I am confused. Please report this bug." },
{ "NSMSG_MUST_TIME_OUT", "You must wait for cookies of that type to time out." },
{ "NSMSG_ATE_COOKIE", "I ate the cookie for your account. You may now have another." },
+ { "NSMSG_ATE_FOREIGN_COOKIE", "I ate the cookie for account $b%s$b. It may now have another." },
{ "NSMSG_USE_RENAME", "You are already authenticated to account $b%s$b -- contact the support staff to rename your account." },
{ "NSMSG_ALREADY_REGISTERING", "You have already used $bREGISTER$b once this session; you may not use it again." },
{ "NSMSG_REGISTER_BAD_NICKMASK", "Could not recognize $b%s$b as either a current nick or a hostmask." },
{ "NSMSG_TITLE_INVALID", "Titles cannot contain any dots; please choose another." },
{ "NSMSG_TITLE_TRUNCATED", "That title combined with the user's account name would result in a truncated host; please choose a shorter title." },
{ "NSMSG_FAKEHOST_INVALID", "Fake hosts must be shorter than %d characters and cannot start with a dot." },
- { "NSMSG_HANDLEINFO_ON", "Account information for $b%s$b:" },
- { "NSMSG_HANDLEINFO_ID", " Account ID: %lu" },
- { "NSMSG_HANDLEINFO_REGGED", " Registered on: %s" },
- { "NSMSG_HANDLEINFO_LASTSEEN", " Last seen: %s" },
- { "NSMSG_HANDLEINFO_LASTSEEN_NOW", " Last seen: Right now!" },
- { "NSMSG_HANDLEINFO_VACATION", " On vacation." },
- { "NSMSG_HANDLEINFO_EMAIL_ADDR", " Email address: %s" },
- { "NSMSG_HANDLEINFO_COOKIE_ACTIVATION", " Cookie: There is currently an activation cookie issued for this account" },
- { "NSMSG_HANDLEINFO_COOKIE_PASSWORD", " Cookie: There is currently a password change cookie issued for this account" },
- { "NSMSG_HANDLEINFO_COOKIE_EMAIL", " Cookie: There is currently an email change cookie issued for this account" },
- { "NSMSG_HANDLEINFO_COOKIE_ALLOWAUTH", " Cookie: There is currently an allowauth cookie issued for this account" },
- { "NSMSG_HANDLEINFO_COOKIE_UNKNOWN", " Cookie: There is currently an unknown cookie issued for this account" },
- { "NSMSG_HANDLEINFO_INFOLINE", " Infoline: %s" },
- { "NSMSG_HANDLEINFO_FLAGS", " Flags: %s" },
- { "NSMSG_HANDLEINFO_EPITHET", " Epithet: %s" },
- { "NSMSG_HANDLEINFO_FAKEHOST", " Fake host: %s" },
- { "NSMSG_HANDLEINFO_LAST_HOST", " Last quit hostmask: %s" },
- { "NSMSG_HANDLEINFO_LAST_HOST_UNKNOWN", " Last quit hostmask: Unknown" },
- { "NSMSG_HANDLEINFO_NICKS", " Nickname(s): %s" },
- { "NSMSG_HANDLEINFO_MASKS", " Hostmask(s): %s" },
- { "NSMSG_HANDLEINFO_CHANNELS", " Channel(s): %s" },
- { "NSMSG_HANDLEINFO_CURRENT", " Current nickname(s): %s" },
- { "NSMSG_HANDLEINFO_DNR", " Do-not-register (by %s): %s" },
+ { "NSMSG_HANDLEINFO_ON", "$bAccount Information for %s$b" },
+ { "NSMSG_HANDLEINFO_END", "----------End of Account Info-----------" },
+ { "NSMSG_HANDLEINFO_ID", "Account ID: %lu" },
+ { "NSMSG_HANDLEINFO_REGGED", "Registered on: %s" },
+ { "NSMSG_HANDLEINFO_LASTSEEN", "Last seen: %s" },
+ { "NSMSG_HANDLEINFO_LASTSEEN_NOW", "Last seen: Right now!" },
+ { "NSMSG_HANDLEINFO_VACATION", "On vacation." },
+ { "NSMSG_HANDLEINFO_EMAIL_ADDR", "Email address: %s" },
+ { "NSMSG_HANDLEINFO_COOKIE_ACTIVATION", "Cookie: There is currently an activation cookie issued for this account" },
+ { "NSMSG_HANDLEINFO_COOKIE_PASSWORD", "Cookie: There is currently a password change cookie issued for this account" },
+ { "NSMSG_HANDLEINFO_COOKIE_EMAIL", "Cookie: There is currently an email change cookie issued for this account" },
+ { "NSMSG_HANDLEINFO_COOKIE_ALLOWAUTH", "Cookie: There is currently an allowauth cookie issued for this account" },
+ { "NSMSG_HANDLEINFO_COOKIE_UNKNOWN", "Cookie: There is currently an unknown cookie issued for this account" },
+ { "NSMSG_HANDLEINFO_INFOLINE", "Infoline: %s" },
+ { "NSMSG_HANDLEINFO_FLAGS", "Flags: %s" },
+ { "NSMSG_HANDLEINFO_EPITHET", "Epithet: %s" },
+ { "NSMSG_HANDLEINFO_FAKEHOST", "Fake host: %s" },
+ { "NSMSG_HANDLEINFO_LAST_HOST", "Last quit hostmask: %s" },
+ { "NSMSG_HANDLEINFO_LAST_HOST_UNKNOWN", "Last quit hostmask: Unknown" },
+ { "NSMSG_HANDLEINFO_NICKS", "Nickname(s): %s" },
+ { "NSMSG_HANDLEINFO_MASKS", "Hostmask(s): %s" },
+ { "NSMSG_HANDLEINFO_CHANNELS", "Channel(s): %s" },
+ { "NSMSG_HANDLEINFO_CURRENT", "Current nickname(s): %s" },
+ { "NSMSG_HANDLEINFO_DNR", "Do-not-register (by %s): %s" },
{ "NSMSG_USERINFO_AUTHED_AS", "$b%s$b is authenticated to account $b%s$b." },
{ "NSMSG_USERINFO_NOT_AUTHED", "$b%s$b is not authenticated to any account." },
{ "NSMSG_NICKINFO_OWNER", "Nick $b%s$b is owned by account $b%s$b." },
{ "NSMSG_RECLAIMED_SVSNICK", "Forcibly changed %s's nick." },
{ "NSMSG_RECLAIMED_KILL", "Disconnected %s from the network." },
{ "NSMSG_CLONE_AUTH", "Warning: %s (%s@%s) authed to your account." },
- { "NSMSG_SETTING_LIST", "$b$N account settings:$b" },
+ { "NSMSG_SETTING_LIST", "$b$N account settings$b" },
+ { "NSMSG_SETTING_LIST_HEADER", "----------------------------------------" },
+ { "NSMSG_SETTING_LIST_END", "-------------End Of Settings------------" },
{ "NSMSG_INVALID_OPTION", "$b%s$b is an invalid account setting." },
{ "NSMSG_INVALID_ANNOUNCE", "$b%s$b is an invalid announcements value." },
{ "NSMSG_SET_INFO", "$bINFO: $b%s" },
{ "NSMSG_SET_TITLE", "$bTITLE: $b%s" },
{ "NSMSG_SET_FAKEHOST", "$bFAKEHOST: $b%s" },
{ "NSEMAIL_ACTIVATION_SUBJECT", "Account verification for %s" },
- { "NSEMAIL_ACTIVATION_BODY", "This email has been sent to verify that this email address belongs to the person who tried to register an account on %1$s. Your cookie is:\n %2$s\nTo verify your email address and complete the account registration, log on to %1$s and type the following command:\n /msg %3$s@%4$s COOKIE %5$s %2$s\nThis command is only used once to complete your account registration, and never again. Once you have run this command, you will need to authenticate everytime you reconnect to the network. To do this, you will have to type this command every time you reconnect:\n /msg %3$s@%4$s AUTH %5$s your-password\n Please remember to fill in 'your-password' with the actual password you gave to us when you registered.\n\nIf you did NOT request this account, you do not need to do anything. Please contact the %1$s staff if you have questions, and be sure to check our website." },
+ { "NSEMAIL_ACTIVATION_BODY",
+ "This email has been sent to verify that this email address belongs to the person who tried to register an account on %1$s. Your cookie is:\n"
+ "%2$s\n"
+ "To verify your email address and complete the account registration, log on to %1$s and type the following command:\n"
+ "/msg %3$s@%4$s COOKIE %5$s %2$s\n"
+ "This command is only used once to complete your account registration, and never again. Once you have run this command, you will need to authenticate everytime you reconnect to the network. To do this, you will have to type this command every time you reconnect:\n"
+ "/msg %3$s@%4$s AUTH %5$s your-password\n"
+ "(Please remember to fill in 'your-password' with the actual password you gave to us when you registered.)\n"
+ "OR configure Login-On-Connect (see http://www.afternet.org/login-on-connect for instructions) to connect pre-logged in every time.\n"
+ "\n"
+ "If you did NOT request this account, you do not need to do anything.\n"
+ "Please contact the %1$s staff if you have questions, and be sure to check our website." },
+ { "NSEMAIL_ACTIVATION_BODY_WEB",
+ "This email has been sent to verify that this email address belongs to the person who tried to register an account on %1$s. Your cookie is:\n"
+ "%2$s\n"
+ "To verify your email address and complete the account registration, visit the following URL:\n"
+ "http://www.afternet.org/index.php?option=com_registration&task=activate&username=%5$s&cookie=%2$s\n"
+ "\n"
+ "If you did NOT request this account, you do not need to do anything.\n"
+ "Please contact the %1$s staff if you have questions, and be sure to check our website." },
{ "NSEMAIL_PASSWORD_CHANGE_SUBJECT", "Password change verification on %s" },
- { "NSEMAIL_PASSWORD_CHANGE_BODY", "This email has been sent to verify that you wish to change the password on your account %5$s. Your cookie is %2$s.\nTo complete the password change, log on to %1$s and type the following command:\n /msg %3$s@%4$s COOKIE %5$s %2$s\nIf you did NOT request your password to be changed, you do not need to do anything. Please contact the %1$s staff if you have questions." },
+ { "NSEMAIL_PASSWORD_CHANGE_BODY",
+ "This email has been sent to verify that you wish to change the password on your account %5$s. Your cookie is %2$s.\n"
+ "To complete the password change, log on to %1$s and type the following command:\n"
+ "/msg %3$s@%4$s COOKIE %5$s %2$s\n"
+ "If you did NOT request your password to be changed, you do not need to do anything.\n"
+ "Please contact the %1$s staff if you have questions." },
+ { "NSEMAIL_PASSWORD_CHANGE_BODY_WEB",
+ "This email has been sent to verify that you wish to change the password on your account %5$s. Your cookie is %2$s.\n"
+ "To complete the password change, click the following URL:\n"
+ "http://www.afternet.org/index.php?option=com_registration&task=passcookie&username=%5$s&cookie=%2$s\n"
+ "If you did NOT request your password to be changed, you do not need to do anything.\n"
+ "Please contact the %1$s staff if you have questions." },
{ "NSEMAIL_EMAIL_CHANGE_SUBJECT", "Email address change verification for %s" },
+#ifdef stupid_verify_old_email
{ "NSEMAIL_EMAIL_CHANGE_BODY_NEW", "This email has been sent to verify that your email address belongs to the same person as account %5$s on %1$s. The SECOND HALF of your cookie is %2$.*6$s.\nTo verify your address as associated with this account, log on to %1$s and type the following command:\n /msg %3$s@%4$s COOKIE %5$s ?????%2$.*6$s\n(Replace the ????? with the FIRST HALF of the cookie, as sent to your OLD email address.)\nIf you did NOT request this email address to be associated with this account, you do not need to do anything. Please contact the %1$s staff if you have questions." },
{ "NSEMAIL_EMAIL_CHANGE_BODY_OLD", "This email has been sent to verify that you want to change your email for account %5$s on %1$s from this address to %7$s. The FIRST HALF of your cookie is %2$.*6$s\nTo verify your new address as associated with this account, log on to %1$s and type the following command:\n /msg %3$s@%4$s COOKIE %5$s %2$.*6$s?????\n(Replace the ????? with the SECOND HALF of the cookie, as sent to your NEW email address.)\nIf you did NOT request this change of email address, you do not need to do anything. Please contact the %1$s staff if you have questions." },
+#endif
{ "NSEMAIL_EMAIL_VERIFY_SUBJECT", "Email address verification for %s" },
{ "NSEMAIL_EMAIL_VERIFY_BODY", "This email has been sent to verify that this address belongs to the same person as %5$s on %1$s. Your cookie is %2$s.\nTo verify your address as associated with this account, log on to %1$s and type the following command:\n /msg %3$s@%4$s COOKIE %5$s %2$s\nIf you did NOT request this email address to be associated with this account, you do not need to do anything. Please contact the %1$s staff if you have questions." },
{ "NSEMAIL_ALLOWAUTH_SUBJECT", "Authentication allowed for %s" },
unsigned int default_hostmask : 1;
unsigned int warn_nick_owned : 1;
unsigned int warn_clone_auth : 1;
+ unsigned int sync_log : 1;
unsigned long nicks_per_handle;
unsigned long password_min_length;
unsigned long password_min_digits;
else
send_message(notify, nickserv, "NSMSG_UNREGISTER_NICKS_SUCCESS", hi->handle);
}
+
+ if (nickserv_conf.sync_log)
+ SyncLog("UNREGISTER %s", hi->handle);
+
dict_remove(nickserv_handle_dict, hi->handle);
}
timeq_add(cookie->expires, nickserv_free_cookie, cookie);
}
+/* Contributed by the great sneep of afternet ;) */
+/* Since this gets used in a URL, we want to avoid stuff that confuses
+ * email clients such as ] and ?. a-z, 0-9 only.
+ */
+void genpass(char *str, int len)
+{
+ int i = 0;
+ char c = 0;
+
+ for(i = 0; i < len; i++)
+ {
+ do
+ {
+ c = (char)((float)rand() / (float)RAND_MAX * (float)256);
+ } while(!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')));
+ str[i] = c;
+ }
+ str[i] = '\0';
+ return;
+}
+
static void
-nickserv_make_cookie(struct userNode *user, struct handle_info *hi, enum cookie_type type, const char *cookie_data)
+nickserv_make_cookie(struct userNode *user, struct handle_info *hi, enum cookie_type type, const char *cookie_data, int weblink)
{
struct handle_cookie *cookie;
char subject[128], body[4096], *misc;
cookie->hi = hi;
cookie->type = type;
cookie->data = cookie_data ? strdup(cookie_data) : NULL;
+
cookie->expires = now + nickserv_conf.cookie_timeout;
- inttobase64(cookie->cookie, rand(), 5);
- inttobase64(cookie->cookie+5, rand(), 5);
+ /* Adding dedicated password gen function for more control -Rubin */
+ genpass(cookie->cookie, 10);
+ /*
+ *inttobase64(cookie->cookie, rand(), 5);
+ *inttobase64(cookie->cookie+5, rand(), 5);
+ */
netname = nickserv_conf.network_name;
subject[0] = 0;
send_message(user, nickserv, "NSMSG_USE_COOKIE_REGISTER");
fmt = handle_find_message(hi, "NSEMAIL_ACTIVATION_SUBJECT");
snprintf(subject, sizeof(subject), fmt, netname);
- fmt = handle_find_message(hi, "NSEMAIL_ACTIVATION_BODY");
+
+ if(weblink)
+ fmt = handle_find_message(hi, "NSEMAIL_ACTIVATION_BODY_WEB");
+ else
+ fmt = handle_find_message(hi, "NSEMAIL_ACTIVATION_BODY");
+
snprintf(body, sizeof(body), fmt, netname, cookie->cookie, nickserv->nick, self->name, hi->handle);
first_time = 1;
break;
send_message(user, nickserv, "NSMSG_USE_COOKIE_RESETPASS");
fmt = handle_find_message(hi, "NSEMAIL_PASSWORD_CHANGE_SUBJECT");
snprintf(subject, sizeof(subject), fmt, netname);
- fmt = handle_find_message(hi, "NSEMAIL_PASSWORD_CHANGE_BODY");
+ if(weblink)
+ fmt = handle_find_message(hi, "NSEMAIL_PASSWORD_CHANGE_BODY_WEB");
+ else
+ fmt = handle_find_message(hi, "NSEMAIL_PASSWORD_CHANGE_BODY");
snprintf(body, sizeof(body), fmt, netname, cookie->cookie, nickserv->nick, self->name, hi->handle);
break;
case EMAIL_CHANGE:
misc = hi->email_addr;
hi->email_addr = cookie->data;
+#ifdef stupid_verify_old_email
if (misc) {
send_message(user, nickserv, "NSMSG_USE_COOKIE_EMAIL_2");
fmt = handle_find_message(hi, "NSEMAIL_EMAIL_CHANGE_SUBJECT");
fmt = handle_find_message(hi, "NSEMAIL_EMAIL_CHANGE_BODY_OLD");
snprintf(body, sizeof(body), fmt, netname, cookie->cookie, nickserv->nick, self->name, hi->handle, COOKIELEN/2, hi->email_addr);
} else {
+#endif
send_message(user, nickserv, "NSMSG_USE_COOKIE_EMAIL_1");
fmt = handle_find_message(hi, "NSEMAIL_EMAIL_VERIFY_SUBJECT");
snprintf(subject, sizeof(subject), fmt, netname);
snprintf(body, sizeof(body), fmt, netname, cookie->cookie, nickserv->nick, self->name, hi->handle);
sendmail(nickserv, hi, subject, body, 1);
subject[0] = 0;
+#ifdef stupid_verify_old_email
}
+#endif
hi->email_addr = misc;
break;
case ALLOWAUTH:
{
struct handle_info *hi;
const char *email_addr, *password;
- int no_auth;
+ char syncpass[MD5_CRYPT_LENGTH];
+ int no_auth, weblink;
if (!IsOper(user) && !dict_size(nickserv_handle_dict)) {
/* Require the first handle registered to belong to someone +o. */
return 0;
}
+
if ((argc >= 4) && nickserv_conf.email_enabled) {
struct handle_info_list *hil;
const char *str;
password = argv[2];
argv[2] = "****";
+ /* Webregister hack - send URL instead of IRC cookie
+ * commands in email
+ */
+ if((argc >= 5) && !strcmp(argv[4],"WEBLINK"))
+ weblink = 1;
+ else
+ weblink = 0;
if (!(hi = nickserv_register(user, user, argv[1], password, no_auth)))
return 0;
/* Add any masks they should get. */
/* If they need to do email verification, tell them. */
if (no_auth)
- nickserv_make_cookie(user, hi, ACTIVATION, hi->passwd);
+ nickserv_make_cookie(user, hi, ACTIVATION, hi->passwd, weblink);
/* Set registering flag.. */
user->modes |= FLAGS_REGISTERING;
+ if (nickserv_conf.sync_log) {
+ cryptpass(password, syncpass);
+ /*
+ * An 0 is only sent if theres no email address. Thios should only happen if email functions are
+ * disabled which they wont be for us. Email Required MUST be set on if you are using this.
+ * -SiRVulcaN
+ */
+ SyncLog("REGISTER %s %s %s %s", hi->handle, syncpass, email_addr ? email_addr : "0", user->info);
+ }
+ process_adduser_pending(user);
+
return 1;
}
nsmsg_none = handle_find_message(hi, "MSG_NONE");
reply("NSMSG_HANDLEINFO_ON", hi->handle);
+ reply("MSG_BAR");
#ifdef WITH_PROTOCOL_BAHAMUT
reply("NSMSG_HANDLEINFO_ID", hi->id);
#endif
reply("NSMSG_HANDLEINFO_DNR", dnr->setter, dnr->reason);
if (!oper_outranks(user, hi))
return 1;
- } else if (hi != user->handle_info)
+ } else if (hi != user->handle_info) {
+ reply("NSMSG_HANDLEINFO_END");
return 1;
+ }
if (nickserv_conf.email_enabled)
reply("NSMSG_HANDLEINFO_EMAIL_ADDR", visible_email_addr(user, hi));
}
if (IsUserSuspended(channel))
buff[pos++] = '-';
- pos += sprintf(buff+pos, "%d:%s ", channel->access, name);
+ pos += sprintf(buff+pos, "%s:%s ", user_level_name_from_level(channel->access), name);
if (next == NULL) {
print_chans_buff:
buff[pos-1] = 0;
}
}
+ reply("NSMSG_HANDLEINFO_END");
return 1;
}
if (hi->passwd[0] != '$')
cryptpass(passwd, hi->passwd);
reply("NSMSG_AUTH_SUCCESS");
+
+ process_adduser_pending(user);
argv[pw_arg] = "****";
return 1;
}
reply("MSG_SET_EMAIL_ADDR");
return 0;
}
- nickserv_make_cookie(user, hi, ALLOWAUTH, NULL);
+ nickserv_make_cookie(user, hi, ALLOWAUTH, NULL, 0);
return 1;
}
return 1;
}
+static NICKSERV_FUNC(cmd_odelcookie)
+{
+ struct handle_info *hi;
+
+ NICKSERV_MIN_PARMS(2);
+
+ if (!(hi = get_victim_oper(user, argv[1])))
+ return 0;
+
+ if (!hi->cookie) {
+ reply("NSMSG_NO_COOKIE_FOREIGN", hi->handle);
+ return 0;
+ }
+
+ nickserv_eat_cookie(hi->cookie);
+ reply("NSMSG_ATE_FOREIGN_COOKIE", hi->handle);
+
+ return 1;
+}
+
static NICKSERV_FUNC(cmd_resetpass)
{
struct handle_info *hi;
char crypted[MD5_CRYPT_LENGTH];
+ int weblink;
NICKSERV_MIN_PARMS(3);
+ if(argc >= 4 && !strcmp(argv[3], "WEBLINK"))
+ weblink = 1;
+ else
+ weblink = 0;
if (user->handle_info) {
reply("NSMSG_ALREADY_AUTHED", user->handle_info->handle);
return 0;
}
cryptpass(argv[2], crypted);
argv[2] = "****";
- nickserv_make_cookie(user, hi, PASSWORD_CHANGE, crypted);
+ nickserv_make_cookie(user, hi, PASSWORD_CHANGE, crypted, weblink);
return 1;
}
safestrncpy(hi->passwd, hi->cookie->data, sizeof(hi->passwd));
set_user_handle_info(user, hi, 1);
reply("NSMSG_HANDLE_ACTIVATED");
+ if (nickserv_conf.sync_log)
+ SyncLog("ACCOUNTACC %s", hi->handle);
break;
case PASSWORD_CHANGE:
set_user_handle_info(user, hi, 1);
safestrncpy(hi->passwd, hi->cookie->data, sizeof(hi->passwd));
reply("NSMSG_PASSWORD_CHANGED");
+ if (nickserv_conf.sync_log)
+ SyncLog("PASSCHANGE %s %s", hi->handle, hi->passwd);
break;
case EMAIL_CHANGE:
+ if (!hi->email_addr && nickserv_conf.sync_log) {
+ /*
+ * This should only happen if an OREGISTER was sent. Require
+ * email must be enabled! - SiRVulcaN
+ */
+ SyncLog("REGISTER %s %s %s %s", hi->handle, hi->passwd, hi->cookie->data, user->info);
+ }
nickserv_set_email_addr(hi, hi->cookie->data);
reply("NSMSG_EMAIL_CHANGED");
+ if (nickserv_conf.sync_log)
+ SyncLog("EMAILCHANGE %s %s", hi->handle, hi->cookie->data);
break;
case ALLOWAUTH:
set_user_handle_info(user, hi, 1);
return 0;
}
cryptpass(new_pass, hi->passwd);
+ if (nickserv_conf.sync_log)
+ SyncLog("PASSCHANGE %s %s", hi->handle, hi->passwd);
argv[1] = "****";
reply("NSMSG_PASS_SUCCESS");
return 1;
option_func_t *opt;
unsigned int i;
char *set_display[] = {
- "INFO", "WIDTH", "TABLEWIDTH", "COLOR", "PRIVMSG", "STYLE",
- "EMAIL", "ANNOUNCEMENTS", "MAXLOGINS", "LANGUAGE"
+ "INFO", "WIDTH", "TABLEWIDTH", "COLOR", "PRIVMSG", /* "STYLE", */
+ "EMAIL", "ANNOUNCEMENTS", "MAXLOGINS", "LANGUAGE",
+ "FAKEHOST", "TITLE", "EPITHET"
};
send_message(user, nickserv, "NSMSG_SETTING_LIST");
+ send_message(user, nickserv, "NSMSG_SETTING_LIST_HEADER");
/* Do this so options are presented in a consistent order. */
for (i = 0; i < ArrayLength(set_display); ++i)
if ((opt = dict_find(nickserv_opt_dict, set_display[i], NULL)))
opt(user, hi, override, 0, NULL);
+ send_message(user, nickserv, "NSMSG_SETTING_LIST_END");
}
static NICKSERV_FUNC(cmd_set)
return 1;
}
+/*
static OPTION_FUNC(opt_style)
{
char *style;
send_message(user, nickserv, "NSMSG_SET_STYLE", style);
return 1;
}
+*/
static OPTION_FUNC(opt_announcements)
{
if (hi->email_addr && !irccasecmp(hi->email_addr, argv[1]))
send_message(user, nickserv, "NSMSG_EMAIL_SAME");
else if (!override)
- nickserv_make_cookie(user, hi, EMAIL_CHANGE, argv[1]);
+ nickserv_make_cookie(user, hi, EMAIL_CHANGE, argv[1], 0);
else {
nickserv_set_email_addr(hi, argv[1]);
if (hi->cookie)
static OPTION_FUNC(opt_epithet)
{
- if (!override) {
- send_message(user, nickserv, "MSG_SETTING_PRIVILEGED", argv[0]);
- return 0;
- }
-
if ((argc > 1) && oper_has_access(user, nickserv, nickserv_conf.set_epithet_level, 0)) {
- char *epithet = unsplit_string(argv+1, argc-1, NULL);
+ char *epithet;
+ if (!override) {
+ send_message(user, nickserv, "MSG_SETTING_PRIVILEGED", argv[0]);
+ return 0;
+ }
+
+ epithet = unsplit_string(argv+1, argc-1, NULL);
+
if (hi->epithet)
free(hi->epithet);
if ((epithet[0] == '*') && !epithet[1])
{
const char *title;
- if (!override) {
- send_message(user, nickserv, "MSG_SETTING_PRIVILEGED", argv[0]);
- return 0;
- }
-
if ((argc > 1) && oper_has_access(user, nickserv, nickserv_conf.set_title_level, 0)) {
+ if (!override) {
+ send_message(user, nickserv, "MSG_SETTING_PRIVILEGED", argv[0]);
+ return 0;
+ }
+
title = argv[1];
if (strchr(title, '.')) {
send_message(user, nickserv, "NSMSG_TITLE_INVALID");
{
const char *fake;
- if (!override) {
- send_message(user, nickserv, "MSG_SETTING_PRIVILEGED", argv[0]);
- return 0;
- }
-
if ((argc > 1) && oper_has_access(user, nickserv, nickserv_conf.set_fakehost_level, 0)) {
+ if (!override) {
+ send_message(user, nickserv, "MSG_SETTING_PRIVILEGED", argv[0]);
+ return 0;
+ }
+
fake = argv[1];
if ((strlen(fake) > HOSTLEN) || (fake[0] == '.')) {
send_message(user, nickserv, "NSMSG_FAKEHOST_INVALID", HOSTLEN);
if (hi_from->lastseen > hi_to->lastseen)
hi_to->lastseen = hi_from->lastseen;
+ /* Does a fakehost carry over? (This intentionally doesn't set it
+ * for users previously attached to hi_to. They'll just have to
+ * reconnect.)
+ */
+ if (hi_from->fakehost && !hi_to->fakehost)
+ hi_to->fakehost = strdup(hi_from->fakehost);
+
/* Notify of success. */
sprintf(buffer, "%s (%s) merged account %s into %s.", user->nick, user->handle_info->handle, hi_from->handle, hi_to->handle);
reply("NSMSG_HANDLES_MERGED", hi_from->handle, hi_to->handle);
nickserv_conf.email_visible_level = str ? strtoul(str, NULL, 0) : 800;
str = database_get_data(conf_node, KEY_EMAIL_ENABLED, RECDB_QSTRING);
nickserv_conf.email_enabled = str ? enabled_string(str) : 0;
+ str = database_get_data(conf_node, KEY_SYNC_LOG, RECDB_QSTRING);
+ nickserv_conf.sync_log = str ? enabled_string(str) : 0;
str = database_get_data(conf_node, KEY_COOKIE_TIMEOUT, RECDB_QSTRING);
nickserv_conf.cookie_timeout = str ? ParseInterval(str) : 24*3600;
str = database_get_data(conf_node, KEY_EMAIL_REQUIRED, RECDB_QSTRING);
{
struct handle_info *hi;
char *colon;
- time_t timestamp;
-
#ifdef WITH_PROTOCOL_P10
+ time_t timestamp = 0;
+
+ colon = strchr(stamp, ':');
+ if(colon && colon[1])
+ {
+ *colon = 0;
+ timestamp = atoi(colon+1);
+ }
hi = dict_find(nickserv_handle_dict, stamp, NULL);
+ if(hi && timestamp && hi->registered != timestamp)
+ {
+ log_module(MAIN_LOG, LOG_WARNING, "%s using account %s but timestamp does not match %lu is not %lu.", user->nick, stamp, timestamp, hi->registered);
+ return;
+ }
#else
hi = dict_find(nickserv_id_dict, stamp, NULL);
+ log_module(MAIN_LOG, LOG_WARNING, "Using non-P10 code in accounts, not tested at all!");
#endif
if (hi) {
- colon = strchr(stamp, ':');
- if(colon && colon[1])
- {
- *colon = 0;
- timestamp = atoi(colon+1);
- if(hi->registered != timestamp)
- {
- log_module(MAIN_LOG, LOG_WARNING, "%s using account %s but timestamp does not match %lu is not %lu.", user->nick, stamp, timestamp, hi->registered);
- return;
- }
- }
-
if (HANDLE_FLAGGED(hi, SUSPENDED)) {
return;
}
nickserv_define_func("RESETPASS", cmd_resetpass, -1, 0, 0);
nickserv_define_func("COOKIE", cmd_cookie, -1, 0, 0);
nickserv_define_func("DELCOOKIE", cmd_delcookie, -1, 1, 0);
+ nickserv_define_func("ODELCOOKIE", cmd_odelcookie, 0, 1, 0);
dict_insert(nickserv_opt_dict, "EMAIL", opt_email);
}
nickserv_define_func("GHOST", cmd_ghost, -1, 1, 0);
dict_insert(nickserv_opt_dict, "TABLEWIDTH", opt_tablewidth);
dict_insert(nickserv_opt_dict, "COLOR", opt_color);
dict_insert(nickserv_opt_dict, "PRIVMSG", opt_privmsg);
- dict_insert(nickserv_opt_dict, "STYLE", opt_style);
+/* dict_insert(nickserv_opt_dict, "STYLE", opt_style); */
dict_insert(nickserv_opt_dict, "PASS", opt_password);
dict_insert(nickserv_opt_dict, "PASSWORD", opt_password);
dict_insert(nickserv_opt_dict, "FLAGS", opt_flags);