def m_MONITOR(cli, ev_msg): command = ev_msg['params'][0].casefold() if command in valid_metadata_subcommands: info = { 'client': cli, 'command': command, } limit = cli.ctx.conf.monitor.get('limit', None) if command == '+' and limit is not None: if len([c for c in cli.monitoring if validate_nick(c)]) + len(ev_msg['params'][1].split(',')) > limit: cli.dump_numeric('734', [cli.nickname, str(limit), ev_msg['params'][1], 'Monitor list is full']) return if command in '-+': targets = [] for target in ev_msg['params'][1].split(','): if not validate_nick(target): continue targets.append(target) info['targets'] = targets eventmgr_core.dispatch(' '.join(['monitor', command]), info) else: cli.dump_numeric(400, ['MONITOR', command, 'Unknown subcommand'])
def m_metadata_clear(info): ctx = get_context() restricted_keys = ctx.conf.metadata.get('restricted_keys', []) source = info['source'] target = info['target'] target_name = info['target_name'] keys = info['keys'] monitor_list = get_monitor_list(source, target) # we dump numerics to the source here instead of in the 'delete' event # below so the 'end of metadata' numeric gets put in the right place for key, kinfo in keys.items(): visibility = kinfo['visibility'] args = [target_name, key, visibility] source.dump_numeric('761', args, add_target=False) # create event to actually remove key and dump notify info = { 'key': key, 'source': source, 'target': target, 'target_name': target_name, 'visibility': visibility, } eventmgr_core.dispatch('metadata delete', info) source.dump_numeric('762', ['end of metadata'], add_target=False)
def m_MONITOR(cli, ev_msg): command = ev_msg['params'][0].casefold() if command in valid_metadata_subcommands: info = { 'client': cli, 'command': command, } limit = cli.ctx.conf.monitor.get('limit', None) if command == '+' and limit is not None: if len([c for c in cli.monitoring if validate_nick(c)]) + len( ev_msg['params'][1].split(',')) > limit: cli.dump_numeric( '734', [str(limit), ev_msg['params'][1], 'Monitor list is full']) return if command in '-+': targets = [] for target in ev_msg['params'][1].split(','): if not validate_nick(target): continue targets.append(target) info['targets'] = targets eventmgr_core.dispatch(' '.join(['monitor', command]), info) else: cli.dump_numeric('400', ['MONITOR', command, 'Unknown subcommand'])
def m_AWAY(cli, ev_msg): message = None # set away if len(ev_msg['params']): message = ev_msg['params'][0] eventmgr_core.dispatch('client away', {'source': cli, 'away': message})
def m_AWAY(cli, ev_msg): message = None # set away if len(ev_msg['params']): message = ev_msg['params'][0] eventmgr_core.dispatch('client away', { 'source': cli, 'away': message })
def metadata_CLEAR(cli, ev_msg, target_name, target): # check user has permission for target if not cli.able_to_edit_metadata(target): cli.dump_numeric('769', [target_name, '*', 'permission denied'], add_target=False) return restricted_keys = cli.ctx.conf.metadata.get('restricted_keys', []) viewable_keys = CaseInsensitiveList() if cli.role: viewable_keys += restricted_keys + cli.role.metakeys_get + cli.role.metakeys_set key_list = {} for key, data in dict(target.metadata).items(): # XXX - make sure user has perms to clear keys via channel ACL # we check keys here because even if a user is clearing their own METADATA, # there may be admin / oper-only / server keys which should not be cleared visibility = '*' if key in restricted_keys: # user cannot see key at all, this is likely a server / oper-only key # so we're not going to even tell them it exists if key not in viewable_keys: continue elif cli.role and key in cli.role.metakeys_set: visibility = 'server:restricted' # if they don't have permission to edit this specific key, just ignore it else: continue key_list[key] = { 'visibility': visibility, } # throw change info = { 'source': cli, 'target': target, 'target_name': target_name, 'keys': key_list, } eventmgr_core.dispatch('metadata clear', info)
def metadata_SET(cli, ev_msg, target_name, target): if len(ev_msg['params']) > 2: key = ev_msg['params'][2] if len(ev_msg['params']) > 3: value = ev_msg['params'][3] else: value = None else: cli.dump_numeric('461', ['METADATA', 'Not enough parameters']) return # check user has permission for target if not cli.able_to_edit_metadata(target): cli.dump_numeric('769', [target_name, '*', 'permission denied'], add_target=False) return restricted_keys = cli.ctx.conf.metadata.get('restricted_keys', []) # check key is valid, and if we're using white/blacklists, check those too whitelist = cli.ctx.conf.metadata.get('whitelist', []) blacklist = cli.ctx.conf.metadata.get('blacklist', []) is_valid = False if validate_metadata_key(key): if key not in blacklist: if key in whitelist or not whitelist or key in restricted_keys: is_valid = True if not is_valid: cli.dump_numeric('767', [key, 'invalid metadata key'], add_target=False) return # check restricted keys key_restricted = False visibility = '*' if key in restricted_keys: if cli.role and key in cli.role.metakeys_set: visibility = 'server:restricted' else: key_restricted = True # XXX - make sure user has privs to set this key through channel ACL if key_restricted: cli.dump_numeric('769', [target_name, key, 'permission denied'], add_target=False) return # if setting a new, non-restricted key, take metadata limits into account # NOTE: we check these here instead of in dispatch handler because we should only # throw valid events, makes more sense to check it before we send the event if value: if key not in target.user_set_metadata and key not in restricted_keys: limit = cli.ctx.conf.metadata.get('limit', None) if limit is not None: if len(target.user_set_metadata) + 1 > limit: cli.dump_numeric('764', [target_name, 'metadata limit reached'], add_target=False) return if not value and key not in target.metadata: cli.dump_numeric('768', [target_name, key, 'key not set'], add_target=False) return # throw change info = { 'key': key, 'value': value, 'source': cli, 'target': target, 'target_name': target_name, 'visibility': visibility, } eventmgr_core.dispatch('metadata set', info)