mirror of
				https://github.com/f-droid/fdroidserver.git
				synced 2025-11-03 22:20:28 +03:00 
			
		
		
		
	Addition of IPFS CIDv1 to Index
IPFS CIDv1 is only generated for APKs and "repo files"
This commit is contained in:
		
							parent
							
								
									5e31f23a96
								
							
						
					
					
						commit
						0ad45a94a8
					
				
					 10 changed files with 60 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -92,6 +92,7 @@ debian_testing:
 | 
			
		|||
        fdroidserver
 | 
			
		||||
        git
 | 
			
		||||
        gnupg
 | 
			
		||||
        ipfs-cid
 | 
			
		||||
        python3-defusedxml
 | 
			
		||||
        python3-setuptools
 | 
			
		||||
        zipalign
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4118,6 +4118,25 @@ def run_yamllint(path, indent=0):
 | 
			
		|||
    return '\n'.join(result)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def calculate_IPFS_cid(filename):
 | 
			
		||||
    """
 | 
			
		||||
    Calculate the IPFS CID of a file and add it to the index.
 | 
			
		||||
 | 
			
		||||
    uses ipfs_cid package at https://packages.debian.org/sid/ipfs-cid
 | 
			
		||||
    Returns CIDv1 of a file as per IPFS recommendation
 | 
			
		||||
    """
 | 
			
		||||
    exe_name = 'ipfs_cid'
 | 
			
		||||
    if not set_command_in_config(exe_name) or not config.get(exe_name):
 | 
			
		||||
        logging.info(_("%s not found, skipping CIDv1 generation") % exe_name)
 | 
			
		||||
        return
 | 
			
		||||
    file_cid = subprocess.run([config[exe_name], filename], capture_output=True)
 | 
			
		||||
 | 
			
		||||
    if file_cid.returncode == 0:
 | 
			
		||||
        cid_output = file_cid.stdout.decode()
 | 
			
		||||
        cid_output_dict = json.loads(cid_output)
 | 
			
		||||
        return cid_output_dict['CIDv1']
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def sha256sum(filename):
 | 
			
		||||
    """Calculate the sha256 of the given file."""
 | 
			
		||||
    sha = hashlib.sha256()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -607,6 +607,10 @@ def convert_version(version, app, repodir):
 | 
			
		|||
        "size": version["size"]
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ipfsCIDv1 = version.get("ipfsCIDv1")
 | 
			
		||||
    if ipfsCIDv1:
 | 
			
		||||
        ver["file"]["ipfsCIDv1"] = ipfsCIDv1
 | 
			
		||||
 | 
			
		||||
    if "srcname" in version:
 | 
			
		||||
        ver["src"] = file_entry(os.path.join(repodir, version["srcname"]))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -945,7 +949,7 @@ def make_v1(apps, packages, repodir, repodict, requestsdict, fdroid_signing_key_
 | 
			
		|||
        for k, v in sorted(package.items()):
 | 
			
		||||
            if not v:
 | 
			
		||||
                continue
 | 
			
		||||
            if k in ('icon', 'icons', 'icons_src', 'name', ):
 | 
			
		||||
            if k in ('icon', 'icons', 'icons_src', 'ipfsCIDv1', 'name'):
 | 
			
		||||
                continue
 | 
			
		||||
            d[k] = v
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,7 +58,7 @@ if hasattr(Image, 'DecompressionBombWarning'):
 | 
			
		|||
    warnings.simplefilter('error', Image.DecompressionBombWarning)
 | 
			
		||||
Image.MAX_IMAGE_PIXELS = 0xffffff  # 4096x4096
 | 
			
		||||
 | 
			
		||||
METADATA_VERSION = 20001
 | 
			
		||||
METADATA_VERSION = 20002
 | 
			
		||||
 | 
			
		||||
# less than the valid range of versionCode, i.e. Java's Integer.MIN_VALUE
 | 
			
		||||
UNSET_VERSION_CODE = -0x100000000
 | 
			
		||||
| 
						 | 
				
			
			@ -1148,6 +1148,7 @@ def scan_repo_files(apkcache, repodir, knownapks, use_date_from_file=False):
 | 
			
		|||
            repo_file['apkName'] = name_utf8
 | 
			
		||||
            repo_file['hash'] = shasum
 | 
			
		||||
            repo_file['hashType'] = 'sha256'
 | 
			
		||||
            repo_file['ipfsCIDv1'] = common.calculate_IPFS_cid(name_utf8)
 | 
			
		||||
            repo_file['versionCode'] = 0
 | 
			
		||||
            repo_file['versionName'] = shasum[0:7]
 | 
			
		||||
            # the static ID is the SHA256 unless it is set in the metadata
 | 
			
		||||
| 
						 | 
				
			
			@ -1212,6 +1213,9 @@ def scan_apk(apk_file, require_signature=True):
 | 
			
		|||
        'icons': {},
 | 
			
		||||
        'antiFeatures': set(),
 | 
			
		||||
    }
 | 
			
		||||
    ipfsCIDv1 = common.calculate_IPFS_cid(apk_file)
 | 
			
		||||
    if ipfsCIDv1:
 | 
			
		||||
        apk['ipfsCIDv1'] = ipfsCIDv1
 | 
			
		||||
 | 
			
		||||
    scan_apk_androguard(apk, apk_file)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1508,6 +1508,20 @@ class CommonTest(unittest.TestCase):
 | 
			
		|||
        with self.assertRaises(SyntaxError):
 | 
			
		||||
            fdroidserver.common.calculate_math_string('1-1 # no comment')
 | 
			
		||||
 | 
			
		||||
    def test_calculate_IPFS_cid_with_no_tool(self):
 | 
			
		||||
        fdroidserver.common.config = {'ipfs_cid': None}
 | 
			
		||||
        self.assertIsNone(fdroidserver.common.calculate_IPFS_cid('urzip.apk'))
 | 
			
		||||
        self.assertIsNone(fdroidserver.common.calculate_IPFS_cid('FileDoesNotExist'))
 | 
			
		||||
 | 
			
		||||
    @unittest.skipUnless(shutil.which('ipfs_cid'), 'calculate_IPFS_cid needs ipfs_cid')
 | 
			
		||||
    def test_calculate_IPFS_cid(self):
 | 
			
		||||
        fdroidserver.common.config = dict()
 | 
			
		||||
        self.assertIsNone(fdroidserver.common.calculate_IPFS_cid('FileDoesNotExist'))
 | 
			
		||||
        self.assertEqual(
 | 
			
		||||
            fdroidserver.common.calculate_IPFS_cid('urzip.apk'),
 | 
			
		||||
            "bafybeigmtgrwyvj77jaflje2rf533haeqtpu2wtwsctryjusjnsawacsam",
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def test_deploy_build_log_with_rsync_with_id_file(self):
 | 
			
		||||
 | 
			
		||||
        mocklogcontent = bytes(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,6 +9,7 @@ icons:
 | 
			
		|||
icons_src:
 | 
			
		||||
  '-1': res/drawable/ic_launcher.png
 | 
			
		||||
  '160': res/drawable/ic_launcher.png
 | 
			
		||||
ipfsCIDv1: bafybeigmtgrwyvj77jaflje2rf533haeqtpu2wtwsctryjusjnsawacsam
 | 
			
		||||
minSdkVersion: 4
 | 
			
		||||
name: urzip
 | 
			
		||||
packageName: info.guardianproject.urzip
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,7 @@ icons_src:
 | 
			
		|||
  '120': res/drawable-ldpi-v4/icon_launcher.png
 | 
			
		||||
  '160': res/drawable-mdpi-v4/icon_launcher.png
 | 
			
		||||
  '240': res/drawable-hdpi-v4/icon_launcher.png
 | 
			
		||||
ipfsCIDv1: bafybeifijmr5ygvfvig4vzbmdc3ysj6m46ddohaol4vgp4qoyooqpc27zu
 | 
			
		||||
minSdkVersion: 7
 | 
			
		||||
name: Compass Keyboard
 | 
			
		||||
nativecode:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
{
 | 
			
		||||
  "repo": {
 | 
			
		||||
    "timestamp": 1502845383782,
 | 
			
		||||
    "version": 20001,
 | 
			
		||||
    "version": 20002,
 | 
			
		||||
    "name": "My First F-Droid Repo Demo",
 | 
			
		||||
    "icon": "icon.png",
 | 
			
		||||
    "address": "https://MyFirstFDroidRepo.org/fdroid/repo",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<fdroid>
 | 
			
		||||
	<repo icon="icon.png" name="My First F-Droid Repo Demo" pubkey="308204e1308202c9a003020102020434597643300d06092a864886f70d01010b050030213110300e060355040b1307462d44726f6964310d300b06035504031304736f7661301e170d3136303931333230313930395a170d3434303133303230313930395a30213110300e060355040b1307462d44726f6964310d300b06035504031304736f766130820222300d06092a864886f70d01010105000382020f003082020a028202010086ef94b5aacf2ba4f38c875f4194b44f5644392e3715575d7c92828577e692c352b567172823851c8c72347fbc9d99684cd7ca3e1db3e4cca126382c53f2a5869fb4c19bdec989b2930501af3e758ff40588915fe96b10076ce3346a193a0277d79e83e30fd8657c20e35260dd085aa32eac7c4b85786ffefbf1555cafe2bc928443430cdbba48cfbe701e12ae86e676477932730d4fc7c00af820aef85038a5b4df084cf6470d110dc4c49ea1b749b80b34709d199b3db516b223625c5de4501e861f7d261b3838f8f616aa78831d618d41d25872dc810c9b2087b5a9e146ca95be740316dcdbcb77314e23ab87d4487913b800b1113c0603ea2294188b71d3e49875df097b56f9151211fc6832f9790c5c83d17481f14ad37915fd164f4fd713f6732a15f4245714b84cd665bdbd085660ea33ad7d7095dcc414f09e3903604a40facc2314a115c0045bb50e9df38efb57e1b8e7cc105f340a26eeb46aba0fa6672953eee7f1f92dcb408e561909bbd4bdf4a4948c4d57c467d21aa238c34ba43be050398be963191fa2b49828bc1e4eeed224b40dbe9dc3e570890a71a974a2f4527edb1b07105071755105edcb2af2f269facfb89180903a572a99b46456e80d4a01685a80b233278805f2c876678e731f4ec4f52075aeef6b2b023efbb8a3637ef507c4c37c27e428152ec1817fcba640ad601cb09f72f0fbe2d274a2410203010001a321301f301d0603551d0e04160414c28bf33dd5a9a17338e5b1d1a6edd8c7d141ed0b300d06092a864886f70d01010b0500038202010084e20458b2aafd7fc27146b0986f9324f4260f244920417a77c9bf15e2e2d22d2725bdd8093ec261c3779c3ca03312516506f9410075b90595b41345956d8eb2786fb5994f195611382c2b99dba13381b0100a30bc9e6e47248bf4325e2f6eec9d789216dc7536e753bf1f4be603d9fa2e6f5e192b4eb988b8cdb0bb1e8668a9225426f7d4636479f73ed24ad1d2657c31e63c93d9679b9080171b3bd1bf10a3b92b80bd790fbf62d3644900cd08eae8b9bf9c2567be98dc8cdd2ae19a8d57a3e3e2de899f81f1279f578989e6af906f80c8c2b67651730ee7e568c1af5bcb845b6d685dc55332a9984aeceaea3b7e883447edf1c76b155d95253e39b9710eaa22efa6c81468829702b5dce7126538f3ca70c2f0ad9a5795435fdb1f715f20d60359ef9a9926c7050116e802df651727447848827815f70bd82af3cedd08783156102d2d8ce995c4c43b8e47e91a3e6927f3505a5d395e6bebb84542c570903eeab4382a1c2151f1471c7a06a34dc4d268d8fa72e93bdcd2dccc4302ecac47b9e7e3d8bc9b46d21cd097874a24d529548018dc190ff568c6aa428f0a5eedff1a347730931c74f19277538e49647a4ad7254f4c1ec7d4da12cce9e1fad9607534e66ab40a56b473d9d7e3d563fd03cad2052bad365c5a29f8ae54f09b60dbca3ea768d7767cbe1c133ca08ce725c1c1370f4aab8e5b6e286f52dc0be8d0982b5a" timestamp="1480431575" url="https://MyFirstFDroidRepo.org/fdroid/repo" version="20001">
 | 
			
		||||
	<repo icon="icon.png" name="My First F-Droid Repo Demo" pubkey="308204e1308202c9a003020102020434597643300d06092a864886f70d01010b050030213110300e060355040b1307462d44726f6964310d300b06035504031304736f7661301e170d3136303931333230313930395a170d3434303133303230313930395a30213110300e060355040b1307462d44726f6964310d300b06035504031304736f766130820222300d06092a864886f70d01010105000382020f003082020a028202010086ef94b5aacf2ba4f38c875f4194b44f5644392e3715575d7c92828577e692c352b567172823851c8c72347fbc9d99684cd7ca3e1db3e4cca126382c53f2a5869fb4c19bdec989b2930501af3e758ff40588915fe96b10076ce3346a193a0277d79e83e30fd8657c20e35260dd085aa32eac7c4b85786ffefbf1555cafe2bc928443430cdbba48cfbe701e12ae86e676477932730d4fc7c00af820aef85038a5b4df084cf6470d110dc4c49ea1b749b80b34709d199b3db516b223625c5de4501e861f7d261b3838f8f616aa78831d618d41d25872dc810c9b2087b5a9e146ca95be740316dcdbcb77314e23ab87d4487913b800b1113c0603ea2294188b71d3e49875df097b56f9151211fc6832f9790c5c83d17481f14ad37915fd164f4fd713f6732a15f4245714b84cd665bdbd085660ea33ad7d7095dcc414f09e3903604a40facc2314a115c0045bb50e9df38efb57e1b8e7cc105f340a26eeb46aba0fa6672953eee7f1f92dcb408e561909bbd4bdf4a4948c4d57c467d21aa238c34ba43be050398be963191fa2b49828bc1e4eeed224b40dbe9dc3e570890a71a974a2f4527edb1b07105071755105edcb2af2f269facfb89180903a572a99b46456e80d4a01685a80b233278805f2c876678e731f4ec4f52075aeef6b2b023efbb8a3637ef507c4c37c27e428152ec1817fcba640ad601cb09f72f0fbe2d274a2410203010001a321301f301d0603551d0e04160414c28bf33dd5a9a17338e5b1d1a6edd8c7d141ed0b300d06092a864886f70d01010b0500038202010084e20458b2aafd7fc27146b0986f9324f4260f244920417a77c9bf15e2e2d22d2725bdd8093ec261c3779c3ca03312516506f9410075b90595b41345956d8eb2786fb5994f195611382c2b99dba13381b0100a30bc9e6e47248bf4325e2f6eec9d789216dc7536e753bf1f4be603d9fa2e6f5e192b4eb988b8cdb0bb1e8668a9225426f7d4636479f73ed24ad1d2657c31e63c93d9679b9080171b3bd1bf10a3b92b80bd790fbf62d3644900cd08eae8b9bf9c2567be98dc8cdd2ae19a8d57a3e3e2de899f81f1279f578989e6af906f80c8c2b67651730ee7e568c1af5bcb845b6d685dc55332a9984aeceaea3b7e883447edf1c76b155d95253e39b9710eaa22efa6c81468829702b5dce7126538f3ca70c2f0ad9a5795435fdb1f715f20d60359ef9a9926c7050116e802df651727447848827815f70bd82af3cedd08783156102d2d8ce995c4c43b8e47e91a3e6927f3505a5d395e6bebb84542c570903eeab4382a1c2151f1471c7a06a34dc4d268d8fa72e93bdcd2dccc4302ecac47b9e7e3d8bc9b46d21cd097874a24d529548018dc190ff568c6aa428f0a5eedff1a347730931c74f19277538e49647a4ad7254f4c1ec7d4da12cce9e1fad9607534e66ab40a56b473d9d7e3d563fd03cad2052bad365c5a29f8ae54f09b60dbca3ea768d7767cbe1c133ca08ce725c1c1370f4aab8e5b6e286f52dc0be8d0982b5a" timestamp="1480431575" url="https://MyFirstFDroidRepo.org/fdroid/repo" version="20002">
 | 
			
		||||
		<description>This is a repository of apps to be used with F-Droid. Applications in this repository are either official binaries built by the original application developers, or are binaries built from source by the admin of f-droid.org using the tools on https://gitlab.com/fdroid.</description>
 | 
			
		||||
		<mirror>http://foobarfoobarfoobar.onion/fdroid/repo</mirror>
 | 
			
		||||
		<mirror>https://foo.bar/fdroid/repo</mirror>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -836,7 +836,7 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
        fdroidserver.update.config = config
 | 
			
		||||
        apk_info = fdroidserver.update.scan_apk('repo/no.min.target.sdk_987.apk')
 | 
			
		||||
        self.maxDiff = None
 | 
			
		||||
        self.assertDictEqual(apk_info, {
 | 
			
		||||
        expected = {
 | 
			
		||||
            'icons': {},
 | 
			
		||||
            'icons_src': {'-1': 'res/drawable/ic_launcher.png',
 | 
			
		||||
                          '160': 'res/drawable/ic_launcher.png'},
 | 
			
		||||
| 
						 | 
				
			
			@ -859,11 +859,18 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
                fdroidserver.update.UsesPermission(name='android.permission.READ_PHONE_STATE',
 | 
			
		||||
                                                   maxSdkVersion=None),
 | 
			
		||||
                fdroidserver.update.UsesPermission(name='android.permission.READ_EXTERNAL_STORAGE',
 | 
			
		||||
                                                   maxSdkVersion=None)]})
 | 
			
		||||
                                                   maxSdkVersion=None),
 | 
			
		||||
            ],
 | 
			
		||||
        }
 | 
			
		||||
        if config.get('ipfs_cid'):
 | 
			
		||||
            expected['ipfsCIDv1'] = 'bafybeidwxseoagnew3gtlasttqovl7ciuwxaud5a5p4a5pzpbrfcfj2gaa'
 | 
			
		||||
 | 
			
		||||
        self.assertDictEqual(apk_info, expected)
 | 
			
		||||
 | 
			
		||||
    def test_scan_apk_no_sig(self):
 | 
			
		||||
        config = dict()
 | 
			
		||||
        fdroidserver.common.fill_config_defaults(config)
 | 
			
		||||
        fdroidserver.common.config = config
 | 
			
		||||
        fdroidserver.update.config = config
 | 
			
		||||
        os.chdir(os.path.join(localmodule, 'tests'))
 | 
			
		||||
        if os.path.basename(os.getcwd()) != 'tests':
 | 
			
		||||
| 
						 | 
				
			
			@ -929,6 +936,7 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
 | 
			
		||||
        config = dict()
 | 
			
		||||
        fdroidserver.common.fill_config_defaults(config)
 | 
			
		||||
        fdroidserver.common.config = config
 | 
			
		||||
        fdroidserver.update.config = config
 | 
			
		||||
        os.chdir(os.path.join(localmodule, 'tests'))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -986,6 +994,8 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
            with open(savepath, 'r') as f:
 | 
			
		||||
                from_yaml = yaml.load(f, Loader=TestLoader)
 | 
			
		||||
            self.maxDiff = None
 | 
			
		||||
            if not config.get('ipfs_cid'):
 | 
			
		||||
                del from_yaml['ipfsCIDv1']  # handle when ipfs_cid is not installed
 | 
			
		||||
            self.assertEqual(apk, from_yaml)
 | 
			
		||||
 | 
			
		||||
    def test_process_apk_signed_by_disabled_algorithms(self):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue