Iacopo Catalano

11 papers Journal 8Unranked 3
YearRankTypeTitle / Venue / Authors
2026 J jnl
CoRR
Iacopo Catalano, David Morilla-Cabello, Jorge Peña Queralta, Eduardo Montijano
2026 J jnl
CoRR
Iacopo Catalano, Francesco Verdoja, Javier Civera, Jorge Peña Queralta, Julio A. Placed
2025 J jnl
CoRR
Iacopo Catalano, Eduardo Montijano, Javier Civera, Julio A. Placed, Jorge Peña Queralta
2025 J jnl
CoRR
Sahar Salimpour, Iacopo Catalano, Tomi Westerlund, Mohsen Falahi, Jorge Peña Queralta
2024 J jnl
Remote. Sens.
Carlos Roberto Cueto Zumaya, Iacopo Catalano, Jorge Peña Queralta
2023 J jnl
CoRR
Iacopo Catalano, Jorge Peña Queralta, Tomi Westerlund
2023 conf
ROBIO
Iacopo Catalano, Xianjia Yu, Jorge Peña Queralta
2023 J jnl
CoRR
Iacopo Catalano, Xianjia Yu, Jorge Peña Queralta
2023 conf
ICL-GNSS
Sier Ha, Xianjia Yu, Iacopo Catalano, Jorge Peña Queralta, Zhuo Zou, Tomi Westerlund
2023 conf
ICAR
Iacopo Catalano, Sier Ha, Xianjia Yu, Tomi Westerlund, Jorge Peña Queralta
2023 J jnl
CoRR
Iacopo Catalano, Sier Ha, Xianjia Yu, Jorge Peña Queralta, Tomi Westerlund
redb/extractors/js_extractors/js_content.py
← Index redb/extractors/js_extractors/js_content.py python
"""Persists raw + normalised text into the generic `code_text_content` table.

Reads the raw source and the deobfuscation result directly from the shared
JSContext so no extra compute happens here — both values are computed once
per sample (the source at JSContext construction, the deobfuscation lazily
on first access) and reused by any extractor that needs them.

`text_normalized` is left NULL when the deobfuscation pass produced no
output, so analysts can distinguish "we tried and got nothing" from
"normalisation succeeded".
"""

import inspect
from datetime import datetime, timezone
from typing import Any

from redb.extractors.enum import Tag
from redb.extractors.js_extractor import JSExtractor


class JSContentExtractor(JSExtractor):

    def __init__(
        self, filepath, log, exporters=None, index_prefix=None,
        known_benign=False, known_malicious=False, source=None, context=None,
    ):
        super().__init__(
            filepath, log, exporters, index_prefix,
            known_benign, known_malicious, source, context=context,
        )
        self.content_row = None
        self.log.debug(inspect.currentframe().f_code.co_name)

    def tag(self):
        return Tag.JS_CONTENT.value

    def extract(self):
        src = self.js_source
        if not src:
            return None

        deobfuscated, normalizer_used = self._context.deobfuscated

        self.content_row = {
            "content_type": self._context.content_type,
            "text_raw": src,
            "text_normalized": deobfuscated,  # may be None
            "normalizer_used": normalizer_used,  # may be None
        }
        return self.content_row

    def prepare_export_data(self, exporter_type: str) -> Any:
        if exporter_type != "ClickHouseExporter":
            return None
        if not self.content_row:
            return None

        r = self.content_row
        data = [[
            self.sha256,
            r["content_type"],
            r["text_raw"],
            r["text_normalized"],
            r["normalizer_used"],
            datetime.now(timezone.utc),
        ]]

        column_names = [
            "sha256",
            "content_type",
            "text_raw",
            "text_normalized",
            "normalizer_used",
            "analysis_date",
        ]

        column_type_names = [
            "FixedString(64)",
            "LowCardinality(String)",
            "String",
            "Nullable(String)",
            "Nullable(String)",
            "DateTime64(3, 'UTC')",
        ]

        return (data, column_names, column_type_names)

    def get_clickhouse_table(self) -> str:
        return "code_text_content"