From f73ad19dc7912f9b4eeaf493010a67ae3acf11fb Mon Sep 17 00:00:00 2001 From: James Keast <30476676+jkeastbb@users.noreply.github.com> Date: Thu, 29 Nov 2018 14:07:21 -0400 Subject: [PATCH] Updating example applications for the BlackBerry Spark Communications Services SDK R7 Release. (#17) --- ClickToCall/.eslintrc.json | 9 +- ClickToCall/README.md | 22 +- ClickToCall/callPopup.html | 29 ++- ClickToCall/js/callPopup.js | 17 +- ClickToCall/js/config_azure.js | 70 +++++ .../js/{config.js => config_google.js} | 61 ++--- ClickToCall/js/config_mock.js | 47 ++++ ClickToCall/js/index.js | 6 +- ClickToCall/package.json | 3 +- ClickToChat/.eslintrc.json | 9 +- ClickToChat/README.md | 23 +- ClickToChat/index.html | 40 ++- ClickToChat/js/config.js | 79 ------ ClickToChat/js/config_azure.js | 70 +++++ ClickToChat/js/config_google.js | 64 +++++ ClickToChat/js/config_mock.js | 48 ++++ ClickToChat/js/index.js | 26 +- ClickToChat/package.json | 3 +- DataTransfer/.eslintrc.json | 8 +- DataTransfer/README.md | 16 +- DataTransfer/index.html | 30 ++- DataTransfer/js/config_azure.js | 63 +++++ .../js/config_google.js | 46 ++-- DataTransfer/js/config_mock.js | 39 +++ DataTransfer/js/dataTransferElement.js | 6 +- DataTransfer/js/index.js | 16 +- DataTransfer/package.json | 3 +- KeyProviderServer/README.md | 13 +- .../screenShots/keyProviderService-azure.png | Bin 58255 -> 62034 bytes Node/GoogleLogin.js | 5 +- Node/README.md | 10 +- QuickStart/.eslintrc.json | 5 +- QuickStart/README.md | 26 +- QuickStart/config_azure.js | 63 +++++ .../config.js => QuickStart/config_google.js | 43 ++-- QuickStart/config_mock.js | 42 +++ QuickStart/index.html | 240 ++++++++++-------- README.md | 52 ++-- SimpleChat/.eslintrc.json | 8 +- SimpleChat/README.md | 28 +- SimpleChat/index.html | 32 ++- SimpleChat/js/config.js | 77 ------ SimpleChat/js/config_azure.js | 62 +++++ SimpleChat/js/config_google.js | 56 ++++ SimpleChat/js/config_mock.js | 39 +++ SimpleChat/js/simpleChat.js | 19 +- SimpleChat/package.json | 3 +- ThreadedChat/.eslintrc.json | 9 +- ThreadedChat/README.md | 22 +- ThreadedChat/index.html | 33 ++- ThreadedChat/js/config_azure.js | 67 +++++ .../js/{config.js => config_google.js} | 57 ++--- ThreadedChat/js/config_mock.js | 42 +++ ThreadedChat/js/threadedChat.js | 19 +- ThreadedChat/package.json | 3 +- 55 files changed, 1370 insertions(+), 558 deletions(-) create mode 100644 ClickToCall/js/config_azure.js rename ClickToCall/js/{config.js => config_google.js} (52%) create mode 100644 ClickToCall/js/config_mock.js delete mode 100644 ClickToChat/js/config.js create mode 100644 ClickToChat/js/config_azure.js create mode 100644 ClickToChat/js/config_google.js create mode 100644 ClickToChat/js/config_mock.js create mode 100644 DataTransfer/js/config_azure.js rename QuickStart/config.js => DataTransfer/js/config_google.js (62%) create mode 100644 DataTransfer/js/config_mock.js create mode 100644 QuickStart/config_azure.js rename DataTransfer/js/config.js => QuickStart/config_google.js (61%) create mode 100644 QuickStart/config_mock.js delete mode 100644 SimpleChat/js/config.js create mode 100644 SimpleChat/js/config_azure.js create mode 100644 SimpleChat/js/config_google.js create mode 100644 SimpleChat/js/config_mock.js create mode 100644 ThreadedChat/js/config_azure.js rename ThreadedChat/js/{config.js => config_google.js} (51%) create mode 100644 ThreadedChat/js/config_mock.js diff --git a/ClickToCall/.eslintrc.json b/ClickToCall/.eslintrc.json index dfc3da9..ed73777 100644 --- a/ClickToCall/.eslintrc.json +++ b/ClickToCall/.eslintrc.json @@ -24,7 +24,12 @@ "FirebaseKeyProvider": false, "KeyProtect": false, "USER_SECRET": false, - "KMS_ARGON_WASM_URL": false + "KMS_ARGON_WASM_URL": false, + "GooglePeopleUserManager": false, + "AUTH_CONFIGURATION": false, + "AuthenticationManager": false, + "MockUserManager": false, + "AzureUserManager": false }, "rules": @@ -34,7 +39,7 @@ [ "error", { - "varsIgnorePattern": "makeCall|KMS_ARGON_WASM_URL|CONTACT_REG_ID|ID_PROVIDER_DOMAIN|USER_SECRET|ID_PROVIDER_ENVIRONMENT|createAuthManager|createUserManager|createKeyProvider|createKeyProtect" + "varsIgnorePattern": "AUTH_CONFIGURATION|makeCall|KMS_ARGON_WASM_URL|CONTACT_REG_ID|ID_PROVIDER_DOMAIN|USER_SECRET|ID_PROVIDER_ENVIRONMENT|createAuthManager|createUserManager" } ] } diff --git a/ClickToCall/README.md b/ClickToCall/README.md index f461da6..6de350c 100644 --- a/ClickToCall/README.md +++ b/ClickToCall/README.md @@ -1,15 +1,17 @@ -![BlackBerry Spark Communications Platform](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/resources/images/bnr-bbm-enterprise-sdk-title.png) +![BlackBerry Spark Communications Services](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/resources/images/bnr-bbm-enterprise-sdk-title.png) # Click To Call Sample for JavaScript The Click to Call sample app demonstrates how to integrate a video call -experience into your website with the Spark SDK for JavaScript. This app allows a user to click a button on a webpage to start a secure video call with a predefined user or agent. The bbmChat widget handles the rendering of messages within the chat, and allows the user to send text, picture, and file messages. +experience into your website with the Spark Communications SDK. This app allows +a user to click a button on a webpage to start a secure video call with a +predefined user or agent. The bbmCall widget handles the rendering of the +incoming and outgoing video streams. ### Features This app demonstrates how easy it is to integrate the bbmCall widget into your -webpage. It initializes the Spark SDK for JavaScript, and starts a -video call with a predefined user. +webpage. It initializes the SDK, and starts a video call with a predefined user.
@@ -19,9 +21,9 @@ video call with a predefined user. ## Getting Started -This sample requires the Spark SDK, which you can find along with related resources at the location below. +This sample requires the Spark Communications SDK for JavaScript, which you can find along with related resources at the location below. -* Getting started with the [Spark SDK](https://developers.blackberry.com/us/en/products/blackberry-bbm-enterprise-sdk.html) +* Getting started with the [Spark Communications SDK](https://developers.blackberry.com/us/en/products/blackberry-spark-communications-platform.html) * [Development Guide](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/index.html) * [API Reference](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/reference/javascript/index.html) @@ -44,7 +46,7 @@ To use the ClickToCall example, you must set up the following elements in js/con - Oauth2 configuration (AUTH_CONFIGURATION) - A hard coded contact registration ID with whom anyone who views the page will talk (CONTACT_REG_ID) -- Your Spark user domain (ID_PROVIDER_DOMAIN) +- Your sandbox domain (ID_PROVIDER_DOMAIN) - Firebase configuration (FIREBASE_CONFIG) - User passcode (USER_SECRET) @@ -53,7 +55,7 @@ To use the ClickToCall example, you must set up the following elements in js/con Follow this guide for a walkthrough of how to integrate a video call into your webpage. - [Import the bbmCall UI widget into your web application](#importCall) -- [Initialize the Spark SDK for JavaScript](#init) +- [Initialize the SDK](#init) - [Perform setup](#setup) - [Start a video call with a predefined user](#startCall) @@ -65,7 +67,7 @@ Your web application needs to import the bbmCall widget in order to bring a vide ``` -### Initialize the Spark SDK for JavaScript +### Initialize the SDK ```javascript // Instantiate BBMEnterprise. @@ -80,7 +82,7 @@ Your web application needs to import the bbmCall widget in order to bring a vide }); ``` -For more information about setting up the Spark SDK for JavaScript, visit the [Getting Started with Web](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/gettingStarted-web.html) section of the guide. +For more information about setting up the SDK, visit the [Getting Started with Web](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/gettingStarted-web.html) section of the guide. ### Perform setup ```javascript diff --git a/ClickToCall/callPopup.html b/ClickToCall/callPopup.html index b77c492..eb04578 100644 --- a/ClickToCall/callPopup.html +++ b/ClickToCall/callPopup.html @@ -22,16 +22,37 @@ - - - - + + + + + + + + + + + + + + + + diff --git a/ClickToCall/js/callPopup.js b/ClickToCall/js/callPopup.js index c5cf30b..09f9dc1 100644 --- a/ClickToCall/js/callPopup.js +++ b/ClickToCall/js/callPopup.js @@ -31,7 +31,21 @@ bbmCallWidget = document.createElement('bbm-call'); await window.customElements.whenDefined('bbm-call'); await BBMEnterprise.validateBrowser(); - const authManager = createAuthManager(); + const authManager = new AuthenticationManager(AUTH_CONFIGURATION); + // Override getUserId() used by the MockAuthManager. + authManager.getUserId = () => new Promise((resolve, reject) => { + const userEmailDialog = document.createElement('bbm-user-email-dialog'); + document.body.appendChild(userEmailDialog); + userEmailDialog.addEventListener('Ok', e => { + userEmailDialog.parentNode.removeChild(userEmailDialog); + resolve(e.detail.userEmail); + }); + userEmailDialog.addEventListener('Cancel', () => { + userEmailDialog.parentNode.removeChild(userEmailDialog); + reject('Failed to get user email.'); + }); + }); + const authUserInfo = await authManager.authenticate(); if (!authUserInfo) { @@ -59,7 +73,6 @@ const userRegId = bbmeSdk.getRegistrationInfo().regId; contactsManager = await createUserManager(userRegId, authManager, - bbmeSdk.getIdentitiesFromAppUserId, bbmeSdk.getIdentitiesFromAppUserIds); await contactsManager.initialize(); makeCall(CONTACT_REG_ID, true); diff --git a/ClickToCall/js/config_azure.js b/ClickToCall/js/config_azure.js new file mode 100644 index 0000000..876d81c --- /dev/null +++ b/ClickToCall/js/config_azure.js @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018 BlackBerry. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +// Reg Id of the contact to start call with. +const CONTACT_REG_ID = 'contact_reg_id'; + +// This secret is used to protect user keys. Must be individual for each user. +const USER_SECRET = 'user_secret'; + +// Refer to the guide to set up your application to use Azure: +// https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/azureForWebExamples.html + +// This domain is a string known to the BBM Enterprise server, which is +// generally a GUID. +// To create a new domain follow the link below +// https://account.good.com/#/a/organization/applications/add +const ID_PROVIDER_DOMAIN = 'your_idp_domain'; + +// The client ID of application registered on OAuth 2.0 server. +// To set up your application refer to +// https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/azureIdentityManagement.html +const CLIENT_ID = 'your_client_id'; + +// The tenant ID of your organization. +// To get your tenant ID refer to +// https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-howto-tenant +const TENANT_ID = 'your_tenant_id'; + +// ============================================================================= +// Configuration below does not require modifications. Change it only if you +// want to change existing application behavior. + +// The environment of your BBM Enterprise server. Must be either 'Sandbox' or +// 'Production'. +const ID_PROVIDER_ENVIRONMENT = 'Sandbox'; + +// The URL or relative path of the Argon2 WASM file. +const KMS_ARGON_WASM_URL = '../../sdk/argon2.wasm'; + +// This configuration contains service endpoints and information for OAuth2 +// authentication. +const AUTH_CONFIGURATION = { + // OAuth 2.0 endpoint for requesting an access token. + authService: `https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/authorize`, + + // The client ID of application registered on OAuth 2.0 server + clientId: CLIENT_ID, + + // Scopes of OAuth 2.0 access token (which resources it can access) + scope: `api://${CLIENT_ID}/Messaging.All https://graph.microsoft.com/User.ReadWrite https://graph.microsoft.com/User.ReadBasic.All` +}; + +// Create the user manager for the Click To Call app. +const createUserManager = (userRegId, authManager, getIdentities) => + Promise.resolve(new AzureUserManager(userRegId, authManager, getIdentities)); diff --git a/ClickToCall/js/config.js b/ClickToCall/js/config_google.js similarity index 52% rename from ClickToCall/js/config.js rename to ClickToCall/js/config_google.js index 605b253..d7150f4 100644 --- a/ClickToCall/js/config.js +++ b/ClickToCall/js/config_google.js @@ -19,12 +19,24 @@ // Reg Id of the contact to start call with const CONTACT_REG_ID = 'contact_reg_id'; -// This domain is a string known to the BBM Enterprise server, which is +// This secret is used to protect user keys. Must be individual for each user. +const USER_SECRET = 'user_secret'; + +// Refer to the guide to set up your application to use Google: +// https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/googleSignInForWebExamples.html + +// This domain is a string known to the BBM Enterprise server, which is // generally a GUID. +// To create a new domain follow the link below +// https://account.good.com/#/a/organization/applications/add const ID_PROVIDER_DOMAIN = 'your_idp_domain'; -// This secret is used to protect user keys. Must be individual for each user. -const USER_SECRET = 'user_secret'; +// The client ID of application registered on OAuth 2.0 server. +const CLIENT_ID = 'your_client_id'; + +// ============================================================================= +// Configuration below does not require modifications. Change it only if you +// want to change existing application behavior. // The environment of your BBM Enterprise server. Must be either 'Sandbox' or // 'Production'. @@ -37,43 +49,16 @@ const KMS_ARGON_WASM_URL = '../../sdk/argon2.wasm'; // authentication. const AUTH_CONFIGURATION = { // OAuth 2.0 endpoint for requesting an access token - // To use google OAuth service, put: - // 'https://accounts.google.com/o/oauth2/v2/auth' - authService : 'your_auth_service_endpoint', - - // OAuth 2.0 endpoint for token validation - // To use google toke info service, put: - // 'https://www.googleapis.com/oauth2/v3/tokeninfo' - tokenInfoService : 'your_oauth_token_info_endpoint', - - // OAuth 2.0 endpoint for obtaining user information (name, email, avatar URL) - // To use google user info service, put: - // 'https://www.googleapis.com/plus/v1/people/me' - userInfoService : 'your_oauth_user_info_endpoint', - + authService : 'https://accounts.google.com/o/oauth2/v2/auth', + // Scopes of OAuth 2.0 access token (which resources it can access) - // If google OAuth service is used, put following scopes: - // 'https://www.googleapis.com/auth/firebase https://www.googleapis.com/auth/userinfo.email' - scope : 'your_scope_oauth', - - // The client ID of application registered on OAuth 2.0 server - clientId: 'your_client_id' -}; + scope : 'https://www.googleapis.com/auth/contacts', -// Firebase config info -const FIREBASE_CONFIG = { - apiKey: 'your_api_key', - authDomain: 'your_auth_domain', - databaseURL: 'your_database_url', - projectId: 'your_project_id', - storageBucket: 'your_storage_bucket', - messagingSenderId: 'your_messaging_sender_id' + // The client ID of application registered on OAuth 2.0 server. + clientId: CLIENT_ID }; -// Create the auth manager for the Click To Call app. -const createAuthManager = () => new GoogleAuthManager(AUTH_CONFIGURATION); - // Create the user manager for the Click To Call app. -const createUserManager = (userRegId, authManager, getIdentity, getIdentities) => - FirebaseUserManager.factory.createInstance(FIREBASE_CONFIG, - userRegId, authManager, GenericUserInfo, getIdentity, getIdentities); \ No newline at end of file +const createUserManager = (userRegId, authManager, getIdentities) => + Promise.resolve(new GooglePeopleUserManager(userRegId, authManager, + getIdentities, AUTH_CONFIGURATION)); \ No newline at end of file diff --git a/ClickToCall/js/config_mock.js b/ClickToCall/js/config_mock.js new file mode 100644 index 0000000..5100aeb --- /dev/null +++ b/ClickToCall/js/config_mock.js @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2018 BlackBerry. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +// Reg Id of the contact to start call with +const CONTACT_REG_ID = 'contact_reg_id'; + +// This domain is a string known to the BBM Enterprise server, which is +// generally a GUID. +// To create a new domain follow the link below +// https://account.good.com/#/a/organization/applications/add +const ID_PROVIDER_DOMAIN = 'your_idp_domain'; + +// This secret is used to protect user keys. Must be individual for each user. +const USER_SECRET = 'user_secret'; + +// ============================================================================= +// Configuration below does not require modifications. Change it only if you +// want to change existing application behavior. + +const AUTH_CONFIGURATION = { }; + +// The environment of your BBM Enterprise server. Must be either 'Sandbox' or +// 'Production'. +const ID_PROVIDER_ENVIRONMENT = 'Sandbox'; + +// The URL or relative path of the Argon2 WASM file. +const KMS_ARGON_WASM_URL = '../../sdk/argon2.wasm'; + +// Create the user manager for the Click To Call app. +const createUserManager = (userRegId, authManager, getIdentities) => + Promise.resolve(new MockUserManager(userRegId, authManager, getIdentities, + ID_PROVIDER_DOMAIN)); \ No newline at end of file diff --git a/ClickToCall/js/index.js b/ClickToCall/js/index.js index 428e4ba..5e8f944 100644 --- a/ClickToCall/js/index.js +++ b/ClickToCall/js/index.js @@ -21,8 +21,8 @@ * of how to implement generic Click To Call functionality using bbm-call UI * widget. * - * When user clicks "Start Secure Call" button, application will start BBME - * call with the hard coded user RegId (CONTACT_REG_ID). + * When the user clicks the "Start Secure Call" button, the application will + * start a call with the hard coded user RegId (CONTACT_REG_ID). * * @class ClickToCall * @memberof Examples @@ -37,4 +37,4 @@ function makeCall() { alert('Failed to create popup window. Please check that your browser' + ' allows popups on this page.'); } -} \ No newline at end of file +} diff --git a/ClickToCall/package.json b/ClickToCall/package.json index ff7da97..58452c7 100644 --- a/ClickToCall/package.json +++ b/ClickToCall/package.json @@ -4,6 +4,7 @@ "version": "1.0.0", "main": "index.html", "dependencies": { - "bbmCall": "file:../support/ui/widgets/bbmCall" + "bbmCall": "file:../support/ui/widgets/bbmCall", + "bbmUserEmailDialog": "file:../support/ui/widgets/bbmUserEmailDialog" } } diff --git a/ClickToChat/.eslintrc.json b/ClickToChat/.eslintrc.json index c6bb419..9d91ff1 100644 --- a/ClickToChat/.eslintrc.json +++ b/ClickToChat/.eslintrc.json @@ -26,7 +26,12 @@ "TimeRangeFormatter": false, "MessageFormatter": false, "USER_SECRET": false, - "KMS_ARGON_WASM_URL": false + "KMS_ARGON_WASM_URL": false, + "GooglePeopleUserManager": false, + "AUTH_CONFIGURATION": false, + "AuthenticationManager": false, + "MockUserManager": false, + "AzureUserManager": false }, "rules": @@ -36,7 +41,7 @@ [ "error", { - "varsIgnorePattern": "startChat|KMS_ARGON_WASM_URL|CONTACT_REG_ID|ID_PROVIDER_DOMAIN|USER_SECRET|ID_PROVIDER_ENVIRONMENT|createAuthManager|createUserManager|createKeyProvider|createKeyProtect" + "varsIgnorePattern": "AUTH_CONFIGURATION|startChat|KMS_ARGON_WASM_URL|CONTACT_REG_ID|ID_PROVIDER_DOMAIN|USER_SECRET|ID_PROVIDER_ENVIRONMENT|createAuthManager|createUserManager" } ] } diff --git a/ClickToChat/README.md b/ClickToChat/README.md index 88f9f1b..9be6d04 100644 --- a/ClickToChat/README.md +++ b/ClickToChat/README.md @@ -1,9 +1,12 @@ -![BlackBerry Spark Communications Platform](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/resources/images/bnr-bbm-enterprise-sdk-title.png) +![BlackBerry Spark Communications Services](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/resources/images/bnr-bbm-enterprise-sdk-title.png) # Click To Chat Sample for JavaScript -The Click to Chat sample app demonstrates how to integrate a chat -experience into your website with the Spark SDK for JavaScript. This app allows a user to click a button on a webpage to start a secure chat with a predefined user or agent. The bbmChat widget handles the rendering of messages within the chat, and allows the user to send text, picture, and file messages. +The Click to Chat sample app demonstrates how to integrate a chat experience +into your website with the Spark Communications SDK. This app allows a user to +click a button on a webpage to start a secure chat with a predefined user or +agent. The bbmChat widget handles the rendering of messages within the chat, +and allows the user to send text, picture, and file messages.


@@ -17,7 +20,9 @@ experience into your website with the Spark SDK for JavaScript. This app allows ### Features -This app demonstrates how easy it is to integrate the bbmChat widget into your webpage. It initializes the Spark SDK for JavaScript, and starts a chat with a predefined user. The app then launches the bbmChat widget which allows the user to: +This app demonstrates how easy it is to integrate the bbmChat widget into your +webpage. It initializes the SDK, and starts a chat with a predefined user. The +app then launches the bbmChat widget which allows the user to: * View all sent and received messages in a chat * Send a text message, picture, or file attachment * Send high priority messages @@ -37,9 +42,9 @@ This app demonstrates how easy it is to integrate the bbmChat widget into your w ## Getting Started -This sample requires the Spark SDK, which you can find along with related resources at the location below. +This sample requires the Spark Communications SDK for JavaScript, which you can find along with related resources at the location below. -* Getting started with the [Spark SDK](https://developers.blackberry.com/us/en/products/blackberry-bbm-enterprise-sdk.html) +* Getting started with the [Spark Communications SDK](https://developers.blackberry.com/us/en/products/blackberry-spark-communications-platform.html) * [Development Guide](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/index.html) * [API Reference](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/reference/javascript/index.html) @@ -62,7 +67,7 @@ To use the ClickToChat example, you must set up the following elements in js/con - Oauth2 configuration (AUTH_CONFIGURATION) - A hardcoded contact registration ID with whom anyone who views the page will chat (CONTACT_REG_ID) -- Your Spark user domain (ID_PROVIDER_DOMAIN) +- Your sandbox domain (ID_PROVIDER_DOMAIN) - Firebase configuration (FIREBASE_CONFIG) - User passcode (USER_SECRET) @@ -71,7 +76,7 @@ To use the ClickToChat example, you must set up the following elements in js/con Follow this guide for a walkthrough of how to integrate a rich chat experience into your webpage. - [Import the bbmChat UI widget into your web application](#importChat) -- [Initialize the Spark SDK for JavaScript](#init) +- [Initialize the SDK](#init) - [Perform setup](#setup) - [Start a chat with a predefined user](#startChat) @@ -102,7 +107,7 @@ Create new instance of BBMEnterprise. }); ``` -For more information about setting up the Spark SDK for JavaScript, visit the [Getting Started with Web](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/gettingStarted-web.html) section of the guide. +For more information about setting up the SDK, visit the [Getting Started with Web](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/gettingStarted-web.html) section of the guide. ### Perform setup diff --git a/ClickToChat/index.html b/ClickToChat/index.html index dc73b7d..cc9bdc4 100644 --- a/ClickToChat/index.html +++ b/ClickToChat/index.html @@ -22,19 +22,38 @@ Click To Chat - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +

@@ -59,4 +78,5 @@
+ diff --git a/ClickToChat/js/config.js b/ClickToChat/js/config.js deleted file mode 100644 index e671037..0000000 --- a/ClickToChat/js/config.js +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2018 BlackBerry. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -// Reg Id of the contact to start secure chat with -const CONTACT_REG_ID = 'contact_reg_id'; - -// This domain is a string known to the BBM Enterprise server, which is -// generally a GUID. -const ID_PROVIDER_DOMAIN = 'your_idp_domain'; - -// This secret is used to protect user keys. Must be individual for each user. -const USER_SECRET = 'user_secret'; - -// The environment of your BBM Enterprise server. Must be either 'Sandbox' or -// 'Production'. -const ID_PROVIDER_ENVIRONMENT = 'Sandbox'; - -// The URL or relative path of the Argon2 WASM file. -const KMS_ARGON_WASM_URL = '../../sdk/argon2.wasm'; - -// This configuration contains service endpoints and information for OAuth2 -// authentication. -const AUTH_CONFIGURATION = { - // OAuth 2.0 endpoint for requesting an access token - // To use google OAuth service, put: - // 'https://accounts.google.com/o/oauth2/v2/auth' - authService : 'your_auth_service_endpoint', - - // OAuth 2.0 endpoint for token validation - // To use google toke info service, put: - // 'https://www.googleapis.com/oauth2/v3/tokeninfo' - tokenInfoService : 'your_oauth_token_info_endpoint', - - // OAuth 2.0 endpoint for obtaining user information (name, email, avatar URL) - // To use google user info service, put: - // 'https://www.googleapis.com/plus/v1/people/me' - userInfoService : 'your_oauth_user_info_endpoint', - - // Scopes of OAuth 2.0 access token (which resources it can access) - // If google OAuth service is used, put following scopes: - // 'https://www.googleapis.com/auth/firebase https://www.googleapis.com/auth/userinfo.email' - scope : 'your_scope_oauth', - - // The client ID of application registered on OAuth 2.0 server - clientId: 'your_client_id' -}; - -// Firebase config info. -const FIREBASE_CONFIG = { - apiKey: 'your_api_key', - authDomain: 'your_auth_domain', - databaseURL: 'your_database_url', - projectId: 'your_project_id', - storageBucket: 'your_storage_bucket', - messagingSenderId: 'your_messaging_sender_id' -}; - -// Create the auth manager for the Click To Chat app. -const createAuthManager = () => new GoogleAuthManager(AUTH_CONFIGURATION); - -// Create the user manager for the Click to chat app. -const createUserManager = (userRegId, authManager, getIdentity, getIdentities) => - FirebaseUserManager.factory.createInstance(FIREBASE_CONFIG, - userRegId, authManager, GenericUserInfo, getIdentity, getIdentities); \ No newline at end of file diff --git a/ClickToChat/js/config_azure.js b/ClickToChat/js/config_azure.js new file mode 100644 index 0000000..faf0e85 --- /dev/null +++ b/ClickToChat/js/config_azure.js @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2018 BlackBerry. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +// Reg Id of the contact to start chat with. +const CONTACT_REG_ID = 'contact_reg_id'; + +// This secret is used to protect user keys. Must be individual for each user. +const USER_SECRET = 'user_secret'; + +// Refer to the guide to set up your application to use Azure: +// https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/azureForWebExamples.html + +// This domain is a string known to the BBM Enterprise server, which is +// generally a GUID. +// To create a new domain follow the link below +// https://account.good.com/#/a/organization/applications/add +const ID_PROVIDER_DOMAIN = 'your_idp_domain'; + +// The client ID of application registered on OAuth 2.0 server. +// To set up your application refer to +// https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/azureIdentityManagement.html +const CLIENT_ID = 'your_client_id'; + +// The tenant ID of your organization. +// To get your tenant ID refer to +// https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-howto-tenant +const TENANT_ID = 'your_tenant_id'; + +// ============================================================================= +// Configuration below does not require modifications. Change it only if you +// want to change existing application behavior. + +// The environment of your BBM Enterprise server. Must be either 'Sandbox' or +// 'Production'. +const ID_PROVIDER_ENVIRONMENT = 'Sandbox'; + +// The URL or relative path of the Argon2 WASM file. +const KMS_ARGON_WASM_URL = '../../sdk/argon2.wasm'; + +// This configuration contains service endpoints and information for OAuth2 +// authentication. +const AUTH_CONFIGURATION = { + // OAuth 2.0 endpoint for requesting an access token. + authService: `https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/authorize`, + + // The client ID of application registered on OAuth 2.0 server + clientId: CLIENT_ID, + + // Scopes of OAuth 2.0 access token (which resources it can access) + scope: `api://${CLIENT_ID}/Messaging.All https://graph.microsoft.com/User.ReadWrite https://graph.microsoft.com/User.ReadBasic.All` +}; + +// Create the user manager for the Rich Chat app. +const createUserManager = (userRegId, authManager, getIdentities) => + Promise.resolve(new AzureUserManager(userRegId, authManager, getIdentities)); diff --git a/ClickToChat/js/config_google.js b/ClickToChat/js/config_google.js new file mode 100644 index 0000000..29177b6 --- /dev/null +++ b/ClickToChat/js/config_google.js @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2018 BlackBerry. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +// Reg Id of the contact to start chat with +const CONTACT_REG_ID = 'contact_reg_id'; + +// This secret is used to protect user keys. Must be individual for each user. +const USER_SECRET = 'user_secret'; + +// Refer to the guide to set up your application to use Google: +// https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/googleSignInForWebExamples.html + +// This domain is a string known to the BBM Enterprise server, which is +// generally a GUID. +// To create a new domain follow the link below +// https://account.good.com/#/a/organization/applications/add +const ID_PROVIDER_DOMAIN = 'your_idp_domain'; + +// The client ID of application registered on OAuth 2.0 server. +const CLIENT_ID = 'your_client_id'; + +// ============================================================================= +// Configuration below does not require modifications. Change it only if you +// want to change existing application behavior. + +// The environment of your BBM Enterprise server. Must be either 'Sandbox' or +// 'Production'. +const ID_PROVIDER_ENVIRONMENT = 'Sandbox'; + +// The URL or relative path of the Argon2 WASM file. +const KMS_ARGON_WASM_URL = '../../sdk/argon2.wasm'; + +// This configuration contains service endpoints and information for OAuth2 +// authentication. +const AUTH_CONFIGURATION = { + // OAuth 2.0 endpoint for requesting an access token + authService : 'https://accounts.google.com/o/oauth2/v2/auth', + + // Scopes of OAuth 2.0 access token (which resources it can access) + scope : 'https://www.googleapis.com/auth/contacts', + + // The client ID of application registered on OAuth 2.0 server. + clientId: CLIENT_ID +}; + +// Create the user manager for the Click To Chat app. +const createUserManager = (userRegId, authManager, getIdentities) => + Promise.resolve(new GooglePeopleUserManager(userRegId, authManager, + getIdentities, AUTH_CONFIGURATION)); \ No newline at end of file diff --git a/ClickToChat/js/config_mock.js b/ClickToChat/js/config_mock.js new file mode 100644 index 0000000..879da13 --- /dev/null +++ b/ClickToChat/js/config_mock.js @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018 BlackBerry. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +// Reg Id of the contact to start call with +// Bot doesn't answer calls! Put one of your REG IDs here. +const CONTACT_REG_ID = 'contact_reg_id'; + +// This domain is a string known to the BBM Enterprise server, which is +// generally a GUID. +// To create a new domain follow the link below +// https://account.good.com/#/a/organization/applications/add +const ID_PROVIDER_DOMAIN = 'your_idp_domain'; + +// This secret is used to protect user keys. Must be individual for each user. +const USER_SECRET = 'user_secret'; + +// ============================================================================= +// Configuration below does not require modifications. Change it only if you +// want to change existing application behavior. + +const AUTH_CONFIGURATION = { }; + +// The environment of your BBM Enterprise server. Must be either 'Sandbox' or +// 'Production'. +const ID_PROVIDER_ENVIRONMENT = 'Sandbox'; + +// The URL or relative path of the Argon2 WASM file. +const KMS_ARGON_WASM_URL = '../../sdk/argon2.wasm'; + +// Create the user manager for the Click To Chat app. +const createUserManager = (userRegId, authManager, getIdentities) => + Promise.resolve(new MockUserManager(userRegId, authManager, getIdentities, + ID_PROVIDER_DOMAIN)); \ No newline at end of file diff --git a/ClickToChat/js/index.js b/ClickToChat/js/index.js index b4c138d..ac5d5ad 100644 --- a/ClickToChat/js/index.js +++ b/ClickToChat/js/index.js @@ -21,7 +21,7 @@ * of how to implement generic Click To Chat functionality using the bbm-chat UI * widget. * - * When user clicks "Start Secure Chat" button, application will start a BBME + * When the user clicks "Start Secure Chat" button, the application will start a * chat with the hard coded user RegId (CONTACT_REG_ID). * * @class ClickToChat @@ -36,7 +36,20 @@ const CHAT_DETAILS = { subject: '' }; -const authManager = createAuthManager(); +const authManager = new AuthenticationManager(AUTH_CONFIGURATION); +// Override getUserId() used by the MockAuthManager. +authManager.getUserId = () => new Promise((resolve, reject) => { + const userEmailDialog = document.createElement('bbm-user-email-dialog'); + document.body.appendChild(userEmailDialog); + userEmailDialog.addEventListener('Ok', e => { + userEmailDialog.parentNode.removeChild(userEmailDialog); + resolve(e.detail.userEmail); + }); + userEmailDialog.addEventListener('Cancel', () => { + userEmailDialog.parentNode.removeChild(userEmailDialog); + reject('Failed to get user email.'); + }); +}); window.onload = async () => { try { @@ -83,7 +96,6 @@ async function startChat() { } const userRegId = bbmeSdk.getRegistrationInfo().regId; const userManager = await createUserManager(userRegId, authManager, - bbmeSdk.getIdentitiesFromAppUserId, bbmeSdk.getIdentitiesFromAppUserIds); await userManager.initialize(); bbmChat.setBbmSdk(bbmeSdk); @@ -97,8 +109,8 @@ async function startChat() { chatPane.style.display = 'block'; } catch (error) { - const errorMessage = 'Failed to initialize Spark SDK for ' + - ` JavaScript. Error: ${error}`; + const errorMessage = + `Failed to initialize the SDK. Error: ${error}`; alert(errorMessage); isChatting = false; } @@ -106,7 +118,7 @@ async function startChat() { } /** - * This function initializes the Spark SDK. + * This function initializes the SDK. */ function initBbmeSdk() { return new Promise(async (resolve, reject) => { @@ -169,4 +181,4 @@ function initBbmeSdk() { reject(error); } }); -} \ No newline at end of file +} diff --git a/ClickToChat/package.json b/ClickToChat/package.json index 221da61..e4282f9 100644 --- a/ClickToChat/package.json +++ b/ClickToChat/package.json @@ -4,6 +4,7 @@ "version": "1.0.1", "main": "index.html", "dependencies": { - "bbmChat": "file:../support/ui/widgets/bbmChat" + "bbmChat": "file:../support/ui/widgets/bbmChat", + "bbmUserEmailDialog": "file:../support/ui/widgets/bbmUserEmailDialog" } } diff --git a/DataTransfer/.eslintrc.json b/DataTransfer/.eslintrc.json index 08ab477..828bf39 100644 --- a/DataTransfer/.eslintrc.json +++ b/DataTransfer/.eslintrc.json @@ -24,7 +24,11 @@ "KeyProtect": false, "Polymer": false, "USER_SECRET": false, - "KMS_ARGON_WASM_URL": false + "KMS_ARGON_WASM_URL": false, + "AUTH_CONFIGURATION": false, + "AuthenticationManager": false, + "MockUserManager": false, + "AzureUserManager": false }, "rules": @@ -34,7 +38,7 @@ [ "error", { - "varsIgnorePattern": "ID_PROVIDER_DOMAIN|KMS_ARGON_WASM_URL|ID_PROVIDER_ENVIRONMENT|USER_SECRET|createAuthManager|createUserManager|createKeyProvider|createKeyProtect" + "varsIgnorePattern": "AUTH_CONFIGURATION|ID_PROVIDER_DOMAIN|KMS_ARGON_WASM_URL|ID_PROVIDER_ENVIRONMENT|USER_SECRET|createAuthManager|createUserManager|createKeyProvider|createKeyProtect" } ] } diff --git a/DataTransfer/README.md b/DataTransfer/README.md index 410e45c..7deda0f 100644 --- a/DataTransfer/README.md +++ b/DataTransfer/README.md @@ -1,8 +1,8 @@ -![BlackBerry Spark Communications Platform](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/resources/images/bnr-bbm-enterprise-sdk-title.png) +![BlackBerry Spark Communications Services](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/resources/images/bnr-bbm-enterprise-sdk-title.png) # Data Transfer for JavaScript -The DataTransfer application shows how to use the peer-to-peer data connection capability in the Spark SDK for JavaScript. The data connection API allows arbitrary data to be sent securely through a familiar stream interface. +The DataTransfer application shows how to use the peer-to-peer data connection capability in the Spark Communications SDK. The data connection API allows arbitrary data to be sent securely through a familiar stream interface. ### Features @@ -20,9 +20,9 @@ The sample application allows the user to do the following: ## Getting Started -This sample requires the Spark SDK, which you can find along with related resources at the location below. +This sample requires the Spark Communications SDK for JavaScript, which you can find along with related resources at the location below. -* Getting started with the [Spark SDK](https://developers.blackberry.com/us/en/products/blackberry-bbm-enterprise-sdk.html) +* Getting started with the [Spark Communications SDK](https://developers.blackberry.com/us/en/products/blackberry-spark-communications-platform.html) * [Development Guide](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/index.html) * [API Reference](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/reference/javascript/index.html) @@ -44,21 +44,21 @@ Visit the [Getting Started with Web](https://developer.blackberry.com/files/bbm- To use the DataTransfer example, you must set up the following elements in js/config.js: - Oauth2 configuration (AUTH_CONFIGURATION) -- Your Spark user domain (ID_PROVIDER_DOMAIN) +- Your sandbox domain (ID_PROVIDER_DOMAIN) - Firebase configuration (FIREBASE_CONFIG) - User passcode (USER_SECRET) ## Walkthrough -Follow this guide for a walkthrough explaining how the Spark SDK for JavaScript is used to share data over a secure peer-to-peer data connection. -- [Initialize the Spark SDK for JavaScript](#init) +Follow this guide for a walkthrough explaining how the Spark Communications SDK is used to share data over a secure peer-to-peer data connection. +- [Initialize the SDK](#init) - [Perform setup](#setup) - [Creating a connection](#create) - [Receive a connection](#receive) - [Receiving a file](#receiveFile) - [Sending a file](#sendFile) -### Initialize the Spark SDK for JavaScript +### Initialize the SDK ```javascript // Create new instance of BBMEnterprise. diff --git a/DataTransfer/index.html b/DataTransfer/index.html index a1e4d2c..de9f3b3 100644 --- a/DataTransfer/index.html +++ b/DataTransfer/index.html @@ -22,18 +22,38 @@ Data Transfer + - - - + + - - + + + + + + + + + + + + + + + + diff --git a/DataTransfer/js/config_azure.js b/DataTransfer/js/config_azure.js new file mode 100644 index 0000000..a800c5f --- /dev/null +++ b/DataTransfer/js/config_azure.js @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018 BlackBerry. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +// This secret is used to protect user keys. Must be individual for each user. +const USER_SECRET = 'user_secret'; + +// Refer to the guide to set up your application to use Azure: +// https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/azureForWebExamples.html + +// This domain is a string known to the BBM Enterprise server, which is +// generally a GUID. +// To create a new domain follow the link below +// https://account.good.com/#/a/organization/applications/add +const ID_PROVIDER_DOMAIN = 'your_idp_domain'; + +// The client ID of application registered on OAuth 2.0 server. +// To set up your application refer to +// https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/azureIdentityManagement.html +const CLIENT_ID = 'your_client_id'; + +// The tenant ID of your organization. +// To get your tenant ID refer to +// https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-howto-tenant +const TENANT_ID = 'your_tenant_id'; + +// ============================================================================= +// Configuration below does not require modifications. Change it only if you +// want to change existing application behavior. + +// The environment of your BBM Enterprise server. Must be either 'Sandbox' or +// 'Production'. +const ID_PROVIDER_ENVIRONMENT = 'Sandbox'; + +// The URL or relative path of the Argon2 WASM file. +const KMS_ARGON_WASM_URL = '../../sdk/argon2.wasm'; + +// This configuration contains service endpoints and information for OAuth2 +// authentication. +const AUTH_CONFIGURATION = { + // OAuth 2.0 endpoint for requesting an access token. + authService: `https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/authorize`, + + // The client ID of application registered on OAuth 2.0 server + clientId: CLIENT_ID, + + // Scopes of OAuth 2.0 access token (which resources it can access) + scope: `api://${CLIENT_ID}/Messaging.All https://graph.microsoft.com/User.ReadWrite https://graph.microsoft.com/User.ReadBasic.All` +}; \ No newline at end of file diff --git a/QuickStart/config.js b/DataTransfer/js/config_google.js similarity index 62% rename from QuickStart/config.js rename to DataTransfer/js/config_google.js index 317e80f..2655594 100644 --- a/QuickStart/config.js +++ b/DataTransfer/js/config_google.js @@ -16,12 +16,24 @@ 'use strict'; -// This domain is a string known to the BBM Enterprise server, which is +// This secret is used to protect user keys. Must be individual for each user. +const USER_SECRET = 'user_secret'; + +// Refer to the guide to set up your application to use Google: +// https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/googleSignInForWebExamples.html + +// This domain is a string known to the BBM Enterprise server, which is // generally a GUID. +// To create a new domain follow the link below +// https://account.good.com/#/a/organization/applications/add const ID_PROVIDER_DOMAIN = 'your_idp_domain'; -// This secret is used to protect user keys. Must be individual for each user. -const USER_SECRET = 'user_secret'; +// The client ID of application registered on OAuth 2.0 server. +const CLIENT_ID = 'your_client_id'; + +// ============================================================================= +// Configuration below does not require modifications. Change it only if you +// want to change existing application behavior. // The environment of your BBM Enterprise server. Must be either 'Sandbox' or // 'Production'. @@ -34,29 +46,11 @@ const KMS_ARGON_WASM_URL = '../../sdk/argon2.wasm'; // authentication. const AUTH_CONFIGURATION = { // OAuth 2.0 endpoint for requesting an access token - // To use google OAuth service, put: - // 'https://accounts.google.com/o/oauth2/v2/auth' - authService : 'your_auth_service_endpoint', - - // OAuth 2.0 endpoint for token validation - // To use google token info service, put : - // 'https://www.googleapis.com/oauth2/v3/tokeninfo' - tokenInfoService : 'your_oauth_token_info_endpoint', - - // OAuth 2.0 endpoint for obtaining user information (name, email, avatar URL) - // To use google user info service, put: - // 'https://www.googleapis.com/plus/v1/people/me' - userInfoService : 'your_oauth_user_info_endpoint', + authService : 'https://accounts.google.com/o/oauth2/v2/auth', // Scopes of OAuth 2.0 access token (which resources it can access) - // If google OAuth service is used, put following scopes: - // 'https://www.googleapis.com/auth/firebase https://www.googleapis.com/auth/userinfo.email' - scope : 'your_scope_oauth', - - // The client ID of application registered on OAuth 2.0 server - clientId: 'your_client_id' -}; + scope : 'profile', -const createAuthManager = () => { - return new GoogleAuthManager(AUTH_CONFIGURATION); -}; + // The client ID of application registered on OAuth 2.0 server. + clientId: CLIENT_ID +}; \ No newline at end of file diff --git a/DataTransfer/js/config_mock.js b/DataTransfer/js/config_mock.js new file mode 100644 index 0000000..0908d94 --- /dev/null +++ b/DataTransfer/js/config_mock.js @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018 BlackBerry. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +// This domain is a string known to the BBM Enterprise server, which is +// generally a GUID. +// To create a new domain follow the link below +// https://account.good.com/#/a/organization/applications/add +const ID_PROVIDER_DOMAIN = 'your_idp_domain'; + +// This secret is used to protect user keys. Must be individual for each user. +const USER_SECRET = 'user_secret'; + +// ============================================================================= +// Configuration below does not require modifications. Change it only if you +// want to change existing application behavior. + +const AUTH_CONFIGURATION = { }; + +// The environment of your BBM Enterprise server. Must be either 'Sandbox' or +// 'Production'. +const ID_PROVIDER_ENVIRONMENT = 'Sandbox'; + +// The URL or relative path of the Argon2 WASM file. +const KMS_ARGON_WASM_URL = '../../sdk/argon2.wasm'; \ No newline at end of file diff --git a/DataTransfer/js/dataTransferElement.js b/DataTransfer/js/dataTransferElement.js index 7403e01..eb5e55a 100644 --- a/DataTransfer/js/dataTransferElement.js +++ b/DataTransfer/js/dataTransferElement.js @@ -29,8 +29,8 @@ /** * data-transfer-element element class implementation. * - * Demonstrates how to implement file transfer functionality using - * BBMEnterprise SDK for JavaScript. + * Demonstrates how to implement file transfer functionality using the + * Spark Communications SDK for JavaScript. */ class DataTransferElement extends Polymer.Element { constructor() { @@ -266,7 +266,7 @@ } if (!this.bbmSdk) { - alert('BBMEnterprise SDK for JavaScript is not initialized.'); + alert('The SDK is not initialized.'); return; } diff --git a/DataTransfer/js/index.js b/DataTransfer/js/index.js index 5de26bb..6356a0f 100644 --- a/DataTransfer/js/index.js +++ b/DataTransfer/js/index.js @@ -40,7 +40,21 @@ function initBbme() { return new Promise(async (resolve, reject) => { try { let isSyncStarted = false; - const authManager = createAuthManager(); + const authManager = new AuthenticationManager(AUTH_CONFIGURATION); + // Override getUserId() used by the MockAuthManager. + authManager.getUserId = () => new Promise((resolve, reject) => { + const userEmailDialog = document.createElement('bbm-user-email-dialog'); + document.body.appendChild(userEmailDialog); + userEmailDialog.addEventListener('Ok', e => { + userEmailDialog.parentNode.removeChild(userEmailDialog); + resolve(e.detail.userEmail); + }); + userEmailDialog.addEventListener('Cancel', () => { + userEmailDialog.parentNode.removeChild(userEmailDialog); + reject('Failed to get user email.'); + }); + }); + const authUserInfo = await authManager.authenticate(); if (!authUserInfo) { console.warn('Application will be redirected to the ' diff --git a/DataTransfer/package.json b/DataTransfer/package.json index 623d526..a91ea1f 100644 --- a/DataTransfer/package.json +++ b/DataTransfer/package.json @@ -6,7 +6,8 @@ "dependencies": { "@webcomponents/webcomponentsjs":"^1.0.20", "@npm-polymer":"https://github.com/Polymer/polymer.git#2.2.0", - "shadycss":"https://github.com/webcomponents/shadycss.git#1.1.0" + "shadycss":"https://github.com/webcomponents/shadycss.git#1.1.0", + "bbmUserEmailDialog": "file:../support/ui/widgets/bbmUserEmailDialog" } } diff --git a/KeyProviderServer/README.md b/KeyProviderServer/README.md index 3fb7f6b..b8dd6f9 100644 --- a/KeyProviderServer/README.md +++ b/KeyProviderServer/README.md @@ -1,4 +1,4 @@ -![BlackBerry Spark Communications Platform](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/resources/images/bnr-bbm-enterprise-sdk-title.png) +![BlackBerry Spark Communications Services](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/resources/images/bnr-bbm-enterprise-sdk-title.png) # KeyProviderServer Sample for JavaScript @@ -12,15 +12,14 @@ The **KeyProviderServer** demonstrates how your app can enforce access control t 4. Allows all authenticated users to read public key data. -You can use this server with popular cloud storage solutions like [Azure Cosmos DB](https://docs.microsoft.com/en-us/azure/cosmos-db/introduction). To learn more about setting up Azure Cosmos DB to store the BlackBerry Secure -Spark security keys, follow the steps provided [here](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/azureCloudKeyStorage.html). +You can use this server with popular cloud storage solutions like [Azure Cosmos DB](https://docs.microsoft.com/en-us/azure/cosmos-db/introduction). To learn more about setting up Azure Cosmos DB for Cloud Key Storage, follow the steps provided [here](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/azureCloudKeyStorage.html). ## Getting Started -These samples require the Spark SDK which you can find along with related resources at the location below. +These samples require the Spark Communications SDK for JavaScript which you can find along with related resources at the location below. -* Getting stated with the [Spark SDK](https://developers.blackberry.com/us/en/products/blackberry-bbm-enterprise-sdk.html) +* Getting stated with the [Spark Communications SDK](https://developers.blackberry.com/us/en/products/blackberry-spark-communications-platform.html) * [Development Guide](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/index.html) * [API Reference](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/reference/javascript/index.html) @@ -35,9 +34,7 @@ These samples require the Spark SDK which you can find along with related resour # KeyProviderServer -The cryptographic keys used by Spark to protect your communications are stored and distributed in a [cloud storage system](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/cloudKeyStorage.html) that you choose. Some cloud storage solutions like [Firebase](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/firebaseCloudKeyStorage.html) satisfy all the [requirements](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/cloudKeyStorage.html) to securely store and distribute keys to authenticated users. However, you may choose a different cloud storage solution that would require you to enforce access control on your application server. - - +The cryptographic keys used by Spark Communications Services to protect your communications are stored and distributed in [cloud storage system](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/cloudKeyStorage.html) that you choose. Some cloud storage solutions like [Firebase](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/firebaseCloudKeyStorage.html) satisfy all the [requirements](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/cloudKeyStorage.html) to securely store and distribute keys to authenticated users. However, you may choose a different cloud storage solution that would require you to enforce access control on your application server.

diff --git a/KeyProviderServer/screenShots/keyProviderService-azure.png b/KeyProviderServer/screenShots/keyProviderService-azure.png index ed9b39cc7079d859ad0cd62df71346b19759d017..9eb25ec16cfcec5de8dec5cbd1e120f30843b1a0 100644 GIT binary patch literal 62034 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%0D*tS#+X4Jm^hc@`wbkH9m{eg&pp)3=t^K+w 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 E0EC@#kN^Mx diff --git a/Node/GoogleLogin.js b/Node/GoogleLogin.js index 7a57d24..f169016 100644 --- a/Node/GoogleLogin.js +++ b/Node/GoogleLogin.js @@ -16,10 +16,9 @@ */ // -// The bbm sdk requires an oauth2 provider, and a key storage service. +// The bbm sdk requires an oauth2 provider. // -// This module implements both, using Google for the oauth2 provider, and -// implementing key storage using Firebase. +// This module implements it, using Google for the oauth2 provider. // // Include some needed modules. diff --git a/Node/README.md b/Node/README.md index 68d3235..f0a320e 100644 --- a/Node/README.md +++ b/Node/README.md @@ -1,9 +1,9 @@ -![BlackBerry Spark Communications Platform](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/resources/images/bnr-bbm-enterprise-sdk-title.png) +![BlackBerry Spark Communications Services](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/resources/images/bnr-bbm-enterprise-sdk-title.png) # BBMBot Sample for JavaScript The BBMBot sample app demonstrates how to build a chat bot in Node.js with the -Spark SDK. The BBMbot uses the [www.botlibre.com](www.botlibre.com) +Spark Communications SDK. The BBMbot uses the [www.botlibre.com](www.botlibre.com) webservice as an example of how to generate responses.

@@ -32,9 +32,9 @@ With the BBMBot example, your app can do the following: ## Getting Started -This sample requires the Spark SDK, which you can find along with related resources at the location below. +This sample requires the Spark Communications SDK for JavaScript, which you can find along with related resources at the location below. -* Getting started with the [Spark SDK](https://developers.blackberry.com/us/en/products/blackberry-bbm-enterprise-sdk.html) +* Getting started with the [Spark Communications SDK](https://developers.blackberry.com/us/en/products/blackberry-spark-communications-platform.html) * [Development Guide](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/index.html) * [API Reference](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/reference/javascript/index.html) @@ -53,7 +53,7 @@ Visit the [Getting Started with Node](https://developer.blackberry.com/files/bbm To use the BBMBot example, you must set up the following elements in config.js: --id_provider_domain: Your Spark user domain. +-id_provider_domain: Your sandbox domain. -firebaseConfig: The firebase API config. diff --git a/QuickStart/.eslintrc.json b/QuickStart/.eslintrc.json index d4152b1..dd56f3e 100644 --- a/QuickStart/.eslintrc.json +++ b/QuickStart/.eslintrc.json @@ -3,7 +3,8 @@ "globals": { "GoogleAuthManager": false, - "KMS_ARGON_WASM_URL": false + "KMS_ARGON_WASM_URL": false, + "AUTH_CONFIGURATION": false }, "rules": { @@ -12,7 +13,7 @@ [ "error", { - "varsIgnorePattern": "ID_PROVIDER_DOMAIN|KMS_ARGON_WASM_URL|ID_PROVIDER_ENVIRONMENT|USER_SECRET|createAuthManager" + "varsIgnorePattern": "AUTH_CONFIGURATION|ID_PROVIDER_DOMAIN|KMS_ARGON_WASM_URL|ID_PROVIDER_ENVIRONMENT|USER_SECRET|createAuthManager|USER_ID" } ] } diff --git a/QuickStart/README.md b/QuickStart/README.md index 12b574c..2a2e81b 100644 --- a/QuickStart/README.md +++ b/QuickStart/README.md @@ -1,10 +1,12 @@ -![BlackBerry Spark Communications Platform](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/resources/images/bnr-bbm-enterprise-sdk-title.png) +![BlackBerry Spark Communications Services](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/resources/images/bnr-bbm-enterprise-sdk-title.png) # Quick Start Sample for JavaScript -The Quick Start application demonstrates how you can authenticate with the Spark SDK using the [Identity Provider](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/identityManagement.html) -of your application. We demonstrate how you can obtain the user ID and token of your user's account -and pass them to the Spark SDK to complete setup. +The Quick Start application demonstrates how you can authenticate with the +Spark Communications SDK using the [Identity +Provider](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/identityManagement.html) +of your application. We demonstrate how you can obtain the user ID and token of +your user's account and pass them to the SDK to complete setup.
@@ -15,9 +17,9 @@ and pass them to the Spark SDK to complete setup. ## Getting Started -This sample requires the Spark SDK, which you can find along with related resources at the location below. +This sample requires the Spark Communications SDK for JavaScript, which you can find along with related resources at the location below. -* Getting started with the [Spark SDK](https://developers.blackberry.com/us/en/products/blackberry-bbm-enterprise-sdk.html) +* Getting started with the [Spark Communications SDK](https://developers.blackberry.com/us/en/products/blackberry-spark-communications-platform.html) * [Development Guide](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/index.html) * [API Reference](https://developer.blackberry.com/files/bbm-enterprise/documents/guide/reference/javascript/index.html) @@ -37,22 +39,22 @@ Visit the [Getting Started with Web](https://developer.blackberry.com/files/bbm- To use this example, you must set up the following elements in config.js: - Oauth2 configuration (AUTH_CONFIGURATION) -- Your Spark user domain (ID_PROVIDER_DOMAIN) +- Your sandbox domain (ID_PROVIDER_DOMAIN) - User passcode (USER_SECRET) ## Walkthrough -Follow this guide for a walkthrough showing how to authenticate with the Spark SDK using Google Sign-in for Web. +Follow this guide for a walkthrough showing how to authenticate with the SDK using Google Sign-in for Web. - [Validate the browser](#validateBrowser) - [Request an access token using the Google Sign-in API](#requestToken) -- [Initialize the Spark SDK](#initialize) +- [Initialize the SDK](#initialize) - [Monitor the setup state](#monitorSetup) - [Monitor for setup errors](#monitorSetupErrors) - [Perform setup](#performSetup) -###
Validate that the browser supports the Spark SDK for JavaScript +### Validate that the browser supports the SDK To verify that the browser has all required features, call BBMEnterprise.validateBrowser. It will return a rejected Promise in browsers which support Promise. If Promise is not supported, it will throw an exception. @@ -80,13 +82,13 @@ function LogIn() { const authManager = createAuthManager(); authManager.authenticate() .then(userData => { - // ... Initialize the Spark SDK here ... + // ... Initialize the SDK here ... } } ``` -### Initialize the Spark SDK +### Initialize the SDK ```javascript // Construct BBMEnterprise object. diff --git a/QuickStart/config_azure.js b/QuickStart/config_azure.js new file mode 100644 index 0000000..a800c5f --- /dev/null +++ b/QuickStart/config_azure.js @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2018 BlackBerry. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +// This secret is used to protect user keys. Must be individual for each user. +const USER_SECRET = 'user_secret'; + +// Refer to the guide to set up your application to use Azure: +// https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/azureForWebExamples.html + +// This domain is a string known to the BBM Enterprise server, which is +// generally a GUID. +// To create a new domain follow the link below +// https://account.good.com/#/a/organization/applications/add +const ID_PROVIDER_DOMAIN = 'your_idp_domain'; + +// The client ID of application registered on OAuth 2.0 server. +// To set up your application refer to +// https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/azureIdentityManagement.html +const CLIENT_ID = 'your_client_id'; + +// The tenant ID of your organization. +// To get your tenant ID refer to +// https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-howto-tenant +const TENANT_ID = 'your_tenant_id'; + +// ============================================================================= +// Configuration below does not require modifications. Change it only if you +// want to change existing application behavior. + +// The environment of your BBM Enterprise server. Must be either 'Sandbox' or +// 'Production'. +const ID_PROVIDER_ENVIRONMENT = 'Sandbox'; + +// The URL or relative path of the Argon2 WASM file. +const KMS_ARGON_WASM_URL = '../../sdk/argon2.wasm'; + +// This configuration contains service endpoints and information for OAuth2 +// authentication. +const AUTH_CONFIGURATION = { + // OAuth 2.0 endpoint for requesting an access token. + authService: `https://login.microsoftonline.com/${TENANT_ID}/oauth2/v2.0/authorize`, + + // The client ID of application registered on OAuth 2.0 server + clientId: CLIENT_ID, + + // Scopes of OAuth 2.0 access token (which resources it can access) + scope: `api://${CLIENT_ID}/Messaging.All https://graph.microsoft.com/User.ReadWrite https://graph.microsoft.com/User.ReadBasic.All` +}; \ No newline at end of file diff --git a/DataTransfer/js/config.js b/QuickStart/config_google.js similarity index 61% rename from DataTransfer/js/config.js rename to QuickStart/config_google.js index 06d21d3..2655594 100644 --- a/DataTransfer/js/config.js +++ b/QuickStart/config_google.js @@ -16,12 +16,24 @@ 'use strict'; +// This secret is used to protect user keys. Must be individual for each user. +const USER_SECRET = 'user_secret'; + +// Refer to the guide to set up your application to use Google: +// https://developer.blackberry.com/files/bbm-enterprise/documents/guide/html/googleSignInForWebExamples.html + // This domain is a string known to the BBM Enterprise server, which is // generally a GUID. +// To create a new domain follow the link below +// https://account.good.com/#/a/organization/applications/add const ID_PROVIDER_DOMAIN = 'your_idp_domain'; -// This secret is used to protect user keys. Must be individual for each user. -const USER_SECRET = 'user_secret'; +// The client ID of application registered on OAuth 2.0 server. +const CLIENT_ID = 'your_client_id'; + +// ============================================================================= +// Configuration below does not require modifications. Change it only if you +// want to change existing application behavior. // The environment of your BBM Enterprise server. Must be either 'Sandbox' or // 'Production'. @@ -34,28 +46,11 @@ const KMS_ARGON_WASM_URL = '../../sdk/argon2.wasm'; // authentication. const AUTH_CONFIGURATION = { // OAuth 2.0 endpoint for requesting an access token - // To use google OAuth service, put: - // 'https://accounts.google.com/o/oauth2/v2/auth' - authService : 'your_auth_service_endpoint', - - // OAuth 2.0 endpoint for token validation - // To use google toke info service, put: - // 'https://www.googleapis.com/oauth2/v3/tokeninfo' - tokenInfoService : 'your_oauth_token_info_endpoint', - - // OAuth 2.0 endpoint for obtaining user information (name, email, avatar URL) - // To use google user info service, put: - // 'https://www.googleapis.com/plus/v1/people/me' - userInfoService : 'your_oauth_user_info_endpoint', + authService : 'https://accounts.google.com/o/oauth2/v2/auth', // Scopes of OAuth 2.0 access token (which resources it can access) - // If google OAuth service is used, put following scopes: - // 'https://www.googleapis.com/auth/firebase https://www.googleapis.com/auth/userinfo.email' - scope : 'your_scope_oauth', - - // The client ID of application registered on OAuth 2.0 server - clientId: 'your_client_id' -}; + scope : 'profile', -// Create the auth manager for the Data Transfer app. -const createAuthManager = () => new GoogleAuthManager(AUTH_CONFIGURATION); \ No newline at end of file + // The client ID of application registered on OAuth 2.0 server. + clientId: CLIENT_ID +}; \ No newline at end of file diff --git a/QuickStart/config_mock.js b/QuickStart/config_mock.js new file mode 100644 index 0000000..6040f05 --- /dev/null +++ b/QuickStart/config_mock.js @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018 BlackBerry. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +// This user ID will be used as the user's identity.. +const USER_ID = 'my.user.id@blackhole.sw.rim.net'; + +// This secret is used to protect user keys. Must be individual for each user. +const USER_SECRET = 'user_secret'; + +// This domain is a string known to the BBM Enterprise server, which is +// generally a GUID. +// To create a new domain follow the link below +// https://account.good.com/#/a/organization/applications/add +const ID_PROVIDER_DOMAIN = 'your_idp_domain'; + +// ============================================================================= +// Configuration below does not require modifications. Change it only if you +// want to change existing application behavior. + +const AUTH_CONFIGURATION = { }; + +// The environment of your BBM Enterprise server. Must be either 'Sandbox' or +// 'Production'. +const ID_PROVIDER_ENVIRONMENT = 'Sandbox'; + +// The URL or relative path of the Argon2 WASM file. +const KMS_ARGON_WASM_URL = '../../sdk/argon2.wasm'; \ No newline at end of file diff --git a/QuickStart/index.html b/QuickStart/index.html index 6dd76f5..fc8752f 100644 --- a/QuickStart/index.html +++ b/QuickStart/index.html @@ -23,11 +23,26 @@ - - - + + + + + + + + + + + +