Skip to content

Commit 7c2d260

Browse files
willdurandRob--W
andauthored
fix: Remove READ_EXTERNAL_STORAGE permission requirement (backport #3018) (#3023)
Co-authored-by: Rob Wu <rob@robwu.nl>
1 parent 2c90009 commit 7c2d260

4 files changed

Lines changed: 0 additions & 371 deletions

File tree

src/extension-runners/firefox-android.js

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,6 @@ export class FirefoxAndroidExtensionRunner {
130130

131131
await this.adbDevicesDiscoveryAndSelect();
132132
await this.apkPackagesDiscoveryAndSelect();
133-
await this.adbCheckRuntimePermissions();
134133
await this.adbForceStopSelectedPackage();
135134

136135
// Create profile prefs (with enabled remote RDP server), prepare the
@@ -381,41 +380,6 @@ export class FirefoxAndroidExtensionRunner {
381380
await adbUtils.amForceStopAPK(selectedAdbDevice, selectedFirefoxApk);
382381
}
383382

384-
async adbCheckRuntimePermissions() {
385-
const { adbUtils, selectedAdbDevice, selectedFirefoxApk } = this;
386-
387-
log.debug(`Discovering Android version for ${selectedAdbDevice}...`);
388-
389-
const androidVersion = await adbUtils.getAndroidVersionNumber(
390-
selectedAdbDevice
391-
);
392-
393-
if (typeof androidVersion !== 'number' || Number.isNaN(androidVersion)) {
394-
throw new WebExtError(`Invalid Android version: ${androidVersion}`);
395-
}
396-
397-
log.debug(`Detected Android version ${androidVersion}`);
398-
399-
if (androidVersion < 23) {
400-
return;
401-
}
402-
403-
log.debug(
404-
'Checking read/write permissions needed for web-ext' +
405-
`on ${selectedFirefoxApk}...`
406-
);
407-
408-
// Runtime permissions needed to Firefox to be able to access the
409-
// xpi file uploaded to the android device or emulator.
410-
const requiredPermissions = ['android.permission.READ_EXTERNAL_STORAGE'];
411-
412-
await adbUtils.ensureRequiredAPKRuntimePermissions(
413-
selectedAdbDevice,
414-
selectedFirefoxApk,
415-
requiredPermissions
416-
);
417-
}
418-
419383
async adbPrepareProfileDir() {
420384
const {
421385
adbUtils,

src/util/adb.js

Lines changed: 0 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -135,66 +135,6 @@ export default class ADBUtils {
135135
});
136136
}
137137

138-
async getAndroidVersionNumber(deviceId: string): Promise<number> {
139-
const androidVersion = (
140-
await this.runShellCommand(deviceId, ['getprop', 'ro.build.version.sdk'])
141-
).trim();
142-
143-
const androidVersionNumber = parseInt(androidVersion);
144-
145-
// No need to check the granted runtime permissions on Android versions < Lollypop.
146-
if (isNaN(androidVersionNumber)) {
147-
throw new WebExtError(
148-
'Unable to discovery android version on ' +
149-
`${deviceId}: ${androidVersion}`
150-
);
151-
}
152-
153-
return androidVersionNumber;
154-
}
155-
156-
// Raise an UsageError when the given APK does not have the required runtime permissions.
157-
async ensureRequiredAPKRuntimePermissions(
158-
deviceId: string,
159-
apk: string,
160-
permissions: Array<string>
161-
): Promise<void> {
162-
const permissionsMap = {};
163-
164-
// Initialize every permission to false in the permissions map.
165-
for (const perm of permissions) {
166-
permissionsMap[perm] = false;
167-
}
168-
169-
// Retrieve the permissions information for the given apk.
170-
const pmDumpLogs = (
171-
await this.runShellCommand(deviceId, ['pm', 'dump', apk])
172-
).split('\n');
173-
174-
// Set to true the required permissions that have been granted.
175-
for (const line of pmDumpLogs) {
176-
for (const perm of permissions) {
177-
if (
178-
line.includes(`${perm}: granted=true`) ||
179-
line.includes(`${perm}, granted=true`)
180-
) {
181-
permissionsMap[perm] = true;
182-
}
183-
}
184-
}
185-
186-
for (const perm of permissions) {
187-
if (!permissionsMap[perm]) {
188-
throw new UsageError(
189-
`Required ${perm} has not be granted for ${apk}. ` +
190-
'Please grant them using the Android Settings ' +
191-
'or using the following adb command:\n' +
192-
`\t adb shell pm grant ${apk} ${perm}\n`
193-
);
194-
}
195-
}
196-
}
197-
198138
async amForceStopAPK(deviceId: string, apk: string): Promise<void> {
199139
await this.runShellCommand(deviceId, ['am', 'force-stop', apk]);
200140
}

tests/unit/test-extension-runners/test.firefox-android.js

Lines changed: 0 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,6 @@ function prepareSelectedDeviceAndAPKParams(
117117
'org.mozilla.reference.browser',
118118
])
119119
),
120-
getAndroidVersionNumber: sinon.spy(() => Promise.resolve(20)),
121120
amForceStopAPK: sinon.spy(() => Promise.resolve()),
122121
discoverRDPUnixSocket: sinon.spy(() =>
123122
Promise.resolve(fakeRDPUnixSocketFile)
@@ -132,7 +131,6 @@ function prepareSelectedDeviceAndAPKParams(
132131
clearArtifactsDir: sinon.spy(() => Promise.resolve()),
133132
detectOrRemoveOldArtifacts: sinon.spy(() => Promise.resolve(true)),
134133
setUserAbortDiscovery: sinon.spy(() => {}),
135-
ensureRequiredAPKRuntimePermissions: sinon.spy(() => Promise.resolve()),
136134
...adbOverrides,
137135
};
138136

@@ -854,92 +852,6 @@ describe('util/extension-runners/firefox-android', () => {
854852
sinon.assert.calledOnce(anotherCallback);
855853
});
856854

857-
it('raises an error when unable to find an android version number', async () => {
858-
async function expectInvalidVersionError(version: any) {
859-
const { params, fakeADBUtils } = prepareSelectedDeviceAndAPKParams();
860-
861-
fakeADBUtils.getAndroidVersionNumber = sinon.spy(() => {
862-
return version;
863-
});
864-
865-
const runnerInstance = new FirefoxAndroidExtensionRunner(params);
866-
const promise = runnerInstance.run();
867-
868-
const expectedMsg = `Invalid Android version: ${version}`;
869-
await assert.isRejected(promise, WebExtError);
870-
await assert.isRejected(promise, expectedMsg);
871-
}
872-
873-
await expectInvalidVersionError(undefined);
874-
await expectInvalidVersionError(NaN);
875-
});
876-
877-
it('does not check granted android permissions on Android <= 21', async () => {
878-
async function expectNoGrantedPermissionDiscovery(version) {
879-
const { params, fakeADBUtils } = prepareSelectedDeviceAndAPKParams();
880-
881-
fakeADBUtils.getAndroidVersionNumber = sinon.spy(() => {
882-
return Promise.resolve(version);
883-
});
884-
885-
const runnerInstance = new FirefoxAndroidExtensionRunner(params);
886-
887-
await runnerInstance.run();
888-
889-
sinon.assert.calledWithMatch(
890-
fakeADBUtils.getAndroidVersionNumber,
891-
'emulator-1'
892-
);
893-
894-
sinon.assert.notCalled(
895-
fakeADBUtils.ensureRequiredAPKRuntimePermissions
896-
);
897-
}
898-
899-
// KitKat (Android 4.4).
900-
await expectNoGrantedPermissionDiscovery(19);
901-
await expectNoGrantedPermissionDiscovery(21);
902-
// Lollipop versions (Android 5.0 and 5.1).
903-
await expectNoGrantedPermissionDiscovery(22);
904-
});
905-
906-
it('checks the granted android permissions on Android >= 23', async () => {
907-
async function testGrantedPermissionDiscovery(version) {
908-
const { params, fakeADBUtils } = prepareSelectedDeviceAndAPKParams();
909-
910-
fakeADBUtils.getAndroidVersionNumber = sinon.spy(() => {
911-
return Promise.resolve(version);
912-
});
913-
914-
const runnerInstance = new FirefoxAndroidExtensionRunner(params);
915-
916-
await runnerInstance.run();
917-
918-
sinon.assert.calledWithMatch(
919-
fakeADBUtils.getAndroidVersionNumber,
920-
'emulator-1'
921-
);
922-
923-
sinon.assert.calledWithMatch(
924-
fakeADBUtils.ensureRequiredAPKRuntimePermissions,
925-
'emulator-1',
926-
'org.mozilla.firefox',
927-
['android.permission.READ_EXTERNAL_STORAGE']
928-
);
929-
930-
sinon.assert.callOrder(
931-
fakeADBUtils.getAndroidVersionNumber,
932-
fakeADBUtils.ensureRequiredAPKRuntimePermissions
933-
);
934-
}
935-
936-
// Marshmallow (Android 6.0)
937-
await testGrantedPermissionDiscovery(23);
938-
// Nougat versions (Android 7.0 and 7.1.1)
939-
await testGrantedPermissionDiscovery(24);
940-
await testGrantedPermissionDiscovery(25);
941-
});
942-
943855
it('logs warnings on the unsupported CLI options', async () => {
944856
const params = prepareSelectedDeviceAndAPKParams();
945857

0 commit comments

Comments
 (0)