The Chromium Chronicle #15: تقييد مستوى رؤية الهدف

الحلقة 15: من تأليف "جو ماسون" في مونتريال، PQ (تشرين الثاني/نوفمبر 2020)
الحلقات السابقة

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

// Blazing fast for 2-char strings, O(n^3) otherwise.
std::string ConcatShortStringsFast(const std::string& a, const std::string& b);

تتوفر عدة طرق لتقييد الوصول. تؤدي قواعد مستوى الرؤية في GN إلى إيقاف الرمز خارج المكوّن من اعتمادًا على هدف. تكون الأهداف التلقائية مرئية للجميع، ولكن يمكنك تعديل ذلك:

# In components/restricted_component/BUILD.gn
visibility = [
  # Applies to all targets in this file.
  # Only the given targets can depend on them.
  "//components/restricted_component:*",
  "//components/authorized_other_component:a_single_target",
]
source_set("internal") {
  # This dangerous target should be locked down even more.
  visibility = [ "//components/restricted_component:privileged_target" ]
}

يتم التحقق من صحة بيانات الإفصاح باستخدام gn check، الذي يتم تشغيله كجزء من كل إصدار من GN.

تتوفّر آلية أخرى، وهي DEPS include_rules، والتي تمنع الوصول إلى ملفات العناوين. كل دليل يكتسب include_rules من الأصل الخاص به، ويمكن تعديل هذه القواعد في ملف DEPS الخاص به. يجب أن يتم السماح بجميع ملفات العناوين المضمّنة من الأدلة الخارجية من خلال include_rules.

# In //components/authorized_other_component/DEPS
include_rules = [
  # Common directories like //base are inherited from
  # //components/DEPS or //DEPS. Also allow includes from
  # restricted_component, but not restricted_component/internal.
  "+components/restricted_component",
  "-components/restricted_component/internal",
  # But do allow a single header from internal, for testing.
  "+components/restricted_component/internal/test_support.h",
]

لضمان أن تكون هذه التبعيات مناسبة، يجب أن تتم الموافقة على التغييرات التي تضيف دليلاً إلى include_rules من خلال OWNERS الخاص بذلك الدليل. لا حاجة إلى موافقة لتقييد دليل باستخدام include_rules! يمكنك التأكد من أنّ كل شخص يغيِّر المكوِّن يتذكر عدم استخدام عناوين معيّنة عن طريق إضافة include_rule لتقديم عروض أسعار لها.

تم التحقّق من include_rules من خلال عملية الإرسال المسبق، لذلك لن تظهر لك أي أخطاء إلى أن تحاول تحميل تغيير. لاختبار include_rules بدون تحميل، شغِّل buildtools/checkdeps/checkdeps.py <directory>.

المراجِع