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)
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())