diff --git a/app/src/main/java/org/fdroid/fdroid/data/NewRepoConfig.java b/app/src/main/java/org/fdroid/fdroid/data/NewRepoConfig.java index 099b0ff82..71c16b022 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/NewRepoConfig.java +++ b/app/src/main/java/org/fdroid/fdroid/data/NewRepoConfig.java @@ -10,6 +10,7 @@ import org.fdroid.fdroid.R; import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.nearby.SwapWorkflowActivity; import org.fdroid.fdroid.nearby.peers.WifiPeer; +import org.fdroid.fdroid.views.ManageReposActivity; import java.util.Arrays; import java.util.List; @@ -50,6 +51,12 @@ public class NewRepoConfig { return; } + if (ManageReposActivity.hasDisallowInstallUnknownSources(context)) { + errorMessage = ManageReposActivity.getDisallowInstallUnknownSourcesErrorMessage(context); + isValidRepo = false; + return; + } + Utils.debugLog(TAG, "Parsing incoming intent looking for repo: " + incomingUri); // scheme and host should only ever be pure ASCII aka Locale.ENGLISH diff --git a/app/src/main/java/org/fdroid/fdroid/views/ManageReposActivity.java b/app/src/main/java/org/fdroid/fdroid/views/ManageReposActivity.java index 0db904c8a..9560c7edb 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/ManageReposActivity.java +++ b/app/src/main/java/org/fdroid/fdroid/views/ManageReposActivity.java @@ -33,6 +33,7 @@ import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Build; import android.os.Bundle; +import android.os.UserManager; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; @@ -194,7 +195,11 @@ public class ManageReposActivity extends AppCompatActivity @Override public void finish() { Intent ret = new Intent(); - setResult(RESULT_OK, ret); + if (getIntent() != null && hasDisallowInstallUnknownSources(this)) { + setResult(RESULT_CANCELED, ret); + } else { + setResult(RESULT_OK, ret); + } super.finish(); } @@ -262,7 +267,12 @@ public class ManageReposActivity extends AppCompatActivity } private void showAddRepo(String newAddress, String newFingerprint, String username, String password) { - new AddRepo(newAddress, newFingerprint, username, password); + if (hasDisallowInstallUnknownSources(this)) { + String msg = getDisallowInstallUnknownSourcesErrorMessage(this); + Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); + } else { + new AddRepo(newAddress, newFingerprint, username, password); + } } /** @@ -911,4 +921,32 @@ public class ManageReposActivity extends AppCompatActivity private void notifyDataSetChanged() { getSupportLoaderManager().restartLoader(0, null, this); } + + /** + * {@link android.app.admin.DevicePolicyManager} makes it possible to set + * user- or device-wide restrictions. This changes whether installing from + * "Unknown Sources" has been disallowed by device policy. + * + * @return boolean whether installing from Unknown Sources has been disallowed + * @see UserManager#DISALLOW_INSTALL_UNKNOWN_SOURCES + * @see UserManager#DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY + */ + public static boolean hasDisallowInstallUnknownSources(Context context) { + UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE); + if (Build.VERSION.SDK_INT < 29) { + return userManager.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES); + } else { + return userManager.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES) + || userManager.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY); + } + } + + public static String getDisallowInstallUnknownSourcesErrorMessage(Context context) { + UserManager userManager = (UserManager) context.getSystemService(Context.USER_SERVICE); + if (Build.VERSION.SDK_INT >= 29 + && userManager.hasUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES_GLOBALLY)) { + return context.getString(R.string.has_disallow_install_unknown_sources_globally); + } + return context.getString(R.string.has_disallow_install_unknown_sources); + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0393d84dd..bbf57db48 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -197,6 +197,10 @@ This often occurs with apps installed via Google Play or other sources, if they Bad fingerprint This is not a valid URL. Ignoring malformed repo URI: %s + + Your device admin doesn\'t allow installing apps from unknown sources, that includes new repos + + Unknown sources can\'t be added by this user, that includes new repos Repository: %s Repositories