Пример #1
0
    def _revoke_rule_args_to_dict(self,
                                  context,
                                  to_port=None,
                                  from_port=None,
                                  ip_protocol=None,
                                  cidr_ip=None,
                                  user_id=None,
                                  source_security_group_name=None,
                                  source_security_group_owner_id=None):

        values = {}

        if source_security_group_name:
            source_project_id = self._get_source_project_id(
                context, source_security_group_owner_id)

            source_security_group = \
                    db.security_group_get_by_name(context.elevated(),
                                                  source_project_id,
                                                  source_security_group_name)
            values['group_id'] = source_security_group['id']
        elif cidr_ip:
            # If this fails, it throws an exception. This is what we want.
            cidr_ip = urllib.unquote(cidr_ip).decode()
            IPy.IP(cidr_ip)
            values['cidr'] = cidr_ip
        else:
            values['cidr'] = '0.0.0.0/0'

        if ip_protocol and from_port and to_port:
            from_port = int(from_port)
            to_port = int(to_port)
            ip_protocol = str(ip_protocol)

            if ip_protocol.upper() not in ['TCP', 'UDP', 'ICMP']:
                raise exception.InvalidIpProtocol(protocol=ip_protocol)
            if ((min(from_port, to_port) < -1)
                    or (max(from_port, to_port) > 65535)):
                raise exception.InvalidPortRange(from_port=from_port,
                                                 to_port=to_port)

            values['protocol'] = ip_protocol
            values['from_port'] = from_port
            values['to_port'] = to_port
        else:
            # If cidr based filtering, protocol and ports are mandatory
            if 'cidr' in values:
                return None

        return values
Пример #2
0
    def _revoke_rule_args_to_dict(self,
                                  context,
                                  to_port=None,
                                  from_port=None,
                                  parent_group_id=None,
                                  ip_protocol=None,
                                  cidr=None,
                                  group_id=None):
        values = {}

        if group_id:
            values['group_id'] = group_id
        elif cidr:
            # If this fails, it throws an exception. This is what we want.
            cidr = urllib.unquote(cidr).decode()
            netaddr.IPNetwork(cidr)
            values['cidr'] = cidr
        else:
            values['cidr'] = '0.0.0.0/0'

        if ip_protocol and from_port and to_port:
            from_port = int(from_port)
            to_port = int(to_port)
            ip_protocol = str(ip_protocol)

            if ip_protocol.upper() not in ['TCP', 'UDP', 'ICMP']:
                raise exception.InvalidIpProtocol(protocol=ip_protocol)
            if ((min(from_port, to_port) < -1)
                    or (max(from_port, to_port) > 65535)):
                raise exception.InvalidPortRange(from_port=from_port,
                                                 to_port=to_port)

            values['protocol'] = ip_protocol
            values['from_port'] = from_port
            values['to_port'] = to_port
        else:
            # If cidr based filtering, protocol and ports are mandatory
            if 'cidr' in values:
                return None

        return values
Пример #3
0
def _new_ingress_rule(ip_protocol,
                      from_port,
                      to_port,
                      group_id=None,
                      cidr=None):
    values = {}

    if group_id:
        values['group_id'] = group_id
        # Open everything if an explicit port range or type/code are not
        # specified, but only if a source group was specified.
        ip_proto_upper = ip_protocol.upper() if ip_protocol else ''
        if (ip_proto_upper == 'ICMP' and from_port is None
                and to_port is None):
            from_port = -1
            to_port = -1
        elif (ip_proto_upper in ['TCP', 'UDP'] and from_port is None
              and to_port is None):
            from_port = 1
            to_port = 65535

    elif cidr:
        values['cidr'] = cidr

    if ip_protocol and from_port is not None and to_port is not None:

        ip_protocol = str(ip_protocol)
        try:
            # Verify integer conversions
            from_port = int(from_port)
            to_port = int(to_port)
        except ValueError:
            if ip_protocol.upper() == 'ICMP':
                raise exception.InvalidInput(
                    reason=_("Type and"
                             " Code must be integers for ICMP protocol type"))
            else:
                raise exception.InvalidInput(reason=_("To and From ports "
                                                      "must be integers"))

        if ip_protocol.upper() not in ['TCP', 'UDP', 'ICMP']:
            raise exception.InvalidIpProtocol(protocol=ip_protocol)

        # Verify that from_port must always be less than
        # or equal to to_port
        if (ip_protocol.upper() in ['TCP', 'UDP'] and (from_port > to_port)):
            raise exception.InvalidPortRange(from_port=from_port,
                                             to_port=to_port,
                                             msg="Former value cannot"
                                             " be greater than the later")

        # Verify valid TCP, UDP port ranges
        if (ip_protocol.upper() in ['TCP', 'UDP']
                and (from_port < 1 or to_port > 65535)):
            raise exception.InvalidPortRange(from_port=from_port,
                                             to_port=to_port,
                                             msg="Valid %s ports should"
                                             " be between 1-65535" %
                                             ip_protocol.upper())

        # Verify ICMP type and code
        if (ip_protocol.upper() == "ICMP"
                and (from_port < -1 or from_port > 255 or to_port < -1
                     or to_port > 255)):
            raise exception.InvalidPortRange(from_port=from_port,
                                             to_port=to_port,
                                             msg="For ICMP, the"
                                             " type:code must be valid")

        values['protocol'] = ip_protocol
        values['from_port'] = from_port
        values['to_port'] = to_port

    else:
        # If cidr based filtering, protocol and ports are mandatory
        if cidr:
            return None

    return values
Пример #4
0
    def _rule_args_to_dict(self, context, to_port=None, from_port=None,
                                  parent_group_id=None, ip_protocol=None,
                                  cidr=None, group_id=None):
        values = {}

        if group_id is not None:
            try:
                parent_group_id = int(parent_group_id)
                group_id = int(group_id)
            except ValueError:
                msg = _("Parent or group id is not integer")
                raise exception.InvalidInput(reason=msg)

            values['group_id'] = group_id
            #check if groupId exists
            db.security_group_get(context, group_id)
        elif cidr:
            # If this fails, it throws an exception. This is what we want.
            try:
                cidr = urllib.unquote(cidr).decode()
            except Exception:
                raise exception.InvalidCidr(cidr=cidr)

            if not utils.is_valid_cidr(cidr):
                # Raise exception for non-valid address
                raise exception.InvalidCidr(cidr=cidr)

            values['cidr'] = cidr
        else:
            values['cidr'] = '0.0.0.0/0'

        if group_id:
            # Open everything if an explicit port range or type/code are not
            # specified, but only if a source group was specified.
            ip_proto_upper = ip_protocol.upper() if ip_protocol else ''
            if (ip_proto_upper == 'ICMP' and
                from_port is None and to_port is None):
                from_port = -1
                to_port = -1
            elif (ip_proto_upper in ['TCP', 'UDP'] and from_port is None
                  and to_port is None):
                from_port = 1
                to_port = 65535

        if ip_protocol and from_port is not None and to_port is not None:

            ip_protocol = str(ip_protocol)
            try:
                from_port = int(from_port)
                to_port = int(to_port)
            except ValueError:
                if ip_protocol.upper() == 'ICMP':
                    raise exception.InvalidInput(reason="Type and"
                         " Code must be integers for ICMP protocol type")
                else:
                    raise exception.InvalidInput(reason="To and From ports "
                          "must be integers")

            if ip_protocol.upper() not in ['TCP', 'UDP', 'ICMP']:
                raise exception.InvalidIpProtocol(protocol=ip_protocol)

            # Verify that from_port must always be less than
            # or equal to to_port
            if (ip_protocol.upper() in ['TCP', 'UDP'] and
                from_port > to_port):
                raise exception.InvalidPortRange(from_port=from_port,
                      to_port=to_port, msg="Former value cannot"
                                            " be greater than the later")

            # Verify valid TCP, UDP port ranges
            if (ip_protocol.upper() in ['TCP', 'UDP'] and
                (from_port < 1 or to_port > 65535)):
                raise exception.InvalidPortRange(from_port=from_port,
                      to_port=to_port, msg="Valid TCP ports should"
                                           " be between 1-65535")

            # Verify ICMP type and code
            if (ip_protocol.upper() == "ICMP" and
                (from_port < -1 or from_port > 255 or
                to_port < -1 or to_port > 255)):
                raise exception.InvalidPortRange(from_port=from_port,
                      to_port=to_port, msg="For ICMP, the"
                                           " type:code must be valid")

            values['protocol'] = ip_protocol
            values['from_port'] = from_port
            values['to_port'] = to_port
        else:
            # If cidr based filtering, protocol and ports are mandatory
            if 'cidr' in values:
                return None

        return values
Пример #5
0
    def _rule_args_to_dict(self,
                           context,
                           to_port=None,
                           from_port=None,
                           parent_group_id=None,
                           ip_protocol=None,
                           cidr=None,
                           group_id=None):
        values = {}

        if group_id:
            try:
                parent_group_id = int(parent_group_id)
                group_id = int(group_id)
            except ValueError:
                msg = _("Parent or group id is not integer")
                raise exception.InvalidInput(reason=msg)

            if parent_group_id == group_id:
                msg = _("Parent group id and group id cannot be same")
                raise exception.InvalidInput(reason=msg)

            values['group_id'] = group_id
            #check if groupId exists
            db.security_group_get(context, group_id)
        elif cidr:
            # If this fails, it throws an exception. This is what we want.
            try:
                cidr = urllib.unquote(cidr).decode()
                netaddr.IPNetwork(cidr)
            except Exception:
                raise exception.InvalidCidr(cidr=cidr)
            values['cidr'] = cidr
        else:
            values['cidr'] = '0.0.0.0/0'

        if ip_protocol and from_port and to_port:

            try:
                from_port = int(from_port)
                to_port = int(to_port)
            except ValueError:
                raise exception.InvalidPortRange(from_port=from_port,
                                                 to_port=to_port)
            ip_protocol = str(ip_protocol)
            if ip_protocol.upper() not in ['TCP', 'UDP', 'ICMP']:
                raise exception.InvalidIpProtocol(protocol=ip_protocol)
            if ((min(from_port, to_port) < -1)
                    or (max(from_port, to_port) > 65535)):
                raise exception.InvalidPortRange(from_port=from_port,
                                                 to_port=to_port)

            values['protocol'] = ip_protocol
            values['from_port'] = from_port
            values['to_port'] = to_port
        else:
            # If cidr based filtering, protocol and ports are mandatory
            if 'cidr' in values:
                return None

        return values