Permission file menentukan siapa yang boleh membaca, menulis, atau mengeksekusi sebuah file. Pada sistem operasi POSIX (Linux, macOS), permission direpresentasikan sebagai kombinasi tiga kategori pengguna (owner, group, others) dan tiga jenis aksi (read, write, execute). Kotlin meminjam API dari java.nio.file.attribute untuk mengelola permission ini, sehingga kode tetap type-safe dan ekspresif.

Konsep Permission POSIX #

Permission POSIX menggunakan sembilan bit yang terbagi menjadi tiga kelompok:

KategoriSingkatanPemilik
OwneruPembuat file
GroupgAnggota grup pemilik
OthersoPengguna lain

Setiap kelompok dapat memiliki kombinasi tiga jenis aksi:

SimbolAngkaAksi
r4Read (baca)
w2Write (tulis)
x1Execute (jalankan/direktori: masuk)

String seperti rw-r--r-- berarti owner dapat baca-tulis, group dapat baca, others dapat baca. Angka oktal yang setara adalah 0644.

Membaca dan Mengubah Permission #

Kotlin menyediakan PosixFilePermissions.fromString() untuk memetakan string permission menjadi Set<PosixFilePermission>, dan Files.setPosixFilePermissions() untuk menerapkannya pada file.

kotlin
import java.io.File
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.attribute.PosixFilePermission
import java.nio.file.attribute.PosixFilePermissions

fun main() {
    val file = Files.createTempFile("izin-", ".txt")
    Files.write(file, "data rahasia".toByteArray())

    // Baca permission POSIX saat ini
    val current = Files.getPosixFilePermissions(file)
    println("Permission awal: ${PosixFilePermissions.toString(current)}")

    // Set permission: rw-r--r-- (0644)
    val perms: Set<PosixFilePermission> = PosixFilePermissions.fromString("rw-r--r--")
    Files.setPosixFilePermissions(file, perms)
    val after = Files.getPosixFilePermissions(file)
    println("Permission setelah set rw-r--r--: ${PosixFilePermissions.toString(after)}")

    // Set permission: rwxr-xr-x (0755) — seperti executable
    val executablePerms: Set<PosixFilePermission> = PosixFilePermissions.fromString("rwxr-xr-x")
    Files.setPosixFilePermissions(file, executablePerms)
    val finalPerms = Files.getPosixFilePermissions(file)
    println("Permission setelah set rwxr-xr-x: ${PosixFilePermissions.toString(finalPerms)}")

    // Cek apakah file bisa dieksekusi (Executable bit)
    println("Apakah executable? ${Files.isExecutable(file)}")

    // Khusus directory, bit x berarti boleh masuk (cd ke dalamnya)
    val dir = Files.createTempDirectory("dir-izin-")
    Files.setPosixFilePermissions(dir, PosixFilePermissions.fromString("rwx------"))
    val dirPerms = Files.getPosixFilePermissions(dir)
    println("Permission direktori (rwx------): ${PosixFilePermissions.toString(dirPerms)}")

    // Cleanup
    Files.deleteIfExists(file)
    Files.deleteIfExists(dir)
    println("Cleanup selesai")
}

Output yang Dihasilkan:

text
Permission awal: rw-------
Permission setelah set rw-r--r--: rw-r--r--
Permission setelah set rwxr-xr-x: rwxr-xr-x
Apakah executable? true
Permission direktori (rwx------): rwx------
Cleanup selesai

Mari kita bedah baris-baris penting di atas:

  1. Files.createTempFile("izin-", ".txt"): membuat file sementara dengan prefix izin- dan suffix .txt. Permission default biasanya rw------- (0600) demi keamanan.
  2. Files.getPosixFilePermissions(file): mengembalikan Set<PosixFilePermission> berisi permission saat ini. Fungsi PosixFilePermissions.toString(set) memetakan balik ke string bentuk rwxrwxrwx.
  3. PosixFilePermissions.fromString("rw-r--r--"): memetakan string permission menjadi Set<PosixFilePermission> yang siap dipakai.
  4. Files.setPosixFilePermissions(file, perms): mengubah permission file secara atomik. Hanya owner file atau root yang boleh melakukan ini.
  5. Files.isExecutable(file): shortcut untuk mengecek apakah bit x aktif untuk owner.
  6. Direktori dengan rwx------: hanya owner yang boleh membaca daftar isi, masuk, dan menambah file di dalamnya.

Permission Bit dan Angka Oktal #

Banyak dokumentasi Linux menulis permission sebagai angka oktal tiga digit, misalnya chmod 755 file. Berikut padanannya di Kotlin:

OktalStringArti
0600rw-------Owner: rw, others: tidak ada (file pribadi)
0644rw-r--r--Owner: rw, others: r (file publik)
0755rwxr-xr-xOwner: rwx, others: r-x (executable)
0700rwx------Direktori pribadi

Best Practice #

  • Berikan permission paling ketat yang masih memungkinkan aplikasi bekerja (prinsip least privilege).
  • File sementara yang berisi data sensitif: rw------- (0600).
  • Direktori kerja aplikasi: rwxr-xr-x (0755) agar pengguna lain bisa membaca tetapi tidak menulis.
  • Jangan pernah memberikan 0666 (rw-rw-rw-) kecuali file benar-benar publik dan tidak ada risiko penyalahgunaan.

Referensi Lanjutan #

Selanjutnya #

Setelah memahami permission, langkah berikutnya adalah menggunakan file sementara secara aman — materi pada chapter Temporary Files.