نظرة عامة
هذه المواصفة تمدد تغذية الاشتراك بالعناوين بالأوامر، لتمكين خوادم الأسماء من بث تحديثات الإدخالات من حاملي أسماء المضيفين. تم تنفيذها في الإصدار 0.9.26، واقترحت أصلاً في المقترح 112.
الدافع
في السابق، كانت خوادم اشتراك hosts.txt ترسل البيانات فقط بصيغة hosts.txt، والتي هي كما يلي:
example.i2p=b64destination
هناك عدة مشاكل في هذا:
- حاملو أسماء المضيفين لا يمكنهم تحديث الـ Destination المرتبط بأسماء المضيفين الخاصة بهم (من أجل مثلاً ترقية مفتاح التوقيع إلى نوع أقوى).
- حاملو أسماء المضيفين لا يمكنهم التخلي عن أسماء المضيفين الخاصة بهم بشكل تعسفي؛ يجب عليهم إعطاء المفاتيح الخاصة للـ Destination المقابل مباشرة للحامل الجديد.
- لا توجد طريقة للتحقق من أن النطاق الفرعي مُتحكم فيه من قبل اسم المضيف الأساسي المقابل؛ هذا حالياً مُطبق فقط بشكل فردي من قبل بعض خوادم الأسماء.
التصميم
تضيف هذه المواصفة عدداً من أسطر الأوامر إلى تنسيق hosts.txt. باستخدام هذه الأوامر، يمكن لخوادم الأسماء توسيع خدماتها لتوفير عدد من الميزات الإضافية. العملاء الذين ينفذون هذه المواصفة سيكونون قادرين على الاستماع لهذه الميزات من خلال عملية الاشتراك العادية.
يجب توقيع جميع أسطر الأوامر من قبل الـ Destination المقابل. هذا يضمن أن التغييرات تتم فقط بناءً على طلب من مالك اسم المضيف.
الآثار الأمنية
هذه المواصفة لا تؤثر على إخفاء الهوية.
هناك زيادة في المخاطر المرتبطة بفقدان السيطرة على مفتاح Destination، حيث يمكن لأي شخص يحصل عليه استخدام هذه الأوامر لإجراء تغييرات على أي أسماء مضيفة مرتبطة. لكن هذا ليس أكثر إشكالية من الوضع الراهن، حيث يمكن لأي شخص يحصل على Destination انتحال شخصية اسم مضيف و(جزئياً) الاستيلاء على حركة مروره. كما أن المخاطر المتزايدة متوازنة من خلال منح أصحاب أسماء المضيفة القدرة على تغيير Destination المرتبط باسم مضيف، في حالة اعتقادهم أن Destination قد تم اختراقه؛ وهذا مستحيل مع النظام الحالي.
المواصفات
أنواع الخطوط الجديدة
هناك نوعان جديدان من الأسطر:
أوامر الإضافة والتغيير:
example.i2p=b64destination#!key1=val1#key2=val2 ...إزالة الأوامر:
#!key1=val1#key2=val2 ...
الترتيب
التغذية ليست بالضرورة مرتبة أو مكتملة. على سبيل المثال، قد يكون أمر التغيير في سطر قبل أمر الإضافة، أو بدون أمر إضافة.
يمكن أن تكون المفاتيح بأي ترتيب. المفاتيح المكررة غير مسموحة. جميع المفاتيح والقيم حساسة لحالة الأحرف.
المفاتيح الشائعة
مطلوب في جميع الأوامر:
sig : توقيع B64، باستخدام مفتاح التوقيع من الوجهة
مراجع لاسم مضيف ثاني و/أو وجهة:
oldname : اسم مضيف ثانٍ (جديد أو معدّل)
olddest : وجهة b64 ثانية (جديدة أو متغيرة)
oldsig : توقيع b64 ثانٍ، باستخدام مفتاح التوقيع من olddest
مفاتيح شائعة أخرى:
action : أمر
name : اسم المضيف، موجود فقط إذا لم يسبقه example.i2p=b64dest
dest : الوجهة b64، موجودة فقط إذا لم تكن مسبوقة بـ example.i2p=b64dest
date : بالثواني منذ بداية العصر (epoch)
expires : بالثواني منذ بداية العصر (epoch)
الأوامر
جميع الأوامر باستثناء أمر “Add” يجب أن تحتوي على مفتاح/قيمة action=command.
من أجل التوافق مع العملاء الأقدم، معظم الأوامر مسبوقة بـ example.i2p=b64dest، كما هو مذكور أدناه. بالنسبة للتغييرات، هذه دائماً القيم الجديدة. أي قيم قديمة مضمنة في قسم المفتاح/القيمة.
المفاتيح المدرجة مطلوبة. جميع الأوامر قد تحتوي على عناصر مفتاح/قيمة إضافية غير محددة هنا.
إضافة اسم المضيف
مسبوق بـ example.i2p=b64dest : نعم، هذا هو اسم المضيف والوجهة الجديدة.
action : غير مُضمّن، إنه مُضمّن ضمنياً.
sig : التوقيع
مثال:
example.i2p=b64dest#!sig=b64sig
تغيير اسم المضيف
مسبوق بـ example.i2p=b64dest : نعم، هذا هو اسم المضيف الجديد والوجهة القديمة.
action : changename
oldname : اسم المضيف القديم، الذي سيتم استبداله
sig : التوقيع
مثال:
example.i2p=b64dest#!action=changename#oldname=oldhostname#sig=b64sig
تغيير الوجهة
مسبوق بـ example.i2p=b64dest : نعم، هذا هو اسم المضيف القديم والوجهة الجديدة.
action : changedest
olddest : الوجهة القديمة، المراد استبدالها
oldsig : التوقيع باستخدام olddest
sig : التوقيع
مثال:
example.i2p=b64dest#!action=changedest#olddest=oldb64dest#oldsig=b64sig#sig=b64sig
إضافة اسم مستعار للمضيف
مسبوق بـ example.i2p=b64dest : نعم، هذا هو اسم المضيف (الاسم المستعار) الجديد والوجهة القديمة.
action : addname
oldname : اسم المضيف القديم
sig : التوقيع
مثال:
example.i2p=b64dest#!action=addname#oldname=oldhostname#sig=b64sig
إضافة اسم مستعار للوجهة
(يُستخدم لترقية التشفير)
مسبوق بـ example.i2p=b64dest : نعم، هذا هو اسم المضيف القديم والوجهة الجديدة (البديلة).
action : adddest
olddest : الوجهة القديمة
oldsig : التوقيع باستخدام olddest
sig : التوقيع باستخدام dest
مثال:
example.i2p=b64dest#!action=adddest#olddest=oldb64dest#oldsig=b64sig#sig=b64sig
إضافة نطاق فرعي
مسبوق بـ subdomain.example.i2p=b64dest : نعم، هذا هو اسم النطاق الفرعي الجديد للمضيف والوجهة.
action : addsubdomain
oldname : اسم المضيف عالي المستوى (example.i2p)
olddest : الوجهة عالية المستوى (على سبيل المثال example.i2p)
oldsig : التوقيع باستخدام olddest
sig : التوقيع باستخدام dest
مثال:
subdomain.example.i2p=b64dest#!action=addsubdomain#oldname=example.i2p#olddest=oldb64dest#oldsig=b64sig#sig=b64sig
تحديث البيانات الوصفية
مسبوق بـ example.i2p=b64dest : نعم، هذا هو اسم المضيف القديم والوجهة.
action : update
sig : التوقيع
(أضف أي مفاتيح محدثة هنا)
مثال:
example.i2p=b64dest#!action=update#k1=v1#k2=v2#sig=b64sig
إزالة اسم المضيف
مسبوق بـ example.i2p=b64dest : لا، هذه محددة في الخيارات
action : remove
name : اسم المضيف
dest : الوجهة
sig : التوقيع
مثال:
#!action=remove#name=example.i2p#dest=b64dest#sig=b64sig
إزالة الكل بهذه الوجهة
مسبوق بـ example.i2p=b64dest : لا، هذه محددة في الخيارات
action : removeall
name : اسم المضيف القديم، استشاري فقط
dest : الوجهة القديمة، جميع العناصر التي تحتوي على هذه الوجهة يتم إزالتها
sig : التوقيع
مثال:
#!action=removeall#name=example.i2p#dest=b64dest#sig=b64sig
التوقيعات
جميع الأوامر يجب أن تحتوي على مفتاح/قيمة التوقيع sig=b64signature حيث التوقيع مخصص للبيانات الأخرى، باستخدام مفتاح التوقيع للوجهة.
للأوامر التي تتضمن وجهة قديمة وجديدة، يجب أن يكون هناك أيضاً oldsig=b64signature، وإما oldname أو olddest أو كلاهما.
في أمر الإضافة أو التغيير، المفتاح العام للتحقق موجود في الوجهة المراد إضافتها أو تغييرها.
في بعض أوامر الإضافة أو التعديل، قد يتم الإشارة إلى destination إضافي، على سبيل المثال عند إضافة اسم مستعار، أو تغيير destination أو اسم المضيف. في هذه الحالة، يجب تضمين توقيع ثانٍ والتحقق من كلاهما. التوقيع الثاني هو التوقيع “الداخلي” ويتم توقيعه والتحقق منه أولاً (باستثناء التوقيع “الخارجي”). يجب على العميل اتخاذ أي إجراء إضافي ضروري للتحقق من التغييرات وقبولها.
oldsig هو دائماً التوقيع “الداخلي”. قم بالتوقيع والتحقق بدون وجود مفاتيح ‘oldsig’ أو ‘sig’. sig هو دائماً التوقيع “الخارجي”. قم بالتوقيع والتحقق مع وجود مفتاح ‘oldsig’ ولكن بدون مفتاح ‘sig’.
مدخلات التوقيعات
لإنتاج تدفق بايت لإنشاء أو التحقق من التوقيع، قم بالتسلسل كما يلي:
- إزالة مفتاح “sig”
- في حالة التحقق باستخدام oldsig، قم أيضاً بإزالة مفتاح “oldsig”
- للأوامر Add أو Change فقط، أخرج
example.i2p=b64dest - إذا بقيت أي مفاتيح، أخرج
#! - رتب الخيارات حسب مفتاح UTF-8، فشل في حالة وجود مفاتيح مكررة
- لكل مفتاح/قيمة، أخرج
key=value، متبوعة بـ (إذا لم تكن آخر مفتاح/قيمة)#
ملاحظات:
- لا تخرج سطر جديد
- ترميز الإخراج هو UTF-8
- جميع ترميزات الوجهة والتوقيع تكون في Base 64 باستخدام أبجدية I2P
- المفاتيح والقيم حساسة لحالة الأحرف
- أسماء المضيفين يجب أن تكون بأحرف صغيرة
التوافق
جميع السطور الجديدة في تنسيق hosts.txt يتم تطبيقها باستخدام رموز التعليقات الرائدة، لذا ستفسر جميع إصدارات I2P الأقدم الأوامر الجديدة كتعليقات.
عندما تقوم I2P routers بالتحديث إلى المواصفة الجديدة، فإنها لن تعيد تفسير التعليقات القديمة، ولكنها ستبدأ في الاستماع للأوامر الجديدة في عمليات الجلب اللاحقة لخلاصات الاشتراك الخاصة بها. لذلك من المهم لخوادم الأسماء أن تحافظ على إدخالات الأوامر بطريقة ما، أو تمكن دعم etag حتى تتمكن الـ routers من جلب جميع الأوامر السابقة.