المستودعات الخاصة
يفحص Patchwire المستودعات الخاصة عبر رموز وصول HTTPS لكل مشروع. الرموز تُشفَّر بـAES-256-GCM قبل الحفظ ولا تُعاد أبداً في أي استجابة من الـAPI.
كيف تعمل
عند حفظ رمز على مشروع، الـAPI:
- يقرأ
PATCHWIRE_DATA_KEYمن البيئة (مفتاح متماثل بطول 32 بايت، مُحمَّل من Kubernetes Secret مختوم). - يولّد nonce جديد بطول 12 بايت.
- يشفّر النصّ الأصلي للرمز بـAES-256-GCM.
- يخزّن التنسيق
nonce ‖ ciphertext ‖ tagفيprojects.access_token_enc(BYTEA).
عند بدء فحص:
- مهمة الفحص تجلب الصف بما فيه الكتلة المشفَّرة.
- تفك التشفير في الذاكرة، لمدة لا تتجاوز عملية النسخ.
- تبني الرابط
https://USER:TOKEN@host/path، وتمرّره إلىgit clone. - سلسلة الرابط موجودة في إطار مكدّس مهمة النسخ، وتُحرَّر عند نهاية النطاق.
استجابة الـAPI تُظهر فقط has_access_token: true — لا الكتلة المشفَّرة، ولا النصّ الأصلي.
إعداد الرمز لكل مزوِّد
GitHub
استخدم رمزاً شخصياً دقيق الصلاحيات (fine-grained PAT) محصوراً بمستودع واحد.
- https://github.com/settings/personal-access-tokens/new
- Resource owner: حسابك أو منظمتك.
- Repository access: Only select repositories ← اختر المستودع.
- Repository permissions: Contents: Read-only.
- Generate.
- في Patchwire: نموذج تعديل المشروع ← رمز الوصول ← ألصق.
- اسم مستخدم الرمز: اتركه افتراضياً (
x-access-token).
الرموز دقيقة الصلاحيات صلاحيتها الأقصى سنة. للتدوير، عدِّل المشروع وألصق رمزاً جديداً؛ الكتلة المشفَّرة القديمة يُكتب فوقها.
GitLab
استخدم رمز وصول للمشروع (project access token).
- المشروع ← Settings ← Access Tokens.
- Token name:
patchwire. - Role: Reporter (أدنى دور يستطيع النسخ).
- Scopes:
read_repository. - اضغط Create.
- انسخ قيمة الرمز (لن تراها مرة أخرى).
- في Patchwire: نموذج تعديل المشروع ← رمز الوصول ← ألصق.
- اسم مستخدم الرمز:
oauth2.
Bitbucket Cloud
استخدم app password بصلاحية قراءة المستودع.
- https://bitbucket.org/account/settings/app-passwords/
- Label:
patchwire. - Permissions: Repositories: Read.
- أنشئ.
- انسخ القيمة.
- في Patchwire: نموذج تعديل المشروع ← رمز الوصول ← ألصق الـapp password.
- اسم مستخدم الرمز: اسم مستخدمك في Bitbucket (الذي يملك المستودع أو يصل إليه).
Forgejo
لست بحاجة لضبط أي شيء. تثبيت Patchwire يحمل PAT خاصاً به على مستوى الكلاستر (FORGEJO_CLONE_TOKEN) يُصادق نسخات git.ahmedanbar.dev تلقائياً. الرموز الخاصة بمشاريع Forgejo تُتجاهَل ببساطة.
تحديث أو حذف الرمز
في نموذج تعديل المشروع (/projects/<slug>):
| الإجراء | ما تفعله |
|---|---|
| استبدال الرمز | اكتب الرمز الجديد في الحقل. أرسل. |
| الإبقاء على الرمز الحالي | اترك الحقل فارغاً. أرسل. |
| إزالة الرمز | اضغط مسح الرمز ثم أرسل. الشارة تعود إلى "بدون رمز مضبوط". |
الـAPI يفرض هذه الحالات الثلاث على جسم PATCH:
- حقل
access_tokenغير موجود ← اتركه دون تغيير access_token: ""← امسحه (اجعل العمود NULL)access_token: "<قيمة>"← أعد التشفير واستبدل
ملاحظات أمنية
- التشفير عند التخزين فقط. النصّ الأصلي موجود في ذاكرة بود الـAPI طوال مدة النسخ — عادةً 10 ثوانٍ. لا نقوم بعدُ بحجب الرابط من سجلات العمليات داخل البود (متابعة معروفة؛ السجلات تذهب إلى stdout ويقرأها
kubectl logs). - مفتاح واحد، بدون تدوير اليوم. تدوير
PATCHWIRE_DATA_KEYسيُبطل كل الرموز الحالية. عمودkey_versionيُضاف عندما يصبح التدوير طلباً حقيقياً. - النطاق على مستوى المشروع. اختراق صلاحية الوصول إلى مفتاح بيانات مستأجر واحد (عملياً، root على بود الـAPI) يفتح كل رموز كل المشاريع في كل المنظمات. نطاق الانفجار هو التثبيت كله، وليس مستأجراً واحداً.
- الرمز ملكك. Patchwire لا يُجري أي مكالمات خارجية تتجاوز
git clone. لا توجد قياسات، ولا تقارير لطرف ثالث.
استكشاف الأخطاء
الفحص يفشل برسالة Authentication failed — الرمز لا يمنح صلاحية القراءة على هذا المستودع، أو حقل اسم المستخدم خاطئ (جرّب oauth2 لـGitLab، أو اسم مستخدمك الحقيقي لـBitbucket).
الفحص يفشل برسالة repository not found — الرابط خاطئ، أو الرمز لحساب آخر، أو المستودع محذوف/مؤرشف.
حقل الرمز يقول "(مضبوط حالياً)" ولا تتذكّر أنك ضبطته — راجع سجل التدقيق: git log -- crates/api/src/handlers/projects.rs يخبرك متى أُضيف تخزين الرمز.