Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/robusta/core/reporting/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from robusta.core.model.env_vars import ROBUSTA_UI_DOMAIN
from robusta.core.reporting.consts import FindingSource, FindingSubjectType, FindingType
from robusta.integrations.kubernetes.api_client_utils import get_namespace_labels
from robusta.utils.common import encode_url
from robusta.utils.scope import BaseScopeMatcher


Expand Down Expand Up @@ -361,6 +362,7 @@ def add_enrichment(
def add_link(self, link: Link, suppress_warning: bool = False) -> None:
if self.dirty and not suppress_warning:
logging.warning("Updating a finding after it was added to the event is not allowed!")
link.url = encode_url(link.url)
self.links.append(link)

def add_video_link(self, video_link: Link, suppress_warning: bool = False) -> None:
Expand Down
8 changes: 4 additions & 4 deletions src/robusta/core/sinks/transformer.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import logging
import re
import urllib.parse
from typing import List, Optional, Union

import markdown2
from fpdf import FPDF
from fpdf.fonts import FontFace

from robusta.utils.common import encode_url

try:
from tabulate import tabulate
except ImportError:
Expand Down Expand Up @@ -122,9 +123,8 @@ def to_github_markdown(markdown_data: str, add_angular_brackets: bool = True) ->
# take only the data between the first '<' and last '>'
splits = match[1:-1].split("|")
if len(splits) == 2: # don't replace unexpected strings
parsed_url = urllib.parse.urlparse(splits[0])
parsed_url = parsed_url._replace(path=urllib.parse.quote_plus(parsed_url.path, safe="/"))
replacement = f"[{splits[1]}]({OPENING_ANGULAR}{parsed_url.geturl()}{CLOSING_ANGULAR})"
encoded_url = encode_url(splits[0])
replacement = f"[{splits[1]}]({OPENING_ANGULAR}{encoded_url}{CLOSING_ANGULAR})"
markdown_data = markdown_data.replace(match, replacement)
return re.sub(r"\*([^\*]*)\*", r"**\1**", markdown_data)

Expand Down
21 changes: 21 additions & 0 deletions src/robusta/utils/common.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import re
import urllib.parse
from typing import List

from hikaru import DiffDetail, HikaruBase
Expand Down Expand Up @@ -41,3 +42,23 @@ def duplicate_without_fields(obj: HikaruBase, omitted_fields: List[str]):
pass # in case the field doesn't exist on this object

return duplication


def encode_url(url: str) -> str:
"""
Encode a URL so that it can be safely used in contexts where special characters must be escaped.
"""
if not url:
return ""

parsed_url = urllib.parse.urlsplit(url)

encoded_path = urllib.parse.quote(parsed_url.path)
encoded_query = urllib.parse.quote_plus(parsed_url.query, safe="=&")
encoded_fragment = urllib.parse.quote(parsed_url.fragment, safe="")
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated

return parsed_url._replace(
path=encoded_path,
query=encoded_query,
fragment=encoded_fragment
).geturl()