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:
| Kategori | Singkatan | Pemilik |
|---|---|---|
| Owner | u | Pembuat file |
| Group | g | Anggota grup pemilik |
| Others | o | Pengguna lain |
Setiap kelompok dapat memiliki kombinasi tiga jenis aksi:
| Simbol | Angka | Aksi |
|---|---|---|
r | 4 | Read (baca) |
w | 2 | Write (tulis) |
x | 1 | Execute (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.
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:
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 selesaiMari kita bedah baris-baris penting di atas:
Files.createTempFile("izin-", ".txt"): membuat file sementara dengan prefixizin-dan suffix.txt. Permission default biasanyarw-------(0600) demi keamanan.Files.getPosixFilePermissions(file): mengembalikanSet<PosixFilePermission>berisi permission saat ini. FungsiPosixFilePermissions.toString(set)memetakan balik ke string bentukrwxrwxrwx.PosixFilePermissions.fromString("rw-r--r--"): memetakan string permission menjadiSet<PosixFilePermission>yang siap dipakai.Files.setPosixFilePermissions(file, perms): mengubah permission file secara atomik. Hanya owner file atau root yang boleh melakukan ini.Files.isExecutable(file): shortcut untuk mengecek apakah bitxaktif untuk owner.- 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:
| Oktal | String | Arti |
|---|---|---|
0600 | rw------- | Owner: rw, others: tidak ada (file pribadi) |
0644 | rw-r--r-- | Owner: rw, others: r (file publik) |
0755 | rwxr-xr-x | Owner: rwx, others: r-x (executable) |
0700 | rwx------ | 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 #
- Java SE 21 Files
— dokumentasi
FilesJava SE 21 untukPosixFilePermissionsdansetAttribute - Kotlin stdlib kotlin.io.path
— paket
kotlin.io.pathdengan extensionPathterkait izin file
Selanjutnya #
Setelah memahami permission, langkah berikutnya adalah menggunakan file sementara secara aman — materi pada chapter Temporary Files.