switch out swap Repo instance all at once

Before, it would change fields in a final Repo instance, which means that
things could be out of sync when accessed.  Now it swaps out the old one
with a new Repo instance in one step.

The local repo variables are now declared volatile so that they are more
predictable when accessed from various threads (WifiStateChangeService,
SwapService, etc.)

askServerToSwapWithUs(NewRepoConfig) was unused, so I removed it.
This commit is contained in:
Hans-Christoph Steiner 2016-05-13 12:49:08 +02:00
parent 26d173acdc
commit 426e03a649
7 changed files with 22 additions and 22 deletions

View File

@ -81,12 +81,12 @@ public class FDroidApp extends Application {
private static Locale locale; private static Locale locale;
// for the local repo on this device, all static since there is only one // for the local repo on this device, all static since there is only one
public static int port; public static volatile int port;
public static String ipAddressString; public static volatile String ipAddressString;
public static SubnetUtils.SubnetInfo subnetInfo; public static volatile SubnetUtils.SubnetInfo subnetInfo;
public static String ssid; public static volatile String ssid;
public static String bssid; public static volatile String bssid;
public static final Repo REPO = new Repo(); public static volatile Repo repo = new Repo();
// Leaving the fully qualified class name here to help clarify the difference between spongy/bouncy castle. // Leaving the fully qualified class name here to help clarify the difference between spongy/bouncy castle.
private static final org.spongycastle.jce.provider.BouncyCastleProvider SPONGYCASTLE_PROVIDER; private static final org.spongycastle.jce.provider.BouncyCastleProvider SPONGYCASTLE_PROVIDER;
@ -147,6 +147,7 @@ public class FDroidApp extends Application {
subnetInfo = new SubnetUtils("0.0.0.0/32").getInfo(); subnetInfo = new SubnetUtils("0.0.0.0/32").getInfo();
ssid = ""; ssid = "";
bssid = ""; bssid = "";
repo = new Repo();
} }
public void updateLanguage() { public void updateLanguage() {

View File

@ -31,7 +31,6 @@ import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.R; import org.fdroid.fdroid.R;
import org.fdroid.fdroid.UpdateService; import org.fdroid.fdroid.UpdateService;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.NewRepoConfig;
import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.Repo;
import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.data.RepoProvider;
import org.fdroid.fdroid.localrepo.peers.Peer; import org.fdroid.fdroid.localrepo.peers.Peer;
@ -208,16 +207,12 @@ public class SwapService extends Service {
askServerToSwapWithUs(repo.address); askServerToSwapWithUs(repo.address);
} }
public void askServerToSwapWithUs(final NewRepoConfig config) {
askServerToSwapWithUs(config.getRepoUriString());
}
private void askServerToSwapWithUs(final String address) { private void askServerToSwapWithUs(final String address) {
new AsyncTask<Void, Void, Void>() { new AsyncTask<Void, Void, Void>() {
@Override @Override
protected Void doInBackground(Void... args) { protected Void doInBackground(Void... args) {
Uri repoUri = Uri.parse(address); Uri repoUri = Uri.parse(address);
String swapBackUri = Utils.getLocalRepoUri(FDroidApp.REPO).toString(); String swapBackUri = Utils.getLocalRepoUri(FDroidApp.repo).toString();
AndroidHttpClient client = AndroidHttpClient.newInstance("F-Droid", SwapService.this); AndroidHttpClient client = AndroidHttpClient.newInstance("F-Droid", SwapService.this);
HttpPost request = new HttpPost("/request-swap"); HttpPost request = new HttpPost("/request-swap");

View File

@ -130,7 +130,7 @@ class BonjourFinder extends PeerFinder implements ServiceListener {
final String type = serviceInfo.getPropertyString("type"); final String type = serviceInfo.getPropertyString("type");
final String fingerprint = serviceInfo.getPropertyString("fingerprint"); final String fingerprint = serviceInfo.getPropertyString("fingerprint");
final boolean isFDroid = type != null && type.startsWith("fdroidrepo"); final boolean isFDroid = type != null && type.startsWith("fdroidrepo");
final boolean isSelf = FDroidApp.REPO != null && fingerprint != null && fingerprint.equalsIgnoreCase(FDroidApp.REPO.fingerprint); final boolean isSelf = FDroidApp.repo != null && fingerprint != null && fingerprint.equalsIgnoreCase(FDroidApp.repo.fingerprint);
if (isFDroid && !isSelf) { if (isFDroid && !isSelf) {
Utils.debugLog(TAG, "Found F-Droid swap Bonjour service:\n" + serviceInfo); Utils.debugLog(TAG, "Found F-Droid swap Bonjour service:\n" + serviceInfo);
subscriber.onNext(new BonjourPeer(serviceInfo)); subscriber.onNext(new BonjourPeer(serviceInfo));

View File

@ -55,7 +55,7 @@ public class BonjourBroadcast extends SwapType {
HashMap<String, String> values = new HashMap<>(); HashMap<String, String> values = new HashMap<>();
values.put("path", "/fdroid/repo"); values.put("path", "/fdroid/repo");
values.put("name", repoName); values.put("name", repoName);
values.put("fingerprint", FDroidApp.REPO.fingerprint); values.put("fingerprint", FDroidApp.repo.fingerprint);
String type; String type;
if (Preferences.get().isLocalRepoHttpsEnabled()) { if (Preferences.get().isLocalRepoHttpsEnabled()) {
values.put("type", "fdroidrepos"); values.put("type", "fdroidrepos");

View File

@ -17,6 +17,7 @@ import org.apache.commons.net.util.SubnetUtils;
import org.fdroid.fdroid.FDroidApp; import org.fdroid.fdroid.FDroidApp;
import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.Preferences;
import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.Utils;
import org.fdroid.fdroid.data.Repo;
import org.fdroid.fdroid.localrepo.LocalRepoKeyStore; import org.fdroid.fdroid.localrepo.LocalRepoKeyStore;
import org.fdroid.fdroid.localrepo.LocalRepoManager; import org.fdroid.fdroid.localrepo.LocalRepoManager;
@ -135,8 +136,9 @@ public class WifiStateChangeService extends IntentService {
} else { } else {
scheme = "http"; scheme = "http";
} }
FDroidApp.REPO.name = Preferences.get().getLocalRepoName(); Repo repo = new Repo();
FDroidApp.REPO.address = String.format(Locale.ENGLISH, "%s://%s:%d/fdroid/repo", repo.name = Preferences.get().getLocalRepoName();
repo.address = String.format(Locale.ENGLISH, "%s://%s:%d/fdroid/repo",
scheme, FDroidApp.ipAddressString, FDroidApp.port); scheme, FDroidApp.ipAddressString, FDroidApp.port);
if (isInterrupted()) { // can be canceled by a change via WifiStateChangeReceiver if (isInterrupted()) { // can be canceled by a change via WifiStateChangeReceiver
@ -145,7 +147,7 @@ public class WifiStateChangeService extends IntentService {
Context context = WifiStateChangeService.this.getApplicationContext(); Context context = WifiStateChangeService.this.getApplicationContext();
LocalRepoManager lrm = LocalRepoManager.get(context); LocalRepoManager lrm = LocalRepoManager.get(context);
lrm.writeIndexPage(Utils.getSharingUri(FDroidApp.REPO).toString()); lrm.writeIndexPage(Utils.getSharingUri(FDroidApp.repo).toString());
if (isInterrupted()) { // can be canceled by a change via WifiStateChangeReceiver if (isInterrupted()) { // can be canceled by a change via WifiStateChangeReceiver
return; return;
@ -154,7 +156,9 @@ public class WifiStateChangeService extends IntentService {
// the fingerprint for the local repo's signing key // the fingerprint for the local repo's signing key
LocalRepoKeyStore localRepoKeyStore = LocalRepoKeyStore.get(context); LocalRepoKeyStore localRepoKeyStore = LocalRepoKeyStore.get(context);
Certificate localCert = localRepoKeyStore.getCertificate(); Certificate localCert = localRepoKeyStore.getCertificate();
FDroidApp.REPO.fingerprint = Utils.calcFingerprint(localCert); repo.fingerprint = Utils.calcFingerprint(localCert);
FDroidApp.repo = repo;
/* /*
* Once the IP address is known we need to generate a self * Once the IP address is known we need to generate a self

View File

@ -504,7 +504,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
// Even if they opted to skip the message which says "Touch devices to swap", // Even if they opted to skip the message which says "Touch devices to swap",
// we still want to actually enable the feature, so that they could touch // we still want to actually enable the feature, so that they could touch
// during the wifi qr code being shown too. // during the wifi qr code being shown too.
boolean nfcMessageReady = NfcHelper.setPushMessage(this, Utils.getSharingUri(FDroidApp.REPO)); boolean nfcMessageReady = NfcHelper.setPushMessage(this, Utils.getSharingUri(FDroidApp.repo));
if (Preferences.get().showNfcDuringSwap() && nfcMessageReady) { if (Preferences.get().showNfcDuringSwap() && nfcMessageReady) {
inflateInnerView(R.layout.swap_nfc); inflateInnerView(R.layout.swap_nfc);
@ -669,7 +669,7 @@ public class SwapWorkflowActivity extends AppCompatActivity {
PrepareSwapRepo(@NonNull Set<String> apps) { PrepareSwapRepo(@NonNull Set<String> apps) {
context = SwapWorkflowActivity.this; context = SwapWorkflowActivity.this;
selectedApps = apps; selectedApps = apps;
sharingUri = Utils.getSharingUri(FDroidApp.REPO); sharingUri = Utils.getSharingUri(FDroidApp.repo);
} }
private void broadcast(int type) { private void broadcast(int type) {

View File

@ -121,7 +121,7 @@ public class WifiQrView extends ScrollView implements SwapWorkflowActivity.Inner
private void setUIFromWifi() { private void setUIFromWifi() {
if (TextUtils.isEmpty(FDroidApp.REPO.address)) { if (TextUtils.isEmpty(FDroidApp.repo.address)) {
return; return;
} }
@ -139,7 +139,7 @@ public class WifiQrView extends ScrollView implements SwapWorkflowActivity.Inner
* wifi AP to join. Lots of QR Scanners are buggy and do not respect * wifi AP to join. Lots of QR Scanners are buggy and do not respect
* custom URI schemes, so we have to use http:// or https:// :-( * custom URI schemes, so we have to use http:// or https:// :-(
*/ */
Uri sharingUri = Utils.getSharingUri(FDroidApp.REPO); Uri sharingUri = Utils.getSharingUri(FDroidApp.repo);
String qrUriString = (scheme + sharingUri.getHost()).toUpperCase(Locale.ENGLISH); String qrUriString = (scheme + sharingUri.getHost()).toUpperCase(Locale.ENGLISH);
if (sharingUri.getPort() != 80) { if (sharingUri.getPort() != 80) {
qrUriString += ":" + sharingUri.getPort(); qrUriString += ":" + sharingUri.getPort();