Restrict workspace paths to configured roots
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
- 2026-10-03: اكتمل فرض Bearer على كل عمليات `/v1` الخاصة (عدا الصحة وقائمة النماذج ومسارات بدء المصادقة العامة)، وربط Flutter بالجلسة لكل طلب محادثة/وكيل/ملف/معرفة/ويب/صوت. أصبحت ملكية فهرس المعرفة وسجل التدقيق حسب الحساب، ومعاينة تعديل الملف لا تُطبق إلا بجلسة صاحبها. تحقق OpenAPI وواجهات رفض الرمز وعزل حسابين وترحيل SQLite: 61 اختبار Python ناجح، و11 اختبار Flutter وتحليل Flutter بلا ملاحظات. يبقى قصر الوصول إلى مسارات نظام الملفات لكل مستخدم، وواجهة الدخول وتخزين الرمز الآمن وحدود محاولات الدخول؛ لذلك يظل التشغيل loopback فقط.
|
||||
- 2026-10-03: أضيفت شاشة Flutter للحساب (إنشاء/دخول/خروج)، وعند تبديل الهوية تمسح المحادثات المحملة ثم تعيد قراءتها تحت الجلسة الجديدة. رمز الحساب يمر عبر `flutter_secure_storage` ويُستعاد بالتحقق من `/v1/auth/me`؛ اختبار Flutter 11/11 و`flutter analyze` بلا ملاحظات. Android مضبوط على API 23. **لم يكتمل بناء Windows:** Visual Studio Build Tools يفتقد ATL (`atlstr.h`) المطلوب من الإضافة، ومحاولة إضافة المكوّن لم تُثبته؛ يجب إصلاح مكوّن البناء ثم إعادة `flutter build windows --debug` قبل اعتبار خطوة Windows مجربة. بناء الويب بدأ لكن لم يُحسم بعد.
|
||||
- 2026-10-03: أضيف تحديد دائم لمحاولات الدخول عبر SQLite: خمس كلمات مرور خاطئة لكل حساب أو عنوان اتصال خلال 15 دقيقة، وحدّ إنشاء 30 حسابًا لكل اتصال في الساعة. تُخزن بصمات SHA-256 للمفاتيح بدل البريد أو IP الخام، ويرجع الخادم 429 و`Retry-After`. تحقق اختبار انقضاء النافذة ومجموعة Python الكاملة: 62 اختبارًا ناجحًا، و`compileall` و`git diff --check` ناجحان. لا يزال هذا حدًا أوليًا خلف خدمة loopback، وليس سياسة كافية وحده لخدمة عامة.
|
||||
- 2026-10-03: أضيفت قائمة سماح جذور لمساحات العمل على مستوى الخدمة؛ اختيار المجلد يتطلب أن يقع داخل جذر يحدده المسؤول في `SOVEREIGNAI_ALLOWED_WORKSPACES`. اختُبر رفض المسار الخارجي وقبول المسار الداخلي، ونجحت مجموعة Python الآن بـ63 اختبارًا مع `compileall` و`git diff --check`. ما زال ربط الجذر بالحساب مستقلًا مطلوبًا.
|
||||
|
||||
## المرحلة 1 — تجربة المحادثة
|
||||
|
||||
@@ -65,7 +66,8 @@
|
||||
- [x] ربط CRUD المحادثات والتقييم بهوية الجلسة، والتحقق من أن حسابًا ثانيًا لا يقرأ محادثة الحساب الأول.
|
||||
- [x] فرض Bearer على جميع عمليات `/v1` الخاصة وإرسال الجلسة من Flutter للمحادثة/الوكيل/الملفات/المعرفة/البحث والصوت؛ فحص OpenAPI يضمن ألا توجد عملية خاصة بلا HTTP Bearer.
|
||||
- [x] عزل فهرس المعرفة وسجل التدقيق بمعرّف الحساب، وربط رمز معاينة تعديل الملفات بصاحبها؛ اختبار API أثبت عدم استرجاع حساب لمحتوى فهرسه حساب آخر.
|
||||
- [ ] قصر مسارات مساحة العمل على مجلدات مصرح بها لكل مستخدم، وإزالة صلاحيات FastAPI العامة عن ملفات المضيف قبل السماح بعميل شبكي أو خدمة مستضافة.
|
||||
- [ ] ربط جذور مساحة العمل بكل حساب على حدة، وإزالة صلاحيات FastAPI العامة عن ملفات المضيف قبل السماح بعميل شبكي أو خدمة مستضافة.
|
||||
- [x] إضافة قائمة سماح على مستوى الخادم عبر `SOVEREIGNAI_ALLOWED_WORKSPACES`؛ يرفض API الآن أي مجلد خارج الجذور المعتمدة عند ضبطها. هذا يقلل الوصول إلى المضيف لكنه لا يعزل حسابين داخل الجذر نفسه، ولا يغني عن إعدادها في كل خدمة تشغيل.
|
||||
- [x] بناء واجهة إنشاء الحساب/الدخول والخروج وربطها بجلسات API؛ عند تبديل الحساب تمسح الواجهة الحالة المحلية ثم تعيد تحميل المحادثات والمهارات تحت الهوية الجديدة.
|
||||
- [x] حفظ رمز الحساب عبر `flutter_secure_storage` في مخزن النظام على المنصات المدعومة، واستعادة `/v1/auth/me` عند بدء التطبيق؛ Android مضبوط على API 23 كحد أدنى. تخزين الويب تجريبي ويعتمد على المتصفح، لذلك لا يُعامل كحماية نظام تشغيل.
|
||||
- [ ] إضافة حدود لمحاولات الدخول/التسجيل وتدفق استعادة كلمة المرور واختبار نشر محلي عبر TLS قبل الوصول الشبكي.
|
||||
|
||||
Reference in New Issue
Block a user