
مواصفات مستودع VEX
يجب تفسير الكلمات المفتاحية "MUST" و"MUST NOT" و"REQUIRED" و"SHALL" و"SHALL NOT" و"SHOULD" و"SHOULD NOT" و"RECOMMENDED" و"MAY" و"OPTIONAL" الواردة في هذا المستند كما هو موصوف في RFC 2119.
عند مقارنة الإصدارات:
أمثلة على المقارنات:
يوفر ملف البيان (manifest) بيانات وصفية حول مستودع بيانات VEX. يجب أن يحتوي هذا الملف على المعلومات اللازمة لاسترجاع بيانات VEX وتحديثها.
https://<domain>/.well-known/vex-repository.jsonvex-repository.json في الدليل الجذر للفرع الرئيسي.يتم تعريف مخطط JSON لملف البيان هنا.
{
"name": "Example Org VEX Repository",
"description": "VEX repository for Example Organization",
"versions": [
{
"spec_version": "0.1",
"locations": [
{
"url": "https://example.com/vex-hub/v0/vex-data-v0.tar.gz"
}
],
"update_interval": "24h",
"repository_specific": {
"location": {
"repository_type": "db",
"db_type": "bbolt",
"url": "oci://ghcr.io/example.com/vex-db:0"
}
}
},
{
"spec_version": "1.0",
"locations": [
{
"url": "https://example.com/vex-hub/v1/vex-data-v1.tar.gz//subdirectory"
},
{
"url": "https://example.com/vex-api/v1"
}
],
"update_interval": "1h"
}
]
}
| Field | Required | Description and Usage Notes |
|---|---|---|
| name | ✓ | اسم المستودع. |
| description | ✓ | وصف موجز للمستودع. |
| versions | ✓ | مصفوفة تحتوي على تفاصيل الإصدارات المتاحة. يمثل كل كائن في المصفوفة إصدارًا ينفذ نسخة من مواصفات مستودع VEX. يجب ترتيب الإصدارات تصاعديًا، من الأقدم إلى الأحدث. راجع الجدول المنفصل للحقول الفرعية. |
| Field | Required | Description and Usage Notes |
|---|---|---|
| spec_version | ✓ | إصدار مواصفات مستودع VEX المنفذ (مثل "0.1"). يجب أن يكون التنسيق "X.Y" كما هو معرّف في القسم 1. |
| locations | ✓ | مصفوفة من الكائنات تصف مواقع بيانات VEX. يجب أن تحتوي على كائن موقع واحد على الأقل. راجع الجدول المنفصل للحقول الفرعية. |
| update_interval | ✓ | الفاصل الزمني الموصى به للتحقق من التحديثات لبيانات VEX الخاصة بهذا الإصدار. يستخدم تنسيق مدة Go (مثل "1h" أو "30m" أو "24h"). |
| repository_specific | - | معلومات إضافية خاصة بالمستودع. |
يجب أن يكون للمستودع البنية التالية:
vex-repository.<archive_extension>
[optional_subdirectory/]
├── index.json
└── pkg/
├── <type>/
│ ├── <namespace>/
│ │ ├── <name>/
│ │ │ └── vex.json
│ │ └── ...
│ └── ...
└── ...
حيث <archive_extension> هي إحدى صيغ الأرشيف المدعومة.
يتم تضمين [optional_subdirectory/] عندما ينتهي عنوان URL في حقل locations بـ // يتبعه مسار دليل فرعي.
يسمح هذا بمرونة في بنية المستودع، خاصة عند استخدام تخطيطات مستودعات قائمة مثل تلك الموجودة في مستودعات GitHub.
على سبيل المثال، إذا كان عنوان URL هو https://github.com/org/repo/archive/refs/heads/main.tar.gz//repo-main، فستكون بنية الملفات:
main.tar.gz
└──repo-main/
├── index.json
└── pkg/
└── ...
في هذه الحالة، repo-main/ هو الدليل الجذر لمستودع VEX داخل ملف tar.gz.
يعمل ملف index.json كبيان (manifest) لمحتويات ملف الأرشيف. يجب وضعه في الدليل الجذر للأرشيف أو في الدليل الفرعي المحدد إذا تم تعريف واحد في عنوان URL. يجب أن يكون للملف البنية التالية:
{
"updated_at": "2023-07-04T12:00:00Z",
"packages": [
{
"id": "pkg:deb/debian/curl",
"location": "pkg/deb/debian/curl/vex.json"
},
{
"id": "pkg:npm/lodash",
"location": "pkg/npm/lodash/vex.json",
"format": "csaf"
}
]
}
أوصاف الحقول:
| Field | Required | Description |
|---|---|---|
| updated_at | ✓ | طابع زمني يشير إلى آخر مرة تم فيها تحديث ملف index.json هذا. |
| packages | ✓ | مصفوفة من الكائنات، يمثل كل منها حزمة في المستودع. |
| packages[].id | ✓ | معرّف الحزمة. حاليًا، يتم قبول Package URL (PURL) فقط. يجب حذف الإصدار والمؤهلات (qualifiers) والمسار الفرعي لأنها مضمنة في مستند VEX. بالنسبة للحزم من نوع OCI، يجب تضمين مؤهل repository_url في المعرّف (id). |
| packages[].location | ✓ | مسار نسبي لملف VEX الخاص بهذه الحزمة داخل الأرشيف. يجب على العملاء استخدام هذا الحقل لتحديد موقع ملفات VEX الخاصة بحزمة معينة. |
| packages[].format | - | تنسيق بيانات VEX. إما "openvex" أو "csaf". إذا تم حذفه، يُفترض أن التنسيق "openvex". |
يتم تعريف مخطط ملف الفهرس هنا.
يجب تخزين معلومات VEX الخاصة بكل حزمة في ملف JSON منفصل، باتباع بنية المسار المعرفة في ملف index.json. يجب أن يلتزم محتوى هذه الملفات بمواصفات تنسيق VEX (OpenVEX أو CSAF VEX) كما هو محدد في حقل format.
قد يتضمن مستند VEX واحد معلومات لإصدارات ومؤهلات ومسارات فرعية مختلفة لنفس الحزمة.
لأمثلة مستندات OpenVEX، يُرجى الرجوع إلى مواصفات OpenVEX.
repository_url الخاص بـ PURL لإنشاء بنية الدليل. على سبيل المثال، يمكن تخزين حزمة يكون PURL الخاص بها "pkg:oci/debian@sha256:3e45770a143ee5afd1ebde5a6aea6e32a71d2bt5602f5dac8025db0d9cc19f10?repository_url=docker.io/library/debian" في المسار "pkg/oci/docker.io/library/debian/vex.json".location بملف index.json، بغض النظر عن البنية الموصى بها.عند تحديث مستودع VEX:
updated_at.locations ذي الصلة في ملف البيان (vex-repository.json) إذا لزم الأمر.يجب توزيع مستودع VEX كملف أرشيف يحتوي على بيانات VEX والبيانات الوصفية المرتبطة بها. يجب أن تتم الإشارة إلى هذا الأرشيف بواسطة حقل locations في ملف vex-repository.json، وهو الوسيلة الأساسية لتوزيع معلومات VEX.
يجب أن يكون ملف الأرشيف بأحد الصيغ التالية:
tar.gz وtgztar.bz2 وtbz2tar.xz وtxzzipgzbz2xzعند اختيار إصدار من مصفوفة versions:
spec_version.عند التعامل مع مواقع متعددة في مصفوفة locations:
يجب تصميم العملاء لدعم مستودعات VEX متعددة.
يجب على العملاء استخدام العملية التالية للتحقق من التحديثات:
update_interval من ملف vex-repository.json.update_interval إلى الطابع الزمني المخزن محليًا.للتشغيل الفعال، قد ينفذ العملاء الاستراتيجيات التالية:
update_interval قصيرًا جدًا.