if(!strcmp(argv[2],"C"))
{
- if((hi = loc_auth(argv[4], argv[5], NULL)))
+ if((hi = loc_auth(NULL, argv[4], argv[5], NULL)))
{
/* Return a AC A */
putsock("%s " P10_ACCOUNT " %s A %s "FMT_TIME_T, self->numeric, server->numeric , argv[3], hi->registered);
}
else if(!strcmp(argv[2],"H")) /* New enhanced (host) version of C */
{
- if((hi = loc_auth(argv[5], argv[6], argv[4] )))
+ if((hi = loc_auth(NULL, argv[5], argv[6], argv[4] )))
+ {
+ /* Return a AC A */
+ putsock("%s " P10_ACCOUNT " %s A %s "FMT_TIME_T, self->numeric, server->numeric , argv[3], hi->registered);
+ }
+ else
+ {
+ /* Return a AC D */
+ putsock("%s " P10_ACCOUNT " %s D %s", self->numeric, server->numeric , argv[3]);
+ }
+ return 1;
+ }
+ else if(!strcmp(argv[2],"S"))
+ {
+ if((hi = loc_auth(argv[5], argv[6], argv[7], argv[4])))
{
/* Return a AC A */
putsock("%s " P10_ACCOUNT " %s A %s "FMT_TIME_T, self->numeric, server->numeric , argv[3], hi->registered);
for (tmp = x3_strtok(&p, argv[i], ","); tmp;
tmp = x3_strtok(&p, NULL, ",")) {
if (!strcmp(tmp, "PRIV_NONE")) {
- clear_privs(user);
+ if (now > user->timestamp+5)
+ clear_privs(user);
break;
} else
client_modify_priv_by_name(user, tmp, what);
}
else if(!strcasecmp(argv[2], "CVERSION")) {
- /* DNSBL_DATA name */
+ /* CTCP VERSION mark */
target = GetUserH(argv[1]);
if(!target) {
log_module(MAIN_LOG, LOG_ERROR, "Unable to find user %s whose version mark is changing.", argv[1]);
return 1;
}
+ else if(!strcasecmp(argv[2], "SSLCLIFP")) {
+ /* SSL fingerprint mark */
+ target = GetUserH(argv[1]);
+ if(!target) {
+ log_module(MAIN_LOG, LOG_ERROR, "Unable to find user %s whose SSL fingerprint mark is changing.", argv[1]);
+ return 0;
+ }
+
+ char *sslfp = unsplit_string(argv + 3, argc - 3, NULL);
+ if(!sslfp)
+ sslfp = "";
+
+ target->sslfp = strdup(sslfp);
+
+ return 1;
+ }
/* unknown type of mark */
return 1;
}
}
static void
-parse_cleanup(void)
+parse_cleanup(UNUSED_ARG(void *extra))
{
unsigned int nn;
free(of_list);
+ free(of_list_extra);
free(privmsg_funcs);
num_privmsg_funcs = 0;
free(notice_funcs);
}
static void
-remove_unbursted_channel(struct chanNode *cNode) {
+remove_unbursted_channel(struct chanNode *cNode, UNUSED_ARG(void *extra)) {
if (unbursted_channels)
dict_remove(unbursted_channels, cNode->name);
}
memset(notice_funcs, 0, sizeof(privmsg_func_t)*num_notice_funcs);
userList_init(&dead_users);
- reg_del_channel_func(remove_unbursted_channel);
- reg_exit_func(parse_cleanup);
+ reg_del_channel_func(remove_unbursted_channel, NULL);
+ reg_exit_func(parse_cleanup, NULL);
// reg_notice_func(opserv, check_ctcp);
}
tstr = conf_get_data("server/type", RECDB_QSTRING);
type = atoi(tstr);
- if (type > 6) {
+ if (type == 7) {
if (irc_in_addr_is_ipv4(uNode->ip)) {
make_virtip((char*)irc_ntoa(&uNode->ip), (char*)irc_ntoa(&uNode->ip), uNode->cryptip);
make_virthost((char*)irc_ntoa(&uNode->ip), uNode->hostname, uNode->crypthost);
}
if (IsLocal(uNode))
irc_user(uNode);
- if (!uNode->dead)
- call_new_user_funcs(uNode);
+ call_new_user_funcs(uNode);
if ((uNode->loc == 1) && (uNode->handle_info))
send_func_list(uNode);
void
DelUser(struct userNode* user, struct userNode *killer, int announce, const char *why)
{
- unsigned int n;
verify(user);
/* Call these in reverse order so ChanServ can update presence
information before NickServ nukes the handle_info. */
- for (n = duf_used; n > 0; )
- duf_list[--n](user, killer, why);
+ call_del_user_funcs(user, killer, why);
user->uplink->clients--;
user->uplink->users[user->num_local] = NULL;
user->version_reply = NULL;
}
+ /* Clean up SSL fingerprint data */
+ if(user->sslfp) {
+ free(user->sslfp);
+ user->sslfp = NULL;
+ }
+
/* clean up mark */
if(user->mark) {
free(user->mark);