Dokümantasyon / Referans
permissions.json
ivralo'nun sormadan yapabileceklerini permissions.json ile genişletir ya da daraltırsınız: shell komutu önekleri, ulaşabileceği host'lar ve başında kimse olmayan bir run'ın kullanabileceği araçlar. Bu sayfada anahtarlar ve iki dosyanın nasıl birleştiği anlatılıyor.
İki dosya
| Dosya | Nerede | Neye uygulanır | Kim yazar |
|---|---|---|---|
| Ana dizindeki | ivralo ana dizininizdeki permissions.json ya da IVRALO_PERMISSIONS'ın gösterdiği yol | Bütün çalışma alanlarına | Siz, elle. ivralo bu dosyaya hiçbir zaman yazmaz. |
| Repo'daki | Çalışma alanında, git'in dışında kalan .ivralo/permissions.json | Yalnızca o repo'ya | Siz, elle; onay diyaloğundaki p bir girdi ekler, /permissions remove <n> bir girdiyi çıkarır. |
İkisinin de olması gerekmez. IVRALO_PERMISSIONS repo'nun kendi dosyasını gösteriyorsa ortada tek dosya vardır ve bir kez okunur. Her dosyanın neyi eklediğini oturumda /permissions, dışarıda ivralo doctor gösterir.
Anahtarlar
Dosya tek bir JSON nesnesidir. Bütün anahtarlar isteğe bağlıdır.
| Anahtar | Tür | Varsayılan | Ne yapar |
|---|---|---|---|
version | sayı | yok | Kabul edilir ama okunmaz. 1 yazın. |
allow | metin listesi | [] | Sormadan çalışan shell komutu önekleri. |
deny | metin listesi | [] | Her zaman reddedilen shell komutu önekleri. |
timeout | tam sayı | 120 | Çağrı kendi süresini belirtmediğinde bir shell komutunun en fazla kaç saniye çalışabileceği. En az 1; 600'ün üstündeki değerler 600'e indirilir. |
allow_tools | araç adı listesi | [] | Onaylayacak kimse yokken de çalışabilecek araçlar. |
hosts | allow ve deny içeren bir nesne | yok | Shell'in, web araçlarının ve Python worker'ının sormadan ulaşabileceği ya da hiçbir zaman ulaşamayacağı host'lar. |
Bilinmeyen bir anahtarı, yanlış bir türü ya da hatalı bir girdiyi ivralo doctor bildirir ve o girdi atılır. Dosyanın geri kalanı yine geçerlidir. Geçerli JSON olmayan bir dosya okunamıyor olarak bildirilir.
allow ve deny
Her girdi bir komut önekidir ve sözcük sözcük eşleştirilir. Büyük küçük harf ve fazladan boşluklar fark etmez.
uv run pytest,uv run pytest -qile eşleşir; amauv run,uv runnerile eşleşmez.ghvegitkomutları kanonik biçimleriyle de karşılaştırılır; böylece sözcüklerin arasına giren bir genel seçenek, örneğingit -C repo push, hiçbir şeyi gizleyemez.- Birkaç parçadan oluşan bir komut (
a && b, bir pipe) parça parça değerlendirilir; komutun tamamı en katı parçası kadar katı sayılır.
Yerleşik red listesi iki dosyanın da altında durur ve hiçbir şey onu kaldıramaz: ağa çıkan programlar (curl, ssh, nc), sistemin paket yöneticileri, git geçmişini yeniden yazan her şey, git push'un her türlü yazımı ve bir pull request'i merge etmek ya da onaylamak. Yerleşik listenin zaten reddettiği bir allow girdisini ivralo doctor bildirir; geçerli olan yerleşik listedir. Ayrıntılar Shell komutları sayfasında.
Bir allow girdisi komutu onaylar, komutun ulaştığı host'u hiçbir zaman onaylamaz. Bilinmeyen bir host'a giden komut yine onay ister.
allow_tools
Başında kimsenin olmadığı bir run'ın, örneğin bir pipe'taki ivralo ask'in, bir zamanlamanın ya da bir job'un, dosya düzenleyebilmesinin ya da git'te değişiklik yapabilmesinin tek yolu budur. Liste kapalıdır: buradakilerin dışında bir ad yazılırsa bildirilir ve atılır.
| Ad | Neye izin verir |
|---|---|
edit_file | Bir dosyada birebir düzenlemeler. Aşağıdaki sembol düzenlemelerine de izin verir. |
write_file | Yeni bir dosya da dahil, bir dosyanın tamamını yazmak. edit_file buna hiçbir zaman izin vermez. |
replace_symbol, replace_range, insert_before_symbol, insert_after_symbol, delete_symbol, add_import | Sembol üzerinden yapılan düzenlemeler, her biri ayrı bir ad. |
git_create_branch, git_stage_files, git_unstage_files, git_commit, git_revert_commit, git_restore_file | git'e yazan işlemler, her biri ayrı bir ad. |
E-posta ya da sohbet mesajı gibi gönderimler bu listeye hiçbir zaman giremez; her zaman onay ister. Push da giremez; başında kimse olmayan bir run'a push yetkisini yalnızca sunucu modu verir. Ayrıntılar Sunucu modu sayfasında.
hosts
{ "hosts": { "allow": ["pypi.org", "10.0.4.12"], "deny": ["metadata.google.internal"] } }
Her girdi bir host adı ya da bir IP adresidir. Bir ad alt alan adlarını da kapsar: example.com, api.example.com'u da kapsar. Joker karakterler, portlar, ağ maskeleri ve URL'ler reddedilir. Farklı biçimde yazılmış bir adres (127.1 ya da onaltılık bir yazım) reddedilir ve yerine nasıl yazılması gerektiği söylenir.
Onay diyaloğunda, host'u yüzünden onay isteyen bir çağrıda p'ye basarsanız o host repo'nun hosts.allow listesine yazılır. Ayrıntılar Makineden neler çıkar sayfasında.
İki dosya nasıl birleşir
| Anahtar | Nasıl birleşir |
|---|---|
allow, deny, allow_tools, hosts.allow, hosts.deny | İki dosyadaki girdilerin birleşimi. |
timeout | Repo'daki değer 120 değilse o; 120 ise ana dizindeki. |
İki dosyadan birindeki bir deny reddetmeye yeter, çünkü deny, allow'dan önce okunur. Böylece bir repo, ana dizinde olmayan bir deny ekleyebilir; ama ana dizindeki bir deny'ı bir repo kaldıramaz.
timeout kuralında bir incelik var: repo dosyasına elle 120 yazmak, bu değeri yükseltmiş bir ana dizin ayarını geçersiz kılmaz. İstediğiniz sayıyı, geçerli olmasını istediğiniz dosyaya yazın.
Güvenmediğiniz bir klasörde
Klonladığınız bir repo, bütün kısıtları kaldıran bir .ivralo/permissions.json ile gelebilir. Klasörü güvenilir saymadığınız sürece bu dosyanın yalnızca daraltan kısımları geçerlidir:
| Repo'daki anahtar | Güvenilmeyen klasör | Güvenilen klasör |
|---|---|---|
deny | Geçerli | Geçerli |
hosts.deny | Geçerli | Geçerli |
allow, allow_tools, hosts.allow, timeout | Yok sayılır | Geçerli |
Güvenilmeyen bir klasörde diyalog p seçeneğini sunmaz ve nedenini söyler. Güvenin başka neleri değiştirdiği IVRALO.md sayfasında.
Örnek
Projenin araçlarının çalışmasına izin veren, şirket içindeki paket aynasına erişen ve gecelik bir zamanlamanın kendi düzenlemelerini commit etmesine izin veren bir ana dizin dosyası:
{
"version": 1,
"allow": ["uv run pytest", "uv run ruff", "uv add", "make test"],
"deny": ["python -c", "rm -rf"],
"timeout": 300,
"allow_tools": ["edit_file", "git_stage_files", "git_commit"],
"hosts": {
"allow": ["pypi.internal.example.com"],
"deny": ["169.254.169.254"]
}
}
Yanında yalnızca ekleme yapan bir repo dosyası:
{
"allow": ["npm run lint"],
"deny": ["npm publish"]
}
İkisi birlikte, güvenilen bir klasörde şunu verir: beş allow girdisi, üç deny girdisi, ana dizinden gelen 300 saniyelik zaman aşımı ve ana dizindeki araçlar ile host'lar.