From 85632ba00efd92c3524394dbebff673335b94de5 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 16 Aug 2016 21:02:15 +0200 Subject: [PATCH] set up install/delete lists for "push" commands from server It is now possible for the server operator to specify lists of apps that must be installed or deleted on the client (aka "push installs). If the user has opted in, or the device is already setup to respond to these requests, then fdroidclient will automatically install/delete the packageNames listed. This is protected by the same signing key as the app index metadata. It generates single XML elements with the data set in the attributes. This keeps the XML compact and easily extensible, e.g. for adding versionCode, signingKey, etc as attributes: Copyright: 2016 Blue Jay Wireless Signed-off-by: Hans-Christoph Steiner closes #177 --- examples/config.py | 18 ++++++++++++++++++ fdroidserver/update.py | 21 +++++++++++++++++++-- tests/run-tests | 4 ++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/examples/config.py b/examples/config.py index d2c0105e..d33ddfac 100644 --- a/examples/config.py +++ b/examples/config.py @@ -246,3 +246,21 @@ The repository of older versions of applications from the main demo repository. # 'Summary': 80, # 'Description': 4000, # } + +# It is possible for the server operator to specify lists of apps that +# must be installed or deleted on the client (aka "push installs). If +# the user has opted in, or the device is already setup to respond to +# these requests, then fdroidclient will automatically install/delete +# the packageNames listed. This is protected by the same signing key +# as the app index metadata. +# +# install_list = { +# 'at.bitfire.davdroid', +# 'com.fsck.k9', +# 'us.replicant', +# } +# +# delete_list = { +# 'com.facebook.orca', +# 'com.android.vending', +# } diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 07c8db30..9f1ad43c 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1,8 +1,10 @@ #!/usr/bin/env python3 # # update.py - part of the FDroid server tools -# Copyright (C) 2010-2015, Ciaran Gultnieks, ciaran@ciarang.com -# Copyright (C) 2013-2014 Daniel Martí +# Copyright (C) 2016, Blue Jay Wireless +# Copyright (C) 2014-2016, Hans-Christoph Steiner +# Copyright (C) 2010-2015, Ciaran Gultnieks +# Copyright (C) 2013-2014, Daniel Martí # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -951,6 +953,21 @@ def make_index(apps, sortedids, apks, repodir, archive, categories): repoel.setAttribute("pubkey", extract_pubkey().decode('utf-8')) root.appendChild(repoel) + for command in ('install', 'delete'): + packageNames = [] + key = command + '_list' + if key in config: + if isinstance(config[key], str): + packageNames = [config[key]] + elif all(isinstance(item, str) for item in config[key]): + packageNames = config[key] + else: + raise TypeError('only accepts strings, lists, and tuples') + for packageName in packageNames: + element = doc.createElement(command) + root.appendChild(element) + element.setAttribute('packageName', packageName) + for appid in sortedids: app = apps[appid] diff --git a/tests/run-tests b/tests/run-tests index c55319da..7e0eb2aa 100755 --- a/tests/run-tests +++ b/tests/run-tests @@ -146,10 +146,14 @@ cd $REPOROOT $fdroid init cp -a $WORKSPACE/tests/metadata $WORKSPACE/tests/repo $REPOROOT/ echo "accepted_formats = ['json', 'txt', 'xml', 'yml']" >> config.py +echo "install_list = 'org.adaway'" >> config.py +echo "delete_list = {'com.android.vending', 'com.facebook.orca',}" >> config.py $fdroid update --verbose test -e repo/index.xml test -e repo/index.jar grep -F '