Factorizer/Cluster ERP WikiCluster ERP English
Ana sayfa / Kimlik ve erişim

Açıklama

Uygulama mağazası lisansları ve hakları

app_store modülünün, lisans dosyasının, rol atamalarının ve server/entitlements.py'nin bir kullanıcının hangi uygulamaları ve modül API'lerini kullanabileceğine nasıl karar verdiği.

Cluster ERP iş alanlarını uygulama olarak satar. Bir kullanıcının bir uygulamayı açıp açamayacağı ve bir arka uç modülünün API'sinin yanıt verip vermeyeceği dört katmana bağlıdır: katalog, lisans, rol atamaları ve kurulumun yükleme durumu. src/cluster_erp/modules/app_store/ içindeki app_store modülü bu kayıtları tutar, server/entitlements.py ise korunan bir modüle gelen her istekte bunları uygular. Bu sayfa her katmanı mekanizma düzeyinde açıklar. Lisans dosyası içeriğini ve doğrulama ayrıntılarını anlatmaz. Modül özeti app store modülü sayfasındadır.

Kısaca

  • Katalog modules/app_store/catalog.json ile gelir ve her açılışta app_store_apps tablosuna yakınsatılır; 6'sı sistem uygulaması olmak üzere 28 uygulama listeler (src/cluster_erp/modules/app_store/services.py:50-97, catalog.json içinde system veya permanent taşıyan girdilerden sayıldı).
  • Lisans, bir yöneticinin yüklediği satıcı imzalı bir belgedir ve her çözümlemede license_public_key içindeki açık anahtara karşı yeniden doğrulanır (src/cluster_erp/modules/app_store/license.py:1-14, src/cluster_erp/modules/app_store/services.py:201-236).
  • Lisans durumları none, invalid, active, grace ve read_only olur (src/cluster_erp/modules/app_store/license.py:9-14, src/cluster_erp/modules/app_store/license.py:33).
  • Rol atamaları üç niyet kullanır: required, available ve blocked; atama satırı olmayan bir uygulama herkese açıktır (src/cluster_erp/modules/app_store/models.py:77-104, src/cluster_erp/modules/app_store/services.py:23-47).
  • İş modülleri yönlendiricilerine require_app(self.name) ekler; modülü kapsayan yüklü, lisanslı ve koltuklu bir uygulama yoksa istekleri reddeder (src/cluster_erp/server/entitlements.py:225-273, örneğin src/cluster_erp/modules/bom/module.py:59).

Nasıl çalışır

Katmanlar

Katman Kayıt Soru Kaynak
L0 katalog app_store_apps içinde StoreApp Hangi uygulamalar var, her biri hangi arka uç modüllerini kapsar, hangileri sistem uygulaması src/cluster_erp/modules/app_store/models.py:14-52
L1 lisans app_store_licenses içinde AppLicense Müşteri hangi uygulamaların bedelini ödedi, lisans güncel mi src/cluster_erp/modules/app_store/models.py:55-75
L2 koltuk app_store_assignments içinde AppAssignment Hangi roller bir uygulamayı kullanabilir src/cluster_erp/modules/app_store/models.py:77-104
L3 kurulum app_store_installs içinde AppInstall Kurulumda uygulama yüklü mü, yönetici hangi modüllere onay verdi src/cluster_erp/modules/app_store/models.py:123-162

Bir kullanıcının uygulama isteği (AppRequest, durumlar pending, approved, denied) bir yöneticiden koltuk ister; onay, uygulamayı isteyenin rolleri için available yapar (src/cluster_erp/modules/app_store/models.py:107-120, src/cluster_erp/modules/app_store/services.py:335-361).

Hak kapısı

Akış şeması bir istek için assert_module_entitled fonksiyonunu gösterir.

flowchart TD
    req["korunan bir modüle istek"] --> resolve["_resolve: guarded, installed, entitled, lisans durumu"]
    resolve --> sold{"modülü bir uygulama satıyor mu?"}
    sold -->|hayır| pass["geçer"]
    sold -->|evet| seat{"kullanıcının koltuğu var mı?"}
    seat -->|hayır| s403["entitlement.no_seat 403"]
    seat -->|evet| inst{"modül yüklü mü?"}
    inst -->|hayır| i403["entitlement.module_not_installed 403"]
    inst -->|evet| lic{"modül lisanslı mı?"}
    lic -->|hayır| l403["entitlement.app_not_licensed 403"]
    lic -->|evet| ro{"read_only ve yazma mı?"}
    ro -->|evet| r403["entitlement.license_read_only 403"]
    ro -->|hayır| pass

Düz anlatımla:

  1. _resolve, herhangi bir katalog uygulamasının kapsadığı modülleri, yüklü uygulamaların yönetici onayı içinde kapsadığı modülleri, lisanslı uygulamaların kapsadığı modülleri ve lisans durumunu hesaplar (src/cluster_erp/server/entitlements.py:80-186).
  2. Hiçbir uygulamanın kapsamadığı bir modül serbestçe geçer (src/cluster_erp/server/entitlements.py:232-233).
  3. Kullanıcının modülü kapsayan bir uygulamada koltuğu olmalıdır (src/cluster_erp/server/entitlements.py:189-222, src/cluster_erp/server/entitlements.py:234-240).
  4. Modül yüklü ve lisanslı olmalıdır (src/cluster_erp/server/entitlements.py:241-250).
  5. read_only lisans durumunda yalnızca GET, HEAD ve OPTIONS geçer (src/cluster_erp/server/entitlements.py:251-257).

Her ret görüntü metni değil, bir ileti kodu taşır; böylece istemci yerelleştirilmiş bir kart gösterebilir (src/cluster_erp/server/entitlements.py:260-265). Modül adını yolda taşıyan genel kayıt yaşam döngüsü uçları aynı denetimi çağırır (src/cluster_erp/modules/records/lifecycle_routes.py:130).

Lisans durumları ve lisanslama duruşu

Durum Anlam Kaynak
none Lisans yüklenmemiş veya açık anahtar yapılandırılmamış src/cluster_erp/modules/app_store/services.py:209-210
invalid Belge doğrulanmıyor veya bozuk src/cluster_erp/modules/app_store/license.py:52-62
active Bitiş tarihinden önce src/cluster_erp/modules/app_store/license.py:76-77
grace Süresi dolmuş, lisansın verdiği ek gün içinde; tam işlev src/cluster_erp/modules/app_store/license.py:78-79
read_only Ek süre de geçmiş; yazmalar reddedilir src/cluster_erp/modules/app_store/license.py:80-81

license_public_key boşken lisanslama kapalıdır ve her katalog uygulamasına hak verilir. Anahtar ayarlıyken eksik veya geçersiz bir lisans yalnızca sistem uygulamalarına hak verir (src/cluster_erp/server/entitlements.py:158-173, src/cluster_erp/modules/app_store/services.py:404-417, src/cluster_erp/config/settings.py:566-569). Doğrulanmayan bir yükleme HTTP 422 ile reddedilir; değiştirilen bir lisans pasifleştirilmiş satır olarak kayıtta kalır (src/cluster_erp/modules/app_store/services.py:238-265). Web ekranı durumu Lisans Durumu olarak gösterir (webapp/i18n/tr.json anahtarı license.status_title).

Kurulum, onay ve korunan paketler

  • İlk açılışta her katalog uygulaması yüklenir ve kurulum satırı uygulama sürümünü ve onay verilen modülleri kaydeder (src/cluster_erp/modules/app_store/services.py:114-159).
  • Bir güncelleme uygulamanın modül listesini genişletirse yeni modüller bir yönetici yeniden onaylayana kadar kapalı kalır (src/cluster_erp/modules/app_store/services.py:161-180, src/cluster_erp/server/entitlements.py:153-157).
  • Kaldırma durumu uninstalled yapar ve modül verisini asla silmez; sistem uygulamaları kaldırılamaz (src/cluster_erp/modules/app_store/models.py:123-136, src/cluster_erp/modules/app_store/services.py:182-189).
  • Uygulama başına JavaScript paketleri herkese açık statik bağlamanın dışında gated_apps/ içinde durur ve kullanıcı için bir katman denetiminden sonra GET /api/v1/app_store/assets/{app_key}/{filename} ile sunulur (src/cluster_erp/modules/app_store/routes.py:95-155). gated_apps/ içinde dokuz klasör vardır. Bkz. korunan uygulama paketleri.
  • GET /api/v1/app_store/registry, oturum açmış kullanıcı için her etkin uygulamayı hak, kurulum, koltuk ve yeniden onay durumuyla döndürür; web istemcisi başlatıcısını bundan çizer (src/cluster_erp/modules/app_store/routes.py:18-39, src/cluster_erp/modules/app_store/services.py:375-447).

İzinler

Kod Kullanan Kaynak
license.manage Lisansı yükleme ve kaldırma src/cluster_erp/modules/app_store/routes.py:71-92
store_app.assign Rol atamaları ve uygulama istekleri src/cluster_erp/modules/app_store/routes.py:158-264
store_app.install Yükleme ve yeniden onay src/cluster_erp/modules/app_store/routes.py:267-285
store_app.uninstall Kaldırma src/cluster_erp/modules/app_store/routes.py:288-295

Kodlar ek kodlar olarak tohumlanır (src/cluster_erp/server/app.py:801-807).

Neden böyle kurulmuştur

  • Lisans satırı bir önbellektir ve dosya her çözümlemede yeniden doğrulanır, çünkü kendi sunucusunu yöneten bir yönetici veritabanını düzenleyebilir ama imza taklit edemez (src/cluster_erp/modules/app_store/license.py:3-7).
  • read_only veriyi okunur ve dışa aktarılabilir tutar, çünkü bir ERP iş verisini asla rehin tutmaz (src/cluster_erp/modules/app_store/license.py:9-11).
  • Kapı güvenlik sınırıdır; istemcide bir kutucuğu gizlemek yalnızca sunumdur (src/cluster_erp/server/entitlements.py:4-8).
  • Lisanslama devredeyken silinen bir lisans sistemi açmaz, kapatır (src/cluster_erp/server/entitlements.py:158-163).
  • Kapsam büyümesi yeni bir onay ister; böylece bir güncelleme uygulamanın erişimini sessizce genişletmez (src/cluster_erp/modules/app_store/models.py:153-157).

Kurallar ve sınırlar

  • Çözülmüş durum süreç belleğinde, kurulum ve lisans değişikliklerinde veritabanı tetikleyicilerinin ilerlettiği bir sürüm damgasıyla anahtarlanarak önbelleğe alınır; her kurulum değişikliği belleği ayrıca düşürür (src/cluster_erp/server/entitlements.py:32-77, src/cluster_erp/modules/app_store/routes.py:82).
  • tests/test_entitlement_stamp.py (2 test) ve tests/test_store_catalog_assets.py (4 test) damgayı ve katalog varlıklarını sabitler; uçtan uca süitler arasında web-client/_e2e_app_store.mjs, web-client/_e2e_license.mjs ve web-client/_e2e_store.mjs vardır.

Diğer parçalarla etkileşim

  • Koltuklar için rol kimlikleri auth bekçi kapısından, role_ids_for ile gelir (src/cluster_erp/modules/app_store/routes.py:250-252, src/cluster_erp/modules/auth/guards.py:189-202).
  • Mağazanın galeri sayfaları webapp/store/ içinde, uygulama başına bir klasördedir (26 klasör). Bkz. korunan uygulama paketleri.

Sınırlar ve açık noktalar

  • Kayıt defteri açıklaması seat ve entitled değerlerini gelecek aşamalar olarak anlatır, ama kod bugün ikisini de hesaplar (src/cluster_erp/modules/app_store/services.py:381-387, src/cluster_erp/modules/app_store/services.py:410-441).
  • Satıcı tarafında lisans üretimi bu deponun sunucu kodunda değildir; lisans dosyalarının nasıl üretildiği koddan belirlenemedi.

Tanıtılan terimler

Terim Kod tanımlayıcısı Tanım Türkçe terim Kaynak
catalogue app StoreApp Kapsadığı arka uç modülleriyle satılabilir bir uygulama. katalog uygulaması src/cluster_erp/modules/app_store/models.py:14
licence state LicenseState Yüklenen lisansın türetilmiş durumu: none, invalid, active, grace veya read_only. Lisans Durumu (webapp/i18n/tr.json anahtarı license.status_title) src/cluster_erp/modules/app_store/license.py:32
seat assignment AppAssignment Bir uygulamayı bir rol için zorunlu, kullanılabilir veya engelli yapan kural. koltuk ataması src/cluster_erp/modules/app_store/models.py:77
install consent consented_modules Bir yöneticinin yüklü bir uygulama için onayladığı arka uç modülleri. kurulum onayı src/cluster_erp/modules/app_store/models.py:162
entitlement gate require_app Hakkı olmayan bir modüle gelen istekleri reddeden yönlendirici bağımlılığı. hak kapısı src/cluster_erp/server/entitlements.py:260

İlgili sayfalar


92f8051 numaralı commit ile 2026-11-13 tarihinde doğrulandı.

Doğrulanan commit 92f8051 · 2026-11-13