Scan report
zonetecde / QuranCaption
Could an attacker exploit mistakes in this code?
Real issues worth reviewing before you rely on this code.
- High
- 0
- Medium
- 34
- Low
- 32
Sources: Bandit, Semgrep, pip-audit
Does this code look like it is trying to cause harm?
Minor issues. Worth a glance, unlikely to be urgent.
- High
- 7
- Medium
- 0
- Low
- 66
Sources: YARA, ClamAV, GuardDog, dependency checker
- Likely real
- 0
- Uncertain
- 20
- Likely noise
- 119
The risk classifier rates every finding for how likely it is to be a real issue. Likely noise still counts, just much less.
What we found, in plain English
This repository shows signs of potential malicious activity rather than just standard insecure coding, as it was flagged by multiple security tools for dangerous patterns like downloading and executing remote files or using credential-harvesting techniques. The most concerning issue is that two YARA rules detected code attempting to download a resource and execute it directly, which could allow an attacker to run arbitrary commands on your system if the code is ever shared publicly. Additionally, there are several medium-level vulnerabilities, including weak hashing methods, unsafe file operations, and potential SQL injection risks, but these appear to be common mistakes in application development rather than intentional attempts to harm others. While some dependencies have loose version constraints that could theoretically be exploited by attackers pushing malicious updates, the overall risk remains low because the codebase does not contain obvious malware or exploits designed specifically to damage your environment.
Written by a local language model from the findings below. The risk scores come from the classifier, not from this summary.
Detections by engine
Score over time
Overall score each time this repository was scanned.
Findings
Highest severity first. Select a finding to see the code and what it means.
-
- Engine
- YARA · Malware signature rules
- Counts towards
- Malicious pattern
- File
- /src-tauri/python/quran-multi-aligner/src/mfa.py
- Likely real
- Uncertain, 33% confidence
YARA rule matched: detect_credential_harvester — References credential/secret material by name AND a deliberate outbound-send API in the same file - narrower than \'reads any env var\', which large legitimate codebases do constantly regardless of intent. Still not proof the two are connected (YARA can\'t trace data flow) - a known limitation, see NOTES.md
-
- Engine
- YARA · Malware signature rules
- Counts towards
- Malicious pattern
- File
- /src-tauri/python/local_multi_aligner_segmenter.py
- Likely real
- Uncertain, 33% confidence
YARA rule matched: detect_credential_harvester — References credential/secret material by name AND a deliberate outbound-send API in the same file - narrower than \'reads any env var\', which large legitimate codebases do constantly regardless of intent. Still not proof the two are connected (YARA can\'t trace data flow) - a known limitation, see NOTES.md
-
- Engine
- YARA · Malware signature rules
- Counts towards
- Malicious pattern
- File
- /src-tauri/python/quran-multi-aligner/src/pipeline.py
- Likely real
- Probably noise, 18% confidence
YARA rule matched: detect_anti_analysis — Checks for a debugger, VM, or sandbox before continuing - a common malware evasion technique, essentially never present in ordinary application code
-
- Engine
- YARA · Malware signature rules
- Counts towards
- Malicious pattern
- File
- /src-tauri/python/quran-multi-aligner/src/api/session_api.py
- Likely real
- Probably noise, 3% confidence
YARA rule matched: detect_base64_exec — Encoded payload decoded and then executed
-
- Engine
- YARA · Malware signature rules
- Counts towards
- Malicious pattern
- File
- /src-tauri/python/quran-multi-aligner/src/core/worker_pool.py
- Likely real
- Probably noise, 3% confidence
YARA rule matched: detect_base64_exec — Encoded payload decoded and then executed
-
- Engine
- YARA · Malware signature rules
- Counts towards
- Malicious pattern
- File
- /src-tauri/python/local_multi_aligner_segmenter.py
- Likely real
- Probably noise, 1% confidence
YARA rule matched: detect_download_and_execute — Downloads a remote resource AND executes it - the actually dangerous combination, not just downloading alone
-
- Engine
- YARA · Malware signature rules
- Counts towards
- Malicious pattern
- File
- /src-tauri/python/quran_recite_to_text/src/core/updater.py
- Likely real
- Probably noise, 1% confidence
YARA rule matched: detect_download_and_execute — Downloads a remote resource AND executes it - the actually dangerous combination, not just downloading alone
-
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/api/session_api.py line 107
- Likely real
- Uncertain, 49% confidence
Use of weak MD5 hash for security. Consider usedforsecurity=False
106 def _intervals_hash(intervals) -> str: 107 return hashlib.md5(json.dumps(intervals).encode()).hexdigest() 108 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/local_multi_aligner_segmenter.py line 143
- Likely real
- Uncertain, 49% confidence
Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
142 try: 143 with urllib.request.urlopen(request, timeout=20) as response: 144 if response.status != 200: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran_recite_to_text/src/phase1_transcribe/fastconformer.py line 41
- Likely real
- Uncertain, 49% confidence
Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
40 url = "https://github.com/Iam-Muslim/QuranReciteToText/releases/download/model/qurankarim-fastconformer-mixed.onnx" 41 urllib.request.urlretrieve(url, FASTCONFORMER_ONNX_PATH) 42 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran_recite_to_text/src/core/updater.py line 53
- Likely real
- Uncertain, 49% confidence
Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
52 req_zip = urllib.request.Request(zipball_url, headers={'User-Agent': 'Mozilla/5.0'}) 53 with urllib.request.urlopen(req_zip, timeout=60) as r_zip, open(zip_path, 'wb') as f: 54 shutil.copyfileobj(r_zip, f) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/local_segmenter.py line 69
- Likely real
- Uncertain, 49% confidence
Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
68 req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'}) 69 with urllib.request.urlopen(req, timeout=300) as response: 70 with open(filepath, 'wb') as out_file: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/local_multi_aligner_segmenter.py line 191
- Likely real
- Uncertain, 49% confidence
Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
190 ) 191 with urllib.request.urlopen(request, timeout=120) as response: 192 payload = response.read() -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran_recite_to_text/src/core/updater.py line 39
- Likely real
- Uncertain, 48% confidence
Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
38 39 with urllib.request.urlopen(req, timeout=5) as response: 40 if response.status == 200: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/ui/styles.py line 14
- Likely real
- Uncertain, 46% confidence
Possible SQL injection vector through string-based query construction.
13 """Return the complete CSS string for the Gradio interface.""" 14 return f""" 15 /* Font faces */ 16 @font-face {{ 17 font-family: 'DigitalKhatt'; 18 src: url(data:font/otf;base64,{DIGITAL_KHATT_FONT_B64}) format('opentype'); 19 font-weight: normal; 20 font-style: normal; 21 }} 22 @font-face {{ 23 font-family: 'SurahName'; 24 src: url(data:font/truetype;base64,{SURAH_NAME_FONT_B64}) format('truetype'); 25 font-weight: normal; 26 font-style: normal; 27 }} 28 29 .arabic-text {{ 30 font-family: 'DigitalKhatt', 'Traditional Arabic', sans-serif; 31 direction: rtl; 32 text-align: right; 33 }} 34 35 /* Prevent output area from being in a scrolling box */ 36 .gradio-container .prose {{ 37 max-height: none !important; 38 }} 39 .output-html {{ 40 max-height: none !important; 41 overflow: visible !important; 42 }} 43 44 /* Segment cards - theme adaptive */ 45 .segment-card {{ 46 border-radius: 8px; 47 padding: 12px 16px; 48 margin-bottom: 12px; 49 border: 2px solid; 50 content-visibility: auto; 51 contain-intrinsic-size: 220px; 52 }} 53 .segment-header {{ 54 display: flex; 55 justify-content: space-between; 56 align-items: center; 57 margin-bottom: 8px; 58 }} 59 .segment-title {{ 60 font-size: 13px; 61 opacity: 0.9; 62 }} 63 .segment-badges {{ 64 display: flex; 65 gap: 6px; 66 align-items: center; 67 }} 68 .segment-badge {{ 69 color: white; 70 padding: 2px 8px; 71 border-radius: 12px; 72 font-size: 12px; 73 font-weight: bold; 74 }} 75 .segment-audio {{ 76 margin: 8px 0; 77 display: flex; 78 align-items: center; 79 gap: 8px; 80 }} 81 .segment-audio audio {{ 82 flex: 1; 83 height: 32px; 84 border-radius: 4px; 85 }} 86 87 /* Lazy play button (replaces <audio controls> until clicked) */ 88 .play-btn {{ 89 flex: 1; 90 height: 32px; 91 border-radius: 4px; 92 border: 1px solid var(--border-color-primary, #ddd); 93 background: var(--block-background-fill, #f7f7f7); 94 cursor: pointer; 95 font-size: 16px; 96 display: flex; 97 align-items: center; 98 justify-content: center; 99 box-sizing: border-box; 100 margin: 0; 101 vertical-align: middle; 102 }} 103 .play-btn:hover {{ background: var(--block-background-fill-secondary, #eee); }} 104 105 /* Make color picker popup overlay instead of pushing content down */ 106 .gradio-container .color-picker {{ 107 position: relative; 108 overflow: visible !important; 109 }} 110 .gradio-container .color-picker .overflow-hidden, 111 .gradio-container .color-picker > div:last-child:not(:first-child) {{ 112 position: absolute; 113 z-index: 100; 114 box-shadow: 0 4px 12px rgba(0,0,0,0.3); 115 border-radius: 8px; 116 overflow: visible !important; 117 max-height: none !important; 118 }} 119 .gradio-container .color-picker .overflow-hidden {{ 120 overflow: visible !important; 121 }} 122 .gradio-container .color-picker *, 123 .gradio-container .color-picker div {{ 124 overflow: visible !important; 125 max-height: none !important; 126 scrollbar-width: none !important; 127 }} 128 .gradio-container .color-picker *::-webkit-scrollbar {{ 129 display: none !important; 130 }} 131 /* Ensure all color-picker ancestors allow overflow for absolute popup */ 132 #anim-settings-accordion, 133 #anim-settings-accordion > *, 134 #anim-style-row, 135 #anim-style-row > * {{ 136 overflow: visible !important; 137 }} 138 139 140 /* Animate button */ 141 .animate-btn {{ 142 background: #4a90d9 !important; 143 color: white !important; 144 border: none; 145 padding: 6px 12px; 146 border-radius: 4px; 147 cursor: pointer; 148 font-size: 12px; 149 font-weight: bold; 150 white-space: nowrap; 151 height: 32px; 152 min-height: 32px; 153 line-height: 1; 154 box-sizing: border-box; 155 display: inline-flex; 156 align-items: center; 157 justify-content: center; 158 margin: 0; 159 vertical-align: middle; 160 }} 161 .animate-btn:hover:not(:disabled) {{ background: #357abd !important; }} 162 .animate-btn.active {{ background: #dc3545 !important; }} 163 .animate-btn:disabled {{ background: #888 !important; cursor: not-allowed; opacity: 0.5; }} 164 165 .manual-split-btn {{ 166 background: #6f42c1 !important; 167 color: white !important; 168 border: none; 169 padding: 6px 12px; 170 border-radius: 4px; 171 cursor: pointer; 172 font-size: 12px; 173 font-weight: bold; 174 white-space: nowrap; 175 height: 32px; 176 min-height: 32px; 177 line-height: 1; 178 box-sizing: border-box; 179 display: inline-flex; 180 align-items: center; 181 justify-content: center; 182 margin: 0; 183 vertical-align: middle; 184 }} 185 .manual-split-btn:hover {{ background: #5c35a4 !important; }} 186 187 /* Make the HTML wrapper inside ts-row match the Gradio Button wrapper */ 188 #ts-row > .gr-html {{ 189 padding: 0; 190 margin: 0; 191 min-width: 0; 192 flex: 1 1 0%; 193 }} 194 #ts-row > div:has(> .animate-all-btn) {{ 195 padding: 0; 196 margin: 0; 197 min-width: 0; 198 flex: 1 1 0%; 199 }} 200 201 /* Animate All button — matches Gradio lg button sizing */ 202 .animate-all-btn {{ 203 display: block; 204 width: 100%; 205 background: var(--button-primary-background-fill, #f97316) !important; 206 color: var(--button-primary-text-color, white) !important; 207 border: var(--button-primary-border, none); 208 padding: var(--size-2, 0.5rem) var(--size-4, 1rem); 209 border-radius: var(--button-large-radius, var(--radius-lg, 8px)); 210 cursor: pointer; 211 font-size: var(--button-large-text-size, var(--text-lg, 1.125rem)); 212 font-weight: var(--button-large-text-weight, 600); 213 box-sizing: border-box; 214 line-height: var(--line-md, 1.5); 215 min-height: var(--size-10, 40px); 216 }} 217 .animate-all-btn:hover:not(:disabled) {{ background: var(--button-primary-background-fill-hover, #ea6c10) !important; }} 218 .animate-all-btn.active {{ background: #dc3545 !important; }} 219 .animate-all-btn:disabled {{ background: #888 !important; cursor: not-allowed; opacity: 0.5; }} 220 221 /* Mega card for Animate All */ 222 .mega-card {{ 223 font-family: 'DigitalKhatt', 'Traditional Arabic', sans-serif; 224 font-size: {MEGA_TEXT_SIZE_DEFAULT}px; 225 direction: rtl; 226 text-align: justify; 227 line-height: {MEGA_LINE_SPACING_DEFAULT}; 228 word-spacing: {MEGA_WORD_SPACING_DEFAULT}em; 229 padding: 16px; 230 border-radius: 8px; 231 background: var(--block-background-fill); 232 max-height: 70vh; 233 overflow-y: auto; 234 scrollbar-color: rgba(255,255,255,0.2) transparent; 235 }} 236 .mega-card::-webkit-scrollbar {{ width: 8px; }} 237 .mega-card::-webkit-scrollbar-track {{ background: transparent; }} 238 .mega-card::-webkit-scrollbar-thumb {{ background: rgba(255,255,255,0.2); border-radius: 4px; }} 239 .mega-card::-webkit-scrollbar-thumb:hover {{ background: rgba(255,255,255,0.35); }} 240 .mega-text-flow {{ 241 display: inline; 242 }} 243 .mega-special-line {{ 244 display: block; 245 text-align: center; 246 margin: 8px 0; 247 opacity: 0.7; 248 font-size: 0.85em; 249 }} 250 .mega-surah-separator {{ 251 display: block; 252 text-align: center; 253 margin: 8px 0 2px; 254 padding: 4px 0 0; 255 border-top: 1px solid rgba(255,255,255,0.1); 256 opacity: 0.8; 257 font-family: 'SurahName', sans-serif; 258 font-feature-settings: "liga" 1; 259 font-size: {MEGA_SURAH_LIGATURE_SIZE}em; 260 line-height: 1.2; 261 letter-spacing: normal; 262 }} 263 .segment-card.hidden-for-mega, 264 .split-group.hidden-for-mega, 265 .missing-words-group.hidden-for-mega {{ display: none; }} 266 267 .mega-top-bar {{ 268 display: flex; justify-content: center; gap: 8px; 269 margin-top: 12px; margin-bottom: 8px; 270 }} 271 .mega-top-bar .animate-all-btn {{ 272 width: auto; min-width: 0; min-height: auto; 273 padding: 4px 12px; 274 font-size: 12px; font-weight: bold; 275 border-radius: 4px; 276 line-height: normal; 277 box-sizing: border-box; 278 border: none; 279 height: 42px; 280 display: inline-flex; 281 align-items: center; 282 justify-content: center; 283 }} 284 .mega-exit-btn {{ 285 background: #6c757d; 286 color: white; 287 border: none; 288 padding: 4px 12px; 289 border-radius: 4px; 290 cursor: pointer; 291 font-size: 12px; 292 font-weight: bold; 293 min-width: 0; min-height: auto; 294 line-height: normal; 295 box-sizing: border-box; 296 height: 42px; 297 display: inline-flex; 298 align-items: center; 299 justify-content: center; 300 }} 301 .mega-exit-btn:hover {{ background: #5a6268; }} 302 .mega-speed-select {{ 303 /* Use Gradio's theme-aware variables */ 304 background: var(--input-background-fill) !important; 305 color: var(--body-text-color) !important; 306 border: var(--input-border-width) solid var(--input-border-color) !important; 307 border-radius: var(--input-radius) !important; 308 /* Typography from Gradio */ 309 font-size: var(--input-text-size) !important; 310 font-family: var(--font) !important; 311 /* Layout */ 312 padding: var(--input-padding) !important; 313 height: 48px !important; 314 min-width: 70px; 315 box-sizing: border-box; 316 /* Dropdown styling */ 317 cursor: pointer; 318 -webkit-appearance: none; 319 -moz-appearance: none; 320 appearance: none; 321 /* Custom dropdown arrow using theme color */ 322 background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='%236b7280' d='M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z'/%3E%3C/svg%3E") !important; 323 background-repeat: no-repeat !important; 324 background-position: right 6px center !important; 325 background-size: 16px !important; 326 padding-right: 28px !important; 327 }} 328 .mega-speed-select:hover {{ 329 border-color: var(--input-border-color-hover) !important; 330 }} 331 .mega-speed-select:focus {{ 332 border-color: var(--input-border-color-focus) !important; 333 outline: none; 334 box-shadow: var(--input-shadow-focus); 335 }} 336 .mega-speed-select option {{ 337 background: var(--input-background-fill); 338 color: var(--body-text-color); 339 }} 340 .mega-tip {{ 341 text-align: center; color: #b0b0b0; font-size: 0.95em; 342 padding: 8px 16px; margin-bottom: 6px; 343 background: rgba(255,255,255,0.05); border-radius: 8px; 344 border: 1px solid rgba(255,255,255,0.08); 345 width: fit-content; margin-left: auto; margin-right: auto; 346 }} 347 348 /* Word/char animation coloring — all modes use the window engine (JS-driven inline opacity) */ 349 :root {{ --anim-word-color: {ANIM_WORD_COLOR}; }} 350 .word, .char {{ 351 color: inherit; 352 }} 353 .word.active, .char.active, .word.active .char {{ 354 color: var(--anim-word-color); 355 }} 356 /* Window engine: all hidden by default; JS sets inline opacity for visible window */ 357 .anim-window .word {{ opacity: 0; }} 358 .anim-window .word.active {{ opacity: 1; }} 359 /* Character-level Window */ 360 .anim-chars.anim-window .word {{ opacity: 1 !important; }} 361 .anim-chars.anim-window .char {{ opacity: 0; }} 362 .anim-chars.anim-window .char.active {{ opacity: 1; }} 363 /* Clickable words and verse markers in mega card */ 364 .mega-text-flow .word {{ cursor: pointer; }} 365 .mega-text-flow .verse-marker {{ cursor: pointer; }} 366 367 /* Allow "All" hint below slider track to be visible */ 368 #anim-window-prev, #anim-window-after {{ overflow: visible !important; padding-bottom: 1.2em; }} 369 #anim-window-prev *, #anim-window-after * {{ overflow: visible !important; }} 370 #anim-settings-accordion .block {{ border: none; }} 371 #anim-settings-accordion .color-picker {{ border: none !important; }} 372 #anim-settings-accordion .color-picker .block {{ border: none !important; }} 373 374 /* Merge style/granularity/color into one unified row */ 375 #anim-style-row {{ 376 gap: 0 !important; 377 border: 1px solid var(--border-color-primary, #ddd); 378 border-radius: var(--radius-lg, 8px); 379 overflow: visible; 380 }} 381 #anim-style-row > div {{ 382 border: none !important; 383 box-shadow: none !important; 384 background: transparent !important; 385 }} 386 /* Side-by-side label + controls for animation settings */ 387 #anim-style-row fieldset, 388 #anim-style-row > div:has(> .dialog-button) {{ 389 display: flex !important; 390 flex-direction: row !important; 391 align-items: center !important; 392 gap: 8px; 393 }} 394 #anim-style-row .block-title, 395 #anim-style-row fieldset > span:first-child {{ 396 white-space: nowrap; 397 min-width: fit-content; 398 margin: 0 !important; 399 font-size: 0.9em; 400 }} 401 402 .segment-text {{ 403 font-family: 'DigitalKhatt', 'Traditional Arabic', sans-serif; 404 font-size: {QURAN_TEXT_SIZE_PX}px; 405 direction: rtl; 406 text-align: right; 407 line-height: 1.8; 408 word-spacing: {ARABIC_WORD_SPACING}; 409 padding: 8px; 410 border-radius: 4px; 411 background: var(--block-background-fill); 412 }} 413 .segment-card.manual-split-mode .segment-audio {{ 414 display: none; 415 }} 416 .segment-split-controls {{ 417 display: none; 418 align-items: center; 419 flex-wrap: wrap; 420 justify-content: flex-end; 421 gap: 8px; 422 margin: 8px 0; 423 }} 424 .segment-card.manual-split-mode .segment-split-controls {{ 425 display: flex; 426 }} 427 .split-confirm-btn, 428 .split-cancel-btn {{ 429 border: 1px solid transparent; 430 border-radius: 4px; 431 padding: 6px 12px; 432 font-size: 12px; 433 font-weight: 700; 434 cursor: pointer; 435 white-space: nowrap; 436 height: 32px; 437 min-height: 32px; 438 line-height: 1; 439 box-sizing: border-box; 440 display: inline-flex; 441 align-items: center; 442 justify-content: center; 443 margin: 0; 444 vertical-align: middle; 445 }} 446 .split-confirm-btn {{ 447 background: #6f42c1; 448 color: white; 449 }} 450 .split-confirm-btn:hover:not(:disabled) {{ 451 background: #5c35a4; 452 }} 453 .split-confirm-btn:disabled {{ 454 background: #8f74c9; 455 cursor: not-allowed; 456 opacity: 0.7; 457 }} 458 .split-cancel-btn {{ 459 background: var(--button-secondary-background-fill, var(--block-background-fill-secondary, #e9ecef)); 460 color: var(--button-secondary-text-color, var(--body-text-color, #333)); 461 border-color: var(--button-secondary-border-color, var(--border-color-primary, #ddd)); 462 }} 463 .split-cancel-btn:hover {{ 464 background: var(--button-secondary-background-fill-hover, var(--block-background-fill, #ddd)); 465 }} 466 .split-hint {{ 467 font-size: 12px; 468 color: #6f42c1; 469 font-weight: 600; 470 order: 0; 471 margin-right: auto; 472 }} 473 .split-confirm-btn {{ order: 1; }} 474 .split-cancel-btn {{ order: 2; }} 475 .segment-card.manual-split-mode .segment-text {{ 476 background: rgba(111, 66, 193, 0.06); 477 contain: layout style paint; 478 min-height: var(--manual-split-text-min-height, auto); 479 max-height: var(--manual-split-text-max-height, none); 480 overflow-y: auto; 481 overscroll-behavior: contain; 482 scrollbar-gutter: stable; 483 }} 484 .split-preview {{ 485 display: block; 486 }} 487 .split-preview-flow {{ 488 min-height: 1.6em; 489 }} 490 .split-preview-break {{ 491 display: none; 492 }} 493 .split-preview-break.active {{ 494 display: block; 495 }} 496 .split-preview-word {{ 497 display: inline-block; 498 border-radius: 6px; 499 padding: 0 4px; 500 transition: background 0.12s ease, box-shadow 0.12s ease; 501 }} 502 .split-preview-word.can-cut {{ 503 cursor: pointer; 504 }} 505 .split-preview-word.can-cut:hover {{ 506 background: rgba(111, 66, 193, 0.12); 507 }} 508 .split-preview-word.boundary-end {{ 509 background: rgba(111, 66, 193, 0.12); 510 box-shadow: inset -2px 0 0 #6f42c1; 511 }} 512 .split-preview-word.boundary-start {{ 513 background: rgba(111, 66, 193, 0.16); 514 box-shadow: inset 2px 0 0 #6f42c1; 515 }} 516 .split-preview-marker {{ 517 display: inline-block; 518 opacity: 0.95; 519 cursor: default; 520 user-select: none; 521 }} 522 .segment-error {{ 523 font-size: 12px; 524 margin-top: 4px; 525 color: var(--error-text-color, #dc3545); 526 }} 527 .no-match {{ 528 opacity: 0.5; 529 }} 530 .no-segments {{ 531 text-align: center; 532 opacity: 0.6; 533 padding: 40px; 534 }} 535 .segments-header {{ 536 font-weight: bold; 537 margin-bottom: 16px; 538 }} 539 540 541 /* Confidence colors - light mode */ 542 .segment-high {{ background: #d4edda; border-color: #28a745; }} 543 .segment-med {{ background: #fff3cd; border-color: #ffc107; }} 544 .segment-low {{ background: #f8d7da; border-color: #dc3545; }} 545 .segment-high-badge {{ background: #28a745; }} 546 .segment-med-badge {{ background: #ffc107; color: #333 !important; }} 547 .segment-low-badge {{ background: #dc3545; }} 548 .segment-special {{ background: #e8eaf6; border-color: #5c6bc0; border-style: dashed; }} 549 .segment-special-badge {{ background: #5c6bc0; }} 550 .segment-repeated-badge {{ background: #ffc107; color: #333 !important; }} 551 .segment-multiverse {{ background: #cff4fc; border-color: #0dcaf0; }} 552 553 /* Repetition feedback widget */ 554 .repeat-feedback-group {{ 555 display: inline-flex; 556 align-items: center; 557 gap: 4px; 558 }} 559 .repeat-fb-btn {{ 560 background: none; 561 border: 1px solid rgba(0,0,0,0.2); 562 border-radius: 8px; 563 cursor: pointer; 564 font-size: 10px; 565 padding: 0 5px; 566 height: 20px; 567 min-height: 0; 568 min-width: 0; 569 box-sizing: border-box; 570 display: inline-flex; 571 align-items: center; 572 justify-content: center; 573 opacity: 0.7; 574 transition: opacity 0.15s, transform 0.15s; 575 position: relative; 576 top: 2px; 577 }} 578 .repeat-fb-btn:hover {{ 579 opacity: 1; 580 transform: scale(1.2); 581 }} 582 .repeat-fb-thanks {{ 583 font-size: 10px; 584 color: #28a745; 585 font-weight: 600; 586 white-space: nowrap; 587 }} 588 .repeat-fb-form {{ 589 display: flex; 590 gap: 4px; 591 align-items: center; 592 }} 593 .repeat-fb-textarea {{ 594 font-size: 10px; 595 font-family: inherit; 596 padding: 0 5px; 597 border: 1px solid var(--border-color-primary, #ccc); 598 border-radius: 8px; 599 background: var(--input-background-fill, white); 600 color: var(--body-text-color, #333); 601 resize: none; 602 height: 20px; 603 min-height: 0; 604 box-sizing: border-box; 605 width: 156px; 606 overflow: hidden; 607 }} 608 .repeat-fb-submit {{ 609 font-size: 10px; 610 padding: 0 6px; 611 border: none; 612 border-radius: 8px; 613 background: #28a745; 614 color: white; 615 cursor: pointer; 616 font-weight: 600; 617 white-space: nowrap; 618 height: 20px; 619 min-height: 0; 620 box-sizing: border-box; 621 display: inline-flex; 622 align-items: center; 623 justify-content: center; 624 position: relative; 625 }} 626 .repeat-fb-submit:hover {{ background: #218838; }} 627 628 /* Divider between repeated text lines */ 629 .repeat-divider {{ 630 height: 0; 631 border: none; 632 border-top: 1px dashed var(--border-color-primary, rgba(128,128,128,0.5)); 633 margin: 2px 0; 634 }} 635 636 /* Missing words group — wraps two consecutive segments sharing a gap */ 637 .missing-words-group {{ 638 border: 2px dashed #dc3545; 639 border-radius: 10px; 640 padding: 8px; 641 margin-bottom: 12px; 642 }} 643 .missing-words-group .segment-card:last-child {{ margin-bottom: 0; }} 644 .missing-words-group-tag {{ 645 background: #dc3545; 646 color: white; 647 padding: 2px 10px; 648 border-radius: 12px; 649 font-size: 12px; 650 font-weight: bold; 651 width: fit-content; 652 margin: 0 auto 8px; 653 }} 654 655 /* Split group — wraps sibling sub-segments produced by the Split action */ 656 .split-group {{ 657 border: 2px dashed #6f42c1; 658 border-radius: 10px; 659 padding: 8px; 660 margin-bottom: 12px; 661 }} 662 .split-group .segment-card:last-child {{ margin-bottom: 0; }} 663 .split-group-header {{ 664 display: flex; 665 justify-content: center; 666 align-items: center; 667 gap: 8px; 668 margin-bottom: 8px; 669 flex-wrap: wrap; 670 }} 671 .split-group-tag {{ 672 background: #6f42c1; 673 color: white; 674 padding: 2px 10px; 675 border-radius: 12px; 676 font-size: 12px; 677 font-weight: bold; 678 width: fit-content; 679 margin: 0; 680 }} 681 .undo-split-btn {{ 682 appearance: none; 683 border: 1px solid #6f42c1; 684 background: #6f42c1; 685 color: white; 686 padding: 2px 10px; 687 border-radius: 12px; 688 font-size: 12px; 689 font-weight: 700; 690 line-height: 1.2; 691 cursor: pointer; 692 box-sizing: border-box; 693 }} 694 .undo-split-btn:hover {{ 695 background: #5f37ab; 696 border-color: #5f37ab; 697 }} 698 .undo-split-btn:disabled {{ 699 opacity: 0.7; 700 cursor: wait; 701 }} 702 703 /* Multi-verse badge — segment covers 2+ distinct verses */ 704 .segment-multiverse-badge {{ 705 background: #0dcaf0; 706 color: white; 707 padding: 2px 8px; 708 border-radius: 10px; 709 font-size: 11px; 710 font-weight: 600; 711 }} 712 .segment-multiverse-text {{ color: #055160; }} 713 @media (prefers-color-scheme: dark) {{ 714 .segment-multiverse-text {{ color: #0dcaf0; }} 715 .split-group {{ background: rgba(111, 66, 193, 0.05); }} 716 }} 717 .dark .segment-multiverse-text {{ color: #0dcaf0; }} 718 .dark .split-group {{ background: rgba(111, 66, 193, 0.05); }} 719 720 /* Hidden JS→Python bridge (must be in DOM but invisible) */ 721 #ref-edit-bridge, #repeat-fb-bridge, #manual-split-bridge, #undo-split-bridge, #edit-patch {{ 722 position: absolute !important; 723 left: -9999px !important; 724 height: 0 !important; 725 overflow: hidden !important; 726 pointer-events: none; 727 }} 728 #ref-edit-bridge *, #repeat-fb-bridge *, #manual-split-bridge *, #undo-split-bridge *, #edit-patch * {{ pointer-events: auto; }} 729 730 /* Clickable ref for inline editing */ 731 .ref-editable {{ 732 cursor: pointer; 733 border-bottom: 1px dashed currentColor; 734 }} 735 .ref-editable:hover {{ 736 opacity: 0.7; 737 }} 738 .segment-card.manual-split-mode .ref-editable {{ 739 cursor: default; 740 border-bottom-color: transparent; 741 }} 742 .segment-card.manual-split-mode .ref-editable:hover {{ 743 opacity: 1; 744 }} 745 .ref-edit-input {{ 746 font-size: inherit; 747 font-family: inherit; 748 background: var(--input-background-fill, white); 749 color: var(--body-text-color, #333); 750 border: 1px solid var(--border-color-primary, #ddd); 751 border-radius: 4px; 752 padding: 0 4px; 753 width: 16ch; 754 }} 755 756 /* Review summary text colors */ 757 .segments-review-summary {{ margin-bottom: 8px; font-size: 14px; }} 758 .segment-med-text {{ color: #856404; }} 759 .segment-low-text {{ color: #721c24; }} 760 @media (prefers-color-scheme: dark) {{ 761 .segment-med-text {{ color: #ffc107; }} 762 .segment-low-text {{ color: #f8d7da; }} 763 }} 764 .dark .segment-med-text {{ color: #ffc107; }} 765 .dark .segment-low-text {{ color: #f8d7da; }} 766 767 /* Confidence colors - dark mode */ 768 @media (prefers-color-scheme: dark) {{ 769 .segment-high {{ background: rgba(40, 167, 69, 0.2); border-color: #28a745; }} 770 .segment-med {{ background: rgba(255, 193, 7, 0.2); border-color: #ffc107; }} 771 .segment-low {{ background: rgba(220, 53, 69, 0.2); border-color: #dc3545; }} 772 .segment-special {{ background: rgba(92, 107, 192, 0.2); border-color: #5c6bc0; border-style: dashed; }} 773 .segment-multiverse {{ background: rgba(13, 202, 240, 0.18); border-color: #0dcaf0; }} 774 .missing-words-group {{ background: rgba(220, 53, 69, 0.05); }} 775 .split-hint {{ color: #bba3ef; }} 776 .segment-card.manual-split-mode .segment-text {{ background: rgba(111, 66, 193, 0.14); }} 777 .undo-split-btn {{ background: rgba(111, 66, 193, 0.22); border-color: #bba3ef; color: #e5d8ff; }} 778 .undo-split-btn:hover {{ background: rgba(111, 66, 193, 0.32); border-color: #d0bcff; }} 779 }} 780 /* Also support Gradio's dark class */ 781 .dark .segment-high {{ background: rgba(40, 167, 69, 0.2); border-color: #28a745; }} 782 .dark .segment-med {{ background: rgba(255, 193, 7, 0.2); border-color: #ffc107; }} 783 .dark .segment-low {{ background: rgba(220, 53, 69, 0.2); border-color: #dc3545; }} 784 .dark .segment-special {{ background: rgba(92, 107, 192, 0.2); border-color: #5c6bc0; border-style: dashed; }} 785 .dark .segment-multiverse {{ background: rgba(13, 202, 240, 0.18); border-color: #0dcaf0; }} 786 .dark .missing-words-group {{ background: rgba(220, 53, 69, 0.05); }} 787 .dark .split-hint {{ color: #bba3ef; }} 788 .dark .segment-card.manual-split-mode .segment-text {{ background: rgba(111, 66, 193, 0.14); }} 789 .dark .undo-split-btn {{ background: rgba(111, 66, 193, 0.22); border-color: #bba3ef; color: #e5d8ff; }} 790 .dark .undo-split-btn:hover {{ background: rgba(111, 66, 193, 0.32); border-color: #d0bcff; }} 791 792 /* Input mode toggle */ 793 #input-mode-row {{ gap: 0 !important; }} 794 #input-mode-row button {{ 795 border-radius: 0 !important; 796 border: 1px solid var(--border-color-primary) !important; 797 }} 798 #input-mode-row button:first-child {{ border-radius: 8px 0 0 8px !important; }} 799 #input-mode-row button:last-child {{ border-radius: 0 8px 8px 0 !important; }} 800 #input-mode-row button:not(:first-child) {{ border-left: none !important; }} 801 #upload-panel, #record-panel, #link-panel, 802 #upload-panel > div, #record-panel > div, #link-panel > div {{ overflow: visible !important; }} 803 .mode-active {{ 804 background: var(--button-primary-background-fill) !important; 805 color: var(--button-primary-text-color) !important; 806 border-color: var(--button-primary-background-fill) !important; 807 }} 808 809 /* Example / site pill buttons — joined group */ 810 #example-row, #link-example-row {{ gap: 0 !important; }} 811 #example-row button, #link-example-row button {{ 812 border-radius: 0 !important; 813 border: 1px solid var(--border-color-primary) !important; 814 }} 815 #example-row button:first-child, #link-example-row button:first-child {{ border-radius: 8px 0 0 8px !important; }} 816 #example-row button:last-child, #link-example-row button:last-child {{ border-radius: 0 8px 8px 0 !important; }} 817 #example-row button:not(:first-child), #link-example-row button:not(:first-child) {{ border-left: none !important; }} 818 819 """ -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/api/session_api.py line 162
- Likely real
- Uncertain, 38% confidence
Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
161 with open(path / "vad.pkl", "rb") as f: 162 vad = pickle.load(f) 163 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/alignment/phoneme_matcher_cache.py line 44
- Likely real
- Uncertain, 38% confidence
Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
43 with open(PHONEME_CACHE_PATH, "rb") as f: 44 loaded: dict[int, "ChapterReference"] = pickle.load(f) 45 _chapter_cache.update(loaded) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/alignment/ngram_index.py line 36
- Likely real
- Uncertain, 38% confidence
Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
35 with open(NGRAM_INDEX_PATH, "rb") as f: 36 _INDEX = pickle.load(f) 37 print(f"[NGRAM] Loaded: {len(_INDEX.ngram_positions)} unique {_INDEX.ngram_size}-grams, " -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/core/worker_pool.py line 491
- Likely real
- Uncertain, 38% confidence
Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
490 t_dec = time.time() 491 result = pickle.loads(base64.b64decode(result_b64)) 492 decode_time = time.time() - t_dec -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/api/session_api.py line 1217
- Likely real
- Uncertain, 38% confidence
Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
1216 args = pickle.loads(base64.b64decode(args_b64)) 1217 kwargs = pickle.loads(base64.b64decode(kwargs_b64)) 1218 timings["unpickle_s"] = round(time.time() - t0, 3) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/api/session_api.py line 1216
- Likely real
- Uncertain, 38% confidence
Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
1215 t0 = time.time() 1216 args = pickle.loads(base64.b64decode(args_b64)) 1217 kwargs = pickle.loads(base64.b64decode(kwargs_b64)) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/app.py line 169
- Likely real
- Uncertain, 37% confidence
Possible binding to all interfaces.
168 demo.launch( 169 server_name="0.0.0.0", 170 server_port=port, -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/config.py line 32
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
31 32 SESSION_DIR = Path("/tmp/aligner_sessions") # Per-session cached data (audio, VAD, metadata) 33 SESSION_EXPIRY_SECONDS = 3600*5 # 5 hours — matches DELETE_CACHE_AGE -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/pipeline.py line 1024
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
1023 try: 1024 disk = os.statvfs('/tmp') 1025 free_mb = disk.f_bavail * disk.f_frsize / 1e6 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/config.py line 23
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
22 SEGMENT_AUDIO_DIR = Path("/tmp/segments") # WAV files written here per request 23 URL_DOWNLOAD_DIR = Path("/tmp/url_downloads") # Audio downloaded from URLs via yt-dlp 24 DEFAULT_INPUT_MODE = "Upload" # "Link", "Upload", or "Record" -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/config.py line 22
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
21 RESAMPLE_TYPE = "soxr_lq" 22 SEGMENT_AUDIO_DIR = Path("/tmp/segments") # WAV files written here per request 23 URL_DOWNLOAD_DIR = Path("/tmp/url_downloads") # Audio downloaded from URLs via yt-dlp -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/app.py line 172
- Likely real
- Probably noise, 25% confidence
Probable insecure usage of temp file/directory.
171 share=args.share, 172 allowed_paths=["/tmp"], 173 ssr_mode=False, # Gradio 6.5.1 SSR probes localhost; fails on some HF container restarts -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/core/usage_logger.py line 326
- Likely real
- Probably noise, 19% confidence
Unsafe Hugging Face Hub download without revision pinning in load_dataset()
325 from datasets import load_dataset 326 ds = load_dataset( 327 USAGE_LOG_AUDIO_REPO, split="train", 328 streaming=True, columns=["audio_id"], 329 ) 330 count = 0 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/segmenter/segmenter_aoti.py line 69
- Likely real
- Probably noise, 19% confidence
Unsafe Hugging Face Hub download without revision pinning in hf_hub_download()
68 t0 = time.time() 69 compiled_graph_file = hf_hub_download( 70 AOTI_HUB_REPO, filename, token=token 71 ) 72 download_time = time.time() - t0 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/ui/dev_tools.py line 289
- Likely real
- Probably noise, 19% confidence
Unsafe Hugging Face Hub download without revision pinning in load_dataset()
288 from config import USAGE_LOG_LOGS_REPO 289 ds = load_dataset(USAGE_LOG_LOGS_REPO, token=token, 290 split="train", streaming=True) 291 except Exception as e: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/ui/dev_tools.py line 774
- Likely real
- Probably noise, 19% confidence
Unsafe Hugging Face Hub download without revision pinning in load_dataset()
773 # V3: audio lives in its own dataset now, keyed by audio_id. 774 ds = load_dataset(USAGE_LOG_AUDIO_REPO, token=token, 775 split="train", streaming=True) 776 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/ui/handlers.py line 170
- Likely real
- Probably noise, 19% confidence
Unsafe Hugging Face Hub download without revision pinning in load_dataset()
169 170 ds = load_dataset( 171 USAGE_LOG_AUDIO_REPO, USAGE_LOG_AUDIO_SUBSET, 172 split="train", streaming=True, 173 ).cast_column("audio", Audio(decode=False)) 174 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/surah-splitter/src/surah_splitter/services/transcription_service.py line 86
- Likely real
- Probably noise, 19% confidence
Unsafe Hugging Face Hub download without revision pinning in snapshot_download()
85 with LoggerTimingContext(f'Downloading "{model_name}" from HuggingFace'): 86 model_path = snapshot_download(repo_id=model_name) 87 model_name = model_path # Use the local path after download -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/segment_core/segment_processor.py line 332
- Likely real
- Probably noise, 17% confidence
Unsafe Hugging Face Hub download without revision pinning in from_pretrained()
331 332 model = WhisperForConditionalGeneration.from_pretrained( 333 actual_model, 334 torch_dtype=dtype, 335 low_cpu_mem_usage=True 336 ).to(device) 337 model.eval() -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/segmenter/segmenter_model.py line 156
- Likely real
- Probably noise, 17% confidence
Unsafe Hugging Face Hub download without revision pinning in from_pretrained()
155 156 model = AutoModelForAudioFrameClassification.from_pretrained(SEGMENTER_MODEL) 157 model.to(device, dtype=dtype) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/segmenter/segmenter_model.py line 162
- Likely real
- Probably noise, 17% confidence
Unsafe Hugging Face Hub download without revision pinning in from_pretrained()
161 162 processor = AutoFeatureExtractor.from_pretrained(SEGMENTER_MODEL) 163 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/segment_core/segment_processor.py line 293
- Likely real
- Probably noise, 17% confidence
Unsafe Hugging Face Hub download without revision pinning in from_pretrained()
292 293 model = AutoModelForAudioFrameClassification.from_pretrained(SEGMENTER_MODEL) 294 model.to(device, dtype=dtype) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/segment_core/segment_processor.py line 297
- Likely real
- Probably noise, 17% confidence
Unsafe Hugging Face Hub download without revision pinning in from_pretrained()
296 297 processor = AutoFeatureExtractor.from_pretrained(SEGMENTER_MODEL) 298 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/segment_core/segment_processor.py line 339
- Likely real
- Probably noise, 17% confidence
Unsafe Hugging Face Hub download without revision pinning in from_pretrained()
338 339 processor = WhisperProcessor.from_pretrained(actual_model) 340 gen_config = model.generation_config -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/alignment/phoneme_asr.py line 99
- Likely real
- Probably noise, 17% confidence
Unsafe Hugging Face Hub download without revision pinning in from_pretrained()
98 99 processor = AutoProcessor.from_pretrained(model_path, token=hf_token) 100 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/alignment/phoneme_asr.py line 91
- Likely real
- Probably noise, 17% confidence
Unsafe Hugging Face Hub download without revision pinning in from_pretrained()
90 91 model = AutoModelForCTC.from_pretrained( 92 model_path, token=hf_token, attn_implementation="sdpa" 93 ) 94 model.to(device, dtype=dtype) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/api/session_api.py line 1406
- Likely real
- Uncertain, 45% confidence
Possible hardcoded password: ''
1405 1406 def debug_process(audio_data, min_silence_ms, min_speech_ms, pad_ms, 1407 model_name="Base", device="GPU", hf_token="", 1408 request: gr.Request = None): 1409 """Hidden debug endpoint: full pipeline with comprehensive debug output. 1410 1411 Authenticated via HF token comparison against the Space secret. 1412 Returns structured debug data from every pipeline stage. 1413 """ 1414 # --- Auth --- 1415 space_token = os.environ.get("HF_TOKEN", "") 1416 if not hf_token or (space_token and hf_token != space_token): 1417 return {"error": "Unauthorized"} 1418 1419 mark_endpoint_entry() 1420 set_stage("validate") 1421 err = _validate_model_name(model_name, endpoint="debug_process", 1422 device=device, request=request) 1423 if err: 1424 return err 1425 1426 from src.core.debug_collector import start_debug_collection, stop_debug_collection 1427 from src.pipeline import process_audio 1428 1429 with _debug_lock: 1430 try: 1431 start_debug_collection() 1432 1433 result = process_audio( 1434 audio_data, int(min_silence_ms), int(min_speech_ms), int(pad_ms), 1435 model_name, device, request=request, endpoint="process", 1436 ) 1437 1438 collector = stop_debug_collection() 1439 except QuotaExhaustedError as e: 1440 stop_debug_collection() 1441 return _quota_error_response(e, endpoint="debug_process", request=request) 1442 except (PoolQueueFullError, PoolExhaustedError) as e: 1443 stop_debug_collection() 1444 return _pool_error_response(e, endpoint="debug_process", request=request) 1445 except Exception as e: 1446 stop_debug_collection() 1447 log_error(error_code="pipeline_exception", endpoint="debug_process", 1448 device=device, exception=e, 1449 user_id=get_user_id(request) if request else "unknown", 1450 message=f"Pipeline failed: {e}", 1451 context={"model_name": model_name}) 1452 return {"error": f"Pipeline failed: {e}"} 1453 1454 # --- Assemble response --- 1455 json_output = result[1] 1456 if json_output is None: 1457 log_error(error_code="no_speech", endpoint="debug_process", 1458 stage="vad", device=device, 1459 user_id=get_user_id(request) if request else "unknown", 1460 message="No speech detected in audio") 1461 return {"error": "No speech detected in audio", "segments": []} 1462 1463 # Extract profiling from collector (stored by _run_post_vad_pipeline) 1464 profiling_dict = {} 1465 if collector and collector._profiling is not None: 1466 p = collector._profiling 1467 profiling_dict = dataclasses.asdict(p) 1468 # Add computed fields 1469 profiling_dict["phoneme_dp_avg_time"] = p.phoneme_dp_avg_time 1470 profiling_dict["summary_text"] = p.summary() 1471 1472 # Format segments (same as _format_response but without session) 1473 segments = [] 1474 for seg in json_output.get("segments", []): 1475 entry = { 1476 "segment": seg["segment"], 1477 "time_from": seg["time_from"], 1478 "time_to": seg["time_to"], 1479 "ref_from": seg["ref_from"], 1480 "ref_to": seg["ref_to"], 1481 "matched_text": seg["matched_text"], 1482 "confidence": seg["confidence"], 1483 "has_missing_words": seg.get("has_missing_words", False), 1484 "has_repeated_words": seg.get("has_repeated_words", False), 1485 "error": seg["error"], 1486 } 1487 if seg.get("special_type"): 1488 entry["special_type"] = seg["special_type"] 1489 if seg.get("repeated_ranges"): 1490 entry["repeated_ranges"] = seg["repeated_ranges"] 1491 entry["repeated_text"] = seg["repeated_text"] 1492 if seg.get("split_group_id"): 1493 entry["split_group_id"] = seg["split_group_id"] 1494 segments.append(entry) 1495 1496 # Surface CPU-worker dispatch info (from thread-local) on debug responses. 1497 try: 1498 from src.core.worker_pool import get_last_dispatch_info 1499 worker_dispatch = get_last_dispatch_info() 1500 except Exception: 1501 worker_dispatch = None 1502 1503 # Build final response 1504 response = { 1505 "status": "ok", 1506 "timestamp": datetime.now(timezone.utc).isoformat(), 1507 "profiling": profiling_dict, 1508 "worker_dispatch": worker_dispatch, 1509 "segments": segments, 1510 } 1511 1512 # Merge collector sections 1513 if collector: 1514 debug_data = collector.to_dict() 1515 response["vad"] = debug_data["vad"] 1516 response["asr"] = debug_data["asr"] 1517 response["anchor"] = debug_data["anchor"] 1518 response["specials"] = debug_data["specials"] 1519 response["alignment_detail"] = debug_data["alignment_detail"] 1520 response["events"] = debug_data["events"] 1521 1522 return response -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran_recite_to_text/run.py line 35
- Likely real
- Uncertain, 36% confidence
Starting a process without a shell.
34 subprocess.check_call([sys.executable, "-m", "pip", "install", "-r", str(req_path)]) 35 os.execv(sys.executable, [sys.executable] + sys.argv) 36 except Exception as ex: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran_recite_to_text/src/core/updater.py line 77
- Likely real
- Uncertain, 36% confidence
Starting a process without a shell.
76 log_callback("[*] Update complete! Restarting...") 77 os.execv(sys.executable, [sys.executable] + sys.argv) 78 except (urllib.error.URLError, socket.timeout, TimeoutError, OSError): -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/segment_core/segment_processor.py line 352
- Likely real
- Probably noise, 28% confidence
Try, Except, Continue detected.
351 break 352 except Exception: 353 continue 354 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran_recite_to_text/src/phase3_alignment/ctc_align.py line 323
- Likely real
- Probably noise, 28% confidence
Try, Except, Continue detected.
322 alignments, scores = _forced_align_chunk(logprobs_np, token_ids) 323 except Exception: 324 continue 325 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/local_multi_aligner_segmenter.py line 112
- Likely real
- Probably noise, 28% confidence
Try, Except, Continue detected.
111 ) 112 except Exception: 113 continue 114 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran_recite_to_text/src/core/updater.py line 70
- Likely real
- Probably noise, 14% confidence
Consider possible security implications associated with the subprocess module.
69 if req_path.exists(): 70 import subprocess 71 try: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/core/audio_transport.py line 69
- Likely real
- Probably noise, 14% confidence
Consider possible security implications associated with the subprocess module.
68 """Encode float32 audio to OGG Vorbis bytes via ffmpeg.""" 69 import subprocess 70 # Input to ffmpeg is s16le (smaller than f32le, same audio fidelity after MP3 source) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/app.py line 25
- Likely real
- Probably noise, 14% confidence
Consider possible security implications associated with the subprocess module.
24 # Build Cython extensions in-place (falls back to pure Python if it fails) 25 import subprocess 26 subprocess.run( -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/core/usage_logger.py line 437
- Likely real
- Probably noise, 14% confidence
Consider possible security implications associated with the subprocess module.
436 import soundfile as sf 437 import subprocess 438 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran_recite_to_text/run.py line 10
- Likely real
- Probably noise, 14% confidence
Consider possible security implications associated with the subprocess module.
9 import io 10 import subprocess 11 from pathlib import Path -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran_recite_to_text/src/core/main_flow.py line 4
- Likely real
- Probably noise, 13% confidence
Consider possible security implications associated with the subprocess module.
3 import time 4 import subprocess 5 import numpy as np -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran_recite_to_text/src/phase1_transcribe/stream.py line 4
- Likely real
- Probably noise, 13% confidence
Consider possible security implications associated with the subprocess module.
3 import time 4 import subprocess 5 import json -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/local_multi_aligner_segmenter.py line 14
- Likely real
- Probably noise, 13% confidence
Consider possible security implications associated with the subprocess module.
13 import os 14 import subprocess 15 import sys -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/app.py line 48
- Likely real
- Probably noise, 12% confidence
Starting a process with a partial executable path
47 subprocess.run(["npm", "ci"], cwd=str(_pot_server_dir / "server"), capture_output=True) 48 subprocess.run(["npx", "tsc"], cwd=str(_pot_server_dir / "server"), capture_output=True) 49 if _pot_main.exists(): -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/app.py line 44
- Likely real
- Probably noise, 12% confidence
Starting a process with a partial executable path
43 print("Setting up PO token server...") 44 subprocess.run(["git", "clone", "--depth=1", "--single-branch", 45 "https://github.com/Brainicism/bgutil-ytdlp-pot-provider.git", 46 str(_pot_server_dir)], capture_output=True) 47 subprocess.run(["npm", "ci"], cwd=str(_pot_server_dir / "server"), capture_output=True) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/app.py line 47
- Likely real
- Probably noise, 12% confidence
Starting a process with a partial executable path
46 str(_pot_server_dir)], capture_output=True) 47 subprocess.run(["npm", "ci"], cwd=str(_pot_server_dir / "server"), capture_output=True) 48 subprocess.run(["npx", "tsc"], cwd=str(_pot_server_dir / "server"), capture_output=True) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/app.py line 50
- Likely real
- Probably noise, 12% confidence
Starting a process with a partial executable path
49 if _pot_main.exists(): 50 subprocess.Popen(["node", str(_pot_main)], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) 51 print("PO token server started on port 4416") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/core/audio_transport.py line 72
- Likely real
- Probably noise, 12% confidence
Starting a process with a partial executable path
71 audio_int16 = np.clip(audio * 32767.0, -32768, 32767).astype(np.int16) 72 p = subprocess.run( 73 ["ffmpeg", "-hide_banner", "-loglevel", "error", "-y", 74 "-f", "s16le", "-ar", str(sample_rate), "-ac", "1", "-i", "pipe:0", 75 "-c:a", "libvorbis", "-f", "ogg", "pipe:1"], 76 input=audio_int16.tobytes(), capture_output=True, check=True, 77 ) 78 return p.stdout -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/core/usage_logger.py line 447
- Likely real
- Probably noise, 12% confidence
Starting a process with a partial executable path
446 try: 447 subprocess.run( 448 ["ffmpeg", "-y", "-i", str(wav_path), 449 "-c:a", "libvorbis", "-q:a", "2", 450 "-ar", "16000", "-ac", "1", 451 str(ogg_path)], 452 capture_output=True, check=True, 453 ) 454 finally: -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 4% confidence
Loose version constraint: '@tauri-apps/api^2.6.0' — attacker could push malicious update
@tauri-apps/api:^2.6.0 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/app.py line 47
- Likely real
- Probably noise, 3% confidence
subprocess call - check for execution of untrusted input.
46 str(_pot_server_dir)], capture_output=True) 47 subprocess.run(["npm", "ci"], cwd=str(_pot_server_dir / "server"), capture_output=True) 48 subprocess.run(["npx", "tsc"], cwd=str(_pot_server_dir / "server"), capture_output=True) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/app.py line 44
- Likely real
- Probably noise, 3% confidence
subprocess call - check for execution of untrusted input.
43 print("Setting up PO token server...") 44 subprocess.run(["git", "clone", "--depth=1", "--single-branch", 45 "https://github.com/Brainicism/bgutil-ytdlp-pot-provider.git", 46 str(_pot_server_dir)], capture_output=True) 47 subprocess.run(["npm", "ci"], cwd=str(_pot_server_dir / "server"), capture_output=True) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/local_multi_aligner_segmenter.py line 97
- Likely real
- Probably noise, 3% confidence
subprocess call - check for execution of untrusted input.
96 try: 97 subprocess.run( 98 [ 99 sys.executable, 100 "-m", 101 "pip", 102 "install", 103 "--upgrade", 104 candidate, 105 "--quiet", 106 ], 107 check=True, 108 stdout=subprocess.PIPE, 109 stderr=subprocess.PIPE, 110 text=True, 111 ) 112 except Exception: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/app.py line 26
- Likely real
- Probably noise, 3% confidence
subprocess call - check for execution of untrusted input.
25 import subprocess 26 subprocess.run( 27 [sys.executable, str(_app_path / "setup.py"), "build_ext", "--inplace"], 28 cwd=str(_app_path), 29 capture_output=True, 30 ) 31 -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran_recite_to_text/src/core/updater.py line 72
- Likely real
- Probably noise, 3% confidence
subprocess call - check for execution of untrusted input.
71 try: 72 subprocess.check_call([sys.executable, "-m", "pip", "install", "-r", str(req_path)]) 73 except Exception as e: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran_recite_to_text/src/core/main_flow.py line 24
- Likely real
- Probably noise, 3% confidence
subprocess call - check for execution of untrusted input.
23 ] 24 process = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 25 stdout, stderr = process.communicate(input=audio_array.tobytes()) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran_recite_to_text/run.py line 34
- Likely real
- Probably noise, 3% confidence
subprocess call - check for execution of untrusted input.
33 try: 34 subprocess.check_call([sys.executable, "-m", "pip", "install", "-r", str(req_path)]) 35 os.execv(sys.executable, [sys.executable] + sys.argv) -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/core/usage_logger.py line 447
- Likely real
- Probably noise, 3% confidence
subprocess call - check for execution of untrusted input.
446 try: 447 subprocess.run( 448 ["ffmpeg", "-y", "-i", str(wav_path), 449 "-c:a", "libvorbis", "-q:a", "2", 450 "-ar", "16000", "-ac", "1", 451 str(ogg_path)], 452 capture_output=True, check=True, 453 ) 454 finally: -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/src/core/audio_transport.py line 72
- Likely real
- Probably noise, 3% confidence
subprocess call - check for execution of untrusted input.
71 audio_int16 = np.clip(audio * 32767.0, -32768, 32767).astype(np.int16) 72 p = subprocess.run( 73 ["ffmpeg", "-hide_banner", "-loglevel", "error", "-y", 74 "-f", "s16le", "-ar", str(sample_rate), "-ac", "1", "-i", "pipe:0", 75 "-c:a", "libvorbis", "-f", "ogg", "pipe:1"], 76 input=audio_int16.tobytes(), capture_output=True, check=True, 77 ) 78 return p.stdout -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/app.py line 50
- Likely real
- Probably noise, 3% confidence
subprocess call - check for execution of untrusted input.
49 if _pot_main.exists(): 50 subprocess.Popen(["node", str(_pot_main)], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) 51 print("PO token server started on port 4416") -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran-multi-aligner/app.py line 48
- Likely real
- Probably noise, 3% confidence
subprocess call - check for execution of untrusted input.
47 subprocess.run(["npm", "ci"], cwd=str(_pot_server_dir / "server"), capture_output=True) 48 subprocess.run(["npx", "tsc"], cwd=str(_pot_server_dir / "server"), capture_output=True) 49 if _pot_main.exists(): -
- Engine
- Bandit · Python security linter
- Counts towards
- Vulnerability
- File
- /src-tauri/python/quran_recite_to_text/src/phase1_transcribe/stream.py line 38
- Likely real
- Probably noise, 3% confidence
subprocess call - check for execution of untrusted input.
37 try: 38 audio_dur = float(subprocess.check_output(probe_cmd).decode('utf-8').strip()) 39 except Exception: -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'prettier^3.4.12' — attacker could push malicious update
prettier:^3.4.12 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'playwright^1.53.0' — attacker could push malicious update
playwright:^1.53.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'globals^16.0.0' — attacker could push malicious update
globals:^16.0.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'eslint-plugin-svelte^3.0.0' — attacker could push malicious update
eslint-plugin-svelte:^3.0.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'eslint-config-prettier^10.0.1' — attacker could push malicious update
eslint-config-prettier:^10.0.1 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'eslint^9.18.0' — attacker could push malicious update
eslint:^9.18.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@vitest/browser^3.2.3' — attacker could push malicious update
@vitest/browser:^3.2.3 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@types/qrcode^1.5.6' — attacker could push malicious update
@types/qrcode:^1.5.6 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@tauri-apps/cli^2.6.0' — attacker could push malicious update
@tauri-apps/cli:^2.6.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@tailwindcss/vite^4.0.0' — attacker could push malicious update
@tailwindcss/vite:^4.0.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@tailwindcss/typography^0.5.16' — attacker could push malicious update
@tailwindcss/typography:^0.5.16 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@tailwindcss/forms^0.5.9' — attacker could push malicious update
@tailwindcss/forms:^0.5.9 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@sveltejs/vite-plugin-svelte^5.0.0' — attacker could push malicious update
@sveltejs/vite-plugin-svelte:^5.0.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'prettier-plugin-svelte^3.3.3' — attacker could push malicious update
prettier-plugin-svelte:^3.3.3 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'prettier-plugin-tailwindcss^0.6.11' — attacker could push malicious update
prettier-plugin-tailwindcss:^0.6.11 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'svelte^5.0.0' — attacker could push malicious update
svelte:^5.0.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'svelte-check^4.0.0' — attacker could push malicious update
svelte-check:^4.0.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'svelte-contextmenu^1.0.2' — attacker could push malicious update
svelte-contextmenu:^1.0.2 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'tailwindcss^4.0.0' — attacker could push malicious update
tailwindcss:^4.0.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'typesafe-i18n^5.27.1' — attacker could push malicious update
typesafe-i18n:^5.27.1 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'typescript^5.0.0' — attacker could push malicious update
typescript:^5.0.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'typescript-eslint^8.20.0' — attacker could push malicious update
typescript-eslint:^8.20.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'vite^6.2.6' — attacker could push malicious update
vite:^6.2.6 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'vitest^3.2.3' — attacker could push malicious update
vitest:^3.2.3 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'vitest-browser-svelte^0.1.0' — attacker could push malicious update
vitest-browser-svelte:^0.1.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@tauri-apps/plugin-dialog^2.3.0' — attacker could push malicious update
@tauri-apps/plugin-dialog:^2.3.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@tauri-apps/plugin-updater^2.10.0' — attacker could push malicious update
@tauri-apps/plugin-updater:^2.10.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'markdown-it^14.1.0' — attacker could push malicious update
markdown-it:^14.1.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'howler^2.2.4' — attacker could push malicious update
howler:^2.2.4 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'harfbuzzjs^0.10.3' — attacker could push malicious update
harfbuzzjs:^0.10.3 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'dompurify^3.2.6' — attacker could push malicious update
dompurify:^3.2.6 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'dom-to-image^2.6.0' — attacker could push malicious update
dom-to-image:^2.6.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'class-transformer^0.5.1' — attacker could push malicious update
class-transformer:^0.5.1 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@types/howler^2.2.12' — attacker could push malicious update
@types/howler:^2.2.12 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@types/dom-to-image^2.6.7' — attacker could push malicious update
@types/dom-to-image:^2.6.7 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@sveltejs/adapter-auto^6.0.0' — attacker could push malicious update
@sveltejs/adapter-auto:^6.0.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@tauri-apps/plugin-store^2.3.0' — attacker could push malicious update
@tauri-apps/plugin-store:^2.3.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@tauri-apps/plugin-process^2.3.1' — attacker could push malicious update
@tauri-apps/plugin-process:^2.3.1 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@tauri-apps/plugin-opener^2.4.0' — attacker could push malicious update
@tauri-apps/plugin-opener:^2.4.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@tauri-apps/plugin-notification^2.0.0' — attacker could push malicious update
@tauri-apps/plugin-notification:^2.0.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@tauri-apps/plugin-fs^2.4.2' — attacker could push malicious update
@tauri-apps/plugin-fs:^2.4.2 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@tauri-apps/plugin-deep-link^2.4.7' — attacker could push malicious update
@tauri-apps/plugin-deep-link:^2.4.7 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@sveltejs/adapter-static^3.0.8' — attacker could push malicious update
@sveltejs/adapter-static:^3.0.8 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'markdown-it-deflist^3.0.0' — attacker could push malicious update
markdown-it-deflist:^3.0.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@sveltejs/kit^2.16.0' — attacker could push malicious update
@sveltejs/kit:^2.16.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@eslint/js^9.18.0' — attacker could push malicious update
@eslint/js:^9.18.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: '@eslint/compat^1.2.5' — attacker could push malicious update
@eslint/compat:^1.2.5 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'wavesurfer.js^7.10.0' — attacker could push malicious update
wavesurfer.js:^7.10.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'svelte-5-french-toast^2.0.4' — attacker could push malicious update
svelte-5-french-toast:^2.0.4 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'sharp^0.34.3' — attacker could push malicious update
sharp:^0.34.3 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'reflect-metadata^0.2.2' — attacker could push malicious update
reflect-metadata:^0.2.2 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'qrcode^1.5.4' — attacker could push malicious update
qrcode:^1.5.4 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'posthog-js^1.318.1' — attacker could push malicious update
posthog-js:^1.318.1 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'plyr^3.7.8' — attacker could push malicious update
plyr:^3.7.8 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'modern-screenshot^4.6.8' — attacker could push malicious update
modern-screenshot:^4.6.8 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'material-icons^1.13.14' — attacker could push malicious update
material-icons:^1.13.14 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'markdown-it-task-lists^2.1.1' — attacker could push malicious update
markdown-it-task-lists:^2.1.1 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'markdown-it-footnote^4.0.0' — attacker could push malicious update
markdown-it-footnote:^4.0.0 -
- Engine
- Dependency checker · CVEs, typosquats and risky installs
- Counts towards
- Supply chain
- File
- package.json
- Likely real
- Probably noise, 2% confidence
Loose version constraint: 'markdown-it-anchor^9.2.0' — attacker could push malicious update
markdown-it-anchor:^9.2.0 -
- Engine
- YARA · Malware signature rules
- Counts towards
- Malicious pattern
- File
- /src-tauri/python/quran_recite_to_text/src/core/updater.py
- Likely real
- Probably noise, 0% confidence
YARA rule matched: detect_downloader — Downloads a remote resource - common and low-signal alone; see detect_download_and_execute for the composite version
-
- Engine
- YARA · Malware signature rules
- Counts towards
- Malicious pattern
- File
- /src-tauri/python/quran_recite_to_text/src/phase1_transcribe/fastconformer.py
- Likely real
- Probably noise, 0% confidence
YARA rule matched: detect_downloader — Downloads a remote resource - common and low-signal alone; see detect_download_and_execute for the composite version
-
- Engine
- YARA · Malware signature rules
- Counts towards
- Malicious pattern
- File
- /src-tauri/python/local_multi_aligner_segmenter.py
- Likely real
- Probably noise, 0% confidence
YARA rule matched: detect_downloader — Downloads a remote resource - common and low-signal alone; see detect_download_and_execute for the composite version
-
- Engine
- YARA · Malware signature rules
- Counts towards
- Malicious pattern
- File
- /src-tauri/python/quran-multi-aligner/src/mfa.py
- Likely real
- Probably noise, 0% confidence
YARA rule matched: detect_downloader — Downloads a remote resource - common and low-signal alone; see detect_download_and_execute for the composite version
-
- Engine
- YARA · Malware signature rules
- Counts towards
- Malicious pattern
- File
- /src-tauri/src/segmentation/requirements.rs
- Likely real
- Probably noise, 0% confidence
YARA rule matched: detect_downloader — Downloads a remote resource - common and low-signal alone; see detect_download_and_execute for the composite version
-
- Engine
- YARA · Malware signature rules
- Counts towards
- Malicious pattern
- File
- /src-tauri/python/local_segmenter.py
- Likely real
- Probably noise, 0% confidence
YARA rule matched: detect_downloader — Downloads a remote resource - common and low-signal alone; see detect_download_and_execute for the composite version
No findings match these filters.