Skip to content

Commit 406e5c8

Browse files
authored
Check for null resourceName before attempting to delete a cert (#669)
Without this, the sdk will send a null resourceName to the server, resulting in a somewhat misleading 404 error being returned.
1 parent 96e3aa5 commit 406e5c8

File tree

4 files changed

+37
-2
lines changed

4 files changed

+37
-2
lines changed

src/project-management/android-app.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,12 @@ export class AndroidApp {
103103
}
104104

105105
public deleteShaCertificate(certificateToDelete: ShaCertificate): Promise<void> {
106+
if (!certificateToDelete.resourceName) {
107+
throw new FirebaseProjectManagementError(
108+
'invalid-argument',
109+
'Specified certificate does not include a resourceName. (Use AndroidApp.getShaCertificates() to retrieve ' +
110+
'certificates with a resourceName.');
111+
}
106112
return this.requestHandler.deleteResource(certificateToDelete.resourceName);
107113
}
108114

src/utils/error.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,12 @@ export class FirebaseMessagingError extends PrefixedFirebaseError {
312312
export class FirebaseProjectManagementError extends PrefixedFirebaseError {
313313
constructor(code: ProjectManagementErrorCode, message: string) {
314314
super('project-management', code, message);
315+
316+
/* tslint:disable:max-line-length */
317+
// Set the prototype explicitly. See the following link for more details:
318+
// https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work
319+
/* tslint:enable:max-line-length */
320+
(this as any).__proto__ = FirebaseProjectManagementError.prototype;
315321
}
316322
}
317323

test/integration/project-management.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,18 @@ describe('admin.projectManagement', () => {
175175
expect(certs.length).to.equal(0);
176176
});
177177
});
178+
179+
it('add a cert and then remove it fails due to missing resourceName',
180+
() => {
181+
const shaCertificate =
182+
admin.projectManagement().shaCertificate(SHA_256_HASH);
183+
return androidApp.addShaCertificate(shaCertificate)
184+
.then(() => androidApp.deleteShaCertificate(shaCertificate))
185+
.should.eventually.be
186+
.rejectedWith(
187+
'Specified certificate does not include a resourceName')
188+
.with.property('code', 'project-management/invalid-argument');
189+
});
178190
});
179191

180192
describe('androidApp.getConfig()', () => {

test/unit/project-management/android-app.spec.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -289,22 +289,33 @@ describe('AndroidApp', () => {
289289

290290
describe('deleteShaCertificate', () => {
291291
const certificateToDelete = new ShaCertificate(VALID_SHA_1_HASH);
292+
const certificateToDeleteWithResourceName =
293+
new ShaCertificate(VALID_SHA_1_HASH, 'resource/name');
292294

293295
it('should propagate API errors', () => {
294296
const stub = sinon
295297
.stub(ProjectManagementRequestHandler.prototype, 'deleteResource')
296298
.returns(Promise.reject(EXPECTED_ERROR));
297299
stubs.push(stub);
298-
return androidApp.deleteShaCertificate(certificateToDelete)
300+
return androidApp
301+
.deleteShaCertificate(certificateToDeleteWithResourceName)
299302
.should.eventually.be.rejected.and.equal(EXPECTED_ERROR);
300303
});
301304

305+
it('should fail on certificate without resourceName', () => {
306+
expect(() => androidApp.deleteShaCertificate(certificateToDelete))
307+
.to.throw(FirebaseProjectManagementError)
308+
.with.property('code', 'project-management/invalid-argument');
309+
});
310+
302311
it('should resolve on success', () => {
303312
const stub = sinon
304313
.stub(ProjectManagementRequestHandler.prototype, 'deleteResource')
305314
.returns(Promise.resolve());
306315
stubs.push(stub);
307-
return androidApp.deleteShaCertificate(certificateToDelete).should.eventually.be.fulfilled;
316+
return androidApp
317+
.deleteShaCertificate(certificateToDeleteWithResourceName)
318+
.should.eventually.be.fulfilled;
308319
});
309320
});
310321

0 commit comments

Comments
 (0)