Source code for pymisp.tools.dataurlobject

#!/usr/bin/env python

from __future__ import annotations

import logging
import re

from io import BytesIO

from .abstractgenerator import AbstractMISPObjectGenerator
from ..exceptions import MISPObjectException

logger = logging.getLogger('pymisp')


[docs] class DataURLObject(AbstractMISPObjectGenerator): def __init__(self, dataurl: str, **kwargs) -> None: # type: ignore[no-untyped-def] super().__init__('data-url', **kwargs) if stripped_dataurl := dataurl.strip(): if not re.match("data:", stripped_dataurl, re.I): raise MISPObjectException('Not a data URL (does not start with data:') self._dataurl = stripped_dataurl[5:] self.generate_attributes() else: raise MISPObjectException('No Data URL provided (empty string)') def _parse_dataurl(self) -> tuple[str, str, bool, str]: base64 = bool(re.match(r'.*;base64,.*', self._dataurl)) if base64: mime, data = self._dataurl.split(';base64,') else: mime, data = self._dataurl.split(',') if mime and ';' in mime: mime, param = mime.split(';', 1) else: param = '' return mime, param, base64, data
[docs] def generate_attributes(self) -> None: try: mime, param, base64, data = self._parse_dataurl() except Exception as e: raise MISPObjectException(f'Invalid Data URL: {self._dataurl} - {e}') self.add_attribute('data', value='data.txt', data=BytesIO(data.encode())) self.add_attribute('base64', value=base64) if mime: self.add_attribute('media-type', value=mime) if param: self.add_attribute('mime-type-parameter', value=param)