def remove_markings(obj, marking): """ Remove an object level marking from the object_marking_refs collection. Args: obj: A SDO or SRO object. marking: identifier or list of identifiers that apply to the SDO or SRO object. Raises: MarkingNotFoundError: If markings to remove are not found on the provided SDO or SRO. Returns: A new version of the given SDO or SRO with specified markings removed. """ marking = utils.convert_to_marking_list(marking) object_markings = obj.get('object_marking_refs', []) if not object_markings: return obj if any(x not in obj['object_marking_refs'] for x in marking): raise exceptions.MarkingNotFoundError(obj, marking) new_markings = [x for x in object_markings if x not in marking] if new_markings: return new_version(obj, object_marking_refs=new_markings, allow_custom=True) else: return new_version(obj, object_marking_refs=None, allow_custom=True)
def add_markings(obj, marking, selectors): """ Appends a granular_marking to the granular_markings collection. Args: obj: An SDO or SRO object. selectors: list of type string, selectors must be relative to the TLO in which the properties appear. marking: identifier or list of marking identifiers that apply to the properties selected by `selectors`. Raises: InvalidSelectorError: If `selectors` fail validation. Returns: A new version of the given SDO or SRO with specified markings added. """ selectors = utils.convert_to_list(selectors) marking = utils.convert_to_marking_list(marking) utils.validate(obj, selectors) granular_marking = [] for m in marking: granular_marking.append({ "marking_ref": m, "selectors": sorted(selectors) }) if obj.get("granular_markings"): granular_marking.extend(obj.get("granular_markings")) granular_marking = utils.expand_markings(granular_marking) granular_marking = utils.compress_markings(granular_marking) return new_version(obj, granular_markings=granular_marking)
def remove_markings(obj, marking, selectors): """ Remove a granular marking from the granular_markings collection. The method makes a best-effort attempt to distinguish between a marking-definition or language granular marking. Args: obj: An SDO or SRO object. marking: identifier or list of marking identifiers that apply to the properties selected by `selectors`. selectors: string or list of selectors strings relative to the SDO or SRO in which the properties appear. Raises: InvalidSelectorError: If `selectors` fail validation. MarkingNotFoundError: If markings to remove are not found on the provided SDO or SRO. Returns: A new version of the given SDO or SRO with specified markings removed. """ selectors = utils.convert_to_list(selectors) marking = utils.convert_to_marking_list(marking) utils.validate(obj, selectors) granular_markings = obj.get('granular_markings') if not granular_markings: return obj granular_markings = utils.expand_markings(granular_markings) to_remove = [] for m in marking: if is_marking(m): to_remove.append({'marking_ref': m, 'selectors': selectors}) else: to_remove.append({'lang': m, 'selectors': selectors}) remove = utils.build_granular_marking(to_remove).get('granular_markings') if not any(marking in granular_markings for marking in remove): raise exceptions.MarkingNotFoundError(obj, remove) granular_markings = [m for m in granular_markings if m not in remove] granular_markings = utils.compress_markings(granular_markings) if granular_markings: return new_version(obj, granular_markings=granular_markings, allow_custom=True) else: return new_version(obj, granular_markings=None, allow_custom=True)
def remove_markings(obj, marking, selectors): """ Removes granular_marking from the granular_markings collection. Args: obj: An SDO or SRO object. selectors: string or list of selectors strings relative to the SDO or SRO in which the properties appear. marking: identifier or list of marking identifiers that apply to the properties selected by `selectors`. Raises: InvalidSelectorError: If `selectors` fail validation. MarkingNotFoundError: If markings to remove are not found on the provided SDO or SRO. Returns: A new version of the given SDO or SRO with specified markings removed. """ selectors = utils.convert_to_list(selectors) marking = utils.convert_to_marking_list(marking) utils.validate(obj, selectors) granular_markings = obj.get("granular_markings") if not granular_markings: return obj granular_markings = utils.expand_markings(granular_markings) to_remove = [] for m in marking: to_remove.append({"marking_ref": m, "selectors": selectors}) remove = utils.build_granular_marking(to_remove).get("granular_markings") if not any(marking in granular_markings for marking in remove): raise exceptions.MarkingNotFoundError(obj, remove) granular_markings = [m for m in granular_markings if m not in remove] granular_markings = utils.compress_markings(granular_markings) if granular_markings: return new_version(obj, granular_markings=granular_markings) else: return new_version(obj, granular_markings=None)
def add_markings(obj, marking): """ Append an object level marking to the object_marking_refs collection. Args: obj: A SDO or SRO object. marking: identifier or list of identifiers to apply SDO or SRO object. Returns: A new version of the given SDO or SRO with specified markings added. """ marking = utils.convert_to_marking_list(marking) object_markings = set(obj.get('object_marking_refs', []) + marking) return new_version(obj, object_marking_refs=list(object_markings), allow_custom=True)
def add_markings(obj, marking, selectors): """ Append a granular marking to the granular_markings collection. The method makes a best-effort attempt to distinguish between a marking-definition or language granular marking. Args: obj: An SDO or SRO object. marking: identifier or list of marking identifiers that apply to the properties selected by `selectors`. selectors: list of type string, selectors must be relative to the TLO in which the properties appear. Raises: InvalidSelectorError: If `selectors` fail validation. Returns: A new version of the given SDO or SRO with specified markings added. """ selectors = utils.convert_to_list(selectors) marking = utils.convert_to_marking_list(marking) utils.validate(obj, selectors) granular_marking = [] for m in marking: if is_marking(m): granular_marking.append({ 'marking_ref': m, 'selectors': sorted(selectors) }) else: granular_marking.append({ 'lang': m, 'selectors': sorted(selectors) }) if obj.get('granular_markings'): granular_marking.extend(obj.get('granular_markings')) granular_marking = utils.expand_markings(granular_marking) granular_marking = utils.compress_markings(granular_marking) return new_version(obj, granular_markings=granular_marking, allow_custom=True)
def is_marked(obj, marking=None): """ Check if SDO or SRO is marked by any marking or by specific marking(s). Args: obj: A SDO or SRO object. marking: identifier or list of marking identifiers that apply to the SDO or SRO object. Returns: bool: True if SDO or SRO has object level markings. False otherwise. Note: When an identifier or list of identifiers is provided, if ANY of the provided marking refs match, True is returned. """ marking = utils.convert_to_marking_list(marking) object_markings = obj.get('object_marking_refs', []) if marking: return any(x in object_markings for x in marking) else: return bool(object_markings)
def is_marked(obj, marking=None, selectors=None, inherited=False, descendants=False): """ Check if field is marked by any marking or by specific marking(s). Args: obj: An SDO or SRO object. marking: identifier or list of marking identifiers that apply to the properties selected by `selectors`. selectors: string or list of selectors strings relative to the SDO or SRO in which the properties appear. inherited: If True, return markings inherited from the given selector. descendants: If True, return granular markings applied to any children of the given selector. Raises: InvalidSelectorError: If `selectors` fail validation. Returns: bool: True if ``selectors`` is found on internal SDO or SRO collection. False otherwise. Note: When a list of marking identifiers is provided, if ANY of the provided marking identifiers match, True is returned. """ if selectors is None: raise TypeError("Required argument 'selectors' must be provided") selectors = utils.convert_to_list(selectors) marking = utils.convert_to_marking_list(marking) utils.validate(obj, selectors) granular_markings = obj.get('granular_markings', []) marked = False markings = set() for granular_marking in granular_markings: for user_selector in selectors: for marking_selector in granular_marking.get('selectors', []): if any([ (user_selector == marking_selector ), # Catch explicit selectors. (user_selector.startswith(marking_selector) and inherited), # Catch inherited selectors. (marking_selector.startswith(user_selector) and descendants), ]): # Catch descendants selectors marking_ref = granular_marking.get('marking_ref', '') if marking and any(x == marking_ref for x in marking): markings.update([marking_ref]) marked = True if marking: # All user-provided markings must be found. return markings.issuperset(set(marking)) return marked