Package: release.debian.org Severity: normal User: [email protected] Usertags: unblock
Please unblock package fdroidserver F-Droid is built on Debian and is a community with the same goals as Debian, modeled after Debian. The F-Droid community maintains stable release branches for fdroidserver that are devoted to each Debian release. buster has 1.1.x and bullseye has 2.0.x. I am both package maintainer and upstream on this package, and a Debian Developer. The 2.0.1 release includes only narrow bug and compatibility fixes. This package has an extensive autopkgtest suite. These are specific issues that are fixed: * corrupt app icons are published, instead of valid PNGs #987717 * stop setting up source repo when running lint/rewritemeta https://gitlab.com/fdroid/fdroidserver/commit/92438bbf78532b89fb7619601cf75c95e7d7f0a0 * use latest SPDX license info https://gitlab.com/fdroid/fdroidserver/commit/eca7b23fc9f742d9420ec068cf0d60e5bdcf497e * crash on bad fastlane/triple-t files https://gitlab.com/fdroid/fdroidserver/commit/cfbee12ad2a1385aaf0aa7d9076924373639d189 * crash on bad repo file: https://gitlab.com/fdroid/fdroidserver/commit/240139baf9778536251b9deee4c0e071a2333ebb Previous stable updates to fdroidserver are here: * #960885 * #935809 * #856358 * #773166 -------------------------------------------------------------------- Here's the debdiff, note that the majority of the changes are to test files, which are also part of the autopkgtest run: diff -Nru fdroidserver-2.0/CHANGELOG.md fdroidserver-2.0.1/CHANGELOG.md --- fdroidserver-2.0/CHANGELOG.md 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/CHANGELOG.md 2021-03-09 18:21:30.000000000 +0100 @@ -4,6 +4,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) +## [2.0.1] - 2020-03-09 + +### Fixed + +* metadata: stop setting up source repo when running lint/rewritemeta +* scanner: show error if scan_binary fails to run apkanalyzer +* common: properly parse version from NDK's source.properties +* update: stop extracting and storing XML icons, they're useless +* index: raise error rather than crash on bad repo file +* update: handle large, corrupt, or inaccessible fastlane/triple-t files +* Update SPDX License List +* checkupdates: set User-Agent to make gitlab.com happy +* Run push_binary_transparency only once + ## [2.0] - 2020-01-31 For a more complete overview, see the [2.0 diff -Nru fdroidserver-2.0/debian/changelog fdroidserver-2.0.1/debian/changelog --- fdroidserver-2.0/debian/changelog 2021-02-02 13:28:22.000000000 +0100 +++ fdroidserver-2.0.1/debian/changelog 2021-03-09 18:26:20.000000000 +0100 @@ -1,3 +1,9 @@ +fdroidserver (2.0.1-1) unstable; urgency=medium + + * New upstream version 2.0.1 + + -- Hans-Christoph Steiner <[email protected]> Tue, 09 Mar 2021 18:26:20 +0100 + fdroidserver (2.0-1) unstable; urgency=medium * New upstream version 2.0 diff -Nru fdroidserver-2.0/examples/fdroid_fetchsrclibs.py fdroidserver-2.0.1/examples/fdroid_fetchsrclibs.py --- fdroidserver-2.0/examples/fdroid_fetchsrclibs.py 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/examples/fdroid_fetchsrclibs.py 2021-03-09 18:21:30.000000000 +0100 @@ -21,7 +21,7 @@ options = parser.parse_args() common.options = options pkgs = common.read_pkg_args(options.appid, True) - allapps = metadata.read_metadata(pkgs) + allapps = metadata.read_metadata(pkgs, check_vcs=True) apps = common.read_app_args(options.appid, allapps, True) srclib_dir = os.path.join('build', 'srclib') os.makedirs(srclib_dir, exist_ok=True) diff -Nru fdroidserver-2.0/fdroidserver/build.py fdroidserver-2.0.1/fdroidserver/build.py --- fdroidserver-2.0/fdroidserver/build.py 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/fdroidserver/build.py 2021-03-09 18:21:30.000000000 +0100 @@ -1013,7 +1013,7 @@ # Read all app and srclib metadata pkgs = common.read_pkg_args(options.appid, True) - allapps = metadata.read_metadata(pkgs, options.refresh, sort_by_time=True) + allapps = metadata.read_metadata(pkgs, options.refresh, sort_by_time=True, check_vcs=True) apps = common.read_app_args(options.appid, allapps, True) for appid, app in list(apps.items()): diff -Nru fdroidserver-2.0/fdroidserver/checkupdates.py fdroidserver-2.0.1/fdroidserver/checkupdates.py --- fdroidserver-2.0/fdroidserver/checkupdates.py 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/fdroidserver/checkupdates.py 2021-03-09 18:21:30.000000000 +0100 @@ -35,6 +35,7 @@ from . import _ from . import common from . import metadata +from . import net from .exception import VCSException, NoSubmodulesException, FDroidException, MetaDataException @@ -63,7 +64,7 @@ vercode = None if len(urlcode) > 0: logging.debug("...requesting {0}".format(urlcode)) - req = urllib.request.Request(urlcode, None) + req = urllib.request.Request(urlcode, None, headers=net.HEADERS) resp = urllib.request.urlopen(req, None, 20) # nosec B310 scheme is filtered above page = resp.read().decode('utf-8') diff -Nru fdroidserver-2.0/fdroidserver/common.py fdroidserver-2.0.1/fdroidserver/common.py --- fdroidserver-2.0/fdroidserver/common.py 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/fdroidserver/common.py 2021-03-09 18:21:30.000000000 +0100 @@ -3819,7 +3819,7 @@ with open(ndk_release_txt, 'r') as fp: components.append((os.path.basename(ndk_path), fp.read()[:-1])) - pattern = re.compile('^Pkg.Revision=(.+)', re.MULTILINE) + pattern = re.compile(r'^Pkg.Revision *= *(.+)', re.MULTILINE) for root, dirs, files in os.walk(sdk_path): if 'source.properties' in files: source_properties = os.path.join(root, 'source.properties') diff -Nru fdroidserver-2.0/fdroidserver/deploy.py fdroidserver-2.0.1/fdroidserver/deploy.py --- fdroidserver-2.0/fdroidserver/deploy.py 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/fdroidserver/deploy.py 2021-03-09 18:21:30.000000000 +0100 @@ -802,10 +802,10 @@ if config.get('virustotal_apikey'): upload_to_virustotal(repo_section, config.get('virustotal_apikey')) - binary_transparency_remote = config.get('binary_transparency_remote') - if binary_transparency_remote: - push_binary_transparency(BINARY_TRANSPARENCY_DIR, - binary_transparency_remote) + binary_transparency_remote = config.get('binary_transparency_remote') + if binary_transparency_remote: + push_binary_transparency(BINARY_TRANSPARENCY_DIR, + binary_transparency_remote) if config.get('wiki_server') and config.get('wiki_path'): update_wiki() diff -Nru fdroidserver-2.0/fdroidserver/lint.py fdroidserver-2.0.1/fdroidserver/lint.py --- fdroidserver-2.0/fdroidserver/lint.py 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/fdroidserver/lint.py 2021-03-09 18:21:30.000000000 +0100 @@ -683,6 +683,7 @@ 'Artistic-1.0-cl8', 'Artistic-2.0', 'Beerware', + 'BSD-1-Clause', 'BSD-2-Clause', 'BSD-2-Clause-FreeBSD', 'BSD-2-Clause-Patent', @@ -692,6 +693,8 @@ 'BSD-4-Clause', 'BSL-1.0', 'BitTorrent-1.1', + 'CAL-1.0', + 'CAL-1.0-Combined-Work-Exception', 'CATOSL-1.1', 'CC-BY-4.0', 'CC-BY-SA-4.0', @@ -763,6 +766,7 @@ 'MS-RL', 'MirOS', 'Motosoto', + 'MulanPSL-2.0', 'Multics', 'NASA-1.3', 'NCSA', @@ -778,9 +782,12 @@ 'ODbL-1.0', 'OFL-1.0', 'OFL-1.1', + 'OFL-1.1-RFN', + 'OFL-1.1-no-RFN', 'OGTSL', 'OLDAP-2.3', 'OLDAP-2.7', + 'OLDAP-2.8', 'OSET-PL-2.1', 'OSL-1.0', 'OSL-1.1', @@ -804,7 +811,9 @@ 'SPL-1.0', 'SimPL-2.0', 'Sleepycat', + 'UCL-1.0', 'UPL-1.0', + 'Unicode-DFS-2016', 'Unlicense', 'VSL-1.0', 'Vim', diff -Nru fdroidserver-2.0/fdroidserver/metadata.py fdroidserver-2.0.1/fdroidserver/metadata.py --- fdroidserver-2.0/fdroidserver/metadata.py 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/fdroidserver/metadata.py 2021-03-09 18:21:30.000000000 +0100 @@ -541,7 +541,7 @@ srclibs[srclibname] = parse_yaml_srclib(metadatapath) -def read_metadata(appids={}, refresh=True, sort_by_time=False): +def read_metadata(appids={}, refresh=True, sort_by_time=False, check_vcs=False): """Return a list of App instances sorted newest first This reads all of the metadata files in a 'data' repository, then @@ -597,7 +597,7 @@ if appid in apps: _warn_or_exception(_("Found multiple metadata files for {appid}") .format(appid=appid)) - app = parse_metadata(metadatapath, appid in appids, refresh) + app = parse_metadata(metadatapath, check_vcs, refresh) check_metadata(app) apps[app.id] = app diff -Nru fdroidserver-2.0/fdroidserver/scanner.py fdroidserver-2.0.1/fdroidserver/scanner.py --- fdroidserver-2.0/fdroidserver/scanner.py 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/fdroidserver/scanner.py 2021-03-09 18:21:30.000000000 +0100 @@ -106,6 +106,9 @@ logging.info("Scanning APK for known non-free classes.") result = common.SdkToolsPopen(["apkanalyzer", "dex", "packages", "--defined-only", apkfile], output=False) problems = 0 + if result.returncode != 0: + problems += 1 + logging.error(result.output) for suspect, regexp in CODE_SIGNATURES.items(): matches = regexp.findall(result.output) if matches: diff -Nru fdroidserver-2.0/fdroidserver/update.py fdroidserver-2.0.1/fdroidserver/update.py --- fdroidserver-2.0/fdroidserver/update.py 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/fdroidserver/update.py 2021-03-09 18:21:30.000000000 +0100 @@ -768,23 +768,41 @@ def _set_localized_text_entry(app, locale, key, f): - limit = config['char_limits'][key] - localized = _get_localized_dict(app, locale) - with open(f, errors='replace') as fp: - text = fp.read()[:limit] - if len(text) > 0: - if key in ('name', 'summary', 'video'): # hardcoded as a single line - localized[key] = text.strip('\n') - else: - localized[key] = text + """Read a fastlane/triple-t metadata file and add an entry to the app + + This reads more than the limit, in case there is leading or + trailing whitespace to be stripped + + """ + try: + limit = config['char_limits'][key] + localized = _get_localized_dict(app, locale) + with open(f, errors='replace') as fp: + text = fp.read(limit * 2) + if len(text) > 0: + if key in ('name', 'summary', 'video'): # hardcoded as a single line + localized[key] = text.strip('\n')[:limit] + else: + localized[key] = text[:limit] + except Exception as e: + logging.error(_('{path}: {error}').format(path=f, error=str(e))) def _set_author_entry(app, key, f): - limit = config['char_limits']['author'] - with open(f, errors='replace') as fp: - text = fp.read()[:limit] - if len(text) > 0: - app[key] = text.strip() + """read a fastlane/triple-t author file and add the entry to the app + + This reads more than the limit, in case there is leading or + trailing whitespace to be stripped + + """ + try: + limit = config['char_limits']['author'] + with open(f, errors='replace') as fp: + text = fp.read(limit * 2) + if len(text) > 0: + app[key] = text.strip()[:limit] + except Exception as e: + logging.error(_('{path}: {error}').format(path=f, error=str(e))) def _strip_and_copy_image(in_file, outpath): @@ -1396,7 +1414,7 @@ """ icons_src = dict() - density_re = re.compile(r'^res/(.*)/{}\.(png|xml)$'.format(icon_name)) + density_re = re.compile(r'^res/(.*)/{}\.png$'.format(icon_name)) with zipfile.ZipFile(apkfile) as zf: for filename in zf.namelist(): m = density_re.match(filename) @@ -1659,7 +1677,7 @@ .format(apkfilename=apkfile) + str(e)) # extract icons from APK zip file - iconfilename = "%s.%s" % (apk['packageName'], apk['versionCode']) + iconfilename = "%s.%s.png" % (apk['packageName'], apk['versionCode']) try: empty_densities = extract_apk_icons(iconfilename, apk, apkzip, repodir) finally: @@ -1746,8 +1764,6 @@ if m and m.group(4) == 'png': density = screen_resolutions[m.group(2)] pngs[m.group(3) + '/' + density] = m.group(0) - - icon_type = None empty_densities = [] for density in screen_densities: if density not in apk['icons_src']: @@ -1755,7 +1771,7 @@ continue icon_src = apk['icons_src'][density] icon_dir = get_icon_dir(repo_dir, density) - icon_type = '.png' + icon_dest = os.path.join(icon_dir, icon_filename) # Extract the icon files per density if icon_src.endswith('.xml'): @@ -1766,48 +1782,44 @@ icon_src = name if icon_src.endswith('.xml'): empty_densities.append(density) - icon_type = '.xml' - icon_dest = os.path.join(icon_dir, icon_filename + icon_type) - + continue try: with open(icon_dest, 'wb') as f: f.write(get_icon_bytes(apkzip, icon_src)) - apk['icons'][density] = icon_filename + icon_type + apk['icons'][density] = icon_filename except (zipfile.BadZipFile, ValueError, KeyError) as e: logging.warning("Error retrieving icon file: %s %s", icon_dest, e) del apk['icons_src'][density] empty_densities.append(density) # '-1' here is a remnant of the parsing of aapt output, meaning "no DPI specified" - if '-1' in apk['icons_src']: + if '-1' in apk['icons_src'] and not apk['icons_src']['-1'].endswith('.xml'): icon_src = apk['icons_src']['-1'] - icon_type = icon_src[-4:] - icon_path = os.path.join(get_icon_dir(repo_dir, '0'), icon_filename + icon_type) + icon_path = os.path.join(get_icon_dir(repo_dir, '0'), icon_filename) with open(icon_path, 'wb') as f: f.write(get_icon_bytes(apkzip, icon_src)) - if icon_type == '.png': - im = None - try: - im = Image.open(icon_path) - dpi = px_to_dpi(im.size[0]) - for density in screen_densities: - if density in apk['icons']: - break - if density == screen_densities[-1] or dpi >= int(density): - apk['icons'][density] = icon_filename + icon_type - shutil.move(icon_path, - os.path.join(get_icon_dir(repo_dir, density), icon_filename + icon_type)) - empty_densities.remove(density) - break - except Exception as e: - logging.warning(_("Failed reading {path}: {error}") - .format(path=icon_path, error=e)) - finally: - if im and hasattr(im, 'close'): - im.close() + im = None + try: + im = Image.open(icon_path) + dpi = px_to_dpi(im.size[0]) + for density in screen_densities: + if density in apk['icons']: + break + if density == screen_densities[-1] or dpi >= int(density): + apk['icons'][density] = icon_filename + shutil.move(icon_path, + os.path.join(get_icon_dir(repo_dir, density), icon_filename)) + empty_densities.remove(density) + break + except Exception as e: + logging.warning(_("Failed reading {path}: {error}") + .format(path=icon_path, error=e)) + finally: + if im and hasattr(im, 'close'): + im.close() if apk['icons']: - apk['icon'] = icon_filename + icon_type + apk['icon'] = icon_filename return empty_densities @@ -1822,7 +1834,6 @@ :param repo_dir: The directory of the APK's repository """ - icon_filename += '.png' # First try resizing down to not lose quality last_density = None for density in screen_densities: @@ -2297,7 +2308,13 @@ options.use_date_from_apk) cachechanged = cachechanged or fcachechanged apks += files + appid_has_apks = set() + appid_has_repo_files = set() for apk in apks: + if apk['apkName'].endswith('.apk'): + appid_has_apks.add(apk['packageName']) + else: + appid_has_repo_files.add(apk['packageName']) if apk['packageName'] not in apps: if options.create_metadata: create_metadata_from_template(apk) @@ -2316,6 +2333,15 @@ else: logging.warning(msg + '\n\t' + _('Use `fdroid update -c` to create it.')) + mismatch_errors = '' + for appid in appid_has_apks: + if appid in appid_has_repo_files: + appid_files = ', '.join(glob.glob(os.path.join('repo', appid + '_[0-9]*.*'))) + mismatch_errors += (_('{appid} has both APKs and files: {files}') + .format(appid=appid, files=appid_files)) + '\n' + if mismatch_errors: + raise FDroidException(mismatch_errors) + # Scan the archive repo for apks as well if len(repodirs) > 1: archapks, cc = process_apks(apkcache, repodirs[1], knownapks, options.use_date_from_apk) diff -Nru fdroidserver-2.0/fdroidserver.egg-info/PKG-INFO fdroidserver-2.0.1/fdroidserver.egg-info/PKG-INFO --- fdroidserver-2.0/fdroidserver.egg-info/PKG-INFO 2021-02-02 13:20:01.000000000 +0100 +++ fdroidserver-2.0.1/fdroidserver.egg-info/PKG-INFO 2021-03-09 18:22:29.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: fdroidserver -Version: 2.0 +Version: 2.0.1 Summary: F-Droid Server Tools Home-page: https://f-droid.org Author: The F-Droid Project diff -Nru fdroidserver-2.0/fdroidserver.egg-info/SOURCES.txt fdroidserver-2.0.1/fdroidserver.egg-info/SOURCES.txt --- fdroidserver-2.0/fdroidserver.egg-info/SOURCES.txt 2021-02-02 13:20:01.000000000 +0100 +++ fdroidserver-2.0.1/fdroidserver.egg-info/SOURCES.txt 2021-03-09 18:22:29.000000000 +0100 @@ -629,6 +629,13 @@ tests/build-tools/28.0.3/aapt-output-obb.mainpatch.current_1619.txt tests/build-tools/28.0.3/aapt-output-souch.smsbypass_9.txt tests/extra/manual-vmtools-test.py +tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties +tests/get_android_tools_versions/android-ndk/r11c/source.properties +tests/get_android_tools_versions/android-ndk/r17c/source.properties +tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties +tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties +tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties +tests/get_android_tools_versions/android-sdk/tools/source.properties tests/getsig/getsig.java tests/getsig/make.sh tests/getsig/run.sh diff -Nru fdroidserver-2.0/MANIFEST.in fdroidserver-2.0.1/MANIFEST.in --- fdroidserver-2.0/MANIFEST.in 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/MANIFEST.in 2021-03-09 18:21:30.000000000 +0100 @@ -551,6 +551,13 @@ include tests/exception.TestCase include tests/extra/manual-vmtools-test.py include tests/funding-usernames.yaml +include tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties +include tests/get_android_tools_versions/android-ndk/r11c/source.properties +include tests/get_android_tools_versions/android-ndk/r17c/source.properties +include tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties +include tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties +include tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties +include tests/get_android_tools_versions/android-sdk/tools/source.properties include tests/getsig/getsig.java include tests/getsig/make.sh include tests/getsig/run.sh diff -Nru fdroidserver-2.0/PKG-INFO fdroidserver-2.0.1/PKG-INFO --- fdroidserver-2.0/PKG-INFO 2021-02-02 13:20:01.000000000 +0100 +++ fdroidserver-2.0.1/PKG-INFO 2021-03-09 18:22:30.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: fdroidserver -Version: 2.0 +Version: 2.0.1 Summary: F-Droid Server Tools Home-page: https://f-droid.org Author: The F-Droid Project diff -Nru fdroidserver-2.0/setup.py fdroidserver-2.0.1/setup.py --- fdroidserver-2.0/setup.py 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/setup.py 2021-03-09 18:21:30.000000000 +0100 @@ -53,7 +53,7 @@ long_description = fh.read() setup(name='fdroidserver', - version='2.0', + version='2.0.1', description='F-Droid Server Tools', long_description=long_description, long_description_content_type='text/markdown', diff -Nru fdroidserver-2.0/tests/common.TestCase fdroidserver-2.0.1/tests/common.TestCase --- fdroidserver-2.0/tests/common.TestCase 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/tests/common.TestCase 2021-03-09 18:21:30.000000000 +0100 @@ -1627,6 +1627,21 @@ {'AutoName': testvalue, 'id': 'nope'}]: self.assertEqual(testvalue, fdroidserver.common.get_app_display_name(app)) + def test_get_android_tools_versions(self): + sdk_path = os.path.join(self.basedir, 'get_android_tools_versions') + fdroidserver.common.config = {'sdk_path': sdk_path} + components = fdroidserver.common.get_android_tools_versions() + expected = ( + ('android-ndk/android-ndk-r21d', '21.3.6528147'), + ('android-ndk/r11c', '11.2.2725575'), + ('android-ndk/r17c', '17.2.4988734'), + ('android-sdk/patcher/v4', '1'), + ('android-sdk/platforms/android-30', '3'), + ('android-sdk/skiaparser/1', '6'), + ('android-sdk/tools', '26.1.1'), + ) + self.assertSequenceEqual(expected, sorted(components)) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) diff -Nru fdroidserver-2.0/tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties fdroidserver-2.0.1/tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties --- fdroidserver-2.0/tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties 1970-01-01 01:00:00.000000000 +0100 +++ fdroidserver-2.0.1/tests/get_android_tools_versions/android-ndk/android-ndk-r21d/source.properties 2021-03-09 18:21:30.000000000 +0100 @@ -0,0 +1,2 @@ +Pkg.Desc = Android NDK +Pkg.Revision = 21.3.6528147 diff -Nru fdroidserver-2.0/tests/get_android_tools_versions/android-ndk/r11c/source.properties fdroidserver-2.0.1/tests/get_android_tools_versions/android-ndk/r11c/source.properties --- fdroidserver-2.0/tests/get_android_tools_versions/android-ndk/r11c/source.properties 1970-01-01 01:00:00.000000000 +0100 +++ fdroidserver-2.0.1/tests/get_android_tools_versions/android-ndk/r11c/source.properties 2021-03-09 18:21:30.000000000 +0100 @@ -0,0 +1,2 @@ +Pkg.Desc = Android NDK +Pkg.Revision = 11.2.2725575 diff -Nru fdroidserver-2.0/tests/get_android_tools_versions/android-ndk/r17c/source.properties fdroidserver-2.0.1/tests/get_android_tools_versions/android-ndk/r17c/source.properties --- fdroidserver-2.0/tests/get_android_tools_versions/android-ndk/r17c/source.properties 1970-01-01 01:00:00.000000000 +0100 +++ fdroidserver-2.0.1/tests/get_android_tools_versions/android-ndk/r17c/source.properties 2021-03-09 18:21:30.000000000 +0100 @@ -0,0 +1,2 @@ +Pkg.Desc = Android NDK +Pkg.Revision = 17.2.4988734 diff -Nru fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties --- fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties 1970-01-01 01:00:00.000000000 +0100 +++ fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/patcher/v4/source.properties 2021-03-09 18:21:30.000000000 +0100 @@ -0,0 +1,18 @@ +# +# Copyright (C) 2016 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +Pkg.Revision=1 +Pkg.Path=patcher;v4 +Pkg.Desc=SDK Patch Applier v4 \ No newline at end of file diff -Nru fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties --- fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties 1970-01-01 01:00:00.000000000 +0100 +++ fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/platforms/android-30/source.properties 2021-03-09 18:21:30.000000000 +0100 @@ -0,0 +1,9 @@ +Pkg.Desc=Android SDK Platform 11 +Pkg.UserSrc=false +Platform.Version=11 +Platform.CodeName= +Pkg.Revision=3 +AndroidVersion.ApiLevel=30 +Layoutlib.Api=15 +Layoutlib.Revision=1 +Platform.MinToolsRev=22 diff -Nru fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties --- fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties 1970-01-01 01:00:00.000000000 +0100 +++ fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/skiaparser/1/source.properties 2021-03-09 18:21:30.000000000 +0100 @@ -0,0 +1,3 @@ +Pkg.Revision=6 +Pkg.Path=skiaparser;1 +Pkg.Desc=Layout Inspector image server for API 29-30 diff -Nru fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/tools/source.properties fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/tools/source.properties --- fdroidserver-2.0/tests/get_android_tools_versions/android-sdk/tools/source.properties 1970-01-01 01:00:00.000000000 +0100 +++ fdroidserver-2.0.1/tests/get_android_tools_versions/android-sdk/tools/source.properties 2021-03-09 18:21:30.000000000 +0100 @@ -0,0 +1,6 @@ +Pkg.UserSrc=false +Pkg.Revision=26.1.1 +Platform.MinPlatformToolsRev=20 +Pkg.Dependencies=emulator +Pkg.Path=tools +Pkg.Desc=Android SDK Tools diff -Nru fdroidserver-2.0/tests/index.TestCase fdroidserver-2.0.1/tests/index.TestCase --- fdroidserver-2.0/tests/index.TestCase 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/tests/index.TestCase 2021-03-09 18:21:30.000000000 +0100 @@ -354,6 +354,15 @@ 'https://gitlab.com/group/project/-/raw/master/fdroid'], fdroidserver.index.get_mirror_service_urls(url)) + def test_v1_sort_packages_with_invalid(self): + i = [{'packageName': 'org.smssecure.smssecure', + 'apkName': 'smssecure-custom.fake', + 'signer': None, + 'versionCode': 11111}] + + fdroidserver.index.v1_sort_packages( + i, fdroidserver.common.load_stats_fdroid_signing_key_fingerprints()) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) diff -Nru fdroidserver-2.0/tests/repo/index-v1.json fdroidserver-2.0.1/tests/repo/index-v1.json --- fdroidserver-2.0/tests/repo/index-v1.json 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/tests/repo/index-v1.json 2021-03-09 18:21:30.000000000 +0100 @@ -54,7 +54,6 @@ "name": "Caffeine Tile", "summary": "Test app for extracting icons when an XML one is default", "added": 1539129600000, - "icon": "info.zwanenburg.caffeinetile.4.xml", "packageName": "info.zwanenburg.caffeinetile", "lastUpdated": 1539129600000 }, diff -Nru fdroidserver-2.0/tests/repo/index.xml fdroidserver-2.0.1/tests/repo/index.xml --- fdroidserver-2.0/tests/repo/index.xml 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/tests/repo/index.xml 2021-03-09 18:21:30.000000000 +0100 @@ -53,7 +53,6 @@ <lastupdated>2018-10-10</lastupdated> <name>Caffeine Tile</name> <summary>Test app for extracting icons when an XML one is default</summary> - <icon>info.zwanenburg.caffeinetile.4.xml</icon> <desc>No description available</desc> <license>Unknown</license> <categories>Development</categories> diff -Nru fdroidserver-2.0/tests/run-tests fdroidserver-2.0.1/tests/run-tests --- fdroidserver-2.0/tests/run-tests 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/tests/run-tests 2021-03-09 18:21:30.000000000 +0100 @@ -735,8 +735,9 @@ $fdroid init $fdroid update --create-metadata --verbose $fdroid readmeta -$fdroid deploy --local-copy-dir=/tmp/fdroid -$fdroid deploy --local-copy-dir=/tmp/fdroid --verbose +LOCAL_COPY_DIR=`create_test_dir`/fdroid +$fdroid deploy --local-copy-dir=$LOCAL_COPY_DIR +$fdroid deploy --local-copy-dir=$LOCAL_COPY_DIR --verbose # now test the errors work set +e diff -Nru fdroidserver-2.0/tests/update.TestCase fdroidserver-2.0.1/tests/update.TestCase --- fdroidserver-2.0/tests/update.TestCase 2021-02-01 22:53:44.000000000 +0100 +++ fdroidserver-2.0.1/tests/update.TestCase 2021-03-09 18:21:30.000000000 +0100 @@ -11,6 +11,7 @@ import os import random import shutil +import string import subprocess import sys import tempfile @@ -706,8 +707,7 @@ apk_info = fdroidserver.update.scan_apk('repo/info.zwanenburg.caffeinetile_4.apk') self.assertEqual(apk_info.get('versionName'), '1.3') - self.assertEqual(apk_info['icons_src'], {'160': 'res/drawable/ic_coffee_on.xml', - '-1': 'res/drawable/ic_coffee_on.xml'}) + self.assertEqual(apk_info['icons_src'], {}) apk_info = fdroidserver.update.scan_apk('repo/com.politedroid_6.apk') self.assertEqual(apk_info.get('versionName'), '1.5') @@ -1309,6 +1309,73 @@ self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(' WhyIncludeWhitespace ')) self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(['first', 'second'])) + def test_set_localized_text_entry(self): + tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, + dir=self.tmpdir) + os.chdir(tmptestsdir) + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.update.config = config + fdroidserver.update.options = fdroidserver.common.options + + files = { + 'full-description.txt': 'description', + 'short-description.txt': 'summary', + 'title.txt': 'name', + 'video-url.txt': 'video', + } + + for f, key in files.items(): + limit = config['char_limits'][key] + with open(f, 'w') as fp: + fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100))) + locale = 'ru_US' + app = dict() + fdroidserver.update._set_localized_text_entry(app, locale, key, f) + self.assertEqual(limit, len(app['localized'][locale][key])) + + f = 'badlink-' + f + os.symlink('/path/to/nowhere', f) + app = dict() + fdroidserver.update._set_localized_text_entry(app, locale, key, f) + self.assertIsNone(app['localized'].get(locale, {}).get(key)) + + def test_set_author_entry(self): + tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, + dir=self.tmpdir) + os.chdir(tmptestsdir) + config = dict() + fdroidserver.common.fill_config_defaults(config) + fdroidserver.update.config = config + fdroidserver.update.options = fdroidserver.common.options + + f = 'contact-website.txt' + key = 'author' + url = 'https://f-droid.org/' + limit = config['char_limits']['author'] + with open(f, 'w') as fp: + fp.write(url) + fp.write('\n') + app = dict() + fdroidserver.update._set_author_entry(app, key, f) + self.assertEqual(url, app[key]) + + f = 'limits.txt' + key = 'author' + limit = config['char_limits']['author'] + for key in ('authorEmail', 'authorPhone', 'authorWebSite'): + with open(f, 'w') as fp: + fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100))) + app = dict() + fdroidserver.update._set_author_entry(app, key, f) + self.assertEqual(limit, len(app[key])) + + f = 'badlink.txt' + os.symlink('/path/to/nowhere', f) + app = dict() + fdroidserver.update._set_author_entry(app, key, f) + self.assertIsNone(app.get(key)) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) unblock fdroidserver/2.0.1-1 -- System Information: Debian Release: 10.9 APT prefers stable-updates APT policy: (500, 'stable-updates'), (500, 'stable'), (100, 'proposed-updates') Architecture: amd64 (x86_64) Kernel: Linux 4.19.0-16-amd64 (SMP w/8 CPU cores) Kernel taint flags: TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /usr/bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled

