A release-readiness QA pass over the whole product. The commits split into defects a user would hit and gates that were reporting green while measuring nothing. ## Fixes that change behaviour Rate limiting was bypassable on every install: TRUST_PROXY defaulted to true, so request.ip came from a client-set header and a forged X-Forwarded-For got past the login limiter. The default is now a private-network trust list. A transient Postgres outage stranded in-flight jobs, leaving finished output on disk with no row pointing at it. A reconciler now resolves those rows and adopts the bytes rather than dropping the work. A Redis connection that moved to a new address wedged every read-blocked consumer, so completions stopped signalling while health still answered 200. Socket timeouts plus subscriber pings recover it. Installing more than one AI bundle left the shared venv multi-versioned and silently broke three tools. The installer now reconciles distributions to one version each. Converting an image to JXL at quality 1 through 4 returned a 500, because libjxl 0.7 rejects the distance those values compute. The quality is floored at what the encoder honours. A missing ffmpeg was also reported to the user as a corrupt upload; it now says the engine is unavailable. RAW uploads reached an unpatched LibRaw on arm64, so it is built from source at 0.22.2, and the release scan was split so it can fail on an unfixed critical instead of hiding it behind ignore-unfixed. ## Gates that could not fail Two mutation lanes ran zero mutants because Stryker crawled the gitignored docs build; coverage discarded its whole report on any failing test; the lint gate skipped root tests, scripts, and two workspaces; and several generated matrices counted a host missing ffmpeg as a passing tool. Each now measures what it claims. Full evidence and the outstanding release items are tracked locally and are not part of this branch.
13 KiB
description, i18n_source_hash, i18n_provenance, i18n_output_hash, i18n_hash_version
| description | i18n_source_hash | i18n_provenance | i18n_output_hash | i18n_hash_version |
|---|---|---|---|---|
| SnapOtter'da kullanıcıları, yerleşik ve özel rolleri, izinleri, API anahtarlarını, ekipleri, oturumları ve denetim günlüğünü yönetin. | bea8955f3aff | human | 83a5fd5e9c61 | 2 |
Kullanıcılar, Roller ve İzinler
SnapOtter üç yerleşik rol, 17 ayrıntılı izin ve isteğe bağlı araç başına erişim denetimiyle özel rol desteği ile gelir. Bu sayfa, tam yetkilendirme modelini, API anahtarı kapsamlandırmasını, ekip yönetimini ve denetim günlüklemesini kapsar.
::: tip İlgili sayfalar OIDC / SSO | SAML SSO | SCIM Sağlama | Güvenlik ve Sağlamlaştırma :::
Kullanıcılar
Kullanıcı oluşturma
Yöneticiler, yönetici paneli veya POST /api/auth/register uç noktası aracılığıyla kullanıcı oluşturabilir. Her kullanıcının bir kullanıcı adı, rolü, ekip ataması ve isteğe bağlı bir e-posta adresi vardır.
Varsayılan yönetici
İlk başlatmada SnapOtter varsayılan bir yönetici hesabı oluşturur. Kimlik bilgileri ortam değişkenlerinden gelir:
| Değişken | Varsayılan | Açıklama |
|---|---|---|
DEFAULT_USERNAME |
admin |
İlk yönetici hesabının kullanıcı adı |
DEFAULT_PASSWORD |
admin |
İlk yönetici hesabının parolası |
Varsayılan yöneticinin ilk girişte parolasını değiştirmesi gerekir.
Kimlik doğrulama sağlayıcıları
Kullanıcılar birkaç yöntemle kimlik doğrulaması yapabilir:
- Yerel - SnapOtter veritabanında saklanan kullanıcı adı ve parola
- OIDC - herhangi bir OpenID Connect sağlayıcısı (OIDC / SSO bölümüne bakın)
- SAML - SAML 2.0 kimlik sağlayıcıları (SAML SSO bölümüne bakın)
- SCIM - bir kimlik sağlayıcıdan otomatik sağlama (SCIM Sağlama bölümüne bakın)
Kimlik doğrulamayı devre dışı bırakma
Kimlik doğrulamayı tamamen devre dışı bırakmak için AUTH_ENABLED=false ayarını yapın. Bu modda, tüm istekler için admin rolüne sahip yapay bir anonim kullanıcı kullanılır. Giriş gerekmez.
::: warning Kimlik doğrulamayı devre dışı bırakmak, örneğe ulaşabilen herkese tam yönetici erişimi verir. Bunu yalnızca güvenilir ortamlarda kullanın. :::
Yerleşik roller
SnapOtter üç yerleşik rol içerir. Bunlar değiştirilemez veya silinemez.
Admin
17 iznin tamamı. Örnek üzerinde tam denetim.
tools:use files:own files:all apikeys:own apikeys:all pipelines:own pipelines:all settings:read settings:write users:manage teams:manage features:manage system:health audit:read compliance:manage webhooks:manage security:manage
Editor
7 izin. Tüm araçları kullanabilir ve tüm dosyaları ve işlem hatlarını yönetebilir, ancak yönetici işlevlerine erişemez.
tools:use files:own files:all apikeys:own pipelines:own pipelines:all settings:read
User
5 izin. Araçları kullanabilir ve kendi kaynaklarını yönetebilir.
tools:use files:own apikeys:own pipelines:own settings:read
İzin referansı
| İzin | Açıklama |
|---|---|
tools:use |
Herhangi bir işlem aracını kullan |
files:own |
Kendi dosyalarını görüntüle ve yönet |
files:all |
Tüm kullanıcıların dosyalarını görüntüle ve yönet |
apikeys:own |
Kendi API anahtarlarını oluştur ve yönet |
apikeys:all |
Tüm kullanıcıların API anahtarlarını görüntüle |
pipelines:own |
Kendi işlem hatlarını oluştur ve yönet |
pipelines:all |
Tüm kullanıcıların işlem hatlarını görüntüle ve yönet |
settings:read |
Örnek ayarlarını görüntüle |
settings:write |
Örnek ayarlarını değiştir |
users:manage |
Aktörün yetki sınırları dahilinde kullanıcı hesapları oluşturun ve yönetin |
teams:manage |
Ekipler oluştur, güncelle ve sil |
features:manage |
AI özellik paketlerini yükle ve yönet |
system:health |
Sağlık ve hazırlık uç noktalarına eriş |
audit:read |
Denetim günlüğünü görüntüle ve rolleri listele |
compliance:manage |
GDPR yaşam döngüsünü ve uyumluluk özelliklerini yönetin; yıkıcı kullanıcı işlemleri yetkiye bağlı kalır |
webhooks:manage |
Giden web kancalarını (webhook) yapılandır |
security:manage |
Güvenlik ayarlarını yönet (IP izin listesi, SSO zorlaması) |
Özel roller
security:manage iznine sahip yöneticiler, yönetici paneli veya roller API'si aracılığıyla özel roller oluşturabilir. Rolleri listelemek audit:read iznini gerektirir.
Özel bir rol oluşturma
curl -X POST http://localhost:1349/api/v1/roles \
-H "Authorization: Bearer si_..." \
-H "Content-Type: application/json" \
-d '{
"name": "reviewer",
"description": "Can use tools and view all files",
"permissions": ["tools:use", "files:own", "files:all", "settings:read"]
}'
Rol adları 2-30 karakter olmalı, tire ve alt çizgi içeren küçük harfli alfasayısal olmalıdır.
Yetki verilen yönetim sınırları
17 iznin tamamı özel roller aracılığıyla devredilebilir ancak yönetim izni, bu rolü yerleşik admin rolüne eşdeğer kılmaz. users:manage tarafından yetkilendirilen kullanıcı mutasyonları, compliance:manage tarafından yetkilendirilen yıkıcı işlemler ve security:manage tarafından yetkilendirilen özel rol yönetimi, aktörün mevcut yetkisine tabidir:
- Yerleşik roller
admin>editor>user'yi takip eder; özel roller yerleşik rollerin altındadır. - Hedefin izinleri, aktörün etkili izinleri tarafından kapsanmalıdır. Kapsamlı bir API anahtarı bu nedenle kapsamından çıkarılan izinleri kullanamaz.
- Hedef rolün araç erişimi, aktörün kendi araç erişimi tarafından kapsanmalıdır.
- Devre dışı bırakılan bir hesap, bu rol
disabled:<original-role>olarak kaydedildiğinde orijinal rolüne göre kontrol edilir. - Özel bir rolü silmek aynı zamanda yerleşik
usergeri dönüşünü atama yetkisini de gerektirir; devre dışı bırakılan üyelerdisabled:userolarak devre dışı kalır.
Genel kimlik bilgileri ve yapılandırma daha katıdır: SCIM belirtecinin verilmesi veya iptal edilmesi ve örnek yapılandırmasının içe aktarılması, tam etkin yönetici yetkisine sahip yerleşik admin rolünü gerektirir.
Araç düzeyinde izinler
Özel roller, kullanıcıların hangi araçlara erişebileceğini isteğe bağlı olarak kısıtlayabilir. İki mod kullanılabilir:
| Mod | Davranış | Lisans gereksinimi |
|---|---|---|
category |
Modaliteye göre kısıtla (image, video, audio, document, file) | Yok (ücretsiz) |
tool |
Bireysel araç kimliğine göre kısıtla | per_tool_permissions kurumsal özelliğini gerektirir |
tool modu ayarlandığında ancak kurumsal özellik kullanılabilir olmadığında, SnapOtter zarif bir şekilde geriler ve tüm araçlara erişime izin verir.
{
"name": "image-only",
"permissions": ["tools:use", "files:own"],
"toolPermissions": {
"mode": "category",
"allowed": ["image"]
}
}
Özel bir rolü silme
Özel bir rol silindiğinde, ona atanan tüm kullanıcılar otomatik olarak user rolüne yeniden atanır.
Ekipler
Ekipler, depolama ve saklama yönetimi için kullanıcıları gruplar. İlk başlatmada bir Default ekibi oluşturulur.
| Alan | Tür | Açıklama |
|---|---|---|
name |
string | Benzersiz ekip adı (1-50 karakter) |
storageQuota |
number | Ekip başına bayt cinsinden depolama sınırı (kurumsal olmadan çalışır) |
retentionHours |
number | Çıktıları bu kadar saat sonra otomatik sil (team_retention_overrides gerektirir, kurumsal) |
legalHold |
boolean | Ekip üyelerinin dosyalarının otomatik silinmesini engelle (legal_hold gerektirir, kurumsal) |
::: info
Default ekibi silinemez. Hâlâ üyesi olan ekipler silinemez. Önce üyeleri yeniden atayın.
:::
API anahtarları
Kullanıcılar, programlı erişim için API anahtarları oluşturabilir. Her anahtar si_ önekini kullanır ve yalnızca oluşturulma sırasında bir kez gösterilir.
Kapsamlandırılmış izinler
API anahtarları isteğe bağlı olarak bir permissions dizisi taşıyabilir. Ayarlandığında, bir isteğin etkin izinleri, kullanıcının rol izinleri ile anahtarın kapsamlandırılmış izinlerinin kesişimidir. Bu, bir API anahtarının asla kullanıcının kendi izinlerinin ötesine geçemeyeceği anlamına gelir.
curl -X POST http://localhost:1349/api/v1/api-keys \
-H "Authorization: Bearer si_..." \
-H "Content-Type: application/json" \
-d '{
"name": "CI pipeline key",
"permissions": ["tools:use", "files:own"],
"expiresAt": "2027-01-01T00:00:00Z"
}'
Sona erme
Anahtarlar isteğe bağlı bir expiresAt zaman damgası kabul eder. Süresi dolmuş anahtarlar kimlik doğrulama sırasında reddedilir.
Denetim günlüğü
SnapOtter, güvenlikle ilgili olayları audit_log veritabanı tablosunda saklanan yapılandırılmış bir denetim günlüğüne kaydeder.
Denetim günlüğünü görüntüleme
GET /api/v1/audit-log?page=1&limit=50&action=LOGIN_FAILED&from=2026-01-01T00:00:00Z&to=2026-12-31T23:59:59Z
audit:read iznini gerektirir. Sayfalandırmayı (page, limit) ve filtreleri (action, ip, from, to) destekler.
Araç işlemi denetimi
::: warning
TOOL_EXECUTED olayları varsayılan olarak günlüğe kaydedilmez. İki yoldan biri aracılığıyla katılım (opt-in) sağlanır:
auditToolOperationsyönetici ayarınıtrueolarak ayarlayın.audit_exportözelliğine sahip etkin bir lisans bulundurun (hem ekip hem de kurumsal planlarda mevcuttur).
Bunlardan biri olmadan, bireysel araç yürütmeleri denetim günlüğüne kaydedilmez. :::
Dışa aktarma
GET /api/v1/enterprise/audit/export?format=csv&from=2026-01-01T00:00:00Z
audit:read iznini ve audit_export kurumsal özelliğini gerektirir (hem ekip hem de kurumsal planlarda mevcuttur). CSV ve JSON formatlarını destekler; action, actorId, targetType, targetId, from ve to ile filtrelenir.
Kurcalamaya dayanıklı imzalama
Etkinleştirildiğinde, her denetim günlüğü girdisi DATA_ENCRYPTION_KEY değerinden türetilen bir HMAC ile imzalanır. Bu şunları gerektirir:
- Ortamınızda
DATA_ENCRYPTION_KEYayarını yapmak. tamperResistantAudityönetici ayarını etkinleştirmek.tamper_resistant_auditözelliğine sahip bir kurumsal lisans.
Saklama
Eski girdileri otomatik olarak temizlemek için AUDIT_RETENTION_DAYS ayarını yapın. Varsayılan değer 0'tir; bu, girdilerin süresiz olarak saklandığı anlamına gelir.
Olay referansı
| Olay | Kategori |
|---|---|
LOGIN_SUCCESS, LOGIN_FAILED |
Kimlik doğrulama |
OIDC_LOGIN_SUCCESS, OIDC_LOGIN_FAILED |
Kimlik doğrulama |
SAML_LOGIN_SUCCESS, SAML_LOGIN_FAILED |
Kimlik doğrulama |
LOGOUT |
Kimlik doğrulama |
USER_CREATED, USER_UPDATED, USER_DELETED |
Kullanıcı yönetimi |
PASSWORD_CHANGED, PASSWORD_RESET |
Kullanıcı yönetimi |
MFA_ENROLLED, MFA_DISABLED, MFA_VERIFIED, MFA_VERIFY_FAILED |
MFA |
MFA_CHALLENGE_ISSUED, MFA_RECOVERY_USED, MFA_RESET |
MFA |
ROLE_CREATED, ROLE_UPDATED, ROLE_DELETED |
Roller |
API_KEY_CREATED, API_KEY_DELETED |
API anahtarları |
SETTINGS_UPDATED, IP_ALLOWLIST_UPDATED |
Ayarlar |
FILE_UPLOADED, FILE_DELETED |
Dosyalar |
TOOL_EXECUTED |
Araçlar (katılımlı) |
SCIM_USER_PROVISIONED, SCIM_USER_UPDATED, SCIM_USER_DEPROVISIONED |
SCIM |
SCIM_GROUP_SYNCED |
SCIM |
LEGAL_HOLD_APPLIED, LEGAL_HOLD_RELEASED |
Uyumluluk |
GDPR_EXPORT_INITIATED, GDPR_USER_PURGED, GDPR_TEAM_PURGED |
Uyumluluk |
CONFIG_EXPORTED, CONFIG_IMPORTED |
Yapılandırma |
Oturum yönetimi
Oturumlar çerez tabanlıdır ve SESSION_DURATION_HOURS tarafından denetlenir (varsayılan: 168 saat / 7 gün).
Rol değişiklikleri oturumları geçersiz kılar
Bir yönetici bir kullanıcının rolünü değiştirdiğinde, o kullanıcının tüm etkin oturumları silinir. Kullanıcının yeni izinlerini almak için yeniden giriş yapması gerekir.
Güvenlik korumaları
- Son-yönetici koruması: kalan son yönetici daha düşük bir role indirilemez. Denerseniz API bir hata döndürür.
- Kendini silme önleme: yöneticiler API aracılığıyla kendi hesaplarını silemez.