#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Standard imports
from io import BytesIO
import base64
import logging
logger = logging.getLogger('pymisp')
# Potentially not installed imports
try:
from reportlab.platypus import SimpleDocTemplate
from reportlab.platypus import Paragraph
from reportlab.platypus import PageBreak
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import mm, inch
from reportlab.pdfgen import canvas
from reportlab.lib import colors
from reportlab.lib.pagesizes import letter, inch
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
HAS_REPORTLAB = True
except ImportError:
HAS_REPORTLAB = False
print("ReportLab cannot be imported. Please verify that ReportLab is installed on the system.")
'''
"INTERNAL" METHODS. Not meant to be used outside of this class.
'''
def create_flowable_table_from_event(misp_event):
data = [['00', '01', '02', '03', '04'],
['10', '11', '12', '13', '14'],
['20', '21', '22', '23', '24'],
['30', '31', '32', '33', '34']]
t = Table(data, 5 * [0.4 * inch], 4 * [0.4 * inch])
t.setStyle(TableStyle([('TEXTCOLOR', (0, 0), (0, -1), colors.blue),
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
('INNERGRID', (0, 0), (-1, -1), 0.25, colors.black),
('BOX', (0, 0), (-1, -1), 0.25, colors.black),
]))
return t
def collect_parts(misp_event):
# List of elements/content we want to add
flowables = []
# Get the list of available styles
sample_style_sheet = getSampleStyleSheet()
# Create stuff
paragraph_1 = Paragraph("A title", sample_style_sheet['Heading1'])
paragraph_2 = Paragraph("Some normal body text",sample_style_sheet['BodyText'])
paragraph_3 = Paragraph("Dingbat paragraph", sample_style_sheet['BodyText']) # Apply custom style
Paragraph("A bold word.
An italic word.", sample_style_sheet['BodyText']) # HTML markup is working too
table = create_flowable_table_from_event(misp_event)
# Add all parts to final PDF
flowables.append(paragraph_1)
flowables.append(paragraph_2)
flowables.append(table)
flowables.append(PageBreak())
flowables.append(paragraph_2)
flowables.append(paragraph_3)
return flowables
def add_page_number(canvas, doc):
canvas.saveState()
canvas.setFont('Times-Roman', 10)
page_number_text = "%d" % (doc.page)
canvas.drawCentredString(
0.75 * inch,
0.75 * inch,
page_number_text
)
canvas.restoreState()
def export_flowables_to_pdf(document, pdf_buffer, flowables):
# my_doc.build(flowables) # Basic building of the final document
document.build(
flowables,
onFirstPage=add_page_number, # Pagination for first page
onLaterPages=add_page_number, # Pagination for all other page
)
'''
"EXTERNAL" exposed METHODS. Meant to be used outside of this class.
'''
PAGESIZE = (140 * mm, 216 * mm) # width, height
BASE_MARGIN = 5 * mm
def convert_event_in_pdf_buffer(misp_event):
# Create a document buffer
pdf_buffer = BytesIO()
# DEBUG / TO DELETE : curr_document = SimpleDocTemplate('myfile.pdf')
curr_document = SimpleDocTemplate(pdf_buffer,
pagesize=PAGESIZE,
topMargin=BASE_MARGIN,
leftMargin=BASE_MARGIN,
rightMargin=BASE_MARGIN,
bottomMargin=BASE_MARGIN)
# Apply standard template
# TODO
# Set the layout
# TODO
# Collect already accessible event's parts to be shown
flowables = collect_parts(misp_event)
# Export
export_flowables_to_pdf(curr_document, pdf_buffer, flowables)
pdf_value = pdf_buffer.getvalue()
#TODO : Not sure what to give back ? Buffer ? Buffer.value() ? Base64(buffer.value()) ? ...
#pdf_buffer.close()
#return pdf_value
return pdf_buffer
def get_values_from_buffer(pdf_buffer):
return pdf_buffer.value()
def get_base64_from_buffer(pdf_buffer):
return base64.b64encode(pdf_buffer.value())
def register_to_file(pdf_buffer, file_name):
pdf_buffer.seek(0)
with open(file_name, 'wb') as f:
f.write(pdf_buffer.read())
if __name__ == "__main__":
pdf_buffer = convert_event_in_pdf_buffer(None)
register_to_file(pdf_buffer, 'test.pdf')
# get_values_from_buffer(pdf_buffer)
# get_base64_from_buffer(pdf_buffer)
''' In the future ?
try:
from pymispgalaxies import Clusters
has_pymispgalaxies = True
except ImportError:
has_pymispgalaxies = False
try:
from pytaxonomies import Taxonomies
has_pymispgalaxies = True
except ImportError:
has_pymispgalaxies = False
'''
'''
class ReportLabObject():
def __init__(self, parameters, strict=True, standalone=True, **kwargs):
super(ReportLabObject, self).__init__('reportlab', strict=strict, standalone=standalone, **kwargs)
self._parameters = parameters
self.generate_attributes()
def generate_attributes(self):
first = self._sanitize_timestamp(self._parameters.pop('first-seen', None))
self._parameters['first-seen'] = first
last = self._sanitize_timestamp(self._parameters.pop('last-seen', None))
self._parameters['last-seen'] = last
return super(ReportLabObject, self).generate_attributes()
'''