Example #1
0
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'])
Example #2
0
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)
Example #3
0
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'])
Example #4
0
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})
Example #5
0
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
    })
Example #6
0
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)
Example #7
0
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)