{"MODCMD_PUBCMD", "Public commands in $b%s$b are restricted."}, /* {ARGS: "#TestChan"} */
{"MODCMD_ACCESS_DENIED", "Access denied."},
{"MODCMD_SUBCOMMANDS", "Subcommands of %s: %s"}, /* {ARGS: "bot", "ADD, DEL, EDIT"} */
+ {"MODCMD_CROSSCHAN", "You must be in %s (or on its userlist) to use this command."},
{NULL, NULL}
};
reply(tmp_text_client, user, "MODCMD_CHAN_REQUIRED");
break;
}
- if((cbind->func->flags & CMDFLAG_CHECK_AUTH) && !(user->flags & USERFLAG_ISAUTHED)) {
+ if(((cbind->func->flags & CMDFLAG_CHECK_AUTH) || (chan && chan != sent_chan && !isUserOnChan(user, chan))) && !(user->flags & USERFLAG_ISAUTHED)) {
//check auth...
struct command_check_user_cache *data = malloc(sizeof(*data));
char **temp_argv = malloc(argc*sizeof(*temp_argv));
MYSQL_RES *res;
MYSQL_ROW row;
int uaccess;
+ char requested_uaccess = 0;
int eventflags = (cbind->func->flags & (CMDFLAG_LOG | CMDFLAG_OPLOG));
if((cbind->func->flags & CMDFLAG_REQUIRE_AUTH) && !(user->flags & USERFLAG_ISAUTHED)) {
reply(tmp_text_client, user, "MODCMD_AUTH_REQUIRED");
return;
}
+ if(chan && sent_chan != chan && !isUserOnChan(user, chan)) {
+ char user_in_chan = 0;
+ if((user->flags & USERFLAG_ISAUTHED)) {
+ //maybe there's another user authed to user->auth on the channel...
+ struct ChanUser *cchanuser;
+ for(cchanuser = getChannelUsers(chan, NULL); cchanuser; cchanuser = getChannelUsers(chan, cchanuser)) {
+ if((cchanuser->user->flags & USERFLAG_ISAUTHED) && !stricmp(user->auth, cchanuser->user->auth)) {
+ user_in_chan = 1;
+ break;
+ }
+ }
+ }
+ if(!user_in_chan) {
+ //check if we are allowed to execute commands in this channel
+ requested_uaccess = 1;
+ uaccess = getChannelAccess(user, chan);
+ if(!uaccess) {
+ reply(tmp_text_client, user, "MODCMD_CROSSCHAN", chan->name);
+ return;
+ }
+ }
+ }
if(sent_chan && sent_chan != chan) {
//check pubcmd of this channel
printf_mysql_query("SELECT `channel_pubcmd` FROM `channels` WHERE `channel_name` = '%s'", escape_string(sent_chan->name));
res = mysql_use();
if ((row = mysql_fetch_row(res)) != NULL) {
- uaccess = getChannelAccess(user, sent_chan);
- if(row[0] && uaccess < atoi(row[0]) && !isGodMode(user)) { //NOTE: HARDCODED DEFAULT: pubcmd = 0
+ int saccess = getChannelAccess(user, sent_chan);
+ if(row[0] && saccess < atoi(row[0]) && !isGodMode(user)) { //NOTE: HARDCODED DEFAULT: pubcmd = 0
reply(tmp_text_client, user, "MODCMD_PUBCMD", sent_chan->name);
return;
}
chan->flags |= CHANFLAG_CHAN_REGISTERED;
chan->channel_id = atoi(row[0]);
if((sent_chan && sent_chan == chan) || access_count || minaccess) {
- uaccess = getChannelAccess(user, chan);
+ if(!requested_uaccess) uaccess = getChannelAccess(user, chan);
if(uaccess < minaccess && isGodMode(user)) {
eventflags |= CMDFLAG_OPLOG;
} else if(uaccess < minaccess) {