সিস্টেম পরিচিতি
License System কী এবং কোন কোন component আছে
এটি একটি সম্পূর্ণ Software License Management System। Admin বা User যখন কারো জন্য License Key তৈরি করে,
সেটি সেই client এর website এর .env ফাইলে স্বয়ংক্রিয়ভাবে সেভ হয়।
Client এর script সেই key দিয়ে এই server-এ verify করে নিজেকে সক্রিয় রাখে।
Format: LIC-XXXX-XXXX-XXXX
প্রতিটি License unique।
64-char HMAC-SHA256।
Domain + License Key থেকে তৈরি।
Client এর server নিজেই লেখে।
কোনো manual কাজ নেই।
Expiry date ছাড়া license।
Admin ও User দিতে পারে।
সম্পূর্ণ কার্যপ্রবাহ
License তৈরি থেকে .env save পর্যন্ত
Admin থেকে License তৈরি
/admin/licenses → Generate License
| Field | বিবরণ | প্রয়োজনীয়? |
|---|---|---|
| user_id | কোন client-এর জন্য | Required |
| domain_name | Client এর domain (যেমন: example.com) | Required |
| validity | 0=Lifetime, 1=১ বছর, 2=২ বছর, 3=৩ বছর | Required |
| site_path | Same-server হলে folder path (ঐচ্ছিক) | Optional |
licenses table-এ: license_key, signature_key, site_path, expiry_date
Server সাথে সাথে https://clientdomain.com/license-receiver.php এ POST করে
যেকোনো সময় manually push করা যায়। HTTP Push ব্যর্থ হলে এটা ব্যবহার করুন।
User থেকে License তৈরি
/license/generate
Admin যদি কোনো user-এর free_license_generation = 1 করে দেয়, সে বিনামূল্যে generate করতে পারে। সাথে সাথে license তৈরি হয়।
UddoktaPay payment gateway দিয়ে payment করলে তারপর license তৈরি হয়। Pending payment-এ admin manually activate করতে পারে।
| Value | মেয়াদ | মূল্য |
|---|---|---|
| 1 | ১ বছর | license_generation_price × 1 |
| 2 | ২ বছর | license_generation_price × 2 |
| 3 | ৩ বছর | license_generation_price × 3 |
| 0 | ♾ Lifetime | license_lifetime_price (default: price × 10) |
Public Purchase Page
/license?domain=example.com
Client এর script license error পেলে এই page-এ redirect করবে domain সহ। সেখানে client সরাসরি payment করে license নিতে পারবে।
Payment form দেখায়। Client নাম + email দিয়ে UddoktaPay-তে pay করে।
License Key দেখায়। Expiry date দেখায়। কোনো payment option নেই।
Generic error দেখায়। Support contact বাটন দেখায়।
| Method | URL | কাজ |
|---|---|---|
| GET | /license?domain=xxx | Purchase page দেখায় |
| POST | /license/buy | UddoktaPay-তে redirect |
| GET | /license/buy/success | Payment success callback |
| POST | /license/buy/webhook | UddoktaPay webhook |
| GET | /license/buy/cancel | Payment cancel |
Auto-Sync — Client Script থেকে
SystemGuard.php → autoSyncLicense()
EnforceRemoteLicenseKillSwitch middleware চলে
.env এ LICENSE_KEY এবং LICENSE_SIGNATURE আছে কিনা দেখে
GET /api/fetch-license?domain=xxx&token=yyy → Server license key + signature দেয়
base_path('.env') এ LICENSE_KEY, LICENSE_SIGNATURE, LICENSE_EXPIRY save করে
HTTP Push — Server থেকে Client এ
license-receiver.php এর মাধ্যমে
১. push_token verify করে (security check)
২. .env ফাইলে LICENSE_KEY, LICENSE_SIGNATURE লেখে
৩. {"status":"ok"} response দেয়
Client Setup
নতুন client কে কী করতে হবে
LICENSE_REMOTE_BASE_URL={{ $serverUrl }} .env এ দিলেই হবে।
.env ফাইলের পাশে রাখুন। cPanel-এ public_html/ ফোল্ডারে।
chmod 664 .env বা cPanel থেকে permission 664 দিন।
Browser-এ https://clientdomain.com/license-receiver.php visit করুন। {"status":"error","message":"Method not allowed."} দেখালে সফল।
API: verify-license
Client script লাইসেন্স যাচাই করতে call করে
| Method | URL | Auth |
|---|---|---|
| POST | {{ $serverUrl }}/api/verify-license | HMAC signature |
| Parameter | Type | বিবরণ |
|---|---|---|
| domain | string | Client এর domain (www ছাড়া) |
| license_key | string | LIC-XXXX-XXXX-XXXX format |
| signature | string | hash_hmac('sha256', domain, HMAC_SALT) |
API: fetch-license
Client script নিজের license key fetch করতে call করে (Auto-Sync)
| Method | URL | Rate Limit |
|---|---|---|
| GET | {{ $serverUrl }}/api/fetch-license | 20 req/min |
| Parameter | বিবরণ |
|---|---|
| domain | Client এর domain |
| token | hash_hmac('sha256', domain + '|' + YYYYmmddHH, HMAC_SALT) — প্রতি ঘন্টায় বদলায় |
API: cache-signal
Kill-switch signal — admin চাইলে client script destroy করতে পারে
| Method | URL |
|---|---|
| GET | {{ $serverUrl }}/api/cache-signal?domain=xxx |
Security Architecture
HMAC + Token সিস্টেম
সব signature calculation এ একই salt ব্যবহার হয়। Server ও Client script এ মিলিয়ে রাখতে হবে।
প্রতিটি সিস্টেমে ভিন্ন formula:
Lifetime License
মেয়াদহীন লাইসেন্স
Validity = 0 দিলে expiry_date = NULL database-এ। Verify করার সময় NULL expiry মানে কখনো expire হবে না। API response-এ "expiry_date": "lifetime" আসে।
Admin table-এ Expiry column-এ ♾ Lifetime badge দেখায়।
generalsettings.license_lifetime_price (default = license_generation_price × 10)
License System Documentation — {{ $gs->title ?? 'Creative Design' }} © {{ date('Y') }}