From 8e73be9b996f720ce760546089a91c9c403797ca Mon Sep 17 00:00:00 2001 From: Jonathan Yarbor Date: Tue, 31 Oct 2017 19:00:44 -0500 Subject: [PATCH 1/4] Add subuser impersonation Sendgrid API has an (as yet) undocumented feature allowing parent accounts to impersonate subusers by including an HTTP header "On-Behalf-Of" in each API request. This commit enables setting the value for impersonation when creating the Sendgrid API Client instance. --- packages/client/src/client.d.ts | 5 +++++ packages/client/src/client.js | 12 ++++++++++++ packages/client/src/client.spec.js | 16 ++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/packages/client/src/client.d.ts b/packages/client/src/client.d.ts index 1b5f92a5f..bef2f9587 100644 --- a/packages/client/src/client.d.ts +++ b/packages/client/src/client.d.ts @@ -8,6 +8,11 @@ declare class Client { */ setApiKey(apiKey: string): void; + /** + * Set client requests to impersonate a subuser + */ + impersonateSubuser(subuser: string): void; + /** * Set default header */ diff --git a/packages/client/src/client.js b/packages/client/src/client.js index a0018ed83..acae6111e 100644 --- a/packages/client/src/client.js +++ b/packages/client/src/client.js @@ -26,6 +26,7 @@ class Client { //API key this.apiKey = ''; + this.impersonateSubuser = ''; //Default headers this.defaultHeaders = { @@ -50,6 +51,13 @@ class Client { this.apiKey = apiKey; } + /** + * Set user impersonation + */ + impersonateSubuser(subuser) { + this.impersonateSubuser = subuser; + } + /** * Set default header */ @@ -79,6 +87,10 @@ class Client { headers.Authorization = 'Bearer ' + this.apiKey; } + if (this.impersonateSubuser) { + headers['On-Behalf-Of'] = this.impersonateSubuser; + } + //Return return headers; } diff --git a/packages/client/src/client.spec.js b/packages/client/src/client.spec.js index 3a2c1218b..7bba119f9 100644 --- a/packages/client/src/client.spec.js +++ b/packages/client/src/client.spec.js @@ -4,6 +4,22 @@ const baseUrl = 'http://localhost:4010/'; /** * Tests */ +describe('test_client_request_headers', () => { + const headers = { + 'apiKey': 'SendGrid API Key', + 'impersonateSubuser': 'abcxyz@this.is.a.test.subuser', +}; + const sgClient = require('./client'); + sgClient.setApiKey(headers.apiKey); + sgClient.impersonateSubuser(headers.impersonateSubuser); + it('should set the API Key', () => { + expect(sgClient.apiKey).to.equal(headers.apiKey); + }); + it('should set the imperonate subuser header', () => { + expect(sgClient.impersonateSubuser).to.equal(headers.impersonateSubuser); + }); +}); + describe('test_access_settings_activity_get', () => { const request = {}; const queryParams = { From ba45129c7d809a23b212c55dc0b53c92c2503ebc Mon Sep 17 00:00:00 2001 From: Jonathan Yarbor Date: Tue, 31 Oct 2017 19:08:32 -0500 Subject: [PATCH 2/4] Subuser impersonation patch Fix method and variable name collision --- packages/client/src/client.d.ts | 2 +- packages/client/src/client.js | 2 +- packages/client/src/client.spec.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/client/src/client.d.ts b/packages/client/src/client.d.ts index bef2f9587..b2eb11d03 100644 --- a/packages/client/src/client.d.ts +++ b/packages/client/src/client.d.ts @@ -11,7 +11,7 @@ declare class Client { /** * Set client requests to impersonate a subuser */ - impersonateSubuser(subuser: string): void; + setImpersonateSubuser(subuser: string): void; /** * Set default header diff --git a/packages/client/src/client.js b/packages/client/src/client.js index acae6111e..a2e62015f 100644 --- a/packages/client/src/client.js +++ b/packages/client/src/client.js @@ -54,7 +54,7 @@ class Client { /** * Set user impersonation */ - impersonateSubuser(subuser) { + setImpersonateSubuser(subuser) { this.impersonateSubuser = subuser; } diff --git a/packages/client/src/client.spec.js b/packages/client/src/client.spec.js index 7bba119f9..cc5b0ff60 100644 --- a/packages/client/src/client.spec.js +++ b/packages/client/src/client.spec.js @@ -11,7 +11,7 @@ describe('test_client_request_headers', () => { }; const sgClient = require('./client'); sgClient.setApiKey(headers.apiKey); - sgClient.impersonateSubuser(headers.impersonateSubuser); + sgClient.setImpersonateSubuser(headers.impersonateSubuser); it('should set the API Key', () => { expect(sgClient.apiKey).to.equal(headers.apiKey); }); From 03b053216b75e196a3b14c5c2af2bc23f4ea63f4 Mon Sep 17 00:00:00 2001 From: childish-sambino Date: Tue, 28 Apr 2020 12:37:11 -0500 Subject: [PATCH 3/4] Update client.js --- packages/client/src/classes/client.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/client/src/classes/client.js b/packages/client/src/classes/client.js index 8db6f3805..74bb23446 100644 --- a/packages/client/src/classes/client.js +++ b/packages/client/src/classes/client.js @@ -18,6 +18,7 @@ const TWILIO_BASE_URL = 'https://email.twilio.com/'; class Client { constructor() { this.auth = ''; + this.impersonateSubuser = ''; this.defaultHeaders = { Accept: 'application/json', @@ -65,6 +66,10 @@ class Client { return typeof value === 'string' || value instanceof String; } + setImpersonateSubuser(subuser) { + this.impersonateSubuser = subuser; + } + setDefaultHeader(key, value) { this.defaultHeaders[key] = value; return this; @@ -84,6 +89,10 @@ class Client { headers.Authorization = this.auth; } + if (this.impersonateSubuser) { + headers['On-Behalf-Of'] = this.impersonateSubuser; + } + return headers; } From cc6db6b4f009ea0fa5a4d54ab177d84ace4de39e Mon Sep 17 00:00:00 2001 From: childish-sambino Date: Tue, 28 Apr 2020 12:43:28 -0500 Subject: [PATCH 4/4] Update client.spec.js --- packages/client/src/client.spec.js | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/packages/client/src/client.spec.js b/packages/client/src/client.spec.js index b850722bc..dbf0421e1 100644 --- a/packages/client/src/client.spec.js +++ b/packages/client/src/client.spec.js @@ -76,21 +76,13 @@ describe('client', () => { }); }); -describe('test_client_request_headers', () => { - const headers = { - 'apiKey': 'SendGrid API Key', - 'impersonateSubuser': 'abcxyz@this.is.a.test.subuser', - }; +describe('setImpersonateSubuser', () => { + const impersonateSubuser = 'abcxyz@this.is.a.test.subuser'; const sgClient = require('./client'); - sgClient.setApiKey(headers.apiKey); - sgClient.setImpersonateSubuser(headers.impersonateSubuser); - - it('should set the API Key', () => { - expect(sgClient.apiKey).to.equal(headers.apiKey); - }); + sgClient.setImpersonateSubuser(impersonateSubuser); it('should set the imperonate subuser header', () => { - expect(sgClient.impersonateSubuser).to.equal(headers.impersonateSubuser); + expect(sgClient.impersonateSubuser).to.equal(impersonateSubuser); }); });