Chakkrit Tantithamthavorn

145 papers A* 10A 13B 1C 3Journal 102Unranked 16
YearRankTypeTitle / Venue / Authors
2026 J jnl
Empir. Softw. Eng.
Honglin Shu, Michael Fu, Junji Yu, Dong Wang, Chakkrit Tantithamthavorn, Junjie Chen, Yasutaka Kamei
2026 J jnl
ACM Trans. Softw. Eng. Methodol.
Xinyu She, Yue Liu, Yanjie Zhao, Yiling He, Li Li, Chakkrit Tantithamthavorn, Zhan Qin, Haoyu Wang
2025 conf
ISSTA Companion
Junji Yu, Honglin Shu, Michael Fu, Dong Wang, Chakkrit Tantithamthavorn, Yasutaka Kamei, Junjie Chen
2025 J jnl
CoRR
Junji Yu, Honglin Shu, Michael Fu, Dong Wang, Chakkrit Tantithamthavorn, Yasutaka Kamei, Junjie Chen
2025 J jnl
ACM Trans. Softw. Eng. Methodol.
Michael Fu, Jirat Pasuksmit, Chakkrit Tantithamthavorn
2025 A* conf
ASE
Rui Yang, Michael Fu, Chakkrit Tantithamthavorn, Chetan Arora, Gunel Gulmammadova, Joselito Joey Chua
2025 J jnl
CoRR
Rui Yang, Michael Fu, Chakkrit Tantithamthavorn, Chetan Arora, Gunel Gulmammadova, Joselito Joey Chua
2025 J jnl
CoRR
Chakkrit Tantithamthavorn, Nicole Novielli, Ayushi Rastogi, Olga Baysal, Bram Adams
2025 J jnl
ACM SIGSOFT Softw. Eng. Notes
Chakkrit Tantithamthavorn, Nicole Novielli, Ayushi Rastogi, Olga Baysal, Bram Adams
2025 A conf
ICSME
Wannita Takerngsaksiri, Chakkrit Tantithamthavorn, Michael Fu, Jirat Pasuksmit, Kun Chen, Ming Wu
2025 J jnl
CoRR
Wannita Takerngsaksiri, Michael Fu, Chakkrit Tantithamthavorn, Jirat Pasuksmit, Kun Chen, Ming Wu
2025 J jnl
CoRR
Sherlock A. Licorish, Ansh Bajpai, Chetan Arora, Fanyu Wang, Chakkrit Tantithamthavorn
2025 J jnl
IEEE Access
Michael Fu, Chakkrit Tantithamthavorn, Trung Le
2025 J jnl
CoRR
Rui Yang, Michael Fu, Chakkrit Tantithamthavorn, Chetan Arora, Gunel Gulmammadova, Joselito Joey Chua
2025 J jnl
IEEE Trans. Reliab.
Michael Fu, Trung Le, Van Nguyen, Chakkrit Tantithamthavorn, Dinh Q. Phung
2025 J jnl
J. Syst. Softw.
Saranya Alagarsamy, Chakkrit Tantithamthavorn, Wannita Takerngsaksiri, Chetan Arora, Aldeida Aleti
2025 A conf
RE
Chetan Arora, Fanyu Wang, Chakkrit Tantithamthavorn, Aldeida Aleti, Shaun Kenyon
2025 J jnl
CoRR
Chetan Arora, Fanyu Wang, Chakkrit Tantithamthavorn, Aldeida Aleti, Shaun Kenyon
2025 conf
SEIP@ICSE
Wannita Takerngsaksiri, Jirat Pasuksmit, Patanamon Thongtanunam, Chakkrit Tantithamthavorn, Ruixiong Zhang, Fan Jiang, Jing Li, Evan Cook, Kun Chen, Ming Wu
2025 A conf
MSR
Jirat Pasuksmit, Wannita Takerngsaksiri, Patanamon Thongtanunam, Chakkrit Tantithamthavorn, Ruixiong Zhang, Shiyan Wang, Fan Jiang, Jing Li, Evan Cook, Kun Chen, Ming Wu
2025 J jnl
CoRR
Jirat Pasuksmit, Wannita Takerngsaksiri, Patanamon Thongtanunam, Chakkrit Tantithamthavorn, Ruixiong Zhang, Shiyan Wang, Fan Jiang, Jing Li, Evan Cook, Kun Chen, Ming Wu
2025 J jnl
CoRR
Honglin Shu, Michael Fu, Junji Yu, Dong Wang, Chakkrit Tantithamthavorn, Junjie Chen, Yasutaka Kamei
2025 A* conf
ASE
Fanyu Wang, Chetan Arora, Yonghui Liu, Kaicheng Huang, Chakkrit Tantithamthavorn, Aldeida Aleti, Dishan Sambathkumar, David Lo
2025 J jnl
CoRR
Fanyu Wang, Chetan Arora, Yonghui Liu, Kaicheng Huang, Chakkrit Tantithamthavorn, Aldeida Aleti, Dishan Sambathkumar, David Lo
2025 J jnl
Empir. Softw. Eng.
Aastha Pant, Rashina Hoda, Chakkrit Tantithamthavorn, Burak Turhan
2025 J jnl
CoRR
Dong Wang, Junji Yu, Honglin Shu, Michael Fu, Chakkrit Tantithamthavorn, Yasutaka Kamei, Junjie Chen
2025 A conf
SANER
Yue Liu, Chakkrit Tantithamthavorn, Li Li
2025 J jnl
J. Syst. Softw.
Wannita Takerngsaksiri, Rujikorn Charakorn, Chakkrit Tantithamthavorn, Yuan-Fang Li
2025 J jnl
CoRR
Rui Yang, Michael Fu, Chakkrit Tantithamthavorn, Chetan Arora, Lisa Vandenhurk, Joselito Joey Chua
2025 J jnl
J. Syst. Softw.
Rui Yang, Michael Fu, Chakkrit Tantithamthavorn, Chetan Arora, Lisa Vandenhurk, Joselito Joey Chua
2025 J jnl
CoRR
Fanyu Wang, Chetan Arora, Chakkrit Tantithamthavorn, Kaicheng Huang, Aldeida Aleti
2025 conf
AIware
Wenliang Shan, Michael Fu, Rui Yang, Chakkrit Tantithamthavorn
2025 J jnl
CoRR
Wenliang Shan, Michael Fu, Rui Yang, Chakkrit Tantithamthavorn
2025 J jnl
IEEE Softw.
Aastha Pant, Rashina Hoda, Burak Turhan, Chakkrit Tantithamthavorn
2025 J jnl
CoRR
Yue Liu, Zhenchang Xing, Shidong Pan, Chakkrit Tantithamthavorn
2024 J jnl
ACM Trans. Softw. Eng. Methodol.
Jinqiang Yu, Michael Fu, Alexey Ignatiev, Chakkrit Tantithamthavorn, Peter J. Stuckey
2024 J jnl
Inf. Softw. Technol.
Saranya Alagarsamy, Chakkrit Tantithamthavorn, Aldeida Aleti
2024 J jnl
CoRR
Michael Fu, Jirat Pasuksmit, Chakkrit Tantithamthavorn
2024 J jnl
Empir. Softw. Eng.
Michael Fu, Chakkrit Tantithamthavorn, Trung Le, Yuki Kume, Van Nguyen, Dinh Q. Phung, John C. Grundy
2024 J jnl
ACM Trans. Softw. Eng. Methodol.
Yue Liu, Chakkrit Tantithamthavorn, Yonghui Liu, Patanamon Thongtanunam, Li Li
2024 A conf
ISSRE
Patanamon Thongtanunam, Chakkrit Tantithamthavorn
2024 J jnl
CoRR
Patanamon Thongtanunam, Chakkrit Tantithamthavorn
2024 J jnl
ACM Trans. Softw. Eng. Methodol.
Van Nguyen, Trung Le, Chakkrit Tantithamthavorn, John C. Grundy, Dinh Q. Phung
2024 J jnl
Inf. Softw. Technol.
Yang Hong, Chakkrit Tantithamthavorn, Patanamon Thongtanunam, Aldeida Aleti
2024 J jnl
CoRR
Saranya Alagarsamy, Chakkrit Tantithamthavorn, Chetan Arora, Aldeida Aleti
2024 J jnl
Empir. Softw. Eng.
Aastha Pant, Rashina Hoda, Chakkrit Tantithamthavorn, Burak Turhan
2024 J jnl
ACM Trans. Softw. Eng. Methodol.
Aastha Pant, Rashina Hoda, Simone V. Spiegler, Chakkrit Tantithamthavorn, Burak Turhan
2024 A* conf
ICSE
Danushka Liyanage, Seongmin Lee, Chakkrit Tantithamthavorn, Marcel Böhme
2024 J jnl
Inf. Softw. Technol.
Chanathip Pornprasit, Chakkrit Tantithamthavorn
2024 J jnl
CoRR
Chanathip Pornprasit, Chakkrit Tantithamthavorn
2024 J jnl
CoRR
Wannita Takerngsaksiri, Jirat Pasuksmit, Patanamon Thongtanunam, Chakkrit Tantithamthavorn, Ruixiong Zhang, Fan Jiang, Jing Li, Evan Cook, Kun Chen, Ming Wu
2024 J jnl
CoRR
Guoxiang Guo, Aldeida Aleti, Neelofar, Chakkrit Tantithamthavorn
2024 J jnl
CoRR
Aastha Pant, Rashina Hoda, Chakkrit Tantithamthavorn, Burak Turhan
2024 J jnl
ACM Trans. Softw. Eng. Methodol.
Yue Liu, Chakkrit Tantithamthavorn, Yonghui Liu, Li Li
2024 conf
SIGSOFT FSE Companion
Yang Hong, Chakkrit Tantithamthavorn, Jirat Pasuksmit, Patanamon Thongtanunam, Arik Friedman, Xing Zhao, Anton Krasikov
2024 J jnl
CoRR
Yang Hong, Chakkrit Tantithamthavorn, Jirat Pasuksmit, Patanamon Thongtanunam, Arik Friedman, Xing Zhao, Anton Krasikov
2024 J jnl
CoRR
Yue Liu, Chakkrit Tantithamthavorn, Li Li
2024 J jnl
ACM Trans. Softw. Eng. Methodol.
Yue Liu, Thanh Le-Cong, Ratnadira Widyasari, Chakkrit Tantithamthavorn, Li Li, Xuan-Bach Dinh Le, David Lo
2024 B conf
COMPSAC
Wannita Takerngsaksiri, Cleshan Warusavitarne, Christian Yaacoub, Matthew Hee Keng Hou, Chakkrit Tantithamthavorn
2024 J jnl
Inf. Softw. Technol.
Wannita Takerngsaksiri, Chakkrit Tantithamthavorn, Yuan-Fang Li
2024 J jnl
CoRR
Wannita Takerngsaksiri, Rujikorn Charakorn, Chakkrit Tantithamthavorn, Yuan-Fang Li
2024 J jnl
ACM Trans. Softw. Eng. Methodol.
Michael Fu, Van Nguyen, Chakkrit Tantithamthavorn, Dinh Phung, Trung Le
2024 J jnl
CoRR
Aastha Pant, Rashina Hoda, Burak Turhan, Chakkrit Tantithamthavorn
2023 J jnl
CoRR
Ahmad Haji Mohammadkhani, Nitin Sai Bommi, Mariem Daboussi, Onkar Sabnis, Chakkrit Tantithamthavorn, Hadi Hemmati
2023 J jnl
CoRR
Saranya Alagarsamy, Chakkrit Tantithamthavorn, Aldeida Aleti
2023 J jnl
CoRR
Michael Fu, Chakkrit Tantithamthavorn, Trung Le, Yuki Kume, Van Nguyen, Dinh Phung, John C. Grundy
2023 J jnl
IEEE Softw.
Rashina Hoda, Hoa Khanh Dam, Chakkrit Tantithamthavorn, Patanamon Thongtanunam, Margaret-Anne D. Storey
2023 J jnl
CoRR
Michael Fu, Chakkrit Tantithamthavorn, Van Nguyen, Trung Le
2023 A conf
SANER
Chanathip Pornprasit, Chakkrit Tantithamthavorn, Patanamon Thongtanunam, Chunyang Chen
2023 J jnl
ACM Comput. Surv.
Yue Liu, Chakkrit Tantithamthavorn, Li Li, Yepang Liu
2023 conf
ASEW
Haonan Hu, Yue Liu, Yanjie Zhao, Yonghui Liu, Xiaoyu Sun, Chakkrit Tantithamthavorn, Li Li
2023 J jnl
CoRR
Aastha Pant, Rashina Hoda, Simone V. Spiegler, Chakkrit Tantithamthavorn, Burak Turhan
2023 J jnl
IEEE Softw.
Jürgen Cito, Satish Chandra, Chakkrit Tantithamthavorn, Hadi Hemmati
2023 J jnl
IEEE Softw.
Chakkrit Tantithamthavorn, Jürgen Cito, Hadi Hemmati, Satish Chandra
2023 C conf
SCAM
Ahmad Haji Mohammadkhani, Chakkrit Tantithamthavorn, Hadi Hemmati
2023 J jnl
IEEE Trans. Software Eng.
Michael Fu, Chakkrit Tantithamthavorn
2023 J jnl
CoRR
Michael Fu, Trung Le, Van Nguyen, Chakkrit Tantithamthavorn, Dinh Q. Phung
2023 J jnl
CoRR
Yue Liu, Chakkrit Tantithamthavorn, Yonghui Liu, Li Li
2023 J jnl
CoRR
Xinyu She, Yue Liu, Yanjie Zhao, Yiling He, Li Li, Chakkrit Tantithamthavorn, Zhan Qin, Haoyu Wang
2023 A* conf
ICSE
Danushka Liyanage, Marcel Böhme, Chakkrit Tantithamthavorn, Stephan Lipp
2023 J jnl
CoRR
Yue Liu, Thanh Le-Cong, Ratnadira Widyasari, Chakkrit Tantithamthavorn, Li Li, Xuan-Bach Dinh Le, David Lo
2023 J jnl
CoRR
Wannita Takerngsaksiri, Cleshan Warusavitarne, Christian Yaacoub, Matthew Hee Keng Hou, Chakkrit Tantithamthavorn
2023 C conf
APSEC
Chakkrit Tantithamthavorn, Norman Chen
2023 J jnl
CoRR
Chakkrit Tantithamthavorn, Norman Chen
2023 conf
ICSE Companion
Wei Teo, Ze Teoh, Dayang Abang Arabi, Morad Aboushadi, Khairenn Lai, Zhe Ng, Aastha Pant, Rashina Hoda, Chakkrit Tantithamthavorn, Burak Turhan
2022 J jnl
CoRR
Van Nguyen, Trung Le, Chakkrit Tantithamthavorn, John C. Grundy, Hung Nguyen, Seyit Camtepe, Paul Quirk, Dinh Q. Phung
2022 A* conf
ICSE
Patanamon Thongtanunam, Chanathip Pornprasit, Chakkrit Tantithamthavorn
2022 J jnl
CoRR
Yue Liu, Chakkrit Tantithamthavorn, Yonghui Liu, Patanamon Thongtanunam, Li Li
2022 conf
ESEC/SIGSOFT FSE
Yang Hong, Chakkrit Tantithamthavorn, Patanamon Thongtanunam, Aldeida Aleti
2022 J jnl
CoRR
Van Nguyen, Trung Le, Chakkrit Tantithamthavorn, John C. Grundy, Hung Nguyen, Dinh Q. Phung
2022 J jnl
CoRR
Aastha Pant, Rashina Hoda, Chakkrit Tantithamthavorn, Burak Turhan
2022 A conf
ISSRE
Yue Liu, Chakkrit Tantithamthavorn, Li Li, Yepang Liu
2022 J jnl
CoRR
Yue Liu, Chakkrit Tantithamthavorn, Li Li, Yepang Liu
2022 J jnl
CoRR
Ahmad Haji Mohammadkhani, Chakkrit Tantithamthavorn, Hadi Hemmati
2022 A conf
MSR
Michael Fu, Chakkrit Tantithamthavorn
2022 J jnl
IEEE Trans. Software Eng.
Supatsara Wattanakriengkrai, Patanamon Thongtanunam, Chakkrit Tantithamthavorn, Hideaki Hata, Kenichi Matsumoto
2022 J jnl
IEEE Trans. Software Eng.
Dilini Rajapaksha, Chakkrit Tantithamthavorn, Jirayus Jiarpakdee, Christoph Bergmeir, John Grundy, Wray L. Buntine
2022 J jnl
Empir. Softw. Eng.
Anjana Perera, Aldeida Aleti, Chakkrit Tantithamthavorn, Jirayus Jiarpakdee, Burak Turhan, Lisa Kuhn, Katie Walker
2022 J jnl
CoRR
Sherlock A. Licorish, Christoph Treude, John C. Grundy, Chakkrit Tantithamthavorn, Kelly Blincoe, Stephen G. MacDonell, Li Li, Jean-Guy Schneider
2022 J jnl
CoRR
Wannita Takerngsaksiri, Chakkrit Tantithamthavorn, Yuan-Fang Li
2022 J jnl
IEEE Trans. Software Eng.
Dayi Lin, Chakkrit Tantithamthavorn, Ahmed E. Hassan
2022 conf
ESEC/SIGSOFT FSE
Michael Fu, Chakkrit Tantithamthavorn, Trung Le, Van Nguyen, Dinh Q. Phung
2021 J jnl
IEEE Softw.
Chakkrit Tantithamthavorn, Jirayus Jiarpakdee, John Grundy
2021 J jnl
CoRR
Chun Yong Chong, Patanamon Thongtanunam, Chakkrit Tantithamthavorn
2021 conf
ICSE (SEET)
Chun Yong Chong, Patanamon Thongtanunam, Chakkrit Tantithamthavorn
2021 J jnl
CoRR
Yue Liu, Chakkrit Tantithamthavorn, Li Li, Yepang Liu
2021 A conf
MSR
Chanathip Pornprasit, Chakkrit Tantithamthavorn
2021 J jnl
CoRR
Chanathip Pornprasit, Chakkrit Tantithamthavorn
2021 A conf
MSR
Jirayus Jiarpakdee, Chakkrit Tantithamthavorn, John C. Grundy
2021 J jnl
CoRR
Jirayus Jiarpakdee, Chakkrit Tantithamthavorn, John C. Grundy
2021 A* conf
ASE
Chanathip Pornprasit, Chakkrit Tantithamthavorn, Jirayus Jiarpakdee, Michael Fu, Patanamon Thongtanunam
2021 J jnl
CoRR
Dilini Rajapaksha, Chakkrit Tantithamthavorn, Jirayus Jiarpakdee, Christoph Bergmeir, John C. Grundy, Wray L. Buntine
2021 J jnl
ACM SIGSOFT Softw. Eng. Notes
Sherlock A. Licorish, Christoph Treude, John C. Grundy, Kelly Blincoe, Stephen G. MacDonell, Chakkrit Tantithamthavorn, Li Li, Jean-Guy Schneider
2021 J jnl
IEEE Trans. Software Eng.
Jirayus Jiarpakdee, Chakkrit Tantithamthavorn, Ahmed E. Hassan
2020 J jnl
CoRR
Chakkrit Tantithamthavorn, Jirayus Jiarpakdee, John C. Grundy
2020 A* conf
ASE
Chaiyakarn Khanan, Worawit Luewichana, Krissakorn Pruktharathikoon, Jirayus Jiarpakdee, Chakkrit Tantithamthavorn, Morakot Choetkiertikul, Chaiyong Ragkhitwetsagul, Thanwadee Sunetnanta
2020 J jnl
CoRR
Supatsara Wattanakriengkrai, Patanamon Thongtanunam, Chakkrit Tantithamthavorn, Hideaki Hata, Kenichi Matsumoto
2020 J jnl
IEEE Trans. Software Eng.
Chakkrit Tantithamthavorn, Ahmed E. Hassan, Kenichi Matsumoto
2020 J jnl
Empir. Softw. Eng.
Jirayus Jiarpakdee, Chakkrit Tantithamthavorn, Christoph Treude
2020 conf
PROMISE
Wisam Haitham Abbood Al-Zubaidi, Patanamon Thongtanunam, Hoa Khanh Dam, Chakkrit Tantithamthavorn, Aditya Ghose
2019 A* conf
ICSE
Suraj Yatish, Jirayus Jiarpakdee, Patanamon Thongtanunam, Chakkrit Tantithamthavorn
2019 J jnl
IEEE Trans. Software Eng.
Chakkrit Tantithamthavorn, Shane McIntosh, Ahmed E. Hassan, Kenichi Matsumoto
2018 conf
ICSE (SEIP)
Chakkrit Tantithamthavorn, Ahmed E. Hassan
2018 A conf
ICSME
Jirayus Jiarpakdee, Chakkrit Tantithamthavorn, Christoph Treude
2018 J jnl
CoRR
Jirayus Jiarpakdee, Chakkrit Tantithamthavorn, Christoph Treude
2018 A conf
ICSME
Jirayus Jiarpakdee, Chakkrit Tantithamthavorn, Christoph Treude
2018 J jnl
Empir. Softw. Eng.
Safwat Hassan, Chakkrit Tantithamthavorn, Cor-Paul Bezemer, Ahmed E. Hassan
2018 A* conf
ICSE
Safwat Hassan, Chakkrit Tantithamthavorn, Cor-Paul Bezemer, Ahmed E. Hassan
2018 J jnl
CoRR
Chakkrit Tantithamthavorn, Shane McIntosh, Ahmed E. Hassan, Kenichi Matsumoto
2018 J jnl
CoRR
Chakkrit Tantithamthavorn, Ahmed E. Hassan, Kenichi Matsumoto
2018 J jnl
CoRR
Jirayus Jiarpakdee, Chakkrit Tantithamthavorn, Ahmed E. Hassan
2018 J jnl
CoRR
Chakkrit Tantithamthavorn, Surafel Lemma Abebe, Ahmed E. Hassan, Akinori Ihara, Kenichi Matsumoto
2018 J jnl
Inf. Softw. Technol.
Chakkrit Tantithamthavorn, Surafel Lemma Abebe, Ahmed E. Hassan, Akinori Ihara, Kenichi Matsumoto
2017 J jnl
IEEE Trans. Software Eng.
Chakkrit Tantithamthavorn, Shane McIntosh, Ahmed E. Hassan, Kenichi Matsumoto
2016 conf
ISSRE Workshops
Jirayus Jiarpakdee, Chakkrit Tantithamthavorn, Akinori Ihara, Kenichi Matsumoto
2016 A* conf
ICSE
Chakkrit Tantithamthavorn, Shane McIntosh, Ahmed E. Hassan, Kenichi Matsumoto
2016 J jnl
IEEE Trans. Software Eng.
Chakkrit Tantithamthavorn, Shane McIntosh, Ahmed E. Hassan, Kenichi Matsumoto
2016 J jnl
PeerJ Prepr.
Chakkrit Tantithamthavorn, Shane McIntosh, Ahmed E. Hassan, Ken-ichi Matsumoto
2016 conf
ICSE (Companion Volume)
Chakkrit Tantithamthavorn
2015 J jnl
PeerJ Prepr.
Chakkrit Tantithamthavorn, Shane McIntosh, Ahmed E. Hassan, Ken-ichi Matsumoto
2015 conf
ICSE (1)
Chakkrit Tantithamthavorn, Shane McIntosh, Ahmed E. Hassan, Akinori Ihara, Ken-ichi Matsumoto
2015 A conf
SANER
Patanamon Thongtanunam, Chakkrit Tantithamthavorn, Raula Gaikovina Kula, Norihiro Yoshida, Hajimu Iida, Ken-ichi Matsumoto
2014 conf
APRES
Chakkrit Tantithamthavorn, Akinori Ihara, Hideaki Hata, Kenichi Matsumoto
2013 conf
ISSRE (Supplemental Proceedings)
Chakkrit Tantithamthavorn, Rattamont Teekavanich, Akinori Ihara, Ken-ichi Matsumoto
2013 C conf
SNPD
Chakkrit Tantithamthavorn, Akinori Ihara, Ken-ichi Matsumoto
redb/extractors/js_extractors/js_patterns.py
← Index redb/extractors/js_extractors/js_patterns.py python
"""Canonical, compiled JavaScript regex patterns shared across JS extractors.

All suspicious-API patterns and the few feature-only patterns live here so each
expression is compiled exactly once per Python process and so any pattern that
was previously duplicated across `js_features.py` and `js_suspicious_apis.py`
now resolves to a single shared compiled object.

JavaScript is case-sensitive at runtime, but every suspicious-API pattern matches
either a literal-case identifier (`\\beval\\s*\\(`, `String\\.fromCharCode`, etc.)
or a string-quoted token (`"powershell"`). Compiling them with `re.IGNORECASE`
matches the historical behaviour of `JSSuspiciousAPIsExtractor` and is safe for
the patterns that historically came from `JSFeaturesExtractor` — those literals
are spelled in real-world JS exactly as written.

`scan_source()` is the entry point used by extractors: it walks the source once
per pattern using the pre-compiled regexes and returns a flat
`{name: {"count": N, "lines": [unique_line_numbers_sorted]}}` dict. Both
`JSFeaturesExtractor` and `JSSuspiciousAPIsExtractor` consume the same dict so
the per-pattern × per-line loops they used to run independently collapse to a
single shared scan.
"""

import bisect
import re
from typing import Dict, Iterable, List, Mapping

_FLAGS = re.IGNORECASE

# Canonical compiled patterns, keyed by their human-readable name. The name is
# also the value emitted into `redb_js_suspicious_apis.api_name`.
PATTERNS = {
    # ---- code execution ----
    "eval": re.compile(r"\beval\s*\(", _FLAGS),
    "Function constructor": re.compile(r"\bnew\s+Function\s*\(", _FLAGS),
    "execScript": re.compile(r"\bexecScript\s*\(", _FLAGS),
    "document.write": re.compile(r"\bdocument\.write(?:ln)?\s*\(", _FLAGS),
    "innerHTML assignment": re.compile(r"\.innerHTML\s*=", _FLAGS),
    "outerHTML assignment": re.compile(r"\.outerHTML\s*=", _FLAGS),
    "insertAdjacentHTML": re.compile(r"\.insertAdjacentHTML\s*\(", _FLAGS),
    # ---- network ----
    "XMLHttpRequest": re.compile(r"\bnew\s+XMLHttpRequest\b", _FLAGS),
    "fetch": re.compile(r"\bfetch\s*\(", _FLAGS),
    "WebSocket": re.compile(r"\bnew\s+WebSocket\s*\(", _FLAGS),
    "navigator.sendBeacon": re.compile(r"\bnavigator\.sendBeacon\s*\(", _FLAGS),
    "ActiveXObject XMLHTTP": re.compile(
        r"ActiveXObject\s*\(\s*[\"\'](?:MSXML2\.XMLHTTP|Microsoft\.XMLHTTP)", _FLAGS
    ),
    "require network module": re.compile(
        r"require\s*\(\s*[\"\'](?:http|https|net|dgram)[\"\']", _FLAGS
    ),
    "axios": re.compile(r"\baxios\b", _FLAGS),
    # ---- filesystem ----
    "require fs": re.compile(r"require\s*\(\s*[\"\']fs[\"\']", _FLAGS),
    "require path": re.compile(r"require\s*\(\s*[\"\']path[\"\']", _FLAGS),
    "FileSystemObject": re.compile(r"Scripting\.FileSystemObject", _FLAGS),
    "ADODB.Stream": re.compile(r"ADODB\.Stream", _FLAGS),
    "Shell.Application": re.compile(r"Shell\.Application", _FLAGS),
    "WScript.CreateObject": re.compile(r"WScript\.CreateObject", _FLAGS),
    # ---- process ----
    "require child_process": re.compile(r"require\s*\(\s*[\"\']child_process[\"\']", _FLAGS),
    "child_process exec": re.compile(r"child_process\.(?:exec|spawn|execFile|fork)\s*\(", _FLAGS),
    "WScript.Shell": re.compile(r"WScript\.Shell", _FLAGS),
    "WScript.Shell.Run": re.compile(r"\.Run\s*\(", _FLAGS),
    "WScript.Shell.Exec": re.compile(r"\.Exec\s*\(", _FLAGS),
    "ShellExecute": re.compile(r"\bShellExecute\b", _FLAGS),
    "PowerShell reference": re.compile(r"[\"\']powershell[\"\']", _FLAGS),
    "cmd.exe reference": re.compile(r"[\"\']cmd\.exe[\"\']", _FLAGS),
    "require os": re.compile(r"require\s*\(\s*[\"\']os[\"\']", _FLAGS),
    # ---- registry ----
    "RegRead": re.compile(r"\.RegRead\s*\(", _FLAGS),
    "RegWrite": re.compile(r"\.RegWrite\s*\(", _FLAGS),
    "RegDelete": re.compile(r"\.RegDelete\s*\(", _FLAGS),
    "StdRegProv": re.compile(r"StdRegProv", _FLAGS),
    # ---- crypto / encoding ----
    "atob": re.compile(r"\batob\s*\(", _FLAGS),
    "btoa": re.compile(r"\bbtoa\s*\(", _FLAGS),
    "String.fromCharCode": re.compile(r"String\.fromCharCode\s*\(", _FLAGS),
    "unescape": re.compile(r"\bunescape\s*\(", _FLAGS),
    "decodeURIComponent": re.compile(r"\bdecodeURIComponent\s*\(", _FLAGS),
    "Buffer.from": re.compile(r"Buffer\.from\s*\(", _FLAGS),
    "crypto module": re.compile(r"crypto\.create(?:Cipher|Decipher|Hash|Hmac)", _FLAGS),
    # ---- DOM manipulation ----
    "document.forms": re.compile(r"document\.forms", _FLAGS),
    "document.cookie": re.compile(r"document\.cookie", _FLAGS),
    "querySelector sensitive input": re.compile(
        r"document\.querySelector\s*\([^)]*(?:password|credit|card|cvv|ssn)", _FLAGS
    ),
    "submit event listener": re.compile(r"addEventListener\s*\(\s*[\"\']submit", _FLAGS),
    "createElement script/iframe": re.compile(
        r"\.createElement\s*\(\s*[\"\'](?:script|iframe)", _FLAGS
    ),
    "dynamic script src": re.compile(r"\.src\s*=\s*[\"\'](?:https?://|//)", _FLAGS),
}

# Pattern name -> category (one of code_execution / network / filesystem /
# process / registry / crypto_encoding / dom_manipulation).
CATEGORIES = {
    "eval": "code_execution",
    "Function constructor": "code_execution",
    "execScript": "code_execution",
    "document.write": "code_execution",
    "innerHTML assignment": "code_execution",
    "outerHTML assignment": "code_execution",
    "insertAdjacentHTML": "code_execution",
    "XMLHttpRequest": "network",
    "fetch": "network",
    "WebSocket": "network",
    "navigator.sendBeacon": "network",
    "ActiveXObject XMLHTTP": "network",
    "require network module": "network",
    "axios": "network",
    "require fs": "filesystem",
    "require path": "filesystem",
    "FileSystemObject": "filesystem",
    "ADODB.Stream": "filesystem",
    "Shell.Application": "filesystem",
    "WScript.CreateObject": "filesystem",
    "require child_process": "process",
    "child_process exec": "process",
    "WScript.Shell": "process",
    "WScript.Shell.Run": "process",
    "WScript.Shell.Exec": "process",
    "ShellExecute": "process",
    "PowerShell reference": "process",
    "cmd.exe reference": "process",
    "require os": "process",
    "RegRead": "registry",
    "RegWrite": "registry",
    "RegDelete": "registry",
    "StdRegProv": "registry",
    "atob": "crypto_encoding",
    "btoa": "crypto_encoding",
    "String.fromCharCode": "crypto_encoding",
    "unescape": "crypto_encoding",
    "decodeURIComponent": "crypto_encoding",
    "Buffer.from": "crypto_encoding",
    "crypto module": "crypto_encoding",
    "document.forms": "dom_manipulation",
    "document.cookie": "dom_manipulation",
    "querySelector sensitive input": "dom_manipulation",
    "submit event listener": "dom_manipulation",
    "createElement script/iframe": "dom_manipulation",
    "dynamic script src": "dom_manipulation",
}

# Patterns consumed only by JSFeaturesExtractor (no category, never surfaced as
# a suspicious-API row). Kept here so every JS regex is compiled in one place.
FEATURE_PATTERNS = {
    "hex_escape": re.compile(r"\\x[0-9a-fA-F]{2}"),
    "unicode_escape": re.compile(r"\\u[0-9a-fA-F]{4}"),
    "base64_string": re.compile(r"[A-Za-z0-9+/]{40,}={0,2}"),
    # decodeURI matches BOTH decodeURI and decodeURIComponent. The latter is also
    # a suspicious-API pattern in PATTERNS; this broader form is what the
    # `decodeuri_count` feature column has historically counted.
    "decodeURI": re.compile(r"\b(?:decodeURI|decodeURIComponent)\s*\(", _FLAGS),
    "settimeout_setinterval": re.compile(r"\b(?:setTimeout|setInterval)\s*\(", _FLAGS),
    "function_decl": re.compile(r"\bfunction\s+\w+\s*\(|\bfunction\s*\("),
    "var_decl": re.compile(r"\b(?:var|let|const)\s+"),
    "string_concat": re.compile(r"[\"\'][\s]*\+[\s]*[\"\']"),
    "comment": re.compile(r"//.*?$|/\*[\s\S]*?\*/", re.MULTILINE),
    "long_string": re.compile(r"[\"\']([^\"\']{256,})[\"\']"),
    "array_function_call": re.compile(r"\[(?:0x[0-9a-f]+|[\d]+)\]\s*\(", _FLAGS),
}

# Patterns consumed only by JSStringsExtractor for encoded-string discovery.
# Scoped to *hidden* strings only — patterns whose decoded form is not visible
# to a substring search over the raw text. Plain long literals are not
# extracted here because they're already preserved in code_text_content and
# scraped by the IOC pipeline over text_raw / text_normalized.
#
# Distinct from FEATURE_PATTERNS even where the names rhyme:
#   FEATURE_PATTERNS["hex_escape"] / ["unicode_escape"]   -> single escape
#   STRING_PATTERNS["hex_escape_seq"] / ["unicode_escape_seq"] -> 4+ / 3+ in a row
#   FEATURE_PATTERNS["base64_string"]                     -> bare base64 token
#   STRING_PATTERNS["base64_quoted"]                      -> base64 inside JS quotes
# These do not share match objects with the suspicious-API or feature scans, so
# they are not folded into JSContext.scan; the strings extractor walks them
# itself (one finditer per pattern, with shared line-offset bisect in #4b).
STRING_PATTERNS = {
    "hex_escape_seq": re.compile(r"(?:\\x[0-9a-fA-F]{2}){4,}"),
    "unicode_escape_seq": re.compile(r"(?:\\u[0-9a-fA-F]{4}){3,}"),
    "charcode_call": re.compile(r"String\.fromCharCode\s*\(\s*([\d,\s]+)\s*\)"),
    "base64_quoted": re.compile(r"[\"\']([A-Za-z0-9+/]{40,}={0,2})[\"\']"),
    "concat_chain": re.compile(r"(?:[\"\'][^\"\']+[\"\']\s*\+\s*){3,}[\"\'][^\"\']+[\"\']"),
}


def line_offsets(source: str) -> List[int]:
    """Sorted list of byte offsets for every newline in `source`, plus a final
    sentinel of len(source). Used to translate match offsets into 1-indexed
    line numbers via bisect.
    """
    offsets = [-1]  # so that bisect_right of offset 0 returns line 1
    push = offsets.append
    idx = source.find("\n")
    while idx != -1:
        push(idx)
        idx = source.find("\n", idx + 1)
    return offsets


def _scan_one(
    pattern: "re.Pattern[str]", source: str, offsets: List[int]
) -> Dict[str, object]:
    """Run a single compiled pattern over `source` and return count + unique lines."""
    count = 0
    seen_lines: "set[int]" = set()
    for m in pattern.finditer(source):
        count += 1
        seen_lines.add(bisect.bisect_right(offsets, m.start()))
    if not count:
        return None  # type: ignore[return-value]
    return {"count": count, "lines": sorted(seen_lines)}


def scan_source(
    source: str,
    patterns: Iterable[Mapping[str, "re.Pattern[str]"]] = (PATTERNS, FEATURE_PATTERNS),
) -> Dict[str, Dict[str, object]]:
    """Scan `source` against every compiled pattern in `patterns`.

    Returns a dict keyed by pattern name. Each entry has:
        "count": total number of matches in the source
        "lines": sorted list of unique 1-indexed line numbers where the pattern
                 matched (deduplicated — multiple matches on the same line
                 collapse to one entry, preserving the historical
                 line-set semantics of JSSuspiciousAPIsExtractor)
    Patterns with zero matches are absent from the dict; callers should default
    to {"count": 0, "lines": []}.
    """
    if not source:
        return {}
    offsets = line_offsets(source)
    results: Dict[str, Dict[str, object]] = {}
    for table in patterns:
        for name, pat in table.items():
            entry = _scan_one(pat, source, offsets)
            if entry is not None:
                results[name] = entry
    return results