X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fproto-p10.c;h=29bf7ac7f515cf2f8b14764c47901fdf07fbdb66;hb=d5e8b0339ab451beb8ac6b97211109b02d6c66c8;hp=c1271db0934dfca74cb5f6418ab4c72460016fe1;hpb=573c044e6589b21596f6370dfaa1a863d3179b43;p=srvx.git diff --git a/src/proto-p10.c b/src/proto-p10.c index c1271db..29bf7ac 100644 --- a/src/proto-p10.c +++ b/src/proto-p10.c @@ -2557,7 +2557,7 @@ keyncpy(char output[], char input[], size_t output_size) } struct mod_chanmode * -mod_chanmode_parse(struct chanNode *channel, char **modes, unsigned int argc, unsigned int flags, short base_oplevel) +mod_chanmode_parse(struct chanNode *channel, struct userNode *user, char **modes, unsigned int argc, unsigned int flags, short base_oplevel) { struct mod_chanmode *change; unsigned int ii, in_arg, ch_arg, add; @@ -2677,8 +2677,28 @@ mod_chanmode_parse(struct chanNode *channel, char **modes, unsigned int argc, un if (add) { if (in_arg >= argc) goto error; + char *altchan = modes[in_arg++]; + struct chanNode *target; + if(!IsChannelName(altchan) || !(target = GetChannel(altchan))) + goto error; + if(!(flags & MCP_OPERMODE)) { + //check if the user has the permissions to use this channel as target + struct modeNode *mn; + struct userData *uData; + struct chanData *cData; + if(user && (mn = GetUserMode(target, user)) && (mn->modes & MODE_CHANOP)) { + //allow - user is opped on target channel + } else if(user && user->handle_info && + (uData = GetChannelUser(channel->channel_info, user->handle_info)) && + (cData = uData->channel) && + uData->access >= cData->lvlOpts[lvlGiveOps] + ) { + //allow - user has access to get op on the channel + } else + goto error; + } change->modes_set |= MODE_ALTCHAN; - safestrncpy(change->new_altchan, modes[in_arg++], sizeof(change->new_altchan)); + safestrncpy(change->new_altchan, altchan, sizeof(change->new_altchan)); } else { change->modes_clear |= MODE_ALTCHAN; }