Przejdź do głównej zawartości
getnextpdf.com

Enterprise edycja

Licencjonowanie — szczegółowa referencja

Ta strona jest szczegółową referencją powierzchni licencjonowania NextPDF Enterprise — modułu, który rozwiązuje każdą inną możliwość Enterprise. Obejmuje model stanów uprawnień (EntitlementEvaluator, EntitlementStatus, EntitlementResult), egzekwowane bramkowanie możliwości (FeatureGate, CapabilityCode, CapabilityRegistry), dwuzegarową maszynę egzekwowania kanału (ChannelEnforcementPolicy, OnlineCheckScheduler) oraz podpisanego klienta online (LicenseClient). Zwykła ewaluacja uprawnień nie wymaga sieci. Klient online istnieje dla jawnych operacji activate, heartbeat, deactivate, verify-online oraz renewal-probe. Szczegóły mechanizmów wewnętrznych pozostają w wewnętrznej dokumentacji repozytorium źródłowego i są poza zakresem tego podręcznika.

Ta możliwość jest dostarczana w NextPDF Enterprise (nextpdf/enterprise) i aktywuje się wraz z kopertą licencyjną poziomu Enterprise. Wdrożenie bez tego uprawnienia nie ładuje klas tej możliwości. Porównaj edycje i uzyskaj licencję.

Licencjonowanie to podstawowa powierzchnia Enterprise. Jest zawsze obecna po zainstalowaniu pakietu Enterprise obok pakietu Core, ponieważ to ona rozwiązuje wszystko inne. NextPDF Pro nie ma osobnej powierzchni uprawnień; model stanów, maszyna egzekwowania oraz klient online są dostarczane wyłącznie w nextpdf/enterprise. NextPDF Core (Apache-2.0) nie ma w ogóle modelu uprawnień — host, który potrzebuje nielicencjonowanego zachowania Apache-2.0, używa silnika Core bezpośrednio, a nie potoku Enterprise.

Wszystkie typy znajdują się w NextPDF\Enterprise\Licensing. Maszyna egzekwowania mieści się w podprzestrzeni nazw Channel, kompozycja środowiska uruchomieniowego w Runtime, a typy podpisanego statusu w Online.

SymbolParametryDomyślne zachowanieZwracaZgłasza lub kończy się błędemUwagi
EntitlementEvaluator::evaluate()?LicenseKey $license, ?DateTimeImmutable $now = nullMapuje zweryfikowaną licencję (lub null) na pełną decyzję o uprawnieniachEntitlementResultBrakLicencja null daje fail-closed wynik braku licencji
EntitlementEvaluator::evaluateEnforced()?LicenseKey $license, EnforcementOutcome $outcomeKonwertuje wcześniej obliczony wynik egzekwowania na wynik uprawnieńEntitlementResultBrakEfektywna edycja pochodzi z wyniku; każda degradacja egzekwowania kończy się na Core
EntitlementEvaluator::resolveBrandingMode(), ::resolveBrandingStrategy()?LicenseKey $license, ?DateTimeImmutable $now = nullRozwiązuje decyzję o brandingu dla generowanego wynikuBrandingMode / BrandingStrategyBrakJedyny organ brandingu; tylko kanał ewaluacji nakłada znak wodny
EntitlementResultObiekt wartości tylko do odczytuNiesie status, edycję, kanał, tryb brandingu, flagi środowiska uruchomieniowego/aktualizacji/wsparcia oraz opcjonalne ostrzeżenieBrakPomocnicze: isFullyActive(), isExpired(), isDowngradedToCore(), shouldApplyEvaluationBranding()
EntitlementStatusEnum oparty na łańcuchu znakówActive, GracePeriod, DowngradedToCore, EvaluationExpired, NoLicenseBrakPerpetualFallback jest zachowany, ale przestarzały; utrzymany tylko po to, by odbiorcy sprzed 6.0 nadal się kompilowali
FeatureGate::hasCapability()CapabilityCode $capabilitySprawdza możliwość względem egzekwowanej efektywnej edycji oraz stanu pakietuboolBrakFail-closed do core przy dowolnym błędzie resolvera
FeatureGate::requireCapability()CapabilityCode $capabilityPrzechodzi po cichu albo zgłasza z ustrukturyzowanym kontekstem upsellvoidSpectrumAuthenticationException SPEC-LIC-001 (nie objęte licencją) lub SPEC-LIC-002 (pakiet wygasł)Kontekst niesie required_capability, required_pack, current_packs, upgrade_info_url
FeatureGate::isFeatureEnabled(), ::requireFeature()string $featureStarsza kontrola identyfikatora funkcjibool / voidSpectrumAuthenticationException SPEC-AUTH-007 (ścieżka require)Zgodność ze starszym kodem; preferuj kontrole możliwości
Akcesory FeatureGateBrakIntrospekcja licencjiZależnieBrakcurrentEdition(), isLicenseValid(), isInGracePeriod(), getActivePacks(), trialPolicy()
CapabilityCodeEnum oparty na łańcuchu znakówKanoniczne identyfikatory możliwości (core.*, pro.*, enterprise.*, pack.*)BrakisPack(), packName(), minimumEdition(), forEdition()
CapabilityRegistryLicenseKey, wzorce trasRozwiązywanie trasy na możliwość oraz wyszukiwanie pakietu przed rozdzieleniemZależnieBrakregisterDefaultRoutes() obejmuje udokumentowane trasy usługi
LicenseKeyObiekt wartości tylko do odczytuSparsowane, zweryfikowane roszczenia licencjiBrakisExpired(), isInGracePeriod(), isFullyExpired(), hasFeature(), hasCapability(), activePackNames(); maxSlots jest wyłącznie umowne
LicenseValidator::buildVerifiedLicenseKey()array $dataBuduje typowany LicenseKey z już zweryfikowanego ładunkuLicenseKeySpectrumAuthenticationException SPEC-AUTH-001 przy naruszeniu schematuObsługuje ładunki schema 2.0, 1.0 oraz starsze
PackDefinition / PackRegistryObiekty wartości tylko do odczytuStan pakietu dodatków z niezależnym wygaśnięciem oraz karencjąZależnieBrakisActive(), isFullyExpired(), activePacks(), activeCapabilities()
TrialPolicybool $enabled, int $maxPagesPerSecond = 2, pola znaku wodnegoPolityka pułapu przepustowości trybu próbnegoBrakfromLicenseKey(), disabled(), isThrottled(); organ brandingu pozostaje przy ewaluatorze
ChannelEnforcementPolicy::enforce()LicenseKey $license, LocalState $state, int $systemNow, bool $revoked = falseUruchamia maszynę dwuzegarową oraz ponowne etykietowanie unieważnienia i trybu próbnegoEnforcementOutcomeBrakUnieważnienie nadpisuje każdy zegar oraz stan trybu próbnego
OnlineCheckScheduler::evaluate(), ::recordSuccessfulOnlineCheck()Licencja, stan lokalny, znaczniki czasuEwaluacja dwuzegarowa; odnowienie dzierżawy z zweryfikowanego czasu serweraEnforcementOutcome / LocalStateBrakONLINE_GRACE_SECONDS przyznaje 48 godzin karencji aktywności po dzierżawie
EnforcementDecision / EnforcementReason / EnforcementOutcomeEnumy + obiekt wartości tylko do odczytuActive, Grace, DowngradedToCore oraz dokładny powódBrakKażdy powód mapuje się deterministycznie na jedną decyzję
Runtime\EntitlementResolver::currentEntitlement()BrakInterfejs: egzekwowane uprawnienie, które obsługuje środowisko uruchomienioweEntitlementResultZależne od implementacjiEnforcedEntitlementResolver komponuje pamięć podręczną, stan, politykę oraz ewaluator, fail-closed do Core
LicenseStateCache::get(), ::getOrThrow()bool $forceRefresh = falsePamięć podręczna zweryfikowanej licencji wspierająca bramkę?LicenseKeygetOrThrow(): SpectrumAuthenticationException SPEC-AUTH-008; LicenseConfigurationException przy nieprawidłowym powiązaniuinvalidate(), isCacheValid()
LicenseClient::activate(), ::heartbeat(), ::deactivate(), ::verifyOnline()string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = nullJedna wymiana podpisanego statusu; odpowiedź jest weryfikowana względem przypiętego korzenia i związana z wysłanym nonceStatusResponseLicenseClientException (transport, nie-200, błędny podany nonce); SpectrumAuthenticationException (sfałszowana, zmanipulowana, nieaktualna, błędny-nonce, błędna-licencja, błędny-typ odpowiedzi)Wysyłany jest wyłącznie solony hash odcisku palca, nigdy surowy odcisk palca
LicenseClient::checkRenewal()string $licenseId, string $customerIdSonda dostępności odnowienia; 404 to normalna odpowiedź „brak dostępnych”Tablica odnowienia (available, download_url, expires_at)LicenseClientException (nieosiągalny, nie-200/404 lub download_url odrzucony przez politykę)URL z niepodpisanego ciała jest sprawdzany pod kątem SSRF, zanim zdoła się wydostać
LicenseClient::__construct()Zobacz blok sygnaturyWaliduje transport, schemat URL oraz zestaw przypięć podczas konstrukcjiLicenseConfigurationException (transport nieegzekwujący polityki, niedozwolony schemat, zwykły HTTP bez przypięć, zniekształcony zestaw przypięć)getPinSet() udostępnia aktywny zestaw przypięć dla narzędzi rotacji
Online\StatusResponseObiekt wartości tylko do odczytuZweryfikowany podpisany statusBrakisLive() jest false przy revoked / expired / released; niesie leaseExpiresAt, liczby stanowisk oraz migawkę uprawnień
LicenseChannelMode / OnlineMode / OnlinePolicyEnumy + obiekt wartości tylko do odczytuRoszczenia kanału oraz polityki onlineBraksigned_source kontra ioncube; tryb online required / optional / disabled z intervalDays oraz leaseDays
LicenseEditionEnum oparty na łańcuchu znakówCore, Pro, EnterpriseBraksatisfies() implementuje hierarchię poziomów
public function __construct(private ?EvaluationBrandingConfig $evaluationBrandingConfig = null)
public function evaluate(?LicenseKey $license, ?DateTimeImmutable $now = null): EntitlementResult
public function evaluateEnforced(?LicenseKey $license, EnforcementOutcome $outcome): EntitlementResult
public function resolveBrandingMode(?LicenseKey $license, ?DateTimeImmutable $now = null): BrandingMode
public function resolveBrandingStrategy(?LicenseKey $license, ?DateTimeImmutable $now = null): BrandingStrategy
public function __construct(private readonly LicenseStateCache $licenseCache, private readonly EntitlementResolver $entitlementResolver, private readonly string $upgradeInfoUrl = self::DEFAULT_UPGRADE_URL)
public function isFeatureEnabled(string $feature): bool
public function requireFeature(string $feature): void
public function currentEdition(): ?string
public function isLicenseValid(): bool
public function isInGracePeriod(): bool
public function hasCapability(CapabilityCode $capability): bool
public function requireCapability(CapabilityCode $capability): void
public function getActivePacks(): array
public function trialPolicy(): TrialPolicy
public 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): StatusResponse
public function heartbeat(string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = null): StatusResponse
public function deactivate(string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = null): StatusResponse
public function verifyOnline(string $licenseJws, string $deploymentId, ?string $machineFingerprintHash = null, ?string $expectedLicenseId = null, ?string $clientNonce = null): StatusResponse
public function getPinSet(): ?PinSet
public function checkRenewal(string $licenseId, string $customerId): array

Ewaluacja uprawnień wytwarza jeden z pięciu bieżących stanów, każdy z ustaloną konsekwencją w czasie wykonywania:

StatusŚrodowisko uruchomienioweEfektywne możliwościAktualizacje / wsparcieBranding
Activedozwoloneuprawniona edycja + aktywne pakietytak (płatna); nie (ewaluacja)brak (płatna); znak wodny (ewaluacja)
GracePerioddozwoloneuprawniona edycja + aktywne pakietytakbrak (płatna)
DowngradedToCoredozwolonetylko Coreniebrak (płatna); znak wodny (próbna)
EvaluationExpiredograniczonebraknieznak wodny
NoLicensewyłączone (fail-closed)braknieznak wodny
  • Wygaśnięcie płatnej licencji nigdy nie wyłącza zainstalowanego środowiska uruchomieniowego. runtimeAllowed pozostaje true dla każdego płatnego stanu. Po oknie karencji efektywna edycja degraduje się do Core: możliwości Core działają bezterminowo, wszystkie możliwości Pro/Enterprise/pakietów są bramkowane, a aktualizacje i wsparcie są odebrane. Przestarzały przypadek EntitlementStatus::PerpetualFallback nazywa politykę wygaśnięcia sprzed 6.0 i istnieje wyłącznie dla zgodności kompilacji.
  • Nie każdy stan kończy się wykonaniem na poziomie Core. Karencja utrzymuje pełną uprawnioną edycję z datowanym ostrzeżeniem o odnowieniu. Wygaśnięcie ewaluacji ogranicza środowisko uruchomieniowe i utrzymuje znak wodny. Stan braku licencji wyłącza ścieżki Enterprise fail-closed i widocznie oznacza znakiem wodnym każdy starszy wynik, więc nigdy nie może uchodzić za płatne wykonanie.
  • Ustalona kolejność rozwiązywania. Całkowicie wygasła licencja nie rozwiązuje żadnej możliwości. Możliwości pakietów zależą od własnego aktywnego stanu pakietu oraz jego niezależnego wygaśnięcia. Możliwości edycji rozwiązują się względem egzekwowanej efektywnej edycji w ścisłej hierarchii Enterprise ⊇ Pro ⊇ Core. Surowe LicenseKey::$edition nigdy nie jest konsultowane przy bramkowaniu.
  • Dwa zegary; wygrywa najbardziej restrykcyjny. Zegar uprawnień (oba kanały) steruje stanami Active, Grace oraz degradacją do Core po karencji. Zegar aktywności online dotyczy wyłącznie kanału ioncube z trybem online required: dzierżawa plus 48-godzinna karencja aktywności musi być aktywna. Offline po wygaśnięciu dzierżawy premium wstrzymuje się na poziomie Core; późniejsza zweryfikowana kontrola online ponownie ustanawia dzierżawę i premium wznawia działanie. Kanał signed_source — oraz dowolny tryb online inny niż required — nie ma zegara aktywności i pozostaje zdolny do pracy offline i w izolacji sieciowej (air-gap).
  • Ochrona przed cofnięciem zegara jest deterministyczna. Egzekwowanie ocenia względem monotonicznej podłogi: czasem efektywnym jest maksimum z zegara systemowego oraz ostatniego zweryfikowanego czasu, więc cofnięcie zegara nie przyznaje dodatkowego czasu. Cofnięcie przekraczające tolerancję odchylenia oraz pozostałą karencję wymusza degradację do Core.
  • Dzierżawy postępują wyłącznie na zaufanym czasie. Udana kontrola online zapisuje zweryfikowany, podpisany czas serwera, nigdy zegar lokalny, więc lokalny skok zegara do przodu nie może zawyżyć dzierżawy.
  • Branding ma jeden organ. Tylko kanał ewaluacji wyzwala znak wodny. Płatna licencja rozwiązuje się do braku brandingu w każdym stanie, w tym w stanach zdegradowanych.
  • Tryb próbny to warstwa polityki na tych samych zegarach. Przepustowość jest ograniczona (domyślnie 2 strony na sekundę), stosuje się znak wodny ewaluacji, a wygaśnięcie jest ścisłe, bez karencji. Zmienia się tylko zgłaszany powód; decyzja oraz efektywna edycja podążają za maszyną płatną.
  • Kontrakt online jest podpisany od początku do końca. Każde żądanie niesie nonce klienta z CSPRNG. Każda odpowiedź to kompaktowy JWS EdDSA typu media application/nextpdf-status+jwt, weryfikowany przez łańcuch x5c do wkompilowanego przypiętego korzenia i związany z wysłanym nonce, zainstalowanym id licencji oraz wywołanym punktem końcowym. Starszy transport niepodpisanej koperty został wycofany; pozostaje dokładnie jedna ścieżka zaufania. Skonfigurowane przypięcia SPKI podróżują jako nagłówek X-NextPDF-Pinned-Public-Key, a zestaw przypięć musi zawierać przypięcie zapasowe.
  • Brak egzekwowania stanowisk w czasie wykonywania. maxSlots jest wyłącznie umowne — brak telemetrii i brak obowiązkowego meldowania (phone-home) dla zwykłego działania.
  • Kontrola możliwości na całkowicie wygasłej licencji zwiera się do „niedostępne” przed uruchomieniem jakiejkolwiek logiki pakietu lub edycji.
  • Pakiet dodatków może wygasnąć, gdy licencja bazowa jest aktywna. Odmowa brzmi wtedy pakiet wygasł (SPEC-LIC-002), a nie nie objęte licencją (SPEC-LIC-001), i wymienia aktualnie aktywne pakiety.
  • Plik stanu egzekwowania lokalnego, który jest obecny, lecz nieczytelny lub nieparsowalny, jest sygnałem manipulacji. Maszyna kończy fail-closed degradacją do Core z EnforcementReason::CorruptState. Prawidłowo nieobecny plik nie jest uszkodzony i przebiega normalnie.
  • Cofnięcie zegara poniżej monotonicznej podłogi, które przekracza tolerancję odchylenia (domyślnie 120 sekund) oraz pozostałą karencję, wymusza degradację do Core deterministycznie.
  • Wygasła dzierżawa aktywności degraduje w innym razie aktywną licencję ioncube; wygaśnięcie uprawnienia degraduje niezależnie od stanu dzierżawy.
  • evaluate(null) jest fail-closed: środowisko uruchomieniowe jest zabronione, stosuje się znak wodny, a ostrzeżenie nazywa URL cennika. Hosty potrzebujące nielicencjonowanego zachowania Core muszą skonstruować silnik Core bezpośrednio.
  • Wygasła licencja ewaluacyjna nie ma karencji ani rozwiązania awaryjnego; środowisko uruchomieniowe jest ograniczone, a znak wodny pozostaje.
  • checkRenewal() traktuje HTTP 404 jako normalną odpowiedź „brak dostępnych”. Każde inne nie-200 zgłasza LicenseClientException, a download_url naruszający politykę wychodzącą kończy fail-closed, zanim zdoła wydostać się z metody.
  • Sfałszowana, zmanipulowana, nieaktualna, o błędnym nonce lub błędnej licencji odpowiedź statusu nigdy nie daje StatusResponse; weryfikacja zgłasza SpectrumAuthenticationException. Podpisany, lecz revoked, expired albo released status weryfikuje się i ujawnia jako sygnał degradacji (isLive() jest false).
  • Odpowiedź statusu wybita dla innej wymiany jest odrzucana: zweryfikowany response_type musi odpowiadać wywołanemu punktowi końcowemu.
  • FeatureGate kończy fail-closed przy dowolnym błędzie resolvera: efektywna edycja degraduje się do core i nie jest przyznawana żadna możliwość premium.
  • EnforcedEntitlementResolver jest fail-closed od początku do końca: dowolny wyjątek w jego łańcuchu daje wynik braku licencji (Core) oraz log błędu PSR-3, nigdy przyznania premium.

Warstwa licencjonowania nie dodaje własnej polityki kryptograficznej. Podpisy licencji oraz statusu to weryfikacje Ed25519 wykonywane przez dostawcę kryptografii hosta. W kompilacji ograniczonej do FIPS algorytm, którego dostawca nie zatwierdza, kończy na granicy kryptograficznej z jawnym błędem; nic nie degraduje się po cichu. Są to twierdzenia o możliwościach kodu NextPDF: NextPDF nie jest walidowanym modułem kryptograficznym, nie posiada certyfikacji i żadnej nie przyznaje.

TwierdzenieStandardKlauzula
Pliki licencji oraz odpowiedzi statusu to JWS kompaktowej serializacji, weryfikowane fail-closed.RFC 7515§3.1
Podpisy licencji oraz statusu to Ed25519.RFC 8032§5.1
Łańcuch x5c w podpisanej odpowiedzi waliduje się wstecz do wkompilowanej przypiętej kotwicy zaufania.RFC 5280§6.1
Skonfigurowany zestaw przypięć SPKI musi zawierać przypięcie zapasowe dla jeszcze niewdrożonego klucza.RFC 7469§4.3
Zweryfikowane roszczenia (iss, aud, exp, nbf, iat) to zarejestrowane nazwy roszczeń.RFC 7519§4.1

Wszystkie klauzule są sparafrazowane; nie odtworzono żadnego tekstu normatywnego. NextPDF nie zgłasza żadnego roszczenia o certyfikacji. Wsparcie nie równa się zgodności, a zgodność nie równa się certyfikacji. Moduł dostosowuje swoje zachowanie do cytowanych klauzul jako możliwość; akceptacja koperty licencji lub statusu jest rozstrzygana przez własny weryfikator NextPDF oparty na przypiętym korzeniu, a nie przez zewnętrzny organ.

  • Konstruuj LicenseClient z transportem egzekwującym politykę (kanonicznie SecurityAwareHttpClient). Surowy klient PSR-18 jest odrzucany podczas konstrukcji, tak by ruch licencyjny nigdy nie mógł zostać wysłany bez kontroli anty-SSRF, braku przekierowań, limitu bajtów oraz limitu czasu.
  • Podany przez wywołującego nonce klienta musi dekodować się do co najmniej 16 bajtów entropii. Źródło opiera tę granicę na RFC 8555 §6.5; ta klauzula jest poza cytowanym korpusem, więc granica jest tu podana wyłącznie na podstawie kodu źródłowego produktu.
  • Bramkuj funkcje przez FeatureGate; nigdy nie rozgałęziaj się na surowe LicenseKey::$edition. Bramka konsultuje wyłącznie egzekwowaną efektywną edycję i kończy fail-closed do core.
  • Nie przełączaj się na przestarzały EntitlementStatus::PerpetualFallback w nowym kodzie. Zamiast tego testuj isDowngradedToCore() lub dopasuj DowngradedToCore.
  • Traktuj odmowę możliwości jako ładunek naprawczy. Uwidocznij jej ustrukturyzowany kontekst oraz URL aktualizacji wywołującemu, zamiast sprowadzać go do ogólnego błędu.
  • Ten moduł dotyczy funkcjonalności kryptograficznej; traktuj go jako wrażliwy pod względem bezpieczeństwa we własnym przeglądzie. Warunki pojemności oraz stanowisk są regulowane umową licencyjną, a nie egzekwowaniem w czasie wykonywania. Niniejsza referencja nie jest opinią prawną; skonsultuj się z własnymi doradcami ds. zgodności i prawnymi.

Ta strona dokumentuje wyłącznie zewnętrznie obserwowalne zachowanie oraz obsługiwaną publiczną powierzchnię API. Wewnętrzne ścieżki przestrzeni nazw, klasy pomocnicze, tabele mechanizmów, nazwy plików runbooków oraz prefiksy zgłoszeń są poza zakresem.