Lompat ke konten
dokumentasi.id
Commit dd5271a
v2
Star6,4 rb

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-19. Sisi tampilan ditangani terpisah oleh kelas color, yang hanya berisi konstanta kode ANSI apkleaks/colors.py:3-11. 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.
Fig. 1: Alur util.finder dari pola sampai hasil terurutPola 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-25. Pencocokan berjalan per baris: matcher.search(line) dipanggil untuk setiap baris, dan hanya mo.group() yang disimpan ke list found apkleaks/utils.py:26-28.

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.

LangkahKonsekuensiRujukan
re.compile(pattern) di luar blok trypola tidak valid melempar re.error ke pemanggil, tidak ditelan finderapkleaks/utils.py:16-19
open(filepath) lalu readlines()seluruh isi berkas masuk memori sekaligus, dan berkas non-teks memicu galat saat didekodeapkleaks/utils.py:20-25
except Exception: passgalat baca per berkas hilang tanpa jejak di keluaranapkleaks/utils.py:29-30
matcher.search(line)satu temuan per baris, hanya kecocokan paling kiriapkleaks/utils.py:26-28
sorted(list(set(found)))hasil unik dan terurut abjad, bukan urutan temuanapkleaks/utils.py:31

⚠️ except Exception: pass menyembunyikan 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-30.

Hasil unik dan terurut

Nilai balik sorted(list(set(found))) membuang duplikat lebih dulu, lalu mengurutkan secara leksikografis apkleaks/utils.py:31. 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-115. Judul kategori dicetak berwarna, tetapi setiap temuan dicetak dengan print biasa tanpa kode ANSI apkleaks/apkleaks.py:110-112.

Pemakaian dari scanning

Setiap kategori pola dijalankan lewat threading.Thread yang menargetkan extract, dengan util.finder(...) sudah dievaluasi di argumen apkleaks/apkleaks.py:125-138. 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-10, sedangkan util.writeln hanya menambahkan newline sebelum memanggil util.write apkleaks/utils.py:12-14. 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.
Fig. 2: Jalur pesan berwarna menuju stdoutKonstanta 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-11. Tabel berikut memetakan tiap konstanta ke pemakaian nyata di repository.

AtributNilaiPemakaianRujukan
HEADER\033[95mbaris penutup "Results saved into"apkleaks/apkleaks.py:145
OKBLUE\033[94mprogres pemindaian dan unduhan jadxapkleaks/apkleaks.py:119-120
OKGREEN\033[92mjudul kategori temuan di extractapkleaks/apkleaks.py:100-115
WARNING\033[93mgalat dependencies/integrity dan hasil kosongapkleaks/apkleaks.py:52-57
WARNING\033[93mpesan "** Done with nothing" saat tidak ada temuanapkleaks/apkleaks.py:149
FAIL\033[91mkondisi berhenti seperti "** Undefined package. Exit!"apkleaks/apkleaks.py:119-120
ENDC\033[0mpenutup yang selalu ditambahkan util.writeapkleaks/utils.py:8-10
BOLD\033[1mdidefinisikan, tidak dipakai pemanggil mana punapkleaks/colors.py:3-11
UNDERLINE\033[4mdidefinisikan, tidak dipakai pemanggil mana punapkleaks/colors.py:3-11

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:145.