تخطَّ إلى المحتوى
getnextpdf.com

Enterprise الإصدار

‏⁨Evidence⁩ — مرجع متعمّق

هذه الصفحة هي المرجع المتعمّق لوحدة ‏NextPDF\Enterprise\Evidence. تختم الوحدة نتائج التحقّق في ‏EvidencePackage غير قابل للتغيير، وتُصدِّره بصيغة ⁨JSON⁩ حتمية بملخّص ⁨SHA-256⁩ مستقرّ، وتُديمه عبر عقد مخزن قابل للتوصيل، وتتتبّع التراجعات بين التشغيلات باستخدام ‏ContinuousMonitor. تستهلك الوحدة النتائج التي يُنتجها سطحا ⁨Validation⁩ و⁨Compliance⁩؛ وهي لا تُجري أي فحوص مطابقة بنفسها. للحصول على إرشادات سير العمل، اقرأ أولًا صفحة قدرة ⁨Evidence⁩.

تُشحَن هذه القدرة في ‏⁨NextPDF Enterprise⁩ (‏nextpdf/enterprise) وتُفعَّل بمغلّف ترخيص من طبقة ⁨Enterprise⁩. والنشر الذي يفتقر إلى ذلك الاستحقاق لا يُحمِّل أصناف القدرة. قارن الإصدارات واحصل على ترخيص.

يُرخَّص هذا السطح بقدرة ‏enterprise.compliance.evidence؛ والاستحقاق المرفوض يرفض الميزة. يُنتج ⁨Core⁩ و⁨Pro⁩ نتائج وتقارير؛ أمّا ختم النتائج في حزمة غير قابلة للتغيير وحتمية وموسومة زمنيًا اختياريًا مع تتبّع التراجعات فلا مكافئ له في طبقة ⁨Core⁩ ولا طبقة ⁨Pro⁩.

سطح واجهة برمجة التطبيقات العامة

قسم بعنوان «سطح واجهة برمجة التطبيقات العامة»
Terminal window
composer require nextpdf/enterprise:^3
الرمزالمعاملاتالسلوك الافتراضيالقيمة المُرجَعةيرمي أو يفشل بـملاحظات
EvidencePortal::__constructEvidenceStoreInterface $store، EvidenceExporter $exporterيربط المخزن والمُصدِّرEvidencePortalلا شيء معلنكلا المتعاونَين قابل للحقن
EvidencePortal::generateEvidencestring $documentHash، list<EvidenceRecord> $records، ?string $tsaTimestamp = nullيعدّ النجاح/الفشل، ويختم حزمة بمُعرِّف ⁨UUID⁩ جديد وطابع generatedAt من ساعة الحائط، ويُديمهاEvidencePackageلا شيء معلنيُديم عبر store()، لا persistImmutable()
EvidencePortal::getEvidencestring $documentHashأحدث حزمة مُخزَّنة لهذا التجزئة?EvidencePackageلا شيء معلنتكون null عند عدم تخزين أي حزمة
EvidencePortal::getHistorystring $documentHashالتاريخ الكامل، الأحدث أولًاlist<EvidencePackage>لا شيء معلنالترتيب يوفّره المخزن
EvidencePortal::exportAsJsonEvidencePackage $packageيفوّض إلى المُصدِّرnon-empty-stringJsonExceptionالبايتات نفسها التي يُنتجها EvidenceExporter::toJson
EvidencePackage::__constructثمانية معاملات مُسمّاة، انظر المقطع البرمجيكائن قيمة غير قابل للتغييرEvidencePackageلا شيء معلنالأعداد لا يُتحقَّق منها مقابل $records
EvidencePackage::allPassedلا شيءfailedCount === 0boolلا شيء معلنتكون true لحزمة فارغة؛ فبوابة القرار على totalFindings
EvidencePackage::passRateلا شيءpassedCount / totalFindingsfloatلا شيء معلنتكون 0.0 عندما يكون totalFindings === 0
EvidenceRecord::__constructstring $policyName، bool $passed، string $details، string $validatorVersion، DateTimeImmutable $timestampنتيجة فحص سياسة واحدة غير قابلة للتغييرEvidenceRecordلا شيء معلنكل الخصائص public readonly
EvidenceExporter::toJsonEvidencePackage $package‏⁨JSON⁩ بترتيب مفاتيح ثابت؛ شرطات و⁨Unicode⁩ غير مهروبةnon-empty-stringJsonExceptionترتيب المفاتيح جوهري (حَمّال للمعنى)
EvidenceExporter::exportHashEvidencePackage $package‏⁨SHA-256⁩ على بايتات toJson()non-empty-string (⁨64 hex⁩)JsonExceptionمستقرّ لكل حزمة
EvidenceStoreInterface::storeEvidencePackage $packageيُلحِق؛ ويُسمح بتاريخ لكل تجزئة مستندvoidمُعرَّف حسب التنفيذدلالات الإلحاق فقط مطلوبة
EvidenceStoreInterface::persistImmutableEvidencePackage $packageكتابة ⁨WORM⁩ حيث تدعمها الخلفيةvoidمُعرَّف حسب التنفيذالخلفيات غير الداعمة لـ ⁨WORM⁩ تتصرّف مثل store()
EvidenceStoreInterface::findByDocumentHashstring $documentHashأحدث حزمة لهذا التجزئة?EvidencePackageمُعرَّف حسب التنفيذ
EvidenceStoreInterface::findAllByDocumentHashstring $documentHashكل الحزم لهذا التجزئة، الأحدث أولًاlist<EvidencePackage>مُعرَّف حسب التنفيذ
EvidenceStoreInterface::countلا شيءالعدد الكلي للحزم المُخزَّنةint<0, max>مُعرَّف حسب التنفيذ
InMemoryEvidenceStoreصنفمخزن مدعوم بمصفوفة للاختبارات والتطويرلا ينطبقلا ينطبقغير دائم؛ بلا دلالات ⁨WORM⁩
ContinuousMonitor::__constructEvidenceStoreInterface $storeيربط المخزنContinuousMonitorلا شيء معلن
ContinuousMonitor::checkEvidencePackage $currentEvidence، string $documentHashيقارن أسماء السياسات الفاشلة بأحدث حزمة مُخزَّنةMonitorResultلا شيء معلنالفحص الأول يعامل كل فشل حالي كأنه جديد
ContinuousMonitor::isDuestring $documentHash، MonitorSchedule $scheduleمُستحَقّ عند غياب أدلّة سابقة، أو انقضاء الفترة، أو كون الأدلّة المُخزَّنة مؤرَّخة في المستقبلboolلا شيء معلنآمن عند الفشل تجاه انحراف الساعة
MonitorResult::__constructثمانية معاملات مُسمّاة، انظر المقطع البرمجينتيجة فرق غير قابلة للتغييرMonitorResultلا شيء معلنيتضمّن الحزمتين وcheckedAt
MonitorSchedule::__constructMonitorFrequency $frequency، int $retentionDays = 90، bool $alertOnNewIssues = trueكائن قيمة للإعدادMonitorScheduleلا شيء معلنالاحتفاظ والتنبيه يفرضهما المضيف
MonitorFrequencyتعداد مدعوم بسلسلةالحالات Daily وWeekly وMonthlyلا ينطبقلا ينطبقالقيم الداعمة daily وweekly وmonthly
MonitorFrequency::intervalSecondsلا شيءالفترة لكل حالة: ⁨86400⁩ و⁨604800⁩ و⁨2592000⁩positive-intلا شيء معلنقيمة Monthly هي ⁨30⁩ يومًا ثابتة
final class EvidencePortal
{
public function __construct(
private readonly EvidenceStoreInterface $store,
private readonly EvidenceExporter $exporter,
)
public function generateEvidence(string $documentHash, array $records, ?string $tsaTimestamp = null): EvidencePackage
public function getEvidence(string $documentHash): ?EvidencePackage
public function getHistory(string $documentHash): array
public function exportAsJson(EvidencePackage $package): string
}
final readonly class EvidencePackage
{
public function __construct(
public string $packageId,
public string $documentHash,
public array $records,
public int $totalFindings,
public int $passedCount,
public int $failedCount,
public DateTimeImmutable $generatedAt,
public ?string $tsaTimestamp = null,
)
public function allPassed(): bool
public function passRate(): float
}
final readonly class EvidenceRecord
{
public function __construct(
public string $policyName,
public bool $passed,
public string $details,
public string $validatorVersion,
public DateTimeImmutable $timestamp,
)
}
final readonly class EvidenceExporter
{
public function toJson(EvidencePackage $package): string
public function exportHash(EvidencePackage $package): string
}
interface EvidenceStoreInterface
{
public function store(EvidencePackage $package): void;
public function persistImmutable(EvidencePackage $package): void;
public function findByDocumentHash(string $documentHash): ?EvidencePackage;
public function findAllByDocumentHash(string $documentHash): array;
public function count(): int;
}
final class ContinuousMonitor
{
public function __construct(
private readonly EvidenceStoreInterface $store,
)
public function check(EvidencePackage $currentEvidence, string $documentHash): MonitorResult
public function isDue(string $documentHash, MonitorSchedule $schedule): bool
}
final readonly class MonitorSchedule
{
public function __construct(
public MonitorFrequency $frequency,
public int $retentionDays = 90,
public bool $alertOnNewIssues = true,
)
}
enum MonitorFrequency: string
{
case Daily = 'daily';
case Weekly = 'weekly';
case Monthly = 'monthly';
public function intervalSeconds(): int
}

EvidencePortal::generateEvidence(string $documentHash, list<EvidenceRecord> $records, ?string $tsaTimestamp = null): EvidencePackage هو نقطة دخول الختم. القواعد القابلة للملاحظة خارجيًا:

  1. التجميع. يعدّ generateEvidence السجلّات الناجحة والفاشلة ويضبط totalFindings على مجموعهما. ويُسنِد مُعرِّف packageId من نوع ⁨UUID⁩ إصدار ⁨4⁩ جديدًا، ويختم generatedAt بساعة الحائط، ويُديم الحزمة عبر EvidenceStoreInterface::store، ويُرجِعها. وتُضمَّن قائمة السجلّات بالترتيب المُعطى، دون تعديل.
  2. عدم القابلية للتغيير.EvidencePackage هو final readonly ولا يُغيَّر أبدًا بعد الإنشاء؛ وهو مناسب لتخزين ⁨WORM⁩. ويكون allPassed() مساويًا لـ failedCount === 0. ويكون passRate() مساويًا لـ passedCount / totalFindings، ويساوي 0.0 عندما يكون totalFindings === 0.
  3. التصدير الحتمي. يُصدِر EvidenceExporter::toJson المغلّف وكل سجلّ بترتيب مفاتيح ثابت مكتوب يدويًا؛ ويتبع تسلسلُ السجلّات الحزمةَ. والترميز صارم ويرمي عند الفشل، مع ترك الشرطات و⁨Unicode⁩ غير مهروبة (JSON_UNESCAPED_SLASHES). وتُسَلسَل الطوابع الزمنية بصيغة DateTimeInterface::RFC3339_EXTENDED، وهي صيغة ⁨RFC 3339⁩ الممتدّة بأجزاء الثانية. ويُرجِع exportHash ملخّص ⁨SHA-256⁩ بالنظام الست عشري المكوّن من ⁨64⁩ حرفًا على تلك البايتات بالضبط. والحزمة نفسها تُنتج دائمًا الملخّص نفسه، على أي مضيف، وفي أي وقت. وإعادة توليد الأدلّة للمستند نفسه تُنتج packageId وgeneratedAt جديدين، ومن ثمّ ملخّصًا جديدًا: الحتمية لكل حزمة، لا لكل مستند.
  4. الطابع الزمني دليل على الوقت، لا حكم. قد تحمل الحزمة رمز ⁨RFC 3161⁩ اختياريًا يوفّره المستدعِي (بترميز ⁨base64⁩). ويربط الرمز مرجع الحزمة بقيمة وقت. وتُضمِّنه الوحدة كسلسلة معتمة؛ وهي لا تجلب الرموز ولا تحلّلها ولا تتحقّق منها، ولا تكفل سلطة الطابع الزمني (⁨TSA⁩). ويعود التحقّق من الرمز إلى وحدتَي ⁨Signature⁩ و⁨Security⁩.
  5. تتبّع التراجعات. يحمّل ContinuousMonitor::check أحدث حزمة مُخزَّنة لتجزئة المستند ويقارن أسماء السياسات الفاشلة الفريدة. وتُصنَّف المسائل إلى newIssues (فاشلة الآن، لا سابقًا)، وresolvedIssues (فاشلة سابقًا، لا الآن)، وunchangedIssues (فاشلة في الحالتين). ويكون hasChanges مساويًا لـ true فقط عند وجود مسائل جديدة أو مُحلّة؛ أمّا الإخفاقات غير المتغيّرة وحدها فتُبلِغ عن false. وفي الفحص الأول، يكون كل فشل حالي جديدًا.
  6. الجدولة. يُرجِع ContinuousMonitor::isDue القيمة true عندما لا توجد أدلّة للتجزئة، أو عندما يبلغ الوقت المنقضي منذ generatedAt المُخزَّن فترةَ تكرار الجدول، أو عندما تكون الأدلّة المُخزَّنة مؤرَّخة في المستقبل نسبةً إلى المضيف المُستطلِع. وحالة التأريخ المستقبلي آمنة عند الفشل: في أسوأ الأحوال فحص إضافي، لا فحص فائت أبدًا.
  7. عقد المخزن. يجب أن تدعم تطبيقات EvidenceStoreInterface دلالات الإلحاق فقط؛ وتشكّل الحزم المتعدّدة لكل تجزئة مستند التاريخَ، الأحدث أولًا. ويستهدف persistImmutable الخلفيات القادرة على ⁨WORM⁩؛ ويجب أن تتصرّف التطبيقات غير الداعمة لـ ⁨WORM⁩ تمامًا مثل store.

الحالات الحدّية وأنماط الفشل

قسم بعنوان «الحالات الحدّية وأنماط الفشل»
  • الحزمة الفارغة تُبلِغ عن allPassed() بقيمة true وpassRate() بقيمة 0.0. تحقّق ببوابة totalFindings > 0 قبل معاملة الحزمة كنجاح.
  • إنشاء EvidencePackage مباشرةً لا يتحقّق من الأعداد مقابل $records. استخدم البوّابة، أو حافظ على اتساق الأعداد بنفسك.
  • يُديم generateEvidence قبل الإرجاع. شغّل ContinuousMonitor::check بالحزمة الجديدة قبل إدامتها؛ فالفحص بعد الإدامة يقارن الحزمة بنفسها ويُبلِغ عن عدم وجود تغييرات.
  • يغطّي exportHash بايتات toJson بالضبط. وأي ملخّص يُعاد حسابه بأي مُسلسِل آخر أو ترتيب مفاتيح آخر أو سياسة هروب أخرى لن يتطابق.
  • MonitorFrequency::Monthly نافذة ثابتة من ⁨30⁩ يومًا، لا شهرًا تقويميًا.
  • MonitorSchedule::$retentionDays و$alertOnNewIssues إعداد يُحمَل لمُجدوِلات المضيف. والوحدة لا تحذف الأدلّة أبدًا ولا ترسل تنبيهات أبدًا.
  • InMemoryEvidenceStore مخصّص للاختبارات والتطوير. وتُفقَد الحزم عند خروج العملية، وpersistImmutable فيه بلا دلالات ⁨WORM⁩.
  • تُصدَّر سلاسل details في السجلّ حرفيًا؛ والمُصدِّر لا يحجب. أبقِ الأسرار والبيانات الشخصية الخاضعة للتنظيم خارج details. والإقامة والاحتفاظ والتحكّم في الوصول تتبع تنفيذ مخزن المُشغِّل.
  • تُقبَل الوسيطة tsaTimestamp كسلسلة معتمة. والرمز المُشوَّه يُضمَّن دون تغيير ولا يظهر إلا عند التحقّق اللاحق.

تحسب هذه الوحدة ملخّصات ⁨SHA-256⁩ وتُضمِّن رمز ⁨RFC 3161⁩ يوفّره المستدعِي. وهي لا تؤدّي أي توقيع ولا حفظ مفاتيح. ويحكم سلوكَ وضع ⁨FIPS⁩ وحدتا ‏⁨Security⁩ و‏⁨Signature⁩.

الادّعاءالمعيارالبند
رمز الطابع الزمني يشير إلى أنّ بيانةً كانت موجودة في نقطة زمنية معيّنة.IETF RFC 3161§2
الطوابع الزمنية المُصدَّرة تستخدم صيغة الإنترنت للتاريخ/الوقت من ⁨ISO 8601⁩، بأجزاء الثانية.IETF RFC 3339§5.6
مادة التحقّق المُضمَّنة داخل ملف ⁨PDF⁩ تنتمي إلى مخزن أمان المستند (Document Security Store)؛ وذلك السطح مِلك وحدة ⁨Signature⁩، لا هذه الوحدة.ISO 32000-2:2020§12.8.4

كل البنود مُعاد صياغتها؛ ولا يستنسخ ⁨NextPDF⁩ النص المعياري. ‏⁨NextPDF⁩ لا يقدّم أي ادّعاء اعتماد. والتقاط الأدلّة يدعم سير عمل التدقيق؛ وهو ليس تأكيدًا قانونيًا ولا اعتماد تدقيق. ورمز الطابع الزمني دليل على الوقت فقط، وهذه الوحدة لا تؤكّد أنّ أي محتوى مطابق. وتبقى الصلاحية والمطابقة خصائص للملف النهائي مضافًا إليه مُتحقِّق. وهذا المرجع ليس رأيًا قانونيًا؛ استشر مستشاري الامتثال والقانون لديك.

  • يحمل مصدر الوحدة @since 2.2.0؛ ويوثّق هذا المرجع السطح كما شُحِن في nextpdf/enterprise ⁨3.1.0⁩.
  • كل شيء يعمل داخل العملية على مضيفك. والوحدة لا تُجري أي إدخال/إخراج شبكي ولا تتّصل بسلطة طابع زمني (⁨TSA⁩) بنفسها أبدًا.
  • ترتيب مفاتيح المصفوفة الحرفية في المُصدِّر جوهري بحكم التصميم. وإعادة ترتيبه ستغيّر exportHash وتُبطِل الملخّصات المُخزَّنة سابقًا؛ والمصدر يمنع ذلك.
  • packageId هو ⁨UUID⁩ إصدار ⁨4⁩ مُجمَّع من مخرَج \random_bytes(16)؛ والمُعرِّفات فريدة لكنها غير قابلة للاستنساخ.
  • الإدامة الدائمة يوفّرها المضيف. وإنفاذ ⁨WORM⁩ والتحكّم في الوصول مسؤولية المُشغِّل؛ والمخزن في الذاكرة هو التطبيق المُرفَق الوحيد.
  • MonitorResult كائن قيمة final readonly؛ وخصائصه الثماني public، بما فيها checkedAt، وهو وقت الفحص بساعة الحائط.

توثّق هذه الصفحة السلوك القابل للملاحظة خارجيًا وسطح واجهة برمجة التطبيقات العامة المدعوم فقط. أمّا مسارات فضاءات الأسماء الداخلية، والأصناف المساعدة، وجداول الآليات، وأسماء ملفات أدلّة التشغيل، وبادئات التذاكر فخارج النطاق.