Enterprise الإصدار
Licensing — مرجع متعمّق
لمحة سريعة
قسم بعنوان «لمحة سريعة»هذه الصفحة هي المرجع المتعمّق لسطح الترخيص في NextPDF Enterprise — الوحدة التي تحلّ كل قدرة Enterprise أخرى. تغطّي نموذج حالة الاستحقاق (EntitlementEvaluator وEntitlementStatus وEntitlementResult)، وحجب القدرة المُنفَّذ (FeatureGate وCapabilityCode وCapabilityRegistry)، وآلة إنفاذ القناة ذات المؤقّتَين (ChannelEnforcementPolicy وOnlineCheckScheduler)، والعميل الموقَّع عبر الإنترنت (LicenseClient). ولا يحتاج تقييم الاستحقاق العادي إلى شبكة. ويوجد العميل عبر الإنترنت لعمليات صريحة هي التفعيل، ونبض الحياة، وإلغاء التفعيل، والتحقّق عبر الإنترنت، وفحص التجديد. وتبقى تفاصيل الآلية الداخلية في التوثيق الداخلي لمستودع المصدر وهي خارج نطاق هذا الدليل.
التوفّر والترخيص
قسم بعنوان «التوفّر والترخيص»تُشحَن هذه القدرة في NextPDF Enterprise (nextpdf/enterprise) وتُفعَّل بغلاف ترخيص من طبقة Enterprise. وأيّ عملية نشر بلا ذلك الاستحقاق لا تُحمِّل أصناف القدرة. قارِن الإصدارات واحصل على ترخيص.
والترخيص سطح Enterprise أساسي. وهو حاضر دائمًا فور تثبيت حزمة Enterprise إلى جوار حزمة Core، لأنه السطح الذي يحلّ كل شيء آخر. ولا يملك NextPDF Pro سطح استحقاق منفصلًا؛ إذ يُشحَن نموذج الحالة، وآلة الإنفاذ، والعميل عبر الإنترنت في nextpdf/enterprise فقط. أمّا NextPDF Core (Apache-2.0) فلا يملك نموذج استحقاق على الإطلاق — والمضيف الذي يحتاج سلوك Apache-2.0 غير المرخَّص يستخدم محرّك Core مباشرةً، لا مسار Enterprise.
سطح واجهة برمجة التطبيقات العامة
قسم بعنوان «سطح واجهة برمجة التطبيقات العامة»تقع كل الأنواع تحت NextPDF\Enterprise\Licensing. وتوجد آلة الإنفاذ في نطاق الأسماء الفرعي Channel، وتركيب وقت التشغيل في Runtime، وأنواع الحالة الموقَّعة في Online.
| الرمز | المعاملات | السلوك الافتراضي | يُعيد | يرمي أو يفشل بـ | ملاحظات |
|---|---|---|---|---|---|
EntitlementEvaluator::evaluate() | ?LicenseKey $license، ?DateTimeImmutable $now = null | يربط ترخيصًا مُتحقَّقًا منه (أو null) بقرار الاستحقاق الكامل | EntitlementResult | لا شيء | ترخيص null يُنتج نتيجة «لا ترخيص» المغلقة عند الفشل |
EntitlementEvaluator::evaluateEnforced() | ?LicenseKey $license، EnforcementOutcome $outcome | يحوّل نتيجة إنفاذ محسوبة مسبقًا إلى نتيجة استحقاق | EntitlementResult | لا شيء | يأتي الإصدار الفعّال من النتيجة؛ وكل تخفيض إنفاذ يستقرّ على Core |
EntitlementEvaluator::resolveBrandingMode()، ::resolveBrandingStrategy() | ?LicenseKey $license، ?DateTimeImmutable $now = null | يحلّ قرار العلامة التجارية للمخرَج المُولَّد | BrandingMode / BrandingStrategy | لا شيء | سلطة العلامة التجارية الوحيدة؛ وقناة التقييم وحدها تضع العلامة المائية |
EntitlementResult | كائن قيمة للقراءة فقط | يحمل الحالة، والإصدار، والقناة، ووضع العلامة التجارية، وأعلام وقت التشغيل/التحديث/الدعم، وتحذيرًا اختياريًا | — | لا شيء | مساعدات: isFullyActive()، isExpired()، isDowngradedToCore()، shouldApplyEvaluationBranding() |
EntitlementStatus | تعداد مدعوم بسلسلة نصية | Active، GracePeriod، DowngradedToCore، EvaluationExpired، NoLicense | — | لا شيء | PerpetualFallback مُبقًى لكنه مُهمَل؛ محفوظ فقط كي يستمرّ مستهلكو ما قبل 6.0 في التصريف |
FeatureGate::hasCapability() | CapabilityCode $capability | يفحص القدرة إزاء الإصدار الفعّال المُنفَّذ وحالة الحزمة | bool | لا شيء | مغلق عند الفشل إلى core عند أي خطأ في المُحلِّل |
FeatureGate::requireCapability() | CapabilityCode $capability | يمرّ بصمت أو يرمي بسياق بيع إضافي مُهيكَل | void | SpectrumAuthenticationException SPEC-LIC-001 (غير مُرخَّص) أو SPEC-LIC-002 (حزمة منتهية) | يحمل السياق required_capability، required_pack، current_packs، upgrade_info_url |
FeatureGate::isFeatureEnabled()، ::requireFeature() | string $feature | فحص مُعرِّف ميزة قديم | bool / void | SpectrumAuthenticationException SPEC-AUTH-007 (مسار require) | توافق قديم؛ فضّل فحوص القدرة |
مُوصِّلات FeatureGate | لا شيء | استبطان الترخيص | متغيّر | لا شيء | currentEdition()، isLicenseValid()، isInGracePeriod()، getActivePacks()، trialPolicy() |
CapabilityCode | تعداد مدعوم بسلسلة نصية | مُعرِّفات القدرة القانونية (core.*، pro.*، enterprise.*، pack.*) | — | لا شيء | isPack()، packName()، minimumEdition()، forEdition() |
CapabilityRegistry | LicenseKey، أنماط المسارات | حلّ مسار-إلى-قدرة والبحث عن الحزمة قبل الإرسال | متغيّر | لا شيء | يغطّي registerDefaultRoutes() مسارات الخدمة المُوثَّقة |
LicenseKey | كائن قيمة للقراءة فقط | مطالبات ترخيص مُحلَّلة ومُتحقَّق منها | — | لا شيء | isExpired()، isInGracePeriod()، isFullyExpired()، hasFeature()، hasCapability()، activePackNames()؛ وmaxSlots تعاقدي فقط |
LicenseValidator::buildVerifiedLicenseKey() | array $data | يبني LicenseKey مُنمَّطًا من حمولة مُتحقَّق منها سلفًا | LicenseKey | SpectrumAuthenticationException SPEC-AUTH-001 عند مخالفة المخطّط | يدعم المخطّط 2.0 و1.0 والحمولات القديمة |
PackDefinition / PackRegistry | كائنات قيمة للقراءة فقط | حالة حزمة إضافية بانتهاء وسماح مستقلَّين | متغيّر | لا شيء | isActive()، isFullyExpired()، activePacks()، activeCapabilities() |
TrialPolicy | bool $enabled، int $maxPagesPerSecond = 2، وحقول العلامة المائية | سياسة سقف معدّل معالجة التجربة | — | لا شيء | fromLicenseKey()، disabled()، isThrottled()؛ وتبقى سلطة العلامة التجارية لدى المُقيِّم |
ChannelEnforcementPolicy::enforce() | LicenseKey $license، LocalState $state، int $systemNow، bool $revoked = false | يُشغّل آلة المؤقّتَين إضافةً إلى الإبطال وإعادة وسم التجربة | EnforcementOutcome | لا شيء | يتجاوز الإبطال كل مؤقّت وكل حالة تجربة |
OnlineCheckScheduler::evaluate()، ::recordSuccessfulOnlineCheck() | الترخيص، والحالة المحلّية، والطوابع الزمنية | تقييم بمؤقّتَين؛ وتجديد المدّة من وقت الخادم المُتحقَّق منه | EnforcementOutcome / LocalState | لا شيء | يمنح ONLINE_GRACE_SECONDS مهلة حيوية مدّتها 48 ساعة بعد انقضاء المدّة |
EnforcementDecision / EnforcementReason / EnforcementOutcome | تعدادات + كائن قيمة للقراءة فقط | Active، Grace، DowngradedToCore إضافةً إلى السبب الدقيق | — | لا شيء | يرتبط كل سبب بقرار واحد على نحو حتمي |
Runtime\EntitlementResolver::currentEntitlement() | لا شيء | واجهة: الاستحقاق المُنفَّذ الذي يقدّمه وقت التشغيل | EntitlementResult | مُحدَّد بالتنفيذ | يركّب EnforcedEntitlementResolver المخبأ، والحالة، والسياسة، والمُقيِّم، مغلقًا عند الفشل إلى Core |
LicenseStateCache::get()، ::getOrThrow() | bool $forceRefresh = false | مخبأ الترخيص المُتحقَّق منه الداعم للبوّابة | ?LicenseKey | getOrThrow(): SpectrumAuthenticationException SPEC-AUTH-008؛ وLicenseConfigurationException عند توصيل غير صالح | invalidate()، isCacheValid() |
LicenseClient::activate()، ::heartbeat()، ::deactivate()، ::verifyOnline() | string $licenseJws، string $deploymentId، ?string $machineFingerprintHash = null، ?string $expectedLicenseId = null، ?string $clientNonce = null | تبادل حالة موقَّعة واحد؛ والاستجابة يُتحقَّق منها إزاء الجذر المُثبَّت وتُربَط بالرمز العشوائي المُرسَل | StatusResponse | LicenseClientException (النقل، أو رمز غير 200، أو رمز عشوائي مُقدَّم غير صالح)؛ وSpectrumAuthenticationException (استجابة مزوّرة، أو مُلاعَب بها، أو قديمة، أو خاطئة الرمز العشوائي، أو خاطئة الترخيص، أو خاطئة النوع) | لا يُرسَل أبدًا سوى بصمة مُملَّحة، ولا تُرسَل بصمة خام قطّ |
LicenseClient::checkRenewal() | string $licenseId، string $customerId | فحص توفّر التجديد؛ و404 هو الجواب المعتاد «لا يوجد متوفّر» | مصفوفة تجديد (available، download_url، expires_at) | LicenseClientException (غير قابل للوصول، أو رمز غير 200/404، أو download_url رفضته السياسة) | يُفحَص عنوان جسم الاستجابة غير الموقَّع ضدّ SSRF قبل أن يتمكّن من الإفلات |
LicenseClient::__construct() | راجع سياج التوقيع | يتحقّق من النقل، ومخطّط URL، ومجموعة التثبيت عند الإنشاء | — | LicenseConfigurationException (نقل لا يفرض السياسة، أو مخطّط غير مسموح، أو HTTP صِرف بلا تثبيتات، أو مجموعة تثبيت مُشوَّهة) | يكشف getPinSet() مجموعة التثبيت النشطة لأدوات التدوير |
Online\StatusResponse | كائن قيمة للقراءة فقط | الحالة الموقَّعة المُتحقَّق منها | — | لا شيء | isLive() خاطئة عند revoked / expired / released؛ وتحمل leaseExpiresAt، وأعداد المقاعد، ولقطة استحقاق |
LicenseChannelMode / OnlineMode / OnlinePolicy | تعدادات + كائن قيمة للقراءة فقط | مطالبات القناة وسياسة الاتصال | — | لا شيء | signed_source مقابل ioncube؛ ووضع الاتصال required / optional / disabled مع intervalDays وleaseDays |
LicenseEdition | تعداد مدعوم بسلسلة نصية | Core، Pro، Enterprise | — | لا شيء | يُنفّذ satisfies() تسلسل الطبقات |
public function __construct(private ?EvaluationBrandingConfig $evaluationBrandingConfig = null)public function evaluate(?LicenseKey $license, ?DateTimeImmutable $now = null): EntitlementResultpublic function evaluateEnforced(?LicenseKey $license, EnforcementOutcome $outcome): EntitlementResultpublic function resolveBrandingMode(?LicenseKey $license, ?DateTimeImmutable $now = null): BrandingModepublic function resolveBrandingStrategy(?LicenseKey $license, ?DateTimeImmutable $now = null): BrandingStrategypublic function __construct(private readonly LicenseStateCache $licenseCache, private readonly EntitlementResolver $entitlementResolver, private readonly string $upgradeInfoUrl = self::DEFAULT_UPGRADE_URL)public function isFeatureEnabled(string $feature): boolpublic function requireFeature(string $feature): voidpublic function currentEdition(): ?stringpublic function isLicenseValid(): boolpublic function isInGracePeriod(): boolpublic function hasCapability(CapabilityCode $capability): boolpublic function requireCapability(CapabilityCode $capability): voidpublic function getActivePacks(): arraypublic function trialPolicy(): TrialPolicypublic function __construct(private readonly ClientInterface $httpClient, private readonly RequestFactoryInterface $requestFactory, private readonly StreamFactoryInterface $streamFactory, private readonly StatusX5cValidator $statusValidator, private readonly string $baseUrl = self::DEFAULT_BASE_URL, #[SensitiveParameter] private readonly ?string $apiKey = null, array $pinnedPublicKeys = [], array $backupPins = [], private readonly OutboundHttpPolicy $policy = new OutboundHttpPolicy(allowedSchemes: ['https'], connectTimeoutSeconds: 10, readTimeoutSeconds: 30, maxResponseBytes: 10_485_760, followRedirects: false, allowPrivateTargets: false, retryAttempts: 0, retryBaseBackoffMs: 250))public function activate(string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = null): StatusResponsepublic function heartbeat(string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = null): StatusResponsepublic function deactivate(string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = null): StatusResponsepublic function verifyOnline(string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = null): StatusResponsepublic function getPinSet(): ?PinSetpublic function checkRenewal(string $licenseId, string $customerId): arrayعقد السلوك
قسم بعنوان «عقد السلوك»يُنتج تقييم الاستحقاق إحدى خمس حالات راهنة، لكلٍّ منها نتيجة ثابتة في وقت التشغيل:
| الحالة | وقت التشغيل | القدرات الفعّالة | التحديثات / الدعم | العلامة التجارية |
|---|---|---|---|---|
Active | مسموح | الإصدار المُستحَقّ + الحِزم النشطة | نعم (مدفوع)؛ لا (تقييم) | لا شيء (مدفوع)؛ علامة مائية (تقييم) |
GracePeriod | مسموح | الإصدار المُستحَقّ + الحِزم النشطة | نعم | لا شيء (مدفوع) |
DowngradedToCore | مسموح | Core فقط | لا | لا شيء (مدفوع)؛ علامة مائية (تجربة) |
EvaluationExpired | مقيَّد | لا شيء | لا | علامة مائية |
NoLicense | مُعطَّل (مغلق عند الفشل) | لا شيء | لا | علامة مائية |
- انتهاء المدفوع لا يُعطِّل أبدًا وقت التشغيل المُثبَّت. تبقى
runtimeAllowedصادقة في كل حالة مدفوعة. وبعد نافذة السماح يُخفَّض الإصدار الفعّال إلى Core: تستمرّ قدرات Core في العمل بلا حدّ، وتُحجَب كل قدرات Pro/Enterprise/الحِزم، وتُلغى التحديثات والدعم. وتُسمّي حالةEntitlementStatus::PerpetualFallbackالمُهمَلة سياسة الانتهاء لما قبل 6.0، وهي موجودة فقط لتوافق التصريف. - لا تنتهي كل حالة بتنفيذ Core. يُبقي السماح على الإصدار المُستحَقّ الكامل مع تحذير تجديد مؤرَّخ. ويُقيِّد انتهاء التقييم وقت التشغيل ويُبقي العلامة المائية. وتُعطِّل حالة «لا ترخيص» مسارات Enterprise مغلقةً عند الفشل وتضع علامة مائية ظاهرة على أي مخرَج قديم، فلا يمكن أن تمرّ أبدًا بوصفها تنفيذًا مدفوعًا.
- ترتيب حلّ ثابت. الترخيص المنتهي بالكامل لا يحلّ أي قدرة. وتؤجَّل قدرات الحزمة إلى حالة الحزمة النشطة الخاصة بها وانتهائها المستقلّ. وتُحلّ قدرات الإصدار إزاء الإصدار الفعّال المُنفَّذ على التسلسل الصارم Enterprise ⊇ Pro ⊇ Core. ولا يُستشار
LicenseKey::$editionالخام أبدًا للحجب. - مؤقّتان؛ والأشدّ تقييدًا يفوز. يقود مؤقّت الاستحقاق (كلتا القناتين) الحالات Active وGrace والتخفيض إلى Core بعد السماح. ولا ينطبق مؤقّت الحيوية عبر الإنترنت إلا على قناة
ioncubeبوضع اتصالrequired: إذ يجب أن تكون المدّة، إضافةً إلى مهلة حيوية مدّتها 48 ساعة، حيّة. وفي وضع عدم الاتصال بعد انقضاء المدّة، يتوقّف المميَّز مؤقّتًا عند طبقة Core؛ ثم يُعيد فحصٌ لاحق مُتحقَّق منه عبر الإنترنت إرساء المدّة فيستأنف المميَّز. أمّا قناةsigned_source— وأي وضع اتصال غيرrequired— فلا مؤقّت حيوية لها وتبقى قادرة على العمل دون اتصال وفي بيئة معزولة. - مكافحة الإرجاع حتمية. يُقيَّم الإنفاذ إزاء أرضية رتيبة: فالوقت الفعّال هو الأقصى بين ساعة النظام وآخر وقت مُتحقَّق منه، فلا يمنح تغييرُ الساعة إلى الوراء وقتًا إضافيًا. والإرجاع الذي يتجاوز تفاوت الانحراف والسماح المتبقّي يفرض التخفيض إلى Core.
- تتقدّم المدد بالوقت الموثوق فقط. يسجّل الفحص الناجح عبر الإنترنت وقت الخادم المُتحقَّق منه والموقَّع، لا الساعة المحلّية أبدًا، فلا يمكن لقفزة ساعة محلّية إلى الأمام أن تضخّم المدّة.
- للعلامة التجارية سلطة واحدة. قناة التقييم وحدها تُطلِق العلامة المائية. والترخيص المدفوع يحلّ إلى بلا علامة تجارية في كل حالة، بما فيها الحالات المُخفَّضة.
- التجربة طبقة سياسة على المؤقّتات نفسها. يُحدّ معدّل المعالجة (الافتراضي صفحتان في الثانية)، وتُطبَّق علامة التقييم المائية، والانتهاء صارم بلا سماح. ولا يتغيّر سوى السبب المُبلَّغ عنه؛ أمّا القرار والإصدار الفعّال فيتبعان الآلة المدفوعة.
- العقد عبر الإنترنت موقَّع من طرف إلى طرف. يحمل كل طلب رمزًا عشوائيًا للعميل من CSPRNG. وكل استجابة هي JWS مضغوط بـEdDSA من نوع الوسائط
application/nextpdf-status+jwt، يُتحقَّق منه عبر سلسلة x5c إلى جذر مُثبَّت مُدمَج في التصريف، ومربوط بالرمز العشوائي المُرسَل، ومُعرِّف الترخيص المُثبَّت، ونقطة النهاية المُستدعاة. وقد أُحيل نقل الغلاف غير الموقَّع القديم إلى التقاعد؛ ولم يبقَ سوى مسار ثقة واحد بالضبط. وتنتقل تثبيتات SPKI المُهيَّأة في ترويسةX-NextPDF-Pinned-Public-Key، ويجب أن تتضمّن مجموعة التثبيت تثبيتًا احتياطيًا. - لا إنفاذ للمقاعد في وقت التشغيل.
maxSlotsتعاقدي فقط — لا قياس بُعدي ولا اتصال بيتي إلزامي للتشغيل العادي.
الحالات الحدّية وأوضاع الفشل
قسم بعنوان «الحالات الحدّية وأوضاع الفشل»- فحص القدرة على ترخيص منتهٍ بالكامل يختصر إلى «غير متوفّر» قبل تشغيل أي منطق حزمة أو إصدار.
- يمكن أن تنتهي حزمة إضافية بينما الترخيص الأساسي نشط. وعندها يُقرأ الرفض «حزمة منتهية» (
SPEC-LIC-002)، لا «غير مُرخَّص» (SPEC-LIC-001)، ويُدرِج الحِزم النشطة حاليًا. - ملفّ حالة إنفاذ محلّي حاضر لكن يتعذّر قراءته أو تحليله إشارة تلاعب. وتفشل الآلة مغلقةً إلى التخفيض إلى Core مع
EnforcementReason::CorruptState. أمّا الملفّ الغائب لسبب مشروع فليس فاسدًا ويمضي على نحو طبيعي. - إرجاع الساعة إلى ما دون الأرضية الرتيبة بما يتجاوز تفاوت الانحراف (الافتراضي 120 ثانية) والسماح المتبقّي يفرض التخفيض إلى Core على نحو حتمي.
- مدّة حيوية منقضية تُخفِّض ترخيص
ioncubeنشطًا لولا ذلك؛ وانتهاء الاستحقاق يُخفِّض بصرف النظر عن حالة المدّة. evaluate(null)مغلق عند الفشل: وقت التشغيل غير مسموح، وتُطبَّق العلامة المائية، ويذكر التحذير عنوان URL الخاص بالتسعير. والمضيفون الذين يحتاجون سلوك Core غير المرخَّص عليهم إنشاء محرّك Core مباشرةً.- ترخيص التقييم المنتهي بلا سماح وبلا احتياط؛ ووقت التشغيل مقيَّد وتبقى العلامة المائية.
- يعامل
checkRenewal()رمز HTTP 404 بوصفه الجواب المعتاد «لا يوجد متوفّر». وأي رمز آخر غير 200 يرفعLicenseClientException، وdownload_urlالذي يخالف السياسة الصادرة يفشل مغلقًا قبل أن يفلت من الطريقة. - استجابة حالة مزوّرة، أو مُلاعَب بها، أو قديمة، أو خاطئة الرمز العشوائي، أو خاطئة الترخيص لا تُنتج أبدًا
StatusResponse؛ إذ يرمي التحقّقSpectrumAuthenticationException. أمّا حالة موقَّعة لكنهاrevokedأوexpiredأوreleasedفتُتحقَّق وتظهر بوصفها إشارة تخفيض (isLive()خاطئة). - تُرفَض استجابة حالة سُكَّت لتبادل مختلف: إذ يجب أن يطابق
response_typeالمُتحقَّق منه نقطة النهاية المُستدعاة. - يفشل
FeatureGateمغلقًا عند أي خطأ في المُحلِّل: إذ يتدهور الإصدار الفعّال إلىcoreولا تُمنَح أي قدرة مميَّزة. EnforcedEntitlementResolverمغلق عند الفشل من طرف إلى طرف: إذ يُنتج أي استثناء في سلسلته نتيجة «لا ترخيص» (Core) وسجلّ خطأ PSR-3، ولا يمنح أبدًا امتيازًا.
سلوك وضع FIPS
قسم بعنوان «سلوك وضع FIPS»لا تضيف طبقة الترخيص أي سياسة تشفير خاصة بها. وتواقيع الترخيص والحالة هي تحقّقات Ed25519 يجريها مزوّد التشفير في المضيف. وفي بناء مقيَّد بـFIPS، تفشل خوارزمية لا يعتمدها المزوّد عند حدّ التشفير بخطأ صريح؛ ولا يُخفَّض أي شيء بصمت. وهذه مطالبات قدرة بشأن كود NextPDF: فـNextPDF ليس وحدة تشفير مُصدَّقًا عليها، ولا يحمل أي اعتماد، ولا يمنح أيًّا منه.
المطابقة
قسم بعنوان «المطابقة»| المطالبة | المعيار | البند |
|---|---|---|
| ملفّات الترخيص واستجابات الحالة هي JWS بتسلسل مضغوط، يُتحقَّق منها مغلقةً عند الفشل. | RFC 7515 | §3.1 |
| تواقيع الترخيص والحالة هي Ed25519. | RFC 8032 | §5.1 |
| تتحقّق سلسلة x5c في استجابة موقَّعة رجوعًا إلى مرتكز ثقة مُثبَّت مُدمَج في التصريف. | RFC 5280 | §6.1 |
| يجب أن تتضمّن مجموعة تثبيت SPKI مُهيَّأة تثبيتًا احتياطيًا لمفتاح لم يُنشَر بعد. | RFC 7469 | §4.3 |
المطالبات المُتحقَّق منها (iss وaud وexp وnbf وiat) هي أسماء مطالبات مُسجَّلة. | RFC 7519 | §4.1 |
كل البنود مُعاد صياغتها؛ ولا يُعاد إنتاج أي نصّ معياري. NextPDF لا يقدّم أي ادّعاء اعتماد. والدعم لا يساوي المطابقة، والمطابقة لا تساوي الاعتماد. وتوائم الوحدة سلوكها مع البنود المُستشهَد بها بوصفه قدرة؛ وقبول غلاف ترخيص أو حالة يقرّره مُتحقِّق الجذر المُثبَّت الخاص بـNextPDF، لا سلطة خارجية.
ملاحظات التطوير
قسم بعنوان «ملاحظات التطوير»- أنشِئ
LicenseClientبنقل يفرض السياسة (قانونيًاSecurityAwareHttpClient). ويُرفَض عميل PSR-18 خام عند الإنشاء كي لا تُرسَل حركة الترخيص أبدًا دون ضوابط مكافحة SSRF، وعدم إعادة التوجيه، وسقف البايتات، والمُهَل. - يجب أن يفكّ الرمز العشوائي للعميل الذي يقدّمه المستدعِي إلى 16 بايت على الأقل من العشوائية. ويؤسّس المصدر هذا الحدّ على RFC 8555 §6.5؛ وهذا البند خارج المتن المُستشهَد به، فالحدّ مذكور هنا من مصدر المنتج فقط.
- احجُب الميزات عبر
FeatureGate؛ ولا تتفرّع أبدًا علىLicenseKey::$editionالخام. فالبوّابة لا تستشير سوى الإصدار الفعّال المُنفَّذ وتفشل مغلقةً إلىcore. - لا تُبدِّل على
EntitlementStatus::PerpetualFallbackالمُهمَلة في كود جديد. بل اختبرisDowngradedToCore()أو طابِقDowngradedToCoreبدلًا منها. - عامِل رفض القدرة حمولة معالجة. وأظهِر للمستدعِي سياقها المُهيكَل وعنوان URL الترقية بدلًا من اختزالها إلى خطأ عام.
- تتعلّق هذه الوحدة بوظيفة تشفير؛ فعامِلها بوصفها حسّاسة أمنيًا في مراجعتك الخاصة. وتحكم شروطَ السعة والمقاعد اتفاقيةُ الترخيص، لا الإنفاذ في وقت التشغيل. وهذا المرجع ليس رأيًا قانونيًا؛ استشر مستشاري الامتثال والقانون لديك.
حدود النشر
قسم بعنوان «حدود النشر»توثّق هذه الصفحة السلوك القابل للملاحظة خارجيًا وسطح واجهة برمجة التطبيقات العامة المدعوم فقط. أمّا مسارات نطاقات الأسماء الداخلية، وأصناف المساعدة، وجداول الآلية، وأسماء ملفّات أدلّة التشغيل، وبادئات التذاكر فخارج النطاق.
انظر أيضًا
قسم بعنوان «انظر أيضًا»- Licensing — NextPDF Enterprise — صفحة القدرة مع إرشاد الإعداد والدمج.
- Billing — مرجع متعمّق — طبقات الخطط، وسياسات التجاوز، والترحيل.
- SaaS — مرجع متعمّق — سطح الخدمة متعدّد المستأجرين الذي تحرسه خريطة المسار.
- Branding — مرجع متعمّق — استراتيجيات العلامة التجارية التي يحلّها المُقيِّم.