Overview
license-receiver.php কী এবং কেন দরকার
license-receiver.php হলো একটি standalone PHP script যা ক্লায়েন্টের website-এর root folder-এ রাখতে হয়।
License server (master site) যখন কাউকে license দেয়, তখন সে এই script-এ একটি POST request পাঠায়।
Script-টি সেই request verify করে এবং ক্লায়েন্টের .env ফাইলে LICENSE_KEY ও LICENSE_SIGNATURE স্বয়ংক্রিয়ভাবে সেট করে দেয়।
যারা {{ $gs->title ?? 'Creative Design' }}-এর script/software কিনেছেন এবং নিজের domain-এ চালাচ্ছেন।
আপনার website-এর root folder-এ (যেখানে .env ফাইল আছে তার পাশে)।
কীভাবে কাজ করে
Push-based license delivery flow
Installation
ধাপে ধাপে ক্লায়েন্ট সাইটে ইনস্টল করুন
Script ডাউনলোড করুন
Admin Panel → License → "Download Receiver Script" বাটনে ক্লিক করুন। অথবা সরাসরি এই লিংক থেকে:
{{ $serverUrl }}/admin/licenses/download-receiver
সঠিক folder-এ upload করুন
ফাইলটি আপনার website-এর public root-এ রাখুন — যেখানে .env আছে তার পাশে নয়, বরং public_html/ বা public/ folder-এ।
# cPanel / Shared Hosting public_html/ ├── license-receiver.php ← এখানে রাখুন ├── index.php ├── .htaccess └── .. # Laravel (public folder) your-project/ ├── public/ │ ├── license-receiver.php ← এখানে রাখুন │ └── index.php ├── .env ← এটি auto-update হবে └── ..
File permission চেক করুন
.env ফাইলটি writable হতে হবে। cPanel File Manager দিয়ে .env ফাইলের permission 644 বা 664 দিন।
chmod 644 .env
Browser-এ Test করুন
Browser-এ https://yourdomain.com/license-receiver.php ওপেন করুন। নিচের response আসলে installation সফল:
{"status":"error","message":"Method not allowed."}
Admin Panel থেকে Push করুন
Admin Panel → License List → আপনার domain খুঁজুন → "Push to Site" বাটনে ক্লিক করুন। ✅ Push সফল দেখালে সব ঠিক আছে।
HMAC_SALT কনফিগারেশন
License server ও receiver script-এর salt মিলতে হবে
define('HMAC_SALT', '{{ $hmacSalt }}');
.env Path Auto-Detection
Script নিজেই .env খুঁজে নেয়
Script-টি নিচের ক্রমে .env ফাইল খোঁজে। প্রথম যেটা readable ও writable পাবে সেটাই ব্যবহার করবে:
| # | Path | কখন কাজ করে |
|---|---|---|
| 1 | dirname(__DIR__)/.env |
script public/-এ আছে, Laravel root-এ .env — সবচেয়ে সাধারণ |
| 2 | dirname(dirname(__DIR__))/.env |
script দুই স্তর ভেতরে থাকলে (subdirectory) |
| 3 | __DIR__/../.env |
same-folder fallback |
.env না পেলে script 500 error return করে এবং কিছু লেখে না। এতে আপনার server নিরাপদ থাকে।Security — Token Verification
HMAC SHA-256 দিয়ে প্রতিটি request authenticate করা হয়
Push Token কীভাবে তৈরি হয়
// Server-side token generation $domain = 'example.com'; // www ছাড়া, lowercase $licenseKey = 'LIC-ABCD-EFGH-IJKL'; $HMAC_SALT = '{{ $hmacSalt }}'; $pushToken = hash_hmac('sha256', $domain . '|' . $licenseKey, $HMAC_SALT);
Receiver Script-এ Verification
// Client site HTTP_HOST থেকে domain বের করা $domain = strtolower(preg_replace('#^www\.#i', '', $_SERVER['HTTP_HOST'])); // Expected token compute $expectedToken = hash_hmac('sha256', $domain . '|' . $licenseKey, HMAC_SALT); // Timing-safe comparison if (!hash_equals($expectedToken, $pushToken)) { http_response_code(403); echo json_encode(['status' => 'error', 'message' => 'Invalid token.']); exit; }
=== comparison-এ timing side-channel attack সম্ভব।
HTTP Responses
Script থেকে কী কী response আসতে পারে
| HTTP Code | status | কারণ |
|---|---|---|
| 200 OK | ok |
লাইসেন্স সফলভাবে .env-এ সেইভ হয়েছে |
| 400 Bad Request | error |
license_key বা push_token missing |
| 403 Forbidden | error |
Push token invalid — HMAC mismatch |
| 405 Method Not Allowed | error |
GET request এসেছে, শুধু POST accept হয় |
| 500 Server Error | error |
.env file পাওয়া যায়নি বা writable নয় |
Success Response Example
{
"status": "ok",
"message": "License saved successfully.",
"domain": "example.com"
}
Payload Fields
License server যে data POST করে
| Field | Type | Required | বিবরণ |
|---|---|---|---|
license_key |
string | Required | Generated license key — e.g. LIC-ABCD-EFGH-IJKL |
signature_key |
string | Required | HMAC-SHA256 signature of licenseKey|domain |
push_token |
string | Required | Security token — HMAC of domain|licenseKey |
expiry_date |
string | Optional | YYYY-MM-DD অথবা lifetime (মেয়াদহীন) |
.env-এ যা লেখা হয়
# License Server থেকে auto-set হয় LICENSE_KEY=LIC-ABCD-EFGH-IJKL LICENSE_SIGNATURE=a3f9b2c1d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1 LICENSE_EXPIRY=lifetime # লাইফটাইম হলে এটি লেখা হয় না
Troubleshooting
সাধারণ সমস্যা ও সমাধান
Push fail: cURL error 6: Could not resolve host
Domain-টি License server থেকে accessible নয় — DNS propagate হয়নি, বা domain live নয়। কিছুক্ষণ পর Admin Panel থেকে manual push করুন।
Push fail: http_status: 404
license-receiver.php ফাইলটি সঠিক জায়গায় নেই বা upload হয়নি। https://yourdomain.com/license-receiver.php browser-এ ওপেন করে দেখুন।
403 Forbidden: Invalid token
HMAC_SALT mismatch। Admin Panel থেকে script re-download করুন — downloaded script-এ HMAC_SALT স্বয়ংক্রিয়ভাবে সেট থাকে।
500: .env not found or not writable
Script .env খুঁজে পাচ্ছে না বা write permission নেই।
① File Manager-এ .env এর permission 644 করুন।
② license-receiver.php সঠিক directory-তে আছে কিনা দেখুন।
Push সফল হলো কিন্তু site এখনো কাজ করছে না
PHP OPcache এবং Laravel config cache clear না হওয়ার কারণ হতে পারে। Terminal-এ php artisan config:clear চালান, অথবা hosting control panel থেকে PHP cache clear করুন।
FAQ
সচরাচর জিজ্ঞাসা
License সফলভাবে push হওয়ার পরে এটি রেখে দেওয়া ভালো — ভবিষ্যতে renewal বা re-push-এ কাজে লাগে। তবে security-সচেতনরা push সম্পন্ন হলে delete বা rename করতে পারেন।
www সহ হয়?
Script স্বয়ংক্রিয়ভাবে www. prefix সরিয়ে নেয়। License server-ও same normalization করে। তাই www.example.com ও example.com দুটোই কাজ করবে।
LICENSE_EXPIRY লেখা হয়?
না। Lifetime license-এর ক্ষেত্রে expiry_date field null বা lifetime আসে — সেক্ষেত্রে LICENSE_EXPIRY .env-এ লেখা হয় না।
না। License সবসময় License Server-এর database-এ সেইভ থাকে। Admin Panel → License List থেকে যেকোনো সময় manually push করা যায়।
License server ({{ $serverUrl }}) publicly accessible একটি server থেকে run করে। সে localhost resolve করতে পারে না।
Local development-এ Admin Panel থেকে site_path দিয়ে লাইসেন্স তৈরি করুন (direct .env write)।
License Receiver Docs — {{ $gs->title ?? 'Creative Design' }} © {{ date('Y') }} | License System Docs →