2.3
Mesin Pencarian Regex dan Keluaran Warna
util.finder adalah mesin pencarian tunggal di repository ini: ia menerima satu pola regex dan satu direktori, lalu mengembalikan daftar teks yang cocok. Fungsi ini adalah @staticmethod tanpa keadaan, sehingga seluruh perilakunya ditentukan oleh dua argumen tersebut apkleaks/utils.py:16-191. Sisi tampilan ditangani terpisah oleh kelas color, yang hanya berisi konstanta kode ANSI apkleaks/colors.py:3-112. Pemanggilan finder dari alur program dijelaskan di Alur Eksekusi CLI, sedangkan bentuk berkas hasilnya di Format Keluaran Hasil Pemindaian.
Alur util.finder
graph TD
P["pattern dari berkas JSON"] --> C["re.compile(pattern)"]
C --> W["os.walk(path)"]
W --> J["os.path.join(fp, fn)"]
J --> R["open(filepath)"]
R --> L["handle.readlines()"]
L --> S["matcher.search(line)"]
S -->|"cocok"| G["found.append(mo.group())"]
S -->|"tidak cocok"| L
G --> L
L -->|"Exception"| X["pass: berkas dilewati"]
L --> O["sorted(list(set(found)))"]
style P fill:#f59e0b,color:#000
style C fill:#f59e0b,color:#000
style R fill:#336791,color:#fff
style L fill:#8b5cf6,color:#fff
style G fill:#8b5cf6,color:#fff
style O fill:#2d7d46,color:#fff
style X fill:#dc2626,color:#fff
%% fig: Alur util.finder dari pola sampai hasil terurut
%% desc: Pola dikompilasi sekali, setiap berkas di bawah path dibaca baris demi baris, temuan dikumpulkan lalu diunifikasi dan diurutkan.Penelusuran dimulai dari os.walk(path). Setiap pasangan direktori dan files menghasilkan filepath lewat os.path.join(fp, fn), lalu berkas dibuka dengan open(filepath) dan dibaca dengan handle.readlines() apkleaks/utils.py:20-253. Pencocokan berjalan per baris: matcher.search(line) dipanggil untuk setiap baris, dan hanya mo.group() yang disimpan ke list found apkleaks/utils.py:26-284.
Perilaku pencocokan per baris
Karena memakai search dan bukan finditer, satu baris hanya menyumbang satu temuan, yaitu temuan paling kiri. Pola yang mengharapkan dua baris sekaligus tidak akan pernah cocok. Tabel berikut merangkum konsekuensi tiap langkah.
| Langkah | Konsekuensi | Rujukan |
|---|---|---|
re.compile(pattern) di luar blok try | pola tidak valid melempar re.error ke pemanggil, tidak ditelan finder | apkleaks/utils.py:16-191 |
open(filepath) lalu readlines() | seluruh isi berkas masuk memori sekaligus, dan berkas non-teks memicu galat saat didekode | apkleaks/utils.py:20-253 |
except Exception: pass | galat baca per berkas hilang tanpa jejak di keluaran | apkleaks/utils.py:29-305 |
matcher.search(line) | satu temuan per baris, hanya kecocokan paling kiri | apkleaks/utils.py:26-284 |
sorted(list(set(found))) | hasil unik dan terurut abjad, bukan urutan temuan | apkleaks/utils.py:316 |
⚠️
except Exception: passmenyembunyikan berkas yang gagal didekode. Berkas hasil decompile yang bukan teks UTF-8 dilewati tanpa pesan, sehingga sebuah kategori bisa tampak kosong padahal berkasnya ada dan polanya benar apkleaks/utils.py:29-305.
Hasil unik dan terurut
Nilai balik sorted(list(set(found))) membuang duplikat lebih dulu, lalu mengurutkan secara leksikografis apkleaks/utils.py:316. Satu string yang muncul di puluhan berkas hanya dilaporkan sekali, dan urutan laporan tidak mencerminkan lokasi berkas maupun urutan kategori.
APKLeaks.extract menerima daftar itu dan langsung bekerja bila daftar tidak kosong; kategori tanpa temuan dilewati tanpa keluaran apkleaks/apkleaks.py:100-1157. Judul kategori dicetak berwarna, tetapi setiap temuan dicetak dengan print biasa tanpa kode ANSI apkleaks/apkleaks.py:110-1128.
Pemakaian dari scanning
Setiap kategori pola dijalankan lewat threading.Thread yang menargetkan extract, dengan util.finder(...) sudah dievaluasi di argumen apkleaks/apkleaks.py:125-1389. Argumen dievaluasi sebelum thread.start(), jadi penelusuran berkas berjalan berurutan di thread utama dan thread hanya membungkus extract. Rincian siklus hidup objeknya ada di Siklus Hidup Kelas APKLeaks.
Keluaran berwarna
util.write menulis color + message + col.ENDC ke sys.stdout apkleaks/utils.py:8-1010, sedangkan util.writeln hanya menambahkan newline sebelum memanggil util.write apkleaks/utils.py:12-1411. Karena ENDC selalu ditempel di ujung, pemanggil tidak perlu mengembalikan warna terminal ke keadaan awal.
graph LR
M["message"] --> WR["util.write(message, color)"]
C["color.HEADER ... color.UNDERLINE"] --> WR
WL["util.writeln(message, color)"] -->|"message + newline"| WR
WR --> OUT["sys.stdout.write: color + message + col.ENDC"]
OUT --> TERM["teks berwarna di terminal"]
style C fill:#f59e0b,color:#000
style WR fill:#8b5cf6,color:#fff
style OUT fill:#8b5cf6,color:#fff
style TERM fill:#2d7d46,color:#fff
%% fig: Jalur pesan berwarna menuju stdout
%% desc: Konstanta color dan message digabung util.write bersama col.ENDC, lalu ditulis ke sys.stdout lewat satu panggilan.Kelas color mendefinisikan delapan konstanta kode ANSI apkleaks/colors.py:3-112. Tabel berikut memetakan tiap konstanta ke pemakaian nyata di repository.
| Atribut | Nilai | Pemakaian | Rujukan |
|---|---|---|---|
HEADER | \033[95m | baris penutup "Results saved into" | apkleaks/apkleaks.py:14512 |
OKBLUE | \033[94m | progres pemindaian dan unduhan jadx | apkleaks/apkleaks.py:119-12013 |
OKGREEN | \033[92m | judul kategori temuan di extract | apkleaks/apkleaks.py:100-1157 |
WARNING | \033[93m | galat dependencies/integrity dan hasil kosong | apkleaks/apkleaks.py:52-5714 |
WARNING | \033[93m | pesan "** Done with nothing" saat tidak ada temuan | apkleaks/apkleaks.py:14915 |
FAIL | \033[91m | kondisi berhenti seperti "** Undefined package. Exit!" | apkleaks/apkleaks.py:119-12013 |
ENDC | \033[0m | penutup yang selalu ditambahkan util.write | apkleaks/utils.py:8-1010 |
BOLD | \033[1m | didefinisikan, tidak dipakai pemanggil mana pun | apkleaks/colors.py:3-112 |
UNDERLINE | \033[4m | didefinisikan, tidak dipakai pemanggil mana pun | apkleaks/colors.py:3-112 |
Satu tempat melewati util.write: baris penutup hasil menyusun sendiri urutan col.HEADER, col.ENDC, col.OKGREEN, dan print, sehingga reset warna ditulis manual apkleaks/apkleaks.py:14512.