Raimund Schatz

112 papers A* 3A 4B 39C 4Misc 2Journal 19Unranked 33
YearRankTypeTitle / Venue / Authors
2026 conf
CHI Extended Abstracts
Raimund Schatz, Helmut Schrom-Feiertag, Guglielmo Papagni, Frank Steinicke, Lea Skorin-Kapov, Mark Billinghurst, Leif Oppermann, Georg Aumayr
2024 C conf
PCS
Jingwen Zhu, Hadi Amirpour, Raimund Schatz, Patrick Le Callet, Christian Timmerer
2024 B conf
DCC
Hadi Amirpour, Jingwen Zhu, Raimund Schatz, Patrick Le Callet, Christian Timmerer
2024 B conf
QoMEX
Michael Oppermann, Raimund Schatz, Andreas Sackl, Sebastian Egger-Lampl
2023 J jnl
IEEE Commun. Surv. Tutorials
Jeroen van der Hooft, Hadi Amirpour, Maria Torres Vega, Yago Sanchez, Raimund Schatz, Thomas Schierl, Christian Timmerer
2023 J jnl
Qual. User Exp.
Nikolas Wehner, Michael Seufert, Raimund Schatz, Tobias Hoßfeld
2023 conf
MHV
Jingwen Zhu, Hadi Amirpour, Vignesh V. Menon, Raimund Schatz, Patrick Le Callet
2023 C conf
VCIP
Jingwen Zhu, Hadi Amirpour, Raimund Schatz, Christian Timmerer, Patrick Le Callet
2023 ed.
GMSys@MMSys
Samira Afzal, Simone Ferlin-Reiter, Tobias Hoßfeld, Raimund Schatz, Christian Timmerer
2022 B conf
QoMEX
Nikolas Wehner, Monisha Amir, Michael Seufert, Raimund Schatz, Tobias Hoßfeld
2022 B conf
QoMEX
Till Bieg, Raimund Schatz, Sebastian Egger-Lampl, Benjamin Roszipal, Klara Kinzer
2022 B conf
QoMEX
Hadi Amirpour, Raimund Schatz, Christian Timmerer
2022 B conf
NetSoft
Pedro Casas, Michael Seufert, Sarah Wassermann, Bruno Gardlo, Nikolas Wehner, Raimund Schatz
2021 conf
W4A
Andreas Sackl, Raimund Schatz, Bruno Gardlo, Manfred Tscheligi
2021 C conf
VCIP
Hadi Amirpour, Raimund Schatz, Christian Timmerer, Mohammad Ghanbari
2021 B conf
QoMEX
Julia Himmelsbach, Katrien De Moor, Andreas Sackl, Raimund Schatz, Manfred Tscheligi
2021 conf
INTERACT (5)
Andreas Sackl, Raimund Schatz, Manfred Tscheligi
2020 A conf
ASSETS
Andreas Sackl, Franziska Graf, Raimund Schatz, Manfred Tscheligi
2020 J jnl
IEEE Commun. Mag.
Jeroen van der Hooft, Maria Torres Vega, Tim Wauters, Christian Timmerer, Ali C. Begen, Filip De Turck, Raimund Schatz
2020 Misc conf
NordiCHI
Stephanie Schwarz, Georg Regal, Marina Kempf, Raimund Schatz
2020 B conf
QoMEX
Jeroen van der Hooft, Maria Torres Vega, Christian Timmerer, Ali C. Begen, Filip De Turck, Raimund Schatz
2020 J jnl
CoRR
Andrew Perkis, Christian Timmerer, Sabina Barakovic, Jasmina Barakovic Husic, Søren Bech, Sebastian Bosse, Jean Botev, Kjell Brunnström, Luís Alberto da Silva Cruz, Katrien De Moor, Andrea de Polo Saibanti, Wouter Durnez, Sebastian Egger-Lampl, Ulrich Engelke, Tiago H. Falk, Asim Hameed, Andrew Hines, Tanja Kojic, Dragan Kukolj, Eirini Liotou, Dragorad Milovanovic, Sebastian Möller, Niall Murray, Babak Naderi, Manuela Pereira, Stuart W. Perry, António M. G. Pinheiro, Andres Pinilla Palacios, Alexander Raake, Sarvesh Rajesh Agrawal, Ulrich Reiter, Rafael Rodrigues, Raimund Schatz, Peter Schelkens, Steven Schmidt, Saeed Shafiee Sabet, Ashutosh Singla, Lea Skorin-Kapov, Mirko Suznjevic, Stefan Uhrig, Sara Vlahovic, Jan-Niklas Voigt-Antons, Saman Zadtootaghaj
2020 A* conf
ACM Multimedia
Nikolas Wehner, Michael Seufert, Sebastian Egger-Lampl, Bruno Gardlo, Pedro Casas, Raimund Schatz
2020 B conf
QoMEX
Hamed Z. Jahromi, Ivan Bartolec, Edwin Gamboa, Andrew Hines, Raimund Schatz
2020 J jnl
CoRR
Hamed Z. Jahromi, Ivan Bartolec, Edwin Gamboa, Andrew Hines, Raimund Schatz
2019 J jnl
i-com
Peter Fröhlich, Raimund Schatz, Markus Buchta, Johann Schrammel, Stefan Suette, Manfred Tscheligi
2019 B conf
QoMEX
Sebastian Egger-Lampl, Cornelia Gerdenitsch, Lisa Deinhard, Raimund Schatz, Philipp Hold
2019 B conf
QoMEX
Andreas Sackl, Raimund Schatz, Stefan Suette, Manfred Tscheligi
2019 B conf
QoMEX
Michael Seufert, Raimund Schatz, Nikolas Wehner, Bruno Gardlo, Pedro Casas
2019 Misc conf
ICIN
Michael Seufert, Raimund Schatz, Nikolas Wehner, Pedro Casas
2019 B conf
QoMEX
Raimund Schatz, Anatoliy Zabrovskiy, Christian Timmerer
2018 B conf
QoMEX
Raimund Schatz, Georg Regal, Stephanie Schwarz, Stefan Suette, Marina Kempf
2018 ch.
Autonomous Control for a Reliable Internet of Services
Raimund Schatz, Susanna Schwarzmann, Thomas Zinner, Ognjen Dobrijevic, Eirini Liotou, Peter Pocta, Sabina Barakovic, Jasmina Barakovic Husic, Lea Skorin-Kapov
2018 B conf
QoMEX
Jan-Niklas Voigt-Antons, Tobias Hoßfeld, Sebastian Egger-Lampl, Raimund Schatz, Sebastian Möller
2018 B conf
QoMEX
Georg Regal, Raimund Schatz, Johann Schrammel, Stefan Suette
2017 J jnl
Multim. Tools Appl.
Tasos Dagiuklas, Raimund Schatz, Pedro Assuncao, Luigi Atzori
2017 J jnl
Qual. User Exp.
Andreas Sackl, Raimund Schatz, Alexander Raake
2017 B conf
QoMEX
Pedro Casas, Alessandro D'Alconzo, Florian Wamser, Michael Seufert, Bruno Gardlo, Anika Schwind, Phuoc Tran-Gia, Raimund Schatz
2017 B conf
QoMEX
Raimund Schatz, Andreas Sackl, Christian Timmerer, Bruno Gardlo
2016 conf
Internet-QoE@SIGCOMM
Pedro Casas, Bruno Gardlo, Raimund Schatz, Marco Mellia
2016 J jnl
IEEE Trans. Netw. Serv. Manag.
Pedro Casas, Michael Seufert, Florian Wamser, Bruno Gardlo, Andreas Sackl, Raimund Schatz
2016 J jnl
IEEE J. Sel. Areas Commun.
Samira Tavakoli, Sebastian Egger, Michael Seufert, Raimund Schatz, Kjell Brunnström, Narciso García
2016 ed.
QCMan@ITC
Thomas Zinner, Oliver Hohlfeld, Raimund Schatz, Prasad Calyam
2016 conf
ICC Workshops
Andreas Sackl, Raimund Schatz, Tobias Hoßfeld, Florian Metzger, David Lister, Ralf Irmer
2016 conf
GLOBECOM Workshops
Eirini Liotou, Raimund Schatz, Andreas Sackl, Pedro Casas, Dimitris Tsolkas, Nikos I. Passas, Lazaros F. Merakos
2015 conf
S3@MobiCom
Michael Seufert, Florian Wamser, Pedro Casas, Ralf Irmer, Phuoc Tran-Gia, Raimund Schatz
2015 conf
AllThingsCellular@SIGCOMM
Pedro Casas, Raimund Schatz, Florian Wamser, Michael Seufert, Ralf Irmer
2015 B conf
IWCMC
Pedro Casas, Martín Varela, Pierdomenico Fiadino, Mirko Schiavone, Helena Rivas, Raimund Schatz
2015 conf
ICC Workshops
Pedro Casas, Andreas Sackl, Raimund Schatz, Lucjan Janowski, John Turk, Ralf Irmer
2015 A* conf
MobiCom
Florian Wamser, Michael Seufert, Pedro Casas, Ralf Irmer, Phuoc Tran-Gia, Raimund Schatz
2015 B conf
QoMEX
Andreas Sackl, Pedro Casas, Raimund Schatz, Lucjan Janowski, Ralf Irmer
2015 J jnl
Multim. Tools Appl.
Thomas Zinner, Tobias Hoßfeld, Markus Fiedler, Florian Liers, Thomas Volkert, Rahamatullah Khondoker, Raimund Schatz
2015 B conf
QoMEX
Eirini Liotou, Hisham Elshaer, Raimund Schatz, Ralf Irmer, Mischa Dohler, Nikos I. Passas, Lazaros F. Merakos
2015 B conf
CNSM
Pedro Casas, Bruno Gardlo, Michael Seufert, Florian Wamser, Raimund Schatz
2015 conf
ICC Workshops
Andreas Sackl, Raimund Schatz
2015 conf
EuCNC
Florian Wamser, Michael Seufert, Pedro Casas, Ralf Irmer, Phuoc Tran-Gia, Raimund Schatz
2015 B conf
IWCMC
Michael Seufert, Florian Wamser, Pedro Casas, Ralf Irmer, Phuoc Tran-Gia, Raimund Schatz
2014 B conf
QoMEX
Raimund Schatz, Sebastian Egger
2014 conf
CloudNet
Pedro Casas, Andreas Sackl, Sebastian Egger, Raimund Schatz
2014 conf
ICC
Bruno Gardlo, Sebastian Egger, Michael Seufert, Raimund Schatz
2014 B conf
QoMEX
Andreas Sackl, Raimund Schatz
2014 B conf
QoMEX
Andreas Sackl, Raimund Schatz
2014 J jnl
Speech Commun.
Katrin Schoenenberg, Alexander Raake, Sebastian Egger, Raimund Schatz
2014 conf
MMB/DFT
Tobias Hoßfeld, Raimund Schatz, Udo R. Krieger
2014 ch.
Quality of Experience
Raimund Schatz, Markus Fiedler, Lea Skorin-Kapov
2014 J jnl
Comput. Networks
Pedro Casas, Raimund Schatz
2014 conf
VideoNext@CoNEXT
Sebastian Egger, Bruno Gardlo, Michael Seufert, Raimund Schatz
2014 B conf
QoMEX
Andreas Sackl, Sebastian Egger, Raimund Schatz
2014 ch.
Quality of Experience
Dominik Strohmeier, Sebastian Egger, Alexander Raake, Tobias Hoßfeld, Raimund Schatz
2013 conf
ICC Workshops
Pedro Casas, Hans Ronald Fischer, Stefan Suette, Raimund Schatz
2013 ch.
Data Traffic Monitoring and Analysis
Raimund Schatz, Tobias Hoßfeld, Lucjan Janowski, Sebastian Egger
2013 J jnl
J. Comput. Networks Commun.
Pedro Merino, Maria G. Martini, Raimund Schatz, Lea Skorin-Kapov, Martín Varela
2013 ch.
Data Traffic Monitoring and Analysis
Tobias Hoßfeld, Raimund Schatz, Ernst W. Biersack, Louis Plissonneau
2013 J jnl
Telecommun. Syst.
Peter Reichl, Bruno Tuffin, Raimund Schatz
2013 B conf
WCNC
Pedro Casas, Raimund Schatz, Tobias Hoßfeld
2013 conf
MoVid@MMSys
Tobias Hoßfeld, Dominik Strohmeier, Alexander Raake, Raimund Schatz
2013 B conf
IM
Pedro Casas, Michael Seufert, Sebastian Egger, Raimund Schatz
2013 B conf
QoMEX
Christian Timmerer, Patrick Le Callet, Martín Varela, Stefan Winkler, Tiago H. Falk, Raimund Schatz
2013 B conf
QoMEX
Andreas Sackl, Sebastian Egger, Raimund Schatz
2013 J jnl
SIGMETRICS Perform. Evaluation Rev.
Pedro Casas, Michael Seufert, Raimund Schatz
2012 conf
ICC
Sebastian Egger, Peter Reichl, Tobias Hoßfeld, Raimund Schatz
2012 J jnl
IEEE Commun. Mag.
Tobias Hoßfeld, Raimund Schatz, Martín Varela, Christian Timmerer
2012 B conf
QoMEX
Tobias Hoßfeld, Sebastian Egger, Raimund Schatz, Markus Fiedler, Kathrin Masuch, Charlott Lorentzen
2012 B conf
QoMEX
Peter Fröhlich, Michal Ries, Kathrin Masuch, Raimund Schatz
2012 B conf
QoMEX
Bruno Gardlo, Michal Ries, Tobias Hoßfeld, Raimund Schatz
2012 conf
IMIS
Raimund Schatz, Tobias Hoßfeld, Pedro Casas
2012 B conf
QoMEX
Peter Fröhlich, Sebastian Egger, Raimund Schatz, Michael Mühlegger, Kathrin Masuch, Bruno Gardlo
2012 J jnl
Prax. Inf.verarb. Kommun.
Tobias Hoßfeld, Florian Liers, Raimund Schatz, Barbara Staehle, Dirk Staehle, Thomas Volkert, Florian Wamser
2012 conf
ICC
Sebastian Egger, Raimund Schatz, Katrin Schoenenberg, Alexander Raake, Gernot Kubin
2012 B conf
QoMEX
Sebastian Egger, Tobias Hoßfeld, Raimund Schatz, Markus Fiedler
2012 B conf
QoMEX
Andreas Sackl, Kathrin Masuch, Sebastian Egger, Raimund Schatz
2012 conf
GLOBECOM Workshops
Pedro Casas, Andreas Sackl, Sebastian Egger, Raimund Schatz
2011 conf
ICC
Raimund Schatz, Sebastian Egger, Alexander Platzer
2011 C conf
ISM
Tobias Hoßfeld, Michael Seufert, Matthias Hirth, Thomas Zinner, Phuoc Tran-Gia, Raimund Schatz
2011 B conf
QoMEX
Tobias Hoßfeld, Raimund Schatz, Sebastian Egger
2011 A conf
ITC
Tobias Hoßfeld, Sebastian Biedermann, Raimund Schatz, Alexander Platzer, Sebastian Egger, Markus Fiedler
2011 conf
W-MUST@SIGCOMM
Raimund Schatz, Sebastian Egger
2010 ch.
Mobile TV: Customizing Content and Experience
Raimund Schatz, Lynne Baillie, Peter Fröhlich, Sebastian Egger, Thomas Grechenig
2010 conf
AH
Peter Fröhlich, Raimund Schatz, Peter Leitner, Matthias Baldauf, Stephan Mantler
2010 conf
CTTE
Peter Reichl, Bruno Tuffin, Raimund Schatz
2010 conf
CHI Extended Abstracts
Peter Fröhlich, Raimund Schatz, Peter Leitner, Stephan Mantler, Matthias Baldauf
2010 A conf
INTERSPEECH
Sebastian Egger, Raimund Schatz, Stefan Scherer
2010 conf
ICC
Peter Reichl, Sebastian Egger, Raimund Schatz, Alessandro D'Alconzo
2008 conf
EuroITV
Arian Bär, Andreas Berger, Sebastian Egger, Raimund Schatz
2008 A* conf
ACM Multimedia
Andreas Berger, Lorenzo Pallara, Raimund Schatz
2008 conf
FIS (Posters & Demos)
Raimund Schatz, Arian Bär, Andreas Berger
2007 conf
ICN
Raimund Schatz, Norbert Jordan, Siegfried Wagner
2007 J jnl
Elektrotech. Informationstechnik
Raimund Schatz, Werner Wiedermann, Roland Ochenbauer, Igor Miladinovic
2007 conf
CHI Extended Abstracts
Peter Reichl, Peter Fröhlich, Lynne Baillie, Raimund Schatz, Antitza Dantcheva
2006 conf
CHI Extended Abstracts
Peter Fröhlich, Lynne Baillie, Peter Reichl, Raimund Schatz, Florian Hammer, Georg Niklfeld
2005 B conf
ICMI
Lynne Baillie, Raimund Schatz
2004 A conf
ICWS
Gert Brettlecker, Heiko Schuldt, Raimund Schatz
redb/extractors/js_extractors/js_context.py
← Index redb/extractors/js_extractors/js_context.py python
"""Per-sample shared state for the JavaScript extractor pipeline.

A `JSContext` is built exactly once per JS sample (in `workers.py`) and threaded
into every extractor that runs against that sample. It owns the disk read, the
decoded source text, the line-split cache, the Shannon text-entropy figure, the
shared `scan_source()` results, and the pyjsparser AST. Each of those is
computed lazily through `cached_property` so an extractor that doesn't need a
particular artefact does not pay for it.

Without this object, every JS extractor instance redoes the same disk read,
decode, scan, and (for any consumer) AST parse. With it, every extractor
shares one set of results.

`JSExtractor.__init__` accepts the context via a `context=` kwarg; if absent
(e.g. unit tests instantiating an extractor directly with `source=...`) it
builds a fresh context from the constructor arguments. Either path produces a
fully-populated context, so extractor code can always rely on
`self._context.scan` / `self._context.ast` / etc.
"""

from __future__ import annotations

import math
from collections import Counter
from dataclasses import dataclass
from functools import cached_property
from typing import Any, Dict, List, Optional

import chardet

from redb.extractors.js_extractors.js_patterns import scan_source


def decode_source(raw_bytes: bytes) -> str:
    """Decode raw JS bytes to text, honouring BOMs and falling back to chardet.

    Mirrors the historical `JSExtractor._decode_source` logic so existing tests
    continue to round-trip identically.
    """
    if not raw_bytes:
        return ""

    if raw_bytes[:3] == b"\xef\xbb\xbf":
        return raw_bytes[3:].decode("utf-8", errors="replace")
    if raw_bytes[:2] in (b"\xff\xfe", b"\xfe\xff"):
        return raw_bytes.decode("utf-16", errors="replace")

    try:
        return raw_bytes.decode("utf-8")
    except UnicodeDecodeError:
        pass

    try:
        detected = chardet.detect(raw_bytes)
        if detected and detected.get("encoding"):
            return raw_bytes.decode(detected["encoding"], errors="replace")
    except Exception:
        pass

    return raw_bytes.decode("latin-1", errors="replace")


def _text_entropy(text: str) -> float:
    """Shannon entropy of the character distribution of `text`, rounded to 4dp."""
    if not text:
        return 0.0
    counter = Counter(text)
    length = len(text)
    entropy = 0.0
    for count in counter.values():
        p = count / length
        if p > 0:
            entropy -= p * math.log2(p)
    return round(entropy, 4)


@dataclass
class JSContext:
    """Shared raw materials for one JS sample, consumed by every JS extractor.

    Cheap attributes (raw_bytes, source) are populated eagerly by the factory.
    Expensive ones (scan, ast) are cached_property — computed on first access
    and reused across every extractor that holds the same context.

    `content_type` is the magika label (e.g. `"javascript"`) carried alongside
    the source so the new code_text_content writer (and any future generic
    text-content writer) can record it without re-running magika. Defaults to
    `"javascript"` because by construction this context type is JS-specific;
    workers.py supplies the actual magika value when it builds the context.
    """

    filepath: str
    raw_bytes: bytes
    source: str
    log: Any = None
    content_type: str = "javascript"
    # Populated by JSStringsExtractor.extract() (the decoded/reconstructed
    # strings — hex/unicode/charcode/base64/concat unpacked into plaintext).
    # Read post-loop by the IOC plumbing in workers.py so any IOCs hidden
    # behind those encodings get scraped from the decoded form. Stays None
    # if JSStringsExtractor didn't run for this sample.
    decoded_strings: Optional[list] = None

    @cached_property
    def lines(self) -> List[str]:
        return self.source.splitlines() if self.source else []

    @cached_property
    def text_entropy(self) -> float:
        return _text_entropy(self.source)

    @cached_property
    def scan(self) -> Dict[str, Dict[str, object]]:
        """Result of running scan_source() exactly once over self.source."""
        return scan_source(self.source) if self.source else {}

    @cached_property
    def ast(self) -> Optional[Any]:
        """Lazy pyjsparser AST. Returns None if the parser is missing or fails.

        Extractors should treat None AST as "fall back to regex" — every
        AST-consuming extractor already handles that path.
        """
        if not self.source:
            return None
        try:
            import pyjsparser
            return pyjsparser.parse(self.source)
        except ImportError:
            if self.log is not None:
                self.log.debug("pyjsparser not installed, AST analysis skipped")
        except Exception as e:
            if self.log is not None:
                self.log.warning(f"AST parsing failed for {self.filepath}: {e}")
        return None

    @cached_property
    def deobfuscated(self) -> "tuple[Optional[str], Optional[str]]":
        """Run the configured JS deobfuscator (with jsbeautifier fallback) once
        per sample and cache the result. Returns `(text, normalizer_used)` or
        `(None, None)` if neither path produced output.

        Computed lazily on first access — samples whose pipeline never reads
        this don't pay the subprocess cost.
        """
        from redb.extractors.js_extractors.js_deobfuscator import deobfuscate
        return deobfuscate(self.source, self.log)

    @cached_property
    def scan_deobfuscated(self) -> Dict[str, Dict[str, object]]:
        """Result of running scan_source() exactly once over the deobfuscated
        text, keyed by PATTERNS only (FEATURE_PATTERNS are not consulted by
        the dual-pass consumers). Empty dict when there is no deobfuscated
        text or it equals the raw source.

        Two extractors consume the post-deobf API surface:
        `JSSuspiciousAPIsExtractor` (for revealed_by_deobf rows) and
        `JSDeobfuscationExtractor` (for the new_apis_found diff). Caching here
        means we scan the deobfuscated text once instead of twice per sample.
        """
        from redb.extractors.js_extractors.js_patterns import PATTERNS
        deobf_text, _ = self.deobfuscated
        if not deobf_text or deobf_text == self.source:
            return {}
        return scan_source(deobf_text, patterns=(PATTERNS,))

    @cached_property
    def xray(self):
        """Run @nodesecure/js-x-ray once per sample and cache the result.

        Returns an `XRayResult` (always — the function collapses every failure
        path to an empty result so callers don't have to special-case missing
        Node, missing package, timeouts, or parse errors). The
        `JSFeaturesExtractor` reads it for the obfuscator family name and for
        corroborating warning kinds; the heuristic falls back cleanly when
        `xray.obfuscator is None`.
        """
        from redb.extractors.js_extractors.js_xray import run
        return run(self.source, self.log)

    @classmethod
    def from_path(
        cls,
        filepath: str,
        log: Any = None,
        source: Optional[str] = None,
        raw_bytes: Optional[bytes] = None,
        content_type: str = "javascript",
    ) -> "JSContext":
        """Build a context from disk. `raw_bytes` and `source` are optional
        overrides — useful when the caller has already read or decoded the file.
        `content_type` is the magika label workers.py dispatched on; it lands
        on the context for the code_text_content writer to record.
        """
        if raw_bytes is None:
            with open(filepath, "rb") as f:
                raw_bytes = f.read()
        if source is None:
            source = decode_source(raw_bytes)
        return cls(
            filepath=filepath,
            raw_bytes=raw_bytes,
            source=source,
            log=log,
            content_type=content_type,
        )