Merge pull request #1228 from sbenmoussati/SDA-3201

SDA-3201 RBC hotfix -  Removing Electron from user-agents to support SSSO
This commit is contained in:
Johan Kwarnmark 2021-06-09 12:41:34 +02:00 committed by GitHub
commit acb81be6d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 95 additions and 16 deletions

View File

@ -1,5 +1,6 @@
{
"url":"https://my.symphony.com",
"overrideUserAgent": false,
"minimizeOnClose" : "ENABLED",
"launchOnStartup" : "ENABLED",
"alwaysOnTop" : "DISABLED",

View File

@ -72,6 +72,20 @@ npm run test:spectron -- --match=spell*
## Packaging:
- Add Artifactory credentials to your home directory `.npmrc` file
1. Login to https://repo.symphony.com/ in your browser
2. Open https://repo.symphony.com/artifactory/webapp/#/profile
3. Click generate token
4. Execute `curl --location --request GET 'https://repo.symphony.com/artifactory/api/npm/auth' --header 'X-JFrog-Art-Api: <token from #3>'`
5. Update ~/.npmrc with:
```
registry = https://repo.symphony.com/artifactory/api/npm/npm-virtual-dev/
_auth = <auth value from #4>
always-auth = true
```
### Mac 🖥
- npm install
- npm run dev (to run locally)

View File

@ -48,6 +48,7 @@ Add “/l* symphony_install.log” to get debug information from the install wri
- OPEN_EXTERNAL (Boolean)
- DEV_TOOLS_ENABLED (Boolean)
- AUTO_LAUNCH_PATH (String)
- OVERRIDE_USER_AGENT (Boolean)
You'll need to quote the Boolean values when passing from the command line.
#### Check-boxes (in the installer UI) that can be altered are listed below:

View File

@ -187,6 +187,7 @@ class Script
new PublicProperty("CONTEXT_ORIGIN_URL", ""),
new PublicProperty("POINTER_LOCK", "true"),
new PublicProperty("USER_DATA_PATH", ""),
new PublicProperty("OVERRIDE_USER_AGENT", "false"),
new Property("MSIINSTALLPERUSER", "1"),
new Property("PROGRAMSFOLDER", System.Environment.ExpandEnvironmentVariables(@"%PROGRAMFILES%"))
};
@ -214,7 +215,7 @@ class Script
new ElevatedManagedAction(CustomActions.UpdateConfig, Return.check, When.After, Step.InstallFiles, Condition.NOT_BeingRemoved )
{
// The UpdateConfig action needs the built-in property INSTALLDIR as well as most of the custom properties
UsesProperties = "INSTALLDIR,POD_URL,CONTEXT_ORIGIN_URL,MINIMIZE_ON_CLOSE,ALWAYS_ON_TOP,AUTO_START,BRING_TO_FRONT,MEDIA,LOCATION,NOTIFICATIONS,MIDI_SYSEX,POINTER_LOCK,FULL_SCREEN,OPEN_EXTERNAL,CUSTOM_TITLE_BAR,DEV_TOOLS_ENABLED,AUTO_LAUNCH_PATH,USER_DATA_PATH"
UsesProperties = "INSTALLDIR,POD_URL,CONTEXT_ORIGIN_URL,MINIMIZE_ON_CLOSE,ALWAYS_ON_TOP,AUTO_START,BRING_TO_FRONT,MEDIA,LOCATION,NOTIFICATIONS,MIDI_SYSEX,POINTER_LOCK,FULL_SCREEN,OPEN_EXTERNAL,CUSTOM_TITLE_BAR,DEV_TOOLS_ENABLED,AUTO_LAUNCH_PATH,USER_DATA_PATH,OVERRIDE_USER_AGENT"
},
// CleanRegistry
@ -383,6 +384,7 @@ public class CustomActions
data = ReplaceProperty(data, "devToolsEnabled", session.Property("DEV_TOOLS_ENABLED"));
data = ReplaceProperty(data, "autoLaunchPath", FixPathFormat(session.Property("AUTO_LAUNCH_PATH")));
data = ReplaceProperty(data, "userDataPath", FixPathFormat(session.Property("USER_DATA_PATH")));
data = ReplaceProperty(data, "overrideUserAgent", session.Property("OVERRIDE_USER_AGENT"));
// Write the contents back to the file
System.IO.File.WriteAllText(filename, data);

View File

@ -492,3 +492,24 @@ The default (if not specified, or if specified as empty string "") is
-------------------------------------------------------------------
### OVERRIDE_USER_AGENT
Expected values:
* "true"
"Electron/X.X" is removed from user-agents.
* "false"
User-agents are not modified (default)
#### Example, install with user-agent override
msiexec /i Symphony.msi OVERRIDE_USER_AGENT="true"
#### Example, install without user-agent override
msiexec /i Symphony.msi OVERRIDE_USER_AGENT="false"
or
msiexec /i Symphony.msi

View File

@ -60,8 +60,12 @@ describe('chrome flags', () => {
it('should call `setChromeFlags` correctly', () => {
const spy = jest.spyOn(app.commandLine, 'appendSwitch');
setChromeFlags();
expect(spy).nthCalledWith(1, 'auth-negotiate-delegate-whitelist', 'url');
expect(spy).nthCalledWith(2, 'auth-server-whitelist', 'whitelist');
expect(spy).nthCalledWith(
1,
'auth-negotiate-delegate-whitelist',
'whitelist',
);
expect(spy).nthCalledWith(2, 'auth-server-whitelist', 'url');
expect(spy).nthCalledWith(3, 'disable-background-timer-throttling', 'true');
expect(spy).nthCalledWith(4, 'disable-d3d11', true);
expect(spy).nthCalledWith(5, 'disable-gpu', true);
@ -79,8 +83,12 @@ describe('chrome flags', () => {
});
const spy = jest.spyOn(app.commandLine, 'appendSwitch');
setChromeFlags();
expect(spy).nthCalledWith(1, 'auth-negotiate-delegate-whitelist', 'url');
expect(spy).nthCalledWith(2, 'auth-server-whitelist', 'whitelist');
expect(spy).nthCalledWith(
1,
'auth-negotiate-delegate-whitelist',
'whitelist',
);
expect(spy).nthCalledWith(2, 'auth-server-whitelist', 'url');
expect(spy).nthCalledWith(3, 'disable-background-timer-throttling', 'true');
expect(spy).not.nthCalledWith(4);
});
@ -166,8 +174,12 @@ describe('chrome flags', () => {
it('should call `setChromeFlags` correctly', () => {
const spy = jest.spyOn(app.commandLine, 'appendSwitch');
setChromeFlags();
expect(spy).nthCalledWith(1, 'auth-negotiate-delegate-whitelist', 'url');
expect(spy).nthCalledWith(2, 'auth-server-whitelist', 'whitelist');
expect(spy).nthCalledWith(
1,
'auth-negotiate-delegate-whitelist',
'whitelist',
);
expect(spy).nthCalledWith(2, 'auth-server-whitelist', 'url');
expect(spy).nthCalledWith(
3,
'disable-background-timer-throttling',

View File

@ -35,9 +35,8 @@ export const setChromeFlags = () => {
]) as any;
const configFlags: object = {
'auth-negotiate-delegate-whitelist':
flagsConfig.customFlags.authServerWhitelist,
'auth-server-whitelist':
flagsConfig.customFlags.authNegotiateDelegateWhitelist,
'auth-server-whitelist': flagsConfig.customFlags.authServerWhitelist,
'disable-background-timer-throttling': 'true',
'disable-d3d11': flagsConfig.disableGpu || null,
'disable-gpu': flagsConfig.disableGpu || null,

View File

@ -47,6 +47,7 @@ export interface IGlobalConfig {
contextOriginUrl: string;
url: string;
contextIsolation: boolean;
overrideUserAgent?: boolean;
}
export interface ICloudConfig {

View File

@ -167,6 +167,7 @@ export class WindowHandler {
'url',
'contextIsolation',
'contextOriginUrl',
'overrideUserAgent',
]);
this.userConfig = config.getUserConfigFields(['url']);
@ -385,7 +386,8 @@ export class WindowHandler {
cleanAppCacheOnCrash(this.mainWindow);
// loads the main window with url from config/cmd line
logger.info(`Loading main window with url ${this.url}`);
this.mainWindow.loadURL(this.url);
const userAgent = this.getUserAgent(this.mainWindow);
this.mainWindow.loadURL(this.url, { userAgent });
// check for build expiry in case of test builds
this.checkExpiry(this.mainWindow);
// update version info from server
@ -456,9 +458,9 @@ export class WindowHandler {
`Looks like about:blank got loaded which may lead to blank screen`,
);
logger.info(`Reloading the app to check if it resolves the issue`);
await this.mainWindow.loadURL(
this.userConfig.url || this.globalConfig.url,
);
const url = this.userConfig.url || this.globalConfig.url;
const userAgent = this.getUserAgent(this.mainWindow);
await this.mainWindow.loadURL(url, { userAgent });
return;
}
logger.info('window-handler: did-finish-load, url: ' + this.url);
@ -1757,8 +1759,10 @@ export class WindowHandler {
logger.info(
`window-utils: user has logged in, getting back to Symphony app`,
);
const userAgent = this.getUserAgent(this.mainWindow);
this.mainWindow.loadURL(
this.url || this.userConfig.url || this.globalConfig.url,
{ userAgent },
);
return;
}
@ -1766,7 +1770,10 @@ export class WindowHandler {
logger.info(
`window-utils: user hasn't logged in yet, loading login page again`,
);
this.mainWindow.loadURL(this.userConfig.url || this.globalConfig.url);
const userAgent = this.getUserAgent(this.mainWindow);
this.mainWindow.loadURL(this.userConfig.url || this.globalConfig.url, {
userAgent,
});
}
}
@ -1785,7 +1792,8 @@ export class WindowHandler {
const reloadUrl =
webContentsUrl || this.userConfig.url || this.globalConfig.url;
logger.info(`window-handler: Trying to reload ${reloadUrl}.`);
await this.mainWindow.loadURL(reloadUrl);
const userAgent = this.getUserAgent(this.mainWindow);
await this.mainWindow.loadURL(reloadUrl, { userAgent });
return;
}
logger.error(
@ -1971,7 +1979,8 @@ export class WindowHandler {
this.url = this.globalConfig.url + `?x-km-csrf-token=${csrfToken}`;
}
this.execCmd(this.screenShareIndicatorFrameUtil, []);
await this.mainWindow.loadURL(this.url);
const userAgent = this.getUserAgent(this.mainWindow);
await this.mainWindow.loadURL(this.url, { userAgent });
} catch (e) {
logger.error(
`window-handler: failed to switch client because of error ${e}`,
@ -2053,6 +2062,25 @@ export class WindowHandler {
return { ...defaultWindowOpts, ...windowOpts };
}
/**
* getUserAgent retrieves current window user-agent and updates it
* depending on global config setup
* Electron user-agent is removed due to Microsoft Azure not supporting SSO if found - cf SDA-3201
* @param mainWindow
* @returns updated user-agents
*/
private getUserAgent(mainWindow: ICustomBrowserWindow): string {
const doOverrideUserAgents = !!this.globalConfig.overrideUserAgent;
let userAgent = mainWindow.webContents.getUserAgent();
if (doOverrideUserAgents) {
const electronUserAgentRegex = /(Electron[0-9\/.]*)/;
userAgent = userAgent
.replace(electronUserAgentRegex, '')
.replace(' ', ' ');
}
return userAgent;
}
}
const windowHandler = new WindowHandler();