حماية محتوى الملف

تتيح واجهة برمجة التطبيقات Google Drive API عدة طرق لمنع تعديل الملفات، بما في ذلك تقييد محتوى الملفات ومنع خيار تنزيل الملفات أو طباعتها أو نسخها.

جعل الملفات للقراءة فقط باستخدام قيود المحتوى في Drive

يمكنك إضافة قيود على المحتوى في ملف Google Drive لمنع المستخدمين من إجراء ما يلي:

  • تعديل العنوان
  • إجراء تعديلات على المحتوى
  • تحميل نسخة معدَّلة
  • إضافة تعليقات أو تعديلها

لا يشكّل حظر المحتوى حظرًا للوصول. مع أنّ المستخدمين لا يمكنهم تعديل محتوى الملف، إلا أنّه لا يزال بإمكانهم إجراء عمليات أخرى استنادًا إلى مستوى الوصول لديهم. على سبيل المثال، يمكن للمستخدم الذي لديه إذن تعديل نقل عنصر أو تغيير إعدادات مشاركته.

لإضافة قيود على المحتوى أو إزالتها من ملف في Drive، يجب أن يتوفّر لدى المستخدم permissions المرتبط. بالنسبة إلى ملف أو مجلد في "ملفاتي" أو في مساحة تخزين سحابي مشتركة يتضمّن capabilities.canModifyEditorContentRestriction، يجب أن يكون لديك إذن role=writer. بالنسبة إلى ملف أو مجلد في "ملفاتي" أو في مساحة تخزين سحابي مشتركة يتضمّن ownerRestricted قيودًا على المحتوى، يجب أن تكون مالك الملف أو أن يكون لديك إذن role=organizer. للاطّلاع على عنصر يتضمّن قيودًا على المحتوى، يجب أن يكون لدى المستخدمين إصدار role=reader أو إصدار أحدث. للحصول على قائمة كاملة بالأدوار، راجِع الأدوار والأذونات. لتعديل الأذونات على ملف، يُرجى الاطّلاع على تعديل الأذونات.

يمكنك استخدام الحقل المنطقي contentRestrictions.readOnly في المرجع files لضبط قيود على المحتوى. يُرجى العلم أنّ ضبط قيود على المحتوى في أحد العناصر سيؤدي إلى استبدال القيود الحالية.

سيناريوهات القيود المفروضة على المحتوى

يشير قيد المحتوى على ملف في Drive إلى المستخدمين بأنّه لا يجب تغيير المحتوى. قد يرجع ذلك إلى بعض الأسباب التالية:

  • إيقاف العمل مؤقتًا على مستند تعاوني خلال فترات المراجعة أو التدقيق
  • ضبط حالة عنصر على حالة نهائية، مثل تمت الموافقة.
  • منع إجراء تغييرات أثناء اجتماع حسّاس
  • حظر التغييرات الخارجية على مهام سير العمل التي تتعامل معها الأنظمة الآلية
  • تقييد عمليات التعديل من خلال Google Apps Script وإضافات Google Workspace
  • تجنُّب إجراء تعديلات غير مقصودة على مستند

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

إدارة الملفات التي تتضمّن قيودًا على المحتوى

يمكن أن تحتوي "مستندات Google" و"جداول بيانات Google" و"العروض التقديمية من Google"، بالإضافة إلى جميع الملفات الأخرى، على قيود على المحتوى.

يمنع فرض قيود على محتوى عنصر معيّن إجراء تغييرات على عنوانه ومحتواه، بما في ذلك:

  • التعليقات والاقتراحات (على "مستندات Google" و"جداول بيانات Google" و"العروض التقديمية من Google" والملفات الثنائية)
  • النسخ السابقة من ملف ثنائي
  • النص والتنسيق في "مستندات Google"
  • النص أو الصيغ في "جداول بيانات Google" وتصميم "جداول بيانات Google" والأمثلة في "جداول بيانات Google"
  • كل المحتوى في "العروض التقديمية من Google"، بالإضافة إلى ترتيب الشرائح وعددها

لا يمكن أن تتضمّن أنواع ملفات معيّنة قيودًا على المحتوى. في ما يلي بعض الأمثلة:

إضافة قيود على المحتوى

لإضافة قيود على محتوى ملف، استخدِم طريقة files.update مع ضبط الحقل contentRestrictions.readOnly على true. أضِف reason اختياريًا لتوضيح سبب إضافة القيد، مثل "تمّت الموافقة على العقد". يوضّح نموذج الرمز التالي كيفية إضافة قيود على المحتوى:

Java

File updatedFile =
  new File()
      .setContentRestrictions(
          ImmutableList.of(new ContentRestriction().setReadOnly(true).setReason("Finalized contract."));

File response = driveService.files().update("FILE_ID", updatedFile).setFields("contentRestrictions").execute();

Python

content_restriction = {'readOnly': True, 'reason':'Finalized contract.'}

response = drive_service.files().update(fileId="FILE_ID", body = {'contentRestrictions' : [content_restriction]}, fields = "contentRestrictions").execute();

Node.js

/**
* Set a content restriction on a file.
* @return{obj} updated file
**/
async function addContentRestriction() {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({scopes: 'https://www.googleapis.com/auth/drive'});
  const service = google.drive({version: 'v3', auth});
  const contentRestriction = {
    'readOnly': True,
    'reason': 'Finalized contract.',
  };
  const updatedFile = {
    'contentRestrictions': [contentRestriction],
  };
  try {
    const response = await service.files.update({
      fileId: 'FILE_ID',
      resource: updatedFile,
      fields: 'contentRestrictions',
    });
    return response;
  } catch (err) {
    // TODO (developer) - Handle error
    throw err;
  }
}

استبدِل FILE_ID بـ fileId الخاص بالملف الذي تريد تعديله.

عند تشغيل نموذج الرمز، سيتم حظر محتوى الملف وسيظهر رمز القفل () بجانب اسم الملف ضمن واجهة مستخدم Google Drive (UI). الملف الآن للقراءة فقط.

ملف يتضمّن قيودًا على المحتوى ضمن قائمة ملفات Drive
الشكل 1. ملف يتضمّن قيودًا على المحتوى ضمن قائمة ملفات Drive

إزالة قيود المحتوى

لإزالة قيود محتوى ملف، استخدِم طريقة files.update مع ضبط الحقل contentRestrictions.readOnly على false. يوضّح نموذج الرمز البرمجي التالي كيفية إزالة قيود المحتوى:

Java

File updatedFile =
new File()
    .setContentRestrictions(
        ImmutableList.of(new ContentRestriction().setReadOnly(false));

File response = driveService.files().update("FILE_ID", updatedFile).setFields("contentRestrictions").execute();

Python

content_restriction = {'readOnly': False}

response = drive_service.files().update(fileId="FILE_ID", body = {'contentRestrictions' : [content_restriction]}, fields = "contentRestrictions").execute();

Node.js

/**
* Remove a content restriction on a file.
* @return{obj} updated file
**/
async function removeContentRestriction() {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({scopes: 'https://www.googleapis.com/auth/drive'});
  const service = google.drive({version: 'v3', auth});
  const contentRestriction = {
    'readOnly': False,
  };
  const updatedFile = {
    'contentRestrictions': [contentRestriction],
  };
  try {
    const response = await service.files.update({
      fileId: 'FILE_ID',
      resource: updatedFile,
      fields: 'contentRestrictions',
    });
    return response;
  } catch (err) {
    // TODO (developer) - Handle error
    throw err;
  }
}

استبدِل FILE_ID بـ fileId الخاص بالملف الذي تريد تعديله.

عند تشغيل نموذج الرمز البرمجي، لن يعود الملف خاضعًا لقيود المحتوى.

يمكنك أيضًا استخدام واجهة مستخدم Drive لإزالة قيود المحتوى والسماح بتعديله (شرط أن تكون لديك الأذونات المناسبة). هناك خياران لإجراء ذلك:

  1. في Drive، انقر بزر الماوس الأيمن على الملف الذي يتضمّن قيودًا على المحتوى، ثم انقر على فتح القفل .

    إزالة قيود على محتوى ملف ضمن قائمة ملفات في Drive
    الشكل 2. إزالة قيود على محتوى ملف ضمن قائمة ملفات في Drive
  2. افتح الملف الذي يتضمّن قيودًا على المحتوى وانقر على (وضع القفل) > فتح قفل الملف.

    إزالة قيود على محتوى ملف ضمن مستند
    الشكل 3. إزالة قيود على محتوى ملف ضمن مستند

التحقّق من وجود قيود على المحتوى

للبحث عن قيود على المحتوى، استخدِم طريقة files.get مع الحقل الذي تم عرضه contentRestrictions. يوضّح نموذج الرمز البرمجي التالي كيفية التحقّق من حالة حظر المحتوى:

Java

File response = driveService.files().get("FILE_ID").setFields("contentRestrictions").execute();

Python

response = drive_service.files().get(fileId="FILE_ID", fields = "contentRestrictions").execute();

Node.js

/**
* Get content restrictions on a file.
* @return{obj} updated file
**/
async function fetchContentRestrictions() {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({scopes: 'https://www.googleapis.com/auth/drive'});
  const service = google.drive({version: 'v3', auth});
  try {
    const response = await service.files.get({
      fileId: 'FILE_ID',
      fields: 'contentRestrictions',
    });
    return response;
  } catch (err) {
    // TODO (developer) - Handle error
    throw err;
  }
}

استبدِل FILE_ID بـ fileId للملف الذي تريد التحقّق منه.

عند تشغيل الرمز النموذجي، تعرض الطريقة مورد ContentRestriction إذا كان متوفّرًا.

إضافة قيود على المحتوى لا يمكن تعديلها إلا من قِبل مالك الملف

لإضافة قيود على محتوى الملف بحيث لا يتمكّن سوى مالكي الملف من تفعيل الآلية أو إيقافها، استخدِم طريقة files.update مع ضبط الحقل المنطقي contentRestrictions.ownerRestricted على true. يوضّح نموذج الرمز البرمجي التالي كيفية إضافة قيود على المحتوى لمالكي الملفات فقط:

Java

File updatedFile =
  new File()
      .setContentRestrictions(
          ImmutableList.of(new ContentRestriction().setReadOnly(true).setOwnerRestricted(true).setReason("Finalized contract."));

File response = driveService.files().update("FILE_ID", updatedFile).setFields("contentRestrictions").execute();

Python

content_restriction = {'readOnly': True, 'ownerRestricted': True, 'reason':'Finalized contract.'}

response = drive_service.files().update(fileId="FILE_ID", body = {'contentRestrictions' : [content_restriction]}, fields = "contentRestrictions").execute();

Node.js

/**
* Set an owner restricted content restriction on a file.
* @return{obj} updated file
**/
async function addOwnerRestrictedContentRestriction() {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({scopes: 'https://www.googleapis.com/auth/drive'});
  const service = google.drive({version: 'v3', auth});
  const contentRestriction = {
    'readOnly': True,
    'ownerRestricted': True,
    'reason': 'Finalized contract.',
  };
  const updatedFile = {
    'contentRestrictions': [contentRestriction],
  };
  try {
    const response = await service.files.update({
      fileId: 'FILE_ID',
      resource: updatedFile,
      fields: 'contentRestrictions',
    });
    return response;
  } catch (err) {
    // TODO (developer) - Handle error
    throw err;
  }
}

استبدِل FILE_ID بـ fileId الخاص بالملف الذي تريد تعديله.

عند تشغيل نموذج الرمز، سيتم حظر المحتوى في الملف، ولن يتمكّن سوى مالكي الملف من إزالته. إذا كنت مالك الملف، سيظهر رمز قفل نشط () بجانب اسم الملف ضمن واجهة مستخدم Drive. إذا لم تكن المالك، سيظهر رمز القفل باهتًا.

لإزالة العلامة ownerRestricted، استخدِم الطريقة files.update مع ضبط الحقل contentRestrictions.ownerRestricted على false.

إمكانات تقييد المحتوى

يحتوي مورد files على مجموعة من حقول capabilities المنطقية المستخدَمة للإشارة إلى ما إذا كان يمكن تنفيذ إجراء على ملف.

تتضمّن قيود المحتوى ما يلي capabilities:

  • capabilities.canModifyEditorContentRestriction: تحدّد هذه السمة ما إذا كان بإمكان المستخدم الحالي إضافة قيود على المحتوى أو تعديلها.
  • capabilities.canModifyOwnerContentRestriction: تحدّد ما إذا كان بإمكان المستخدم الحالي إضافة قيود على المحتوى يفرضها المالك أو تعديلها.
  • capabilities.canRemoveContentRestriction: تحدّد هذه السمة ما إذا كان بإمكان المستخدم الحالي إزالة قيود المحتوى المفروضة (إذا كانت متوفّرة).

لمزيد من المعلومات، يُرجى الاطّلاع على التعرّف على إمكانات الملف.

للاطّلاع على مثال على استرداد الملف capabilities، يُرجى الاطّلاع على الحصول على إمكانات الملف.

منع المستخدمين من تنزيل ملفك أو طباعته أو نسخه

يمكنك فرض قيود على كيفية تنزيل المستخدمين للملفات وطباعتها ونسخها داخل Drive و"مستندات Google" و"جداول بيانات Google" و"العروض التقديمية من Google".

لتحديد ما إذا كان بإمكان المستخدم تغيير المالك أو القيود التي يفرضها المنظّم على تنزيل ملف، تحقَّق من الحقل المنطقي capabilities.canChangeItemDownloadRestriction. إذا تم ضبط capabilities.canChangeItemDownloadRestriction على true، يمكن تطبيق قيود التنزيل على الملف. لمزيد من المعلومات، راجِع التعرّف على إمكانات الملفات.

لتطبيق قيود التنزيل على ملف، اضبط الحقل downloadRestrictions باستخدام الطريقة files.update. يمكنك ضبط الحقل باستخدام الكائن DownloadRestrictionsMetadata.

يحتوي العنصر DownloadRestrictionsMetadata على حقلَين: itemDownloadRestriction وeffectiveDownloadRestrictionWithContext. يمكن قراءة كلا الحقلين، ولكن لا يمكن ضبط سوى itemDownloadRestriction. يعرض الحقل itemDownloadRestriction الكائن DownloadRestriction. يحتوي العنصر DownloadRestriction على حقلَين منطقيَين منفصلَين: restrictedForReaders وrestrictedForWriters.

عند ضبط الحقل itemDownloadRestriction، يفرض المالك أو المنظّم قيود التنزيل على الملف مباشرةً. لا يأخذ في الاعتبار إعدادات المساحة المشتركة أو قواعد منع فقدان البيانات (DLP). لمزيد من المعلومات، يُرجى الاطّلاع على لمحة عن ميزة "منع فقدان البيانات".

إذا عدّلت الحقل itemDownloadRestriction من خلال ضبط الحقل restrictedForWriters على true، يعني ذلك أنّ restrictedForReaders هو true. وبالمثل، فإنّ ضبط restrictedForWriters على true وrestrictedForReaders على false يعادل ضبط كل من restrictedForWriters وrestrictedForReaders على true.

بالنسبة إلى الحقل effectiveDownloadRestrictionWithContext، يتم تطبيق قيود التنزيل على الملف، ويراعي جميع إعدادات القيود وقواعد منع فقدان البيانات.

يمكن ضبط الحقل effectiveDownloadRestrictionWithContext على restrictedForWriters أو restrictedForReaders. إذا كانت هناك أي إعدادات تقييد للتنزيل أو النسخ للأدوار المعنية من إعدادات الملف أو إعدادات مساحة التخزين السحابي المشتركة أو قواعد "منع فقدان البيانات" (بما في ذلك تلك التي تتضمّن سياقًا)، يتم ضبط القيمة على true، وإلا تكون false.

التوافق مع الإصدارات السابقة

ننصحك باستخدام العنصر DownloadRestriction لفرض الطريقة التي يمكن للمستخدمين من خلالها تنزيل الملفات وطباعتها ونسخها.

إذا كنت تريد استخدام حقل copyRequiresWriterPermission من النوع المنطقي، ستختلف الوظيفة عند القراءة من الحقل والكتابة فيه.

تعكس القيمة التي تم استردادها للحقل copyRequiresWriterPermission ما إذا كان بإمكان المستخدمين الذين لديهم الإذن role=commenter أو role=reader تنزيل الملفات أو طباعتها أو نسخها في Drive. تعكس قيمة الحقل مجموعة إعدادات الملف أو إعدادات مساحة التخزين السحابي المشتركة أو قواعد منع فقدان البيانات. ومع ذلك، لا يشمل ذلك تقييم السياق لقواعد "منع فقدان البيانات".

يؤدي ضبط الحقل copyRequiresWriterPermission على false إلى تعديل الحقلين restrictedForWriters وrestrictedForReaders إلى false. وهذا يعني أنّه ستتم إزالة إعدادات القيود المفروضة على التنزيل أو النسخ لجميع المستخدمين.

الحقول التي تتحكّم في ميزات التنزيل والطباعة والنسخ

يسرد الجدول التالي حقول موارد files التي تؤثّر في وظائف التنزيل والطباعة والنسخ:

الحقل الوصف الإصدار
capabilities.canCopy تُستخدَم لتحديد ما إذا كان بإمكان المستخدم الحالي نسخ ملف. الإصداران 2 و3
capabilities.canDownload تُستخدَم لتحديد ما إذا كان بإمكان المستخدم الحالي تنزيل ملف. الإصداران 2 و3
capabilities.canChangeCopyRequiresWriterPermission تحدّد هذه السمة ما إذا كان بإمكان المستخدم الحالي تغيير قيود copyRequiresWriterPermission لملف. الإصداران 2 و3
capabilities.canChangeItemDownloadRestriction تُستخدَم لتحديد ما إذا كان بإمكان المستخدم الحالي تغيير قيود تنزيل ملف. الإصدار 3 فقط
copyRequiresWriterPermission تحديد ما إذا كان يجب إيقاف خيارات نسخ هذا الملف أو طباعته أو تنزيله للقراء والمعلّقين الإصداران 2 و3
downloadRestrictions قيود التنزيل المطبَّقة على ملف الإصدار 3 فقط