Example #1
0
def registrar_remote_data_feeds(request):
    #Given the id of a TAXII service we get the data feeds of the TAXII Client and copy them to the current system.
    feed_managment = TAXIIServices.objects.get(id = request.DATA.get('id'))
    urlParsed = urlparse(feed_managment.feed_managment)

    logger = logging.getLogger('TAXIIApplication.rest.tasks.obtener_remote_data_feeds')

    logger.debug('We get the server data feeds')
    logger.debug('Host: ' + urlParsed.hostname)
    logger.debug('Path: ' + urlParsed.path)
    logger.debug('Port: ' + str(urlParsed.port))

    host = urlParsed.hostname
    path = urlParsed.path
    port = str(urlParsed.port)

    feed_information = tm.FeedInformationRequest(message_id=tm.generate_message_id())
    feed_info_xml = feed_information.to_xml()
    logger.debug('The following message is sent: ' + feed_info_xml)
    client = tc.HttpClient()
    resp = client.callTaxiiService2(host, path, t.VID_TAXII_XML_10, feed_info_xml, port)

    response_message = t.get_message_from_http_response(resp, '0')
    logger.debug("The response was: " + response_message.to_xml())
    try:
        taxii_message = tm.get_message_from_xml(response_message.to_xml())

        logger.debug("Feed Information iteration")
        feed_informations = taxii_message.feed_informations
        for feed in feed_informations:
            logger.debug("Create a new Remote Data Feed")
            remote_df = RemoteDataFeed()
            remote_df.name = feed.feed_name
            logger.debug(feed.feed_name)
            if feed.feed_description == None:
                remote_df.description = "None"
            else:
                remote_df.description = feed.feed_description
            remote_df.producer = host
            remote_df.save()
            i = 0
            logger.debug('We get the subscription methods')
            for sm in feed.subscription_methods:
                protocol_binding = ProtocolBindingId(binding_id = sm.subscription_protocol)
                protocol_binding.save()

                dfsm = DataFeedSubscriptionMethod()
                dfsm.title = feed.feed_name + "_"+str(i)
                dfsm.address = sm.subscription_address
                dfsm.protocol_binding=protocol_binding

                dfsm.save()
                for mb in sm.subscription_message_bindings:
                    msgb = MessageBindingId(binding_id = mb)
                    msgb.save()
                    dfsm.message_bindings.add(msgb)
                dfsm.save()
                remote_df.subscription_methods.add(dfsm)

            logger.debug('We get the Content Bindings')
            for sc in feed.supported_contents:
                cb = ContentBindingId(binding_id = sc )
                cb.save()
                remote_df.supported_content_bindings.add(cb)

            logger.debug('Obtengo los push methods')
            for pm in feed.push_methods:
                pb = ProtocolBindingId(binding_id = pm.push_protocol)
                pb.save()
                mb = MessageBindingId(binding_id = pm.push_message_bindings)
                mb.save()
                dpm = DataFeedPushMethod(protocol_binding = pb, message_binding = mb)
                dpm.save()

                remote_df.push_methods.add(dpm)


            poll_service_instances = []
            logger.debug('We get the Poll Service Instances')
            for psi in feed.polling_service_instances:

                rdfpi = RemoteDataFeedPollInformation()
                rdfpi.address = psi.poll_address

                pb = ProtocolBindingId(binding_id = psi.poll_protocol)
                pb.save()
                rdfpi.protocol_binding = pb
                rdfpi.save()

                logger.debug(psi.poll_message_bindings)
                for msg in psi.poll_message_bindings:
                    msgb = MessageBindingId(binding_id = msg)
                    msgb.save()
                    rdfpi.message_bindings.add(msgb)
                
                rdfpi.save()
                remote_df.poll_service_instances.add(rdfpi)
            logger.debug("Save the remote data feed")
            remote_df.save()

        return Response(status=status.HTTP_201_CREATED)
    except Exception as ex:
        logger.debug( ex)
        return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR)
Example #2
0
def feed_subscription_get_content(request, taxii_message):
    """Returns a feed subscription response for a given subscription feed  Message"""
    logger = logging.getLogger('taxii.utils.handlers.feed_subscription_get_content')
    logger.debug('Retriving data feed names')


    f = tm.ACT_TYPES
    #For now we only accept subscriptions
    if taxii_message.action == f[0]:

        try:
            logger.debug('Getting the data feed [%s]', make_safe(taxii_message.feed_name))
            data_feed = DataFeed.objects.get(name=taxii_message.feed_name)
        except:
            logger.debug('Attempting to subscribe to unknown data feed [%s]', make_safe(taxii_message.feed_name))
            m = tm.StatusMessage(tm.generate_message_id(), taxii_message.message_id, status_type=tm.ST_NOT_FOUND, message='Data feed does not exist [%s]' % (make_safe(taxii_message.feed_name)))
            return create_taxii_response(m, use_https=request.is_secure())

        try:
            binding_id = taxii_message.delivery_parameters.inbox_protocol
            logger.debug('Getting the binding protocol [%s]', make_safe(binding_id))
            protocol_binding = ProtocolBindingId.objects.get(title=binding_id)
            message_binding = taxii_message.delivery_parameters.delivery_message_binding
            logger.debug('Getting the binding message [%s]', make_safe(message_binding))
            message_binding = MessageBindingId.objects.get(title=message_binding)
        except:
            logger.debug('Attempting to subscribe to use unknowon protocol or message bindings')
            m = tm.StatusMessage(tm.generate_message_id(), taxii_message.message_id, status_type=tm.ST_NOT_FOUND, message='Protocol or message bindings does not exist')
            return create_taxii_response(m, use_https=request.is_secure())

        logger.debug("Response message")
        subscr_methods = DataFeedSubscriptionMethod()
        subscr_methods.title = taxii_message.delivery_parameters.inbox_address
        subscr_methods.description = taxii_message.delivery_parameters.inbox_address
        subscr_methods.address = taxii_message.delivery_parameters.inbox_address
        subscr_methods.protocol_binding = protocol_binding

        subscr_methods.save()
        subscr_methods.message_bindings.add(message_binding)
        subscr_methods.save()

        logger.debug("The information was correclty saved")

        user = User.objects.get(id=1)
        logger.debug("Get user")
        data_feed_subscription = DataFeedSubscription()
        data_feed_subscription.active = True
        data_feed_subscription.expires = timezone.now() + datetime.timedelta(days=500)
        data_feed_subscription.data_feed_method = subscr_methods
        data_feed_subscription.data_feed = data_feed
        data_feed_subscription.user = user

        subscription_list = DataFeedSubscription.objects.all()
        if len(subscription_list) == 0:
                id_value = 1
        else:
                id_value = DataFeedSubscription.objects.latest('id').id + 1

        data_feed_subscription.subscription_id = id_value
        data_feed_subscription.save()

        delivery_parameters = tm.DeliveryParameters(inbox_protocol=taxii_message.delivery_parameters.inbox_protocol,
                                inbox_address=taxii_message.delivery_parameters.inbox_address,
                                delivery_message_binding=taxii_message.delivery_parameters.delivery_message_binding,
                                content_bindings=taxii_message.delivery_parameters.content_bindings)

        logger.debug("Return the Poll Service instances")
        poll_instances = []
        for poll_info in data_feed.poll_service_instances.all():
            poll_inst = tm.ManageFeedSubscriptionResponse.PollInstance(poll_protocol = poll_info.protocol_binding.binding_id,
                        poll_address = poll_info.address)

            mbindings = []
            for mbinding_id in poll_info.message_bindings.all():
                mbindings.append(mbinding_id.binding_id)

            poll_inst.poll_message_bindings = mbindings

            poll_instances.append(poll_inst)

        subscription_instances = []

        subscr_instance = tm.ManageFeedSubscriptionResponse.SubscriptionInstance(subscription_id = str(data_feed_subscription.id))
        subscr_instance.delivery_parameters = [delivery_parameters]
        subscr_instance.poll_instances = poll_instances

        subscription_instances.append(subscr_instance)
        logger.debug("Returns the response")
        feed_subscription_response_message = tm.ManageFeedSubscriptionResponse(message_id = tm.generate_message_id(), in_response_to = taxii_message.message_id,
                feed_name = taxii_message.feed_name, message='Subscription succeds', subscription_instances = subscription_instances)

        return create_taxii_response(feed_subscription_response_message, use_https=request.is_secure())
    else:
        logger.debug('Modifing or deleteing subscription is not supported')
        m = tm.StatusMessage(tm.generate_message_id(), taxii_message.message_id, status_type=tm.ST_FAILURE, message='Modifing subscriptions is not allowed')
        return create_taxii_response(m, use_https=request.is_secure())