From bc908198d6445373e628da580c8491df72f7c640 Mon Sep 17 00:00:00 2001 From: ZhymabekRoman Date: Tue, 22 Oct 2024 17:23:26 +0500 Subject: [PATCH] hotfix: xss fix, codeblock rendering problem --- medium-parser/medium_parser/core.py | 47 +++++++++++++++++------------ 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/medium-parser/medium_parser/core.py b/medium-parser/medium_parser/core.py index 663d9e3..146e443 100644 --- a/medium-parser/medium_parser/core.py +++ b/medium-parser/medium_parser/core.py @@ -5,7 +5,6 @@ import math import textwrap import typing import urllib.parse -from typing import Optional import jinja2 import tld @@ -15,14 +14,13 @@ from loguru import logger from rl_string_helper import RLStringHelper, split_overlapping_ranges from . import jinja_env +from .api import MediumApi from .exceptions import ( - InvalidMediumPostID, InvalidMediumPostURL, InvalidURL, - MediumParserException, MediumPostQueryError, ) -from .api import MediumApi +from .markups import parse_markups from .models.html_result import HtmlResult from .time import convert_datetime_to_human_readable from .utils import ( @@ -34,7 +32,6 @@ from .utils import ( is_valid_url, resolve_medium_url, ) -from .markups import parse_markups if typing.TYPE_CHECKING: from database_lib import AbstractCacheBackend @@ -71,13 +68,23 @@ class MediumParser: async def resolve(self, unknown: str) -> str: logger.debug(f"We got some unknown data: {unknown=}. Trying resolve them...///") + post_id = None - if is_has_valid_medium_post_id(unknown): - logger.debug("Seems like it's valid post_id") - return extract_hex_string(unknown) + try: + logger.debug("...maybe it's URL. Let's checkout...") + post_id = await self.resolve_url(unknown) + except Exception as e: + logger.exception(e) + logger.error(f"Error while resolving URL: {e}") + + if is_has_valid_medium_post_id(unknown): + logger.debug("Seems like it's valid post_id") + return extract_hex_string(unknown) + + logger.error(f"Unknown data: {unknown}") + + raise e - logger.debug("...maybe it's URL. Let's checkout...") - post_id = await self.resolve_url(unknown) return post_id async def resolve_url(self, url: str) -> str: @@ -200,7 +207,7 @@ class MediumParser: logger.debug("Pushing post data to cache") self.cache.push(post_id, post_data) - logger.trace(f"Query: done") + logger.trace("Query: done") return post_data def _parse_and_render_content_html_post( @@ -223,8 +230,8 @@ class MediumParser: # Hotfix, workaround for code block has_code_block = any(markup["type"] == "CODE" for markup in markups) if is_code or has_code_block: - # quote_html_type = ["minimal"] - quote_html_type = None + quote_html_type = ["minimal"] + # quote_html_type = None else: quote_html_type = ["full"] text_formater = RLStringHelper(text, quote_html_type=quote_html_type) @@ -354,7 +361,7 @@ class MediumParser: out_paragraphs.append(header_template_rendered) elif paragraph["type"] == "IMG": image_template = jinja_env.from_string( - '
{{ paragraph.metadata.alt }}
' + '
{{ paragraph.metadata.alt }}
' ) image_caption_template = jinja_env.from_string( "
{{ text }}
" @@ -411,7 +418,7 @@ class MediumParser: out_paragraphs.append(paragraph_template_rendered) elif paragraph["type"] == "ULI": uli_template = jinja_env.from_string( - '' + '' ) li_template = jinja_env.from_string("
  • {{ text }}
  • ") li_templates = [] @@ -438,7 +445,7 @@ class MediumParser: current_pos = _tmp_current_pos - 1 elif paragraph["type"] == "OLI": ol_template = jinja_env.from_string( - '
      {{ li }}
    ' + '
      {{ li }}
    ' ) li_template = jinja_env.from_string("
  • {{ text }}
  • ") li_templates = [] @@ -465,7 +472,7 @@ class MediumParser: current_pos = _tmp_current_pos - 1 elif paragraph["type"] == "PRE": pre_template = jinja_env.from_string( - '
    {{code_block}}
    ' + '
    {{code_block}}
    ' ) code_block_template = jinja_env.from_string( '{{ text }}' @@ -515,7 +522,7 @@ class MediumParser: out_paragraphs.append(bq_template_rendered) elif paragraph["type"] == "PQ": pq_template = jinja_env.from_string( - '

    {{ text }}

    ' + '

    {{ text }}

    ' ) pq_template_rendered = pq_template.render(text=text_formater.get_text()) logger.trace(pq_template_rendered) @@ -523,7 +530,7 @@ class MediumParser: elif paragraph["type"] == "MIXTAPE_EMBED": # TODO: redirect all Medium embeding articles to Fredium embed_template = jinja_env.from_string( - '

    {{ embed_title }}

    {{ embed_description }}

    {{ embed_site }}

    ' + '

    {{ embed_title }}

    {{ embed_description }}

    {{ embed_site }}

    ' ) if paragraph.get("mixtapeMetadata") is not None: url = paragraph["mixtapeMetadata"]["href"] @@ -578,7 +585,7 @@ class MediumParser: out_paragraphs.append(embed_template_rendered) elif paragraph["type"] == "IFRAME": iframe_template = jinja_env.from_string( - '
    ' + '
    ' ) iframe_template_rendered = iframe_template.render( host_address=self.host_address,