def check(self, _file, stash): res = [] items = stash.GetItemsFor(filename=_file, classifier=Variable.CLASSIFIER, attribute=Variable.ATTR_VAR, attributeValue='SRC_URI') _fetcher = [] for item in items: if any([item.Flag.endswith(x) for x in ['md5sum', 'sha256sum']]): # These are just the hashes continue lines = [y.strip('"') for y in item.get_items() if y] for x in lines: if x == INLINE_BLOCK: _fetcher.append(('inline', item.InFileLine)) continue _url = get_scr_components(x) if _url['scheme']: _fetcher.append((_url['scheme'], item.InFileLine)) if _fetcher: if any(x[0] != 'file' for x in _fetcher) and _fetcher[0][0] == 'file': res += self.finding(item.Origin, _fetcher[0][1]) return res
def check(self, _file, stash): res = [] items = stash.GetItemsFor(filename=_file, classifier=Variable.CLASSIFIER, attribute=Variable.ATTR_VAR, attributeValue='SRC_URI') for item in items: if any([item.Flag.endswith(x) for x in ['md5sum', 'sha256sum']]): # These are just the hashes continue lines = [y.strip('"') for y in item.get_items() if y] for x in lines: if x == INLINE_BLOCK: continue _url = get_scr_components(x) if _url['scheme'] in ['git'] and 'tag' in _url['options']: _srcrevs = stash.GetItemsFor( filename=_file, classifier=Variable.CLASSIFIER, attribute=Variable.ATTR_VAR, attributeValue='SRCREV') if 'name' in _url['options']: _srcrevs = [ x for x in _srcrevs if _url['options']['name'] in x.SubItems ] else: _srcrevs = [x for x in _srcrevs if not x.SubItems] if any(_srcrevs): res += self.finding(item.Origin, item.InFileLine) return res
def check(self, _file, stash): res = [] items = stash.GetItemsFor(filename=_file, classifier=Variable.CLASSIFIER, attribute=Variable.ATTR_VAR) needles = ["SRC_URI"] for i in [x for x in items if x.VarName in needles]: for x in i.get_items(): _comp = get_scr_components(x) if "${PN}" in _comp["src"]: res += self.finding(i.Origin, i.InFileLine) return res
def check(self, _file, stash): res = [] items = stash.GetItemsFor(filename=_file, classifier=Variable.CLASSIFIER, attribute=Variable.ATTR_VAR, attributeValue="BUGTRACKER") for i in items: val = i.VarValueStripped try: result = get_scr_components(val) if not result["scheme"] or not result["src"]: raise Exception() except Exception: res += self.finding(i.Origin, i.InFileLine) return res
def check(self, _file, stash): res = [] items = stash.GetItemsFor(filename=_file, classifier=Variable.CLASSIFIER, attribute=Variable.ATTR_VAR) needles = ['SRC_URI', 'S'] for i in [x for x in items if x.VarName in needles]: for x in i.get_items(): if i.VarName == 'SRC_URI': _haystack = get_scr_components(x)['src'] else: _haystack = x if '${P}' in _haystack: res += self.finding(i.Origin, i.InFileLine) return res
def check(self, _file, stash): res = [] _items = stash.GetItemsFor(filename=_file, classifier=Variable.CLASSIFIER, attribute=Variable.ATTR_VAR, attributeValue="SRC_URI") for i in _items: for f in [x.strip('"') for x in i.get_items() if x]: if f == INLINE_BLOCK: continue components = get_scr_components(f) if components["scheme"] == "file": if any([x for x in ["*"] if x in components["src"]]): res += self.finding(i.Origin, i.InFileLine) return res
def check(self, _file, stash): res = [] items = stash.GetItemsFor(filename=_file, classifier=Variable.CLASSIFIER, attribute=Variable.ATTR_VAR, attributeValue='LIC_FILES_CHKSUM') for i in items: for listitem in i.get_items(): _comp = get_scr_components(listitem) _prefix = os.path.dirname(_comp['src']) if _prefix in ['${S}']: res += self.finding( i.Origin, i.InFileLine, override_msg=self.Msg.format(PATH=_prefix)) return res
def check(self, _file, stash): res = [] _items = stash.GetItemsFor(filename=_file, classifier=Variable.CLASSIFIER, attribute=Variable.ATTR_VAR, attributeValue='LIC_FILES_CHKSUM') _var_whitelist = ['${WORKDIR}', '${S}', '${B}'] for i in _items: components = get_scr_components( expand_term(stash, _file, i.VarValueStripped)) if any(components) and components['scheme'] == 'file': _clean = components['src'] for x in _var_whitelist: _clean = _clean.replace(x, '') if '${' in _clean: res += self.finding(i.Origin, i.InFileLine) return res
def check(self, _file, stash): res = [] _items = stash.GetItemsFor(filename=_file, classifier=Variable.CLASSIFIER, attribute=Variable.ATTR_VAR, attributeValue="LIC_FILES_CHKSUM") _var_whitelist = ["${WORKDIR}", "${S}", "${B}"] for i in _items: components = get_scr_components( expand_term(stash, _file, i.VarValueStripped)) if any(components) and components["scheme"] == "file": _clean = components["src"] for x in _var_whitelist: _clean = _clean.replace(x, "") if "${" in _clean: res += self.finding(i.Origin, i.InFileLine) return res
def check(self, _file, stash): res = [] items = stash.GetItemsFor(filename=_file, classifier=Variable.CLASSIFIER, attribute=Variable.ATTR_VAR, attributeValue="SRC_URI") _domains = set() for i in items: for u in [x.strip('"').strip() for x in i.get_items()]: if u == INLINE_BLOCK: continue _url = get_scr_components(u) if _url["scheme"] and _url["scheme"] not in ["file"]: _domains.add(_url["src"].split("/")[0]) if len(_domains) > 1: res += self.finding(i.Origin, i.InFileLine) return res
def check(self, _file, stash): res = [] items = stash.GetItemsFor(filename=_file, classifier=Variable.CLASSIFIER, attribute=Variable.ATTR_VAR, attributeValue="SRC_URI") for i in items: if any([i.Flag.endswith(x) for x in ["md5sum", "sha256sum"]]): # These are just the hashes continue lines = [y.strip('"') for y in i.get_items() if y] for x in lines: if x == INLINE_BLOCK: continue _url = get_scr_components(x) if _url["scheme"] in ["git"] and "tag" in _url["options"]: res += self.finding(i.Origin, i.InFileLine) return res
def check(self, _file, stash): res = [] items = stash.GetItemsFor(filename=_file, classifier=Variable.CLASSIFIER, attribute=Variable.ATTR_VAR, attributeValue='SRC_URI') _domains = set() for item in items: for u in [x.strip('\'').strip() for x in item.get_items()]: if u == INLINE_BLOCK: continue _url = get_scr_components(u) if _url['scheme'] and _url['scheme'] not in ['file']: _domains.add(_url['src'].split('/')[0]) if len(_domains) > 1: res += self.finding(item.Origin, item.InFileLine) return res
def __analyse(self, item, _input, _index): _url = get_scr_components(_input) res = [] if 'scheme' not in _url: return res # pragma: no cover # For certain types of file:// url parsing fails # ignore those if _url['scheme'] not in self._valid_options.keys() and not _input.strip().startswith('file://') and _url['scheme']: res += self.finding(item.Origin, item.InFileLine + _index, 'Fetcher \'{a}\' is not known'.format(a=_url['scheme'])) else: for k, v in _url['options'].items(): if _url['scheme'] not in self._valid_options: continue # pragma: no cover if k == 'type' and v == 'kmeta': continue # linux-yocto uses this option to indicate kernel metadata sources if k not in self._valid_options[_url['scheme']] + self._general_options: res += self.finding(item.Origin, item.InFileLine + _index, 'Option \'{a}\' is not known with this fetcher type'.format(a=k)) return res
def check(self, _file, stash): res = [] items = stash.GetItemsFor(filename=_file, classifier=Variable.CLASSIFIER, attribute=Variable.ATTR_VAR, attributeValue='SRC_URI') _pv = expand_term(stash, _file, '${PV}') or guess_recipe_version(_file) for i in items: for item in [expand_term(stash, _file, x) for x in i.get_items()]: _scrcomp = get_scr_components(item) if _scrcomp.get('scheme', '') in ['https', 'http', 'ftp']: _src = _scrcomp.get('src', '') _dfn = _scrcomp.get('options', {}).get( 'downloadfilename', '') if _pv not in _src: if _dfn and _pv in _dfn: continue res += self.finding(i.Origin, i.InFileLine) return res
def __analyse(self, item, _input, _index): _url = get_scr_components(_input) res = [] if 'scheme' not in _url: return res # pragma: no cover # For certain types of file:// url parsing fails # ignore those if _url['scheme'] not in self._valid_options.keys( ) and not _input.strip().startswith('file://') and _url['scheme']: res += self.finding( item.Origin, item.InFileLine + _index, 'Fetcher \'{a}\' is not known'.format(a=_url['scheme'])) else: for k, v in _url['options'].items(): if _url['scheme'] not in self._valid_options: continue # pragma: no cover if k == 'type' and v == 'kmeta': continue # linux-yocto uses this option to indicate kernel metadata sources if k not in self._valid_options[ _url['scheme']] + self._general_options: res += self.finding( item.Origin, item.InFileLine + _index, 'Option \'{a}\' is not known with this fetcher type'. format(a=k)) for opt in self._required_might_options.get(_url['scheme'], []): if opt not in _url['options']: res += self.finding( item.Origin, item.InFileLine + _index, 'Fetcher \'{fetcher}\' might require option \'{option}\' to be set' .format(fetcher=_url['scheme'], option=opt)) for key, val in self._required_unless_options.get( _url['scheme'], {}).items(): if key not in _url['options'] and not any(x in _url['options'] for x in val): res += self.finding( item.Origin, item.InFileLine + _index, 'Fetcher \'{fetcher}\' requires option \'{option}\' or any of \'{other}\' to be set' .format(fetcher=_url['scheme'], option=key, other=','.join(val))) return res
def __analyse(self, i, _input, _index): _url = get_scr_components(_input) res = [] if "scheme" not in _url: return res # For certain types of file:// url parsing fails # ignore those if _url["scheme"] not in self._valid_options.keys() and \ not _input.strip().startswith("file://") and _url["scheme"]: res += self.finding( i.Origin, i.InFileLine + _index, "Fetcher '{}' is not known".format(_url["scheme"])) else: for k, _ in _url["options"].items(): if _url["scheme"] not in self._valid_options: continue if k not in self._valid_options[ _url["scheme"]] + self._general_options: res += self.finding( i.Origin, i.InFileLine + _index, "Option '{}' is not known with this fetcher type". format(k)) return res
def check(self, _file, stash): res = [] items = stash.GetItemsFor(filename=_file, classifier=Variable.CLASSIFIER, attribute=Variable.ATTR_VAR, attributeValue="SRC_URI") _fetcher = [] for i in items: if any([i.Flag.endswith(x) for x in ["md5sum", "sha256sum"]]): # These are just the hashes continue lines = [y.strip('"') for y in i.get_items() if y] for x in lines: if x == INLINE_BLOCK: _fetcher.append(("inline", i.InFileLine)) continue _url = get_scr_components(x) _fetcher.append((_url["scheme"], i.InFileLine)) if _fetcher: if any(x[0] != "file" for x in _fetcher) and _fetcher[0][0] == "file": res += self.finding(i.Origin, _fetcher[0][1]) return res