Modül Lisanslama

18 görüntülenme Markdown

Modülünüzün lisanssız çalışmayı reddedip reddetmeyeceği sizin kararınız, kararı veren sunucu da öyle.

Genel Bakış

WISECP, sizin adınıza sattığı ürünler için bir lisans protokolü yayınlamaz. Adresi, soruyla giden alanları ve bir cevabın ne anlama geldiğini siz seçersiniz.

Bize ait iki şey var. Şifreleme: okunabilir gitmemesi gereken dosyaları işaretlersiniz, paketleyici onları şifreler. Taşıyıcı isteğe bağlıdır ve cevabı bir gün hatırlar.

bizimkini isterseniz, entegrasyonun tamamı
$answer = \License::remote_check('https://siteniz.example/license/check', ['domain' => \Utility::getDomain()]);

if ($answer === null)                    return true;   // sorulamadi
if (trim($answer['body']) !== 'OK')      return false;  // sunucunuz hayir dedi

return true;

Kendi curl'ünüz de aynı ölçüde makbul. Önemli olan kararın nerede durduğu: işaretlediğiniz bir dosyanın içinde, ki operatör onu silemesin.

Ön Koşullar

Zaten çalışan bir modül Lisanslama en son eklenen şeydir. Özelliği lisanssız kurup test edin, kapıyı sonra koyun.
Cevap veren kendi sunucunuz Kontrol ettiğiniz herhangi bir adres, istediğiniz şekilde. WISECP'nin kendi ürünleri /license-verify/checking/{token}/{id} ucundan düz OK ya da ERROR kelimesiyle cevap verir.
Müşterinin sunucusunda curl Yoksa taşıyıcı hata vermek yerine null döner.

Yapı

Özelliği dört parça taşır ve ilk üçü sizindir.

ParçaNerede yaşarNe yapar
Sunucunuzkontrol ettiğiniz bir adresSoruyu seçtiğiniz şekilde yanıtlar.
Kontrolünüzmodül sınıfınızın private bir metoduSorar, cevabı okur ve ne anlama geldiğine karar verir.
Kapınızücretli davranışın başladığı yerO metodu çağırır; reddeder, kısıtlar ya da açar.
Yanıt önbelleğicoremio/storage/licensesAdres ve soru başına bir şifreli dosya, cache dizininin dışında.

Önbellek kendi klasöründe kasıtlı olarak duruyor. Admin operation'ları parametresiz cache temizlemeyi günde birkaç kez çağırır. Oraya park edilmiş bir yanıt da diğerleriyle silinir.

Adım Adım

Kapıyı değerin olduğu yere koyun

Müşterinin parasını ödediği şeyi kapılayın, modülün varlığını değil. "Soramadım"ı kendi başına bir cevap sayın: curl'ü olmayan bir sistem size tam olarak onu getirir.

admin ekranı
/* @wisecp-protected */

private function licensed(): bool
{
    $answer = \License::remote_check('https://siteniz.example/license/check', [
        'product' => 'aurora-backup',
        'domain'  => \Utility::getDomain(),
    ]);

    // Sorulamadi. Sizin kesintiniz musterinin sucu degil, bu yuzden acik kaliyor.
    if ($answer === null) return true;

    return $answer['status'] === 200 && trim($answer['body']) === 'OK';
}

public function adminArea(): array
{
    if (!$this->licensed())
        return [
            'page_title' => $this->lang['name'] ?? 'Aurora Backup',
            'content'    => $this->view('unlicensed.php'),
        ];

    return [
        'page_title' => $this->lang['name'] ?? 'Aurora Backup',
        'content'    => $this->view('index.php'),
    ];
}

Okunabilir gitmemesi gereken her dosyayı işaretleyin

Paketleyici kontrolünüzü hangi dosyanın taşıdığını çıkaramaz. Yardımcınızın adını siz koydunuz ve çağrı tek bir dosyada geçer. Bunu siz beyan edersiniz. İşareti, elden çıkarmak istemediğiniz her dosyanın başına kendi satırında koyun.

işaret
/* @wisecp-protected */      // modül sınıfı, hooks.php, bir yardımcı — herhangi bir PHP dosyası

Yalnız PHP. Şablonlar hangi motoru kullanırsa kullansın şifrelenmez. Motor onları gösterimden önce diske düz PHP olarak derler, yani şablona yazılan bir sır orada zaten okunabilir. Kararları PHP'de tutun.

İşaret bir taahhüttür: işaretli bir dosyayı koruyamayan yapı reddedilir.

En çok beş dosya

Bir gönderimde en çok beş dosya işaretlenebilir. Fazlası yayına alınmaz; yayınlamak ücretli bir ek olur. Karara dokunan her şeyi değil, kararı veren dosyayı işaretleyin: sınıf, yardımcısı ve view.

Referans

Taşıyıcı neyi hatırlar

PencereSüreDavranış
Disk önbelleği86400 saniyeHiç ağ turu yok. Adres ve alan kümesi başına bir şifreli dosya, coremio/storage/licenses altında.
Her çağrıyokBir soru dünkü cevapla yanıtlanmamalıysa üçüncü argümanı true geçin.
Ulaşılamadıyoknull, ve hiçbir şey yazılmaz. Bir kesinti bir günlük sessizliği önbelleğe dondurmaz.

Önbellek dosyası sistemin kendi sırrıyla şifrelenir ve imzalanır; zarf hangi sorunun cevabı olduğunu taşır. Başka bir sistemden alınıp adı değiştirilen dosya hiçbir şeye cevap vermez. Tolerans penceresi yoktur.

Kendi ucunuza sormak

Kontrolün nereye gideceği ve cevabın ne anlama geldiği sizin kararınız. Bu metot soruyu taşır ve trafiği günde bir çağrıda tutar.

public static function remote_check(string $url, array $fields = [], bool $always = false, array $options = []): ?array;
$url Sorulacak adres. Yalnız http ve https. Müşterinin kendi ağındaki adresler soket açılmadan reddedilir: loopback, özel aralıklar, bulut metadata.
$fields İstek gövdesi olarak gider.
$always Dokunmazsanız cevap bir gün hatırlanır. Her çağrıda sormak için true geçin.
$options headers istek başlıkları; 'Ad: değer' satırları ya da ad => değer haritası olarak verilir. method varsayılan POST. timeout saniye, 1 ile 60 arası, varsayılan 10.
Döner ['status' => int, 'headers' => array, 'body' => string]. Başlık adları küçük harfe çevrilir, gövde olduğu gibidir. null sunucuya ulaşılamadı demektir ve hiçbir şey saklanmaz.

Adres, alanlar, metot ve başlıklar birlikte cache kimliğidir. Kimlik doğrulamalı çağrı, anonim olandan ayrı hatırlanır.

$answer = \License::remote_check(
    'https://siteniz.example/license/check',
    ['product' => 'aurora-backup', 'domain' => \Utility::getDomain()],
    false,
    ['headers' => ['Authorization: Bearer ' . $this->vendor_key()]]
);

if ($answer === null)         return true;      // sorulamadi; sizin kesintiniz, musterinin sucu degil
if ($answer['status'] !== 200) return false;    // 401, 403, 404 — sunucunuz baska bir sey soyledi

$data = \Utility::jdecode($answer['body'], true);

return (bool) ($data['valid'] ?? false);

Cevabı yorumlamaz, imza da doğrulamaz

Müşterinin sunucusu adresinizi neye çözerse o cevabı yazabilir, durum kodu dahil. Cevap parayı belirliyorsa sunucunuzda imzalayın ve okuyan kodda imzayı doğrulayın.

Örnek

Uçtan uca kapılanmış, eksiksiz bir ücretli modül. Admin ekranı da zamanlanmış görev de aynı soruyu sorar. Yalnız birine konan kapı, kapı değildir.

modül sınıfı
<?php
    namespace WISECP\Modules\Addons;

    use AddonModule;
    use Filter;

    /* @wisecp-protected */
    class AuroraBackup extends AddonModule
    {
        public string $version = '1.2';

        /** Sizin adresiniz, sizin alanlariniz, cevabi sizin okumaniz. */
        private function licensed(): bool
        {
            $answer = \License::remote_check('https://vendor.example/license/check', [
                'product' => 'aurora-backup',
                'domain'  => \Utility::getDomain(),
            ]);

            // Sorulamadi. Sizin kesintiniz musterinin sucu degil.
            if ($answer === null) return true;

            return $answer['status'] === 200 && trim($answer['body']) === 'OK';
        }

        public function adminArea(): array
        {
            $action = Filter::init('REQUEST/action', 'route') ?: 'index';
            if (!$this->licensed()) $action = 'unlicensed';

            return [
                'page_title' => $this->lang['name'] ?? 'Aurora Backup',
                'content'    => $this->view($action . '.php'),
            ];
        }

        /** Zamanlanmis yari. Bir cron kosusu da suresi dolmus lisansla is yapmamali. */
        public function run_backup(): bool
        {
            if (!$this->licensed())
                throw new \Exception($this->lang['error-not-licensed'] ?? 'Not licensed.');

            // ...
            return true;
        }
    }

Zamanlanmış yol da kapılanıyor. Yalnız admin ekranını koruyan bir kapı, aylar önce dolmuş bir lisansla ücretli işin çalışmasına izin verir.

Tuzaklar

Ulaşılamadı, lisanssız demek değildir

Her olumsuz yanıtı hırsızlık saymak, ilk ağ tıkanmasında modülünüzü kapatır. Gerekçeye göre dallanın ve toleransın işini yapmasına izin verin.

Açık anahtarsız göndermek kontrolü isteğe bağlı yapar

Alan boşken yanıt yalnız nonce ve saat kontrolüyle kabul edilir. Host adınızı başka bir yere yönlendirebilen herkes her şeye "geçerli" diyebilir. Bunu ilk ücretli sürümden önce doldurun.

Ayarlarda unutulan domain, geliştiricinin yanıtını gönderir

Domain seçeneği sorulan host'u ezer ve yalnız yerel çalışma içindir. Bir sürümde dolu bırakılırsa her kopya sizin makineniz hakkında sorar ve lisanslı çıkar.

Uzun zaman aşımı sizin kesintinizi onların kesintisine çevirir

Beş saniye, günde bir kez olan bir çağrı için zaten cömerttir. Yükseltirseniz sunucunuz düştüğü anda müşterinin panelindeki her sayfa sizi beklemeye başlar.

Yalnız mutlu yolu değil, ret yolunu da test edin

Adresi önce var olmayan bir host'a, sonra imzasız yanıt dönen bir host'a yönlendirin. Modülünüze iki durumda da bakın. Ret ekranını parasını ödemeyen her müşteri görür.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.