HTTP/2 200
cache-control: private
content-type: text/html; charset=utf-8
server: ScreenConnect/23.2.9.8466-1894385917 Microsoft-HTTPAPI/2.0
x-robots-tag: noindex
p3p: CP="NON CUR OUR STP STA PRE"
<!DOCTYPE html>
<html>
<head><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<script>
function setTaggedSessionInfo(tag, taggedSessionInfo) {
var oldTaggedSessionInfo = window._taggedSessionInfos[tag];
window._taggedSessionInfos[tag] = taggedSessionInfo;
if (!oldTaggedSessionInfo || taggedSessionInfo.SessionID != oldTaggedSessionInfo.SessionID || taggedSessionInfo.Code != oldTaggedSessionInfo.Code)
SC.pagedata.notifyDirty();
}
// backwards compatibility with extensions
function setTaggedSessionID(tag, sessionID) {
window.setTaggedSessionInfo(tag, { SessionID: sessionID });
}
function getTaggedSessionInfo(tag) {
return window._taggedSessionInfos[tag];
}
</script>
<script src="Script.ashx?__Cache=fd679076-5557-4f9b-a06d-abda51b45296" id="defaultScript"></script>
<link href="App_Themes/Solid/Default.css?__Cache=c33594ec-f460-47ee-ba84-eb3315411231" type="text/css" rel="stylesheet" /><link href="FavIcon.axd?__Cache=9ba1a2d5-c5aa-4470-b2ec-d1eecab079c3" rel="shortcut icon" />
<script>SC.util.mergeIntoContext({"focusedControlID":null,"userName":"","userDisplayName":"","isUserAuthenticated":false,"antiForgeryToken":"A2daa5gtl4xtLlHwTHY/HyY2S5T7XRgHJCWGYFLkHjEBAAChzigX0LotQg==","isUserAdministrator":false,"canManageSharedToolbox":false,"pageBaseFileName":"Guest","notifyActivityFrequencyMilliseconds":600000,"loginAfterInactivityMilliseconds":36000000,"canChangePassword":false,"controlPanelUrl":null,"pageType":"GuestPage","processType":2,"userAgentOverride":null,"sessionTypeInfos":[]});</script>
<script>SC.extension.addInitializeProc('fa369545-ba27-4670-b053-a9f65f3269b0', function (extensionContext) {
if (SC.context.pageType == 'AdministrationPage' && SC.context.isUserAuthenticated)
SC.service.GetThemeInfo(function (themeInfo) {
SC.util.includeStyleSheet(extensionContext.baseUrl + 'css/Style.css');
});
SC.event.addGlobalHandler(SC.event.ExecuteCommand, function (eventArgs) {
switch (eventArgs.commandName) {
case 'WebConfigSave':
SC.dialog.showModalButtonDialog(
'Prompt',
SC.res['AdvancedConfig.ApplyChanges'],
'OK',
'Default',
function (container) {
SC.ui.setContents(container, [
eventArgs.commandArgument === 'WebConfigRestore' ? $p(SC.res['AdvancedConfig.RestoreDefaults.WebConfigWarning']) : $p(SC.res['AdvancedConfig.RestartInstanceWarning'])
]);
},
function () {
var appSettings = JSON.parse(sessionStorage.getItem('WebConfigAppSettings'));
var pageSettings = JSON.parse(JSON.stringify(appSettings.location));
delete appSettings.location;
SC.service.WriteChangesToWebConfig(appSettings, pageSettings, function (result) {
if (result === 'OK') {
sessionStorage.removeItem('WebConfigAppSettings');
SC.dialog.showModalActivityAndReload('Save', true, window.location.href.split('#')[0]);
} else {
SC.dialog.showModalMessageBox(SC.res['AdvancedConfig.SaveError.Title'], SC.res['AdvancedConfig.SaveError.WebConfigDescription'] + ' ' + result);
}
});
}
);
break;
case 'AppConfigSave':
SC.dialog.showModalButtonDialog(
'Prompt',
SC.res['AdvancedConfig.ApplyChanges'],
'OK',
'Default',
function (container) {
SC.ui.setContents(container, [
eventArgs.commandArgument === 'AppConfigRestore' ? $p(SC.res['AdvancedConfig.RestoreDefaults.AppConfigWarning']) : $p(SC.res['AdvancedConfig.ReinstallWarning'])
]);
},
function () {
var systemSettings = JSON.parse(sessionStorage.getItem('AppConfigAppSettings')).SystemSettings;
var userInterfaceSettings = JSON.parse(sessionStorage.getItem('AppConfigAppSettings')).UserInterfaceSettings;
SC.service.WriteChangesToAppConfig(systemSettings, userInterfaceSettings, AppConfigDefaults, function (result) {
if (result === 'OK') {
sessionStorage.removeItem('AppConfigAppSettings');
window.location.reload();
} else {
SC.dialog.showModalMessageBox(SC.res['AdvancedConfig.SaveError.Title'], SC.res['AdvancedConfig.SaveError.AppConfigDescription'] + ' ' + result);
}
});
}
);
break;
}
});
});</script>
<script>SC.extension.addInitializeProc('fc234f0e-2e8e-4a1f-b977-ba41b14031f7', function (extensionContext) {
// Add: Options | Help
var x=extensionContext.baseUrl.split('/').splice(-2)[0];
SC.res['HelpPanel.Link'+x+'.Url']="https://docs.connectwise.com/ConnectWise_Automate/ConnectWise_Automate_Documentation/080/020/020?psa=1";
SC.event.addGlobalHandler(SC.event.QueryCommandButtonState,function(e){if(e.commandElement&&e.commandElement._commandName&&e.commandElement._commandName=='EditExtensionSettings'&&e.commandContext.extensionInfo.ExtensionID==x){SC.ui.addElement(e.target.parentElement,'A',{_commandName:'NavigateHelpLink',_commandArgument:x,_innerText:SC.res['Command.Help.Text'].replace(' ▽','')});}});
});</script>
<script>SC.extension.addInitializeProc('fc234f0e-2e8e-4a1f-b977-ba41b14031f7', function (extensionContext) {
/*
The following is currently ripped from the Hosted Integration Template per Control
Potential to one day not need this and use some core functionality
File will hide the UI and display the fourth column only
*/
var sendCommandToParent = function (commandName, commandData) {
if (commandName)
window.parent.postMessage({ _internalCommand: commandName, _internalCommandData: commandData ? commandData : {} }, '*');
};
SC.event.addGlobalHandler(SC.event.PreRender, function () {
window.addEventListener('message', function (eventArgs) {
SC.util.includeStyleSheet(extensionContext.baseUrl + 'LiveData/livedata.css');
switch (eventArgs.data._externalCommand) {
case 'RenderSessionDetailsFullWidthCommand':
var applicablePaths = ['/', '/Guest', '/Host', '/Login'];
if (!applicablePaths.includes(window.location.pathname))
break;
var elementsToHide = [
$('.HeaderPanel'),
$('.GlobalBar'),
$('.NavigationPanel'),
$('.MasterPanel'),
$('.MainDetailHeaderPanel'),
$('.MainDetailPanel'),
$('.ToggleDetailPanelButton'),
];
for (var i = 0; i < elementsToHide.length; i++)
if (elementsToHide[i])
SC.css.ensureClass(elementsToHide[i], 'HiddenElement', true);
var outerPanel = $('.OuterPanel');
var mainPanel = $('.MainPanel');
var subDetailHeader = $('.SubDetailHeaderPanel');
if (outerPanel)
SC.css.ensureClass(outerPanel, 'OuterPanelOverride', true);
if (mainPanel)
SC.css.ensureClass(mainPanel, 'GridOverride', true);
if (subDetailHeader)
SC.css.ensureClass(subDetailHeader, 'FullSizeHeaderElement', true);
var notifyPaths = ['/', '/Guest'];
if (notifyPaths.includes(window.location.pathname))
sendCommandToParent('OnPreRenderComplete');
break;
case 'LoadSessionCommand':
var sessionID = eventArgs.data._externalCommandData;
if (sessionID) {
// call our LiveDataService
SC.service.GetSessionDetailsUrl(
sessionID,
function (url) {
if (url)
window.location.href = url;
}
);
}
sendCommandToParent('OnLoadSessionComplete');
break;
}
});
sendCommandToParent('OnPreRender');
});
});</script>
<script>SC.extension.addInitializeProc('008c8fcf-2b14-4551-aa25-2177aa9a61e5', function (extensionContext) {
var connectWiseUserSourceName = 'ConnectWise';
var userSourceConfiguration = {
IdentityProviderUri: extensionContext.settingValues.ConnectWiseSsoBaseUrl,
ExtraScopes: 'roles',
ClientID: null,
ClientSecret: null,
UserInfoRoleNamesPath: 'roles',
ExtraRoleNames: '',
DisplayName: 'ConnectWise SSO',
ExternalUserManagementUrl: extensionContext.settingValues.ConnectWiseSsoUserManagementUrl,
}
userSourceConfiguration.ExternalUserManagementUrl = extensionContext.settingValues.ConnectWiseSsoUserManagementUrl;
SC.event.addGlobalHandler(SC.event.PreRender, function () {
if (SC.context.pageType === 'AdministrationPage')
SC.util.includeStyleSheet(extensionContext.baseUrl + 'ConnectWiseSSO.css');
});
SC.event.addGlobalHandler(SC.event.QueryCommandButtons, function (eventArgs) {
switch (eventArgs.area) {
case 'AddUserSourcePopoutPanel':
eventArgs.buttonDefinitions.push({
commandName: 'AddConnectWiseSSOUserSource',
text: SC.res['ConnectWiseSSO.AddUserSourcePopoutPanel.Button']
});
break;
}
});
SC.event.addGlobalHandler(SC.event.QueryCommandButtonState, function (eventArgs) {
switch (eventArgs.commandName) {
case 'AddConnectWiseSSOUserSource':
eventArgs.isEnabled = eventArgs.isVisible = SC.pagedata.get().UserSources.every(it => it.Name !== connectWiseUserSourceName);
break;
}
});
SC.event.addGlobalHandler(SC.event.ExecuteCommand, function (eventArgs) {
switch (eventArgs.commandName) {
case 'AddConnectWiseSSOUserSource':
SC.dialog.showModalButtonDialog(
'ConnectWiseSsoSetup',
SC.res['ConnectWiseSSO.SetupModal.Title'],
SC.res['ConnectWiseSSO.SetupModal.Button'],
null,
function (container) {
SC.ui.addContent(container, [
$h2({ innerHTML: SC.res['ConnectWiseSSO.SetupModal.Instructions'], className: 'SettingHeader' }),
$div($textarea({ className: 'RegistrationTokenInput' }))
]);
},
function () {
SC.service.MakeDynamicClientRegistrationRequest(
$('.RegistrationTokenInput').value,
SC.context.instanceID || SC.context.instanceUrlScheme,
SC.context.scriptBaseUrl,
connectWiseUserSourceName,
function (registrationResponse) {
userSourceConfiguration.ClientID = registrationResponse.client_id;
userSourceConfiguration.ClientSecret = registrationResponse.client_secret;
var configKeys = Object.keys(userSourceConfiguration);
var configValues = configKeys.map(function (key) { return userSourceConfiguration[key]; });
SC.service.AddUserSource(
'ScreenConnect.OpenIDConnectMembershipProvider',
connectWiseUserSourceName,
true,
false,
configKeys,
configValues,
() => SC.pagedata.notifyDirty()
);
});
SC.dialog.hideModalDialog();
}
);
break;
}
});
function compareVersions(version1, version2) {
var versionNumbers1 = version1.toString().split('.');
var versionNumbers2 = version2.toString().split('.');
for (let i = 0; i < Math.max(versionNumbers1.length, versionNumbers2.length); i++) {
var versionNumber1 = parseInt(versionNumbers1[i] || 0, 10);
var versionNumber2 = parseInt(versionNumbers2[i] || 0, 10);
if (versionNumber1 > versionNumber2) return 1;
if (versionNumber2 > versionNumber1) return -1;
}
return 0;
}
function isVersionInRange(version, minVersionInclusive, maxVersionExclusive) {
return (minVersionInclusive == undefined || compareVersions(version, minVersionInclusive) >= 0
&& (maxVersionExclusive == undefined || compareVersions(version, maxVersionExclusive) < 0));
}
function isProductVersionInRange(minVersionInclusive, maxVersionExclusive) {
return isVersionInRange(SC.context.productVersion, minVersionInclusive, maxVersionExclusive);
}
});</script>
<script>SC.extension.addInitializeProc('75fe3a74-43ba-45eb-9eab-12ff335b91cb', function (extensionContext) {
/** Edit App.Config Settings **/
/** Global Extension Variables **/
var extensionId = extensionContext.baseUrl.split('/').slice(-2)[0];
const numberRegex = new RegExp(/(^[0-9]$)|(^[1-9][0-9]+$)/);
/** Custom 'top' modal dialog to show alert type messages in modal dialog on top of existing modal dialogs **/
function setupTopModalDialog(disable){
if (!disable) {
eval('SC.dialog.showModalDialogRawOnTop = ' + SC.dialog.showModalDialogRaw.toString().replace('SC.dialog.hideModalDialog();','').replace(/hideModalDialog/g,'hideTopModalDialog'));
eval('SC.dialog.hideTopModalDialog = ' + SC.dialog.hideModalDialog.toString().replace(/getModalDialog/g,'getTopModalDialog'));
SC.dialog.getTopModalDialog = function() { return Array.prototype.map.call(window.document.querySelectorAll('#dialog'),function(_){return _;}).pop(); };
} else {
delete SC.dialog.showModalDialogRawOnTop;
delete SC.dialog.hideTopModalDialog;
delete SC.dialog.getTopModalDialog;
}
}
function alertModal(message){
if (!SC.dialog.showModalDialogRawOnTop)
setupTopModalDialog();
SC.dialog.showModalDialogRawOnTop(
message.subClass || 'MessageBox',
[
message.titlePanel || SC.dialog.createTitlePanel(message.title || SC.res['ErrorPanel.Title']),
message.contentPanel || SC.dialog.createContentPanel($div(message.content || message)),
message.buttonPanel || SC.dialog.createButtonPanel(message.button || 'OK',message.extraButtons || null)
],
message.onExecProc || function(eventArgs){
SC.dialog.hideTopModalDialog();
},
message.onQueryProc || null,
message.onHideProc || function(){
if (SC.dialog.getTopModalDialog() == SC.dialog.getModalDialog())
setupTopModalDialog(true);
}
);
}
/**********************************************/
/** Table Sorting Functions **/
var sortBy = {};
function sortTable(table, col) {
if (sortBy.table){
var oldSortCol = document.querySelector('#' + sortBy.table).tHead.rows[0].cells[sortBy.col || 0];
SC.css.ensureClass(oldSortCol,'Ascending',false);
SC.css.ensureClass(oldSortCol,'Descending',false);
}
if (sortBy.table == table.id && sortBy.col == col){
sortBy.dir = -((+sortBy.dir) || -1);
}
else {
sortBy.table = table.id;
sortBy.col = col;
sortBy.dir = 1;
}
if (sortBy.dir !== 0)
SC.css.ensureClass(table.tHead.rows[0].cells[col],sortBy.dir > 0 ? 'Ascending' : 'Descending', true);
var tb = table.tBodies[0];
var tr = Array.prototype.slice.call(tb.rows, 0);
tr = tr.sort(function (a, b) {
var aVal = a.cells[col].order ? a.cells[col].order : a.cells[col].textContent;
var bVal = b.cells[col].order ? b.cells[col].order : b.cells[col].textContent;
return sortBy.dir * (typeof aVal == 'number' ? aVal - bVal : aVal.localeCompare(bVal));
});
for(var i=0; i<tr.length; ++i){
tb.appendChild(tr[i]);
}
}
function makeSortable(table) {
var th = table.tHead, i;
th && (th = th.rows[0]) && (th = th.cells);
if (th) i = th.length;
else return; // if no `<thead>` then do nothing
while (--i >= 0) (function (i) {
SC.css.ensureClass(th[i],'Sortable',true);
th[i].addEventListener('click', function () {sortTable(table, i)});
}(i));
}
function makeAllSortable(parent) {
parent = parent || document.body;
var t = parent.getElementsByTagName('table'), i = t.length;
while (--i >= 0) makeSortable(t[i]);
}
/*****************************/
/** General Extension Functions **/
function checkVersion(minVer, curVer) {
if (typeof curVer + typeof minVer != 'stringstring')
return false;
var a = curVer.split('.'), b = minVer.split('.'), i = 0, len = Math.max(a.length, b.length);
for (; i < len; i++) {
if ((a[i] && !b[i] && parseInt(a[i]) > 0) || (parseInt(a[i]) > parseInt(b[i]))) {
return true;
} else if ((b[i] && !a[i] && parseInt(b[i]) > 0) || (parseInt(a[i]) < parseInt(b[i]))) {
return false;
}
}
return true;
}
function checkLongBitmask(flagInput,maskInput) {
var maxJSMaskLength = 8;
flags = flagInput.substring(flagInput.length,flagInput.length-(Math.min(maxJSMaskLength,flagInput.length)));
mask = maskInput.substring(maskInput.length,maskInput.length-(Math.min(maxJSMaskLength,maskInput.length)));
if (isNaN(flags) || isNaN(mask)){
return false;
}
if (parseInt(mask,16) === 0) {
if (maskInput.length > maxJSMaskLength) {
{
"@category" : "datascan",
"@timestamp" : "2024-11-20T23:01:55.000Z",
"app" : {
"extract" : {
"domain" : [
"connectwise.com"
],
"hostname" : [
"docs.connectwise.com"
],
"url" : [
"https://docs.connectwise.com/ConnectWise_Automate/ConnectWise_Automate_Documentation/080/020/020?psa=1"
]
},
"http" : {
"bodymd5" : "931e7ce8ad0e3e0e866f4dc47c151ecd",
"bodymmh3" : 747461957,
"headermd5" : "2ed1d4fb9b05fad4a548cc785a4f3855",
"headermmh3" : -1098840062
},
"length" : 16384
},
"asn" : "AS63949",
"city" : "Frankfurt am Main",
"country" : "DE",
"cpe" : "<enterprise field>: cpe",
"cpecount" : "<enterprise field>: cpecount",
"data" : "HTTP/2 200 \ncache-control: private\ncontent-type: text/html; charset=utf-8\nserver: ScreenConnect/23.2.9.8466-1894385917 Microsoft-HTTPAPI/2.0\nx-robots-tag: noindex\np3p: CP=\"NON CUR OUR STP STA PRE\"\n\n\n<!DOCTYPE html>\n<html>\n<head><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\" />\n\t<script>\n\n\t\tfunction setTaggedSessionInfo(tag, taggedSessionInfo) {\n\t\t\tvar oldTaggedSessionInfo = window._taggedSessionInfos[tag];\n\t\t\twindow._taggedSessionInfos[tag] = taggedSessionInfo;\n\n\t\t\tif (!oldTaggedSessionInfo || taggedSessionInfo.SessionID != oldTaggedSessionInfo.SessionID || taggedSessionInfo.Code != oldTaggedSessionInfo.Code)\n\t\t\t\tSC.pagedata.notifyDirty();\n\t\t}\n\n\t\t// backwards compatibility with extensions\n\t\tfunction setTaggedSessionID(tag, sessionID) {\n\t\t\twindow.setTaggedSessionInfo(tag, { SessionID: sessionID });\n\t\t}\n\n\t\tfunction getTaggedSessionInfo(tag) {\n\t\t\treturn window._taggedSessionInfos[tag];\n\t\t}\n\n\t</script>\n<script src=\"Script.ashx?__Cache=fd679076-5557-4f9b-a06d-abda51b45296\" id=\"defaultScript\"></script>\n<link href=\"App_Themes/Solid/Default.css?__Cache=c33594ec-f460-47ee-ba84-eb3315411231\" type=\"text/css\" rel=\"stylesheet\" /><link href=\"FavIcon.axd?__Cache=9ba1a2d5-c5aa-4470-b2ec-d1eecab079c3\" rel=\"shortcut icon\" />\n<script>SC.util.mergeIntoContext({\"focusedControlID\":null,\"userName\":\"\",\"userDisplayName\":\"\",\"isUserAuthenticated\":false,\"antiForgeryToken\":\"A2daa5gtl4xtLlHwTHY/HyY2S5T7XRgHJCWGYFLkHjEBAAChzigX0LotQg==\",\"isUserAdministrator\":false,\"canManageSharedToolbox\":false,\"pageBaseFileName\":\"Guest\",\"notifyActivityFrequencyMilliseconds\":600000,\"loginAfterInactivityMilliseconds\":36000000,\"canChangePassword\":false,\"controlPanelUrl\":null,\"pageType\":\"GuestPage\",\"processType\":2,\"userAgentOverride\":null,\"sessionTypeInfos\":[]});</script>\n<script>SC.extension.addInitializeProc('fa369545-ba27-4670-b053-a9f65f3269b0', function (extensionContext) {\nif (SC.context.pageType == 'AdministrationPage' && SC.context.isUserAuthenticated)\n\tSC.service.GetThemeInfo(function (themeInfo) {\n\t\tSC.util.includeStyleSheet(extensionContext.baseUrl + 'css/Style.css');\n\t});\n\nSC.event.addGlobalHandler(SC.event.ExecuteCommand, function (eventArgs) {\n\tswitch (eventArgs.commandName) {\n\t\tcase 'WebConfigSave':\n\t\t\tSC.dialog.showModalButtonDialog(\n\t\t\t\t'Prompt',\n\t\t\t\tSC.res['AdvancedConfig.ApplyChanges'],\n\t\t\t\t'OK',\n\t\t\t\t'Default',\n\t\t\t\tfunction (container) {\n\t\t\t\t\tSC.ui.setContents(container, [\n\t\t\t\t\t\teventArgs.commandArgument === 'WebConfigRestore' ? $p(SC.res['AdvancedConfig.RestoreDefaults.WebConfigWarning']) : $p(SC.res['AdvancedConfig.RestartInstanceWarning'])\n\t\t\t\t\t]);\n\t\t\t\t},\n\t\t\t\tfunction () {\n\t\t\t\t\tvar appSettings = JSON.parse(sessionStorage.getItem('WebConfigAppSettings'));\n\t\t\t\t\tvar pageSettings = JSON.parse(JSON.stringify(appSettings.location));\n\t\t\t\t\tdelete appSettings.location;\n\n\t\t\t\t\tSC.service.WriteChangesToWebConfig(appSettings, pageSettings, function (result) {\n\t\t\t\t\t\tif (result === 'OK') {\n\t\t\t\t\t\t\tsessionStorage.removeItem('WebConfigAppSettings');\n\t\t\t\t\t\t\tSC.dialog.showModalActivityAndReload('Save', true, window.location.href.split('#')[0]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tSC.dialog.showModalMessageBox(SC.res['AdvancedConfig.SaveError.Title'], SC.res['AdvancedConfig.SaveError.WebConfigDescription'] + ' ' + result);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t);\n\t\t\tbreak;\n\t\tcase 'AppConfigSave':\n\t\t\tSC.dialog.showModalButtonDialog(\n\t\t\t\t'Prompt',\n\t\t\t\tSC.res['AdvancedConfig.ApplyChanges'],\n\t\t\t\t'OK',\n\t\t\t\t'Default',\n\t\t\t\tfunction (container) {\n\t\t\t\t\tSC.ui.setContents(container, [\n\t\t\t\t\t\teventArgs.commandArgument === 'AppConfigRestore' ? $p(SC.res['AdvancedConfig.RestoreDefaults.AppConfigWarning']) : $p(SC.res['AdvancedConfig.ReinstallWarning'])\n\t\t\t\t\t]);\n\t\t\t\t},\n\t\t\t\tfunction () {\n\t\t\t\t\tvar systemSettings = JSON.parse(sessionStorage.getItem('AppConfigAppSettings')).SystemSettings;\n\t\t\t\t\tvar userInterfaceSettings = JSON.parse(sessionStorage.getItem('AppConfigAppSettings')).UserInterfaceSettings;\n\n\t\t\t\t\tSC.service.WriteChangesToAppConfig(systemSettings, userInterfaceSettings, AppConfigDefaults, function (result) {\n\t\t\t\t\t\tif (result === 'OK') {\n\t\t\t\t\t\t\tsessionStorage.removeItem('AppConfigAppSettings');\n\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tSC.dialog.showModalMessageBox(SC.res['AdvancedConfig.SaveError.Title'], SC.res['AdvancedConfig.SaveError.AppConfigDescription'] + ' ' + result);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t);\n\t\t\tbreak;\n\t}\n});\n\n\n});</script>\n<script>SC.extension.addInitializeProc('fc234f0e-2e8e-4a1f-b977-ba41b14031f7', function (extensionContext) {\n// Add: Options | Help\nvar x=extensionContext.baseUrl.split('/').splice(-2)[0];\nSC.res['HelpPanel.Link'+x+'.Url']=\"https://docs.connectwise.com/ConnectWise_Automate/ConnectWise_Automate_Documentation/080/020/020?psa=1\";\nSC.event.addGlobalHandler(SC.event.QueryCommandButtonState,function(e){if(e.commandElement&&e.commandElement._commandName&&e.commandElement._commandName=='EditExtensionSettings'&&e.commandContext.extensionInfo.ExtensionID==x){SC.ui.addElement(e.target.parentElement,'A',{_commandName:'NavigateHelpLink',_commandArgument:x,_innerText:SC.res['Command.Help.Text'].replace(' \u25bd','')});}});\n\n});</script>\n<script>SC.extension.addInitializeProc('fc234f0e-2e8e-4a1f-b977-ba41b14031f7', function (extensionContext) {\n/*\n The following is currently ripped from the Hosted Integration Template per Control\n Potential to one day not need this and use some core functionality\n\n File will hide the UI and display the fourth column only\n*/\nvar sendCommandToParent = function (commandName, commandData) {\n if (commandName)\n window.parent.postMessage({ _internalCommand: commandName, _internalCommandData: commandData ? commandData : {} }, '*');\n};\n\nSC.event.addGlobalHandler(SC.event.PreRender, function () {\n window.addEventListener('message', function (eventArgs) {\n SC.util.includeStyleSheet(extensionContext.baseUrl + 'LiveData/livedata.css');\n switch (eventArgs.data._externalCommand) {\n case 'RenderSessionDetailsFullWidthCommand':\n var applicablePaths = ['/', '/Guest', '/Host', '/Login'];\n if (!applicablePaths.includes(window.location.pathname))\n break;\n\n var elementsToHide = [\n $('.HeaderPanel'),\n $('.GlobalBar'),\n $('.NavigationPanel'),\n $('.MasterPanel'),\n $('.MainDetailHeaderPanel'),\n $('.MainDetailPanel'),\n $('.ToggleDetailPanelButton'),\n ];\n\n for (var i = 0; i < elementsToHide.length; i++)\n if (elementsToHide[i])\n SC.css.ensureClass(elementsToHide[i], 'HiddenElement', true);\n\n var outerPanel = $('.OuterPanel');\n var mainPanel = $('.MainPanel');\n var subDetailHeader = $('.SubDetailHeaderPanel');\n\n if (outerPanel)\n SC.css.ensureClass(outerPanel, 'OuterPanelOverride', true);\n\n if (mainPanel)\n SC.css.ensureClass(mainPanel, 'GridOverride', true);\n\n if (subDetailHeader)\n SC.css.ensureClass(subDetailHeader, 'FullSizeHeaderElement', true);\n\n var notifyPaths = ['/', '/Guest'];\n\n if (notifyPaths.includes(window.location.pathname))\n sendCommandToParent('OnPreRenderComplete');\n\n break;\n\n case 'LoadSessionCommand':\n var sessionID = eventArgs.data._externalCommandData;\n\n if (sessionID) {\n // call our LiveDataService\n SC.service.GetSessionDetailsUrl(\n sessionID,\n function (url) {\n if (url)\n window.location.href = url;\n }\n );\n }\n\n sendCommandToParent('OnLoadSessionComplete');\n break;\n }\n });\n\n sendCommandToParent('OnPreRender');\n});\n\n});</script>\n<script>SC.extension.addInitializeProc('008c8fcf-2b14-4551-aa25-2177aa9a61e5', function (extensionContext) {\nvar connectWiseUserSourceName = 'ConnectWise';\n\nvar userSourceConfiguration = {\n\tIdentityProviderUri: extensionContext.settingValues.ConnectWiseSsoBaseUrl,\n\tExtraScopes: 'roles',\n\tClientID: null,\n\tClientSecret: null,\n\tUserInfoRoleNamesPath: 'roles',\n\tExtraRoleNames: '',\n\tDisplayName: 'ConnectWise SSO',\n\tExternalUserManagementUrl: extensionContext.settingValues.ConnectWiseSsoUserManagementUrl,\n}\n\nuserSourceConfiguration.ExternalUserManagementUrl = extensionContext.settingValues.ConnectWiseSsoUserManagementUrl;\n\nSC.event.addGlobalHandler(SC.event.PreRender, function () {\n\tif (SC.context.pageType === 'AdministrationPage')\n\t\tSC.util.includeStyleSheet(extensionContext.baseUrl + 'ConnectWiseSSO.css');\n});\n\nSC.event.addGlobalHandler(SC.event.QueryCommandButtons, function (eventArgs) {\n\tswitch (eventArgs.area) {\n\t\tcase 'AddUserSourcePopoutPanel':\n\t\t\teventArgs.buttonDefinitions.push({\n\t\t\t\tcommandName: 'AddConnectWiseSSOUserSource',\n\t\t\t\ttext: SC.res['ConnectWiseSSO.AddUserSourcePopoutPanel.Button']\n\t\t\t});\n\t\t\tbreak;\n\t}\n});\n\nSC.event.addGlobalHandler(SC.event.QueryCommandButtonState, function (eventArgs) {\n\tswitch (eventArgs.commandName) {\n\t\tcase 'AddConnectWiseSSOUserSource':\n\t\t\teventArgs.isEnabled = eventArgs.isVisible = SC.pagedata.get().UserSources.every(it => it.Name !== connectWiseUserSourceName);\n\t\t\tbreak;\n\t}\n});\n\nSC.event.addGlobalHandler(SC.event.ExecuteCommand, function (eventArgs) {\n\tswitch (eventArgs.commandName) {\n\t\tcase 'AddConnectWiseSSOUserSource':\n\t\t\tSC.dialog.showModalButtonDialog(\n\t\t\t\t'ConnectWiseSsoSetup',\n\t\t\t\tSC.res['ConnectWiseSSO.SetupModal.Title'],\n\t\t\t\tSC.res['ConnectWiseSSO.SetupModal.Button'],\n\t\t\t\tnull,\n\t\t\t\tfunction (container) {\n\t\t\t\t\tSC.ui.addContent(container, [\n\t\t\t\t\t\t$h2({ innerHTML: SC.res['ConnectWiseSSO.SetupModal.Instructions'], className: 'SettingHeader' }),\n\t\t\t\t\t\t$div($textarea({ className: 'RegistrationTokenInput' }))\n\t\t\t\t\t]);\n\t\t\t\t},\n\t\t\t\tfunction () {\n\t\t\t\t\tSC.service.MakeDynamicClientRegistrationRequest(\n\t\t\t\t\t\t$('.RegistrationTokenInput').value,\n\t\t\t\t\t\tSC.context.instanceID || SC.context.instanceUrlScheme,\n\t\t\t\t\t\tSC.context.scriptBaseUrl,\n\t\t\t\t\t\tconnectWiseUserSourceName,\n\t\t\t\t\t\tfunction (registrationResponse) {\n\t\t\t\t\t\t\tuserSourceConfiguration.ClientID = registrationResponse.client_id;\n\t\t\t\t\t\t\tuserSourceConfiguration.ClientSecret = registrationResponse.client_secret;\n\n\t\t\t\t\t\t\tvar configKeys = Object.keys(userSourceConfiguration);\n\t\t\t\t\t\t\tvar configValues = configKeys.map(function (key) { return userSourceConfiguration[key]; });\n\n\t\t\t\t\t\t\tSC.service.AddUserSource(\n\t\t\t\t\t\t\t\t'ScreenConnect.OpenIDConnectMembershipProvider',\n\t\t\t\t\t\t\t\tconnectWiseUserSourceName,\n\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\t\tconfigKeys,\n\t\t\t\t\t\t\t\tconfigValues,\n\t\t\t\t\t\t\t\t() => SC.pagedata.notifyDirty()\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t});\n\n\t\t\t\t\tSC.dialog.hideModalDialog();\n\t\t\t\t}\n\t\t\t);\n\t\t\tbreak;\n\t}\n});\n\nfunction compareVersions(version1, version2) {\n\tvar versionNumbers1 = version1.toString().split('.');\n\tvar versionNumbers2 = version2.toString().split('.');\n\n\tfor (let i = 0; i < Math.max(versionNumbers1.length, versionNumbers2.length); i++) {\n\t\tvar versionNumber1 = parseInt(versionNumbers1[i] || 0, 10);\n\t\tvar versionNumber2 = parseInt(versionNumbers2[i] || 0, 10);\n\t\tif (versionNumber1 > versionNumber2) return 1;\n\t\tif (versionNumber2 > versionNumber1) return -1;\n\t}\n\n\treturn 0;\n}\n\nfunction isVersionInRange(version, minVersionInclusive, maxVersionExclusive) {\n\treturn (minVersionInclusive == undefined || compareVersions(version, minVersionInclusive) >= 0\n\t\t&& (maxVersionExclusive == undefined || compareVersions(version, maxVersionExclusive) < 0));\n}\n\nfunction isProductVersionInRange(minVersionInclusive, maxVersionExclusive) {\n\treturn isVersionInRange(SC.context.productVersion, minVersionInclusive, maxVersionExclusive);\n}\n\n});</script>\n<script>SC.extension.addInitializeProc('75fe3a74-43ba-45eb-9eab-12ff335b91cb', function (extensionContext) {\n/** Edit App.Config Settings **/\n\n/** Global Extension Variables **/\nvar extensionId = extensionContext.baseUrl.split('/').slice(-2)[0];\n\nconst numberRegex = new RegExp(/(^[0-9]$)|(^[1-9][0-9]+$)/);\n\n/** Custom 'top' modal dialog to show alert type messages in modal dialog on top of existing modal dialogs **/\nfunction setupTopModalDialog(disable){\n\tif (!disable) {\n\t\teval('SC.dialog.showModalDialogRawOnTop = ' + SC.dialog.showModalDialogRaw.toString().replace('SC.dialog.hideModalDialog();','').replace(/hideModalDialog/g,'hideTopModalDialog'));\n\t\teval('SC.dialog.hideTopModalDialog = ' + SC.dialog.hideModalDialog.toString().replace(/getModalDialog/g,'getTopModalDialog'));\n\t\tSC.dialog.getTopModalDialog = function() { return Array.prototype.map.call(window.document.querySelectorAll('#dialog'),function(_){return _;}).pop(); };\n\t} else {\n\t\tdelete SC.dialog.showModalDialogRawOnTop;\n\t\tdelete SC.dialog.hideTopModalDialog;\n\t\tdelete SC.dialog.getTopModalDialog;\n\t}\n}\n\nfunction alertModal(message){\n\tif (!SC.dialog.showModalDialogRawOnTop)\n\t\tsetupTopModalDialog();\n\n\tSC.dialog.showModalDialogRawOnTop(\n\t\tmessage.subClass || 'MessageBox',\n\t\t[\n\t\t\tmessage.titlePanel || SC.dialog.createTitlePanel(message.title || SC.res['ErrorPanel.Title']),\n\t\t\tmessage.contentPanel || SC.dialog.createContentPanel($div(message.content || message)),\n\t\t\tmessage.buttonPanel || SC.dialog.createButtonPanel(message.button || 'OK',message.extraButtons || null)\n\t\t],\n\t\tmessage.onExecProc || function(eventArgs){\n\t\t\tSC.dialog.hideTopModalDialog();\n\t\t},\n\t\tmessage.onQueryProc || null,\n\t\tmessage.onHideProc || function(){\n\t\t\tif (SC.dialog.getTopModalDialog() == SC.dialog.getModalDialog())\n\t\t\t\tsetupTopModalDialog(true);\n\t\t}\n\t);\n}\n/**********************************************/\n\n/** Table Sorting Functions **/\nvar sortBy = {};\nfunction sortTable(table, col) {\n\tif (sortBy.table){\n\t\tvar oldSortCol = document.querySelector('#' + sortBy.table).tHead.rows[0].cells[sortBy.col || 0];\n\t\tSC.css.ensureClass(oldSortCol,'Ascending',false);\n\t\tSC.css.ensureClass(oldSortCol,'Descending',false);\n\t}\n\t\n\tif (sortBy.table == table.id && sortBy.col == col){\n\t\tsortBy.dir = -((+sortBy.dir) || -1);\n\t}\n\telse {\n\t\tsortBy.table = table.id;\n\t\tsortBy.col = col;\n\t\tsortBy.dir = 1;\n\t}\n\tif (sortBy.dir !== 0)\n\t\tSC.css.ensureClass(table.tHead.rows[0].cells[col],sortBy.dir > 0 ? 'Ascending' : 'Descending', true);\n\n\tvar tb = table.tBodies[0];\n\tvar tr = Array.prototype.slice.call(tb.rows, 0);\n\ttr = tr.sort(function (a, b) {\n\t\tvar aVal = a.cells[col].order ? a.cells[col].order : a.cells[col].textContent;\n\t\tvar bVal = b.cells[col].order ? b.cells[col].order : b.cells[col].textContent;\n\t\treturn sortBy.dir * (typeof aVal == 'number' ? aVal - bVal : aVal.localeCompare(bVal));\n\t});\n\tfor(var i=0; i<tr.length; ++i){\n\t\ttb.appendChild(tr[i]);\n\t}\n}\n\nfunction makeSortable(table) {\n\tvar th = table.tHead, i;\n\tth && (th = th.rows[0]) && (th = th.cells);\n\tif (th) i = th.length;\n\telse return; // if no `<thead>` then do nothing\n\twhile (--i >= 0) (function (i) {\n\t\tSC.css.ensureClass(th[i],'Sortable',true);\n\t\tth[i].addEventListener('click', function () {sortTable(table, i)});\n\t}(i));\n}\n\nfunction makeAllSortable(parent) {\n\tparent = parent || document.body;\n\tvar t = parent.getElementsByTagName('table'), i = t.length;\n\twhile (--i >= 0) makeSortable(t[i]);\n}\n/*****************************/\n\n/** General Extension Functions **/\nfunction checkVersion(minVer, curVer) {\n\tif (typeof curVer + typeof minVer != 'stringstring')\n\t\treturn false;\n\tvar a = curVer.split('.'), b = minVer.split('.'), i = 0, len = Math.max(a.length, b.length);\n\tfor (; i < len; i++) {\n\t\tif ((a[i] && !b[i] && parseInt(a[i]) > 0) || (parseInt(a[i]) > parseInt(b[i]))) {\n\t\t\treturn true;\n\t\t} else if ((b[i] && !a[i] && parseInt(b[i]) > 0) || (parseInt(a[i]) < parseInt(b[i]))) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\nfunction checkLongBitmask(flagInput,maskInput) {\n\tvar maxJSMaskLength = 8;\n\tflags = flagInput.substring(flagInput.length,flagInput.length-(Math.min(maxJSMaskLength,flagInput.length)));\n\tmask = maskInput.substring(maskInput.length,maskInput.length-(Math.min(maxJSMaskLength,maskInput.length)));\n\n\tif (isNaN(flags) || isNaN(mask)){\n\t\treturn false;\n\t}\n\n\tif (parseInt(mask,16) === 0) {\n\t\tif (maskInput.length > maxJSMaskLength) {",
"datamd5" : "49eab9e205612a0f4919c3fe1c018f72",
"datammh3" : 1942039422,
"device" : {
"class" : "<enterprise field>: device.class"
},
"domain" : [
"linodeusercontent.com"
],
"geolocus" : {
"asn" : "AS63949",
"continent" : "NA",
"continentname" : "North America",
"country" : "US",
"countryname" : "United States",
"domain" : [
"akamai.com",
"linode.com"
],
"isineu" : "false",
"latitude" : "37.09024",
"location" : "37.09024,-95.712891",
"longitude" : "-95.712891",
"netname" : "LINODE",
"organization" : "Linode",
"subnet" : "172.105.64.0/19"
},
"host" : [
"172-105-94-43"
],
"hostname" : [
"172-105-94-43.ip.linodeusercontent.com"
],
"ip" : "172.105.94.43",
"ipv6" : "false",
"latitude" : "50.1187",
"location" : "50.1187,8.6842",
"longitude" : "8.6842",
"node" : {
"country" : "<enterprise field>: node.country",
"groupid" : "<enterprise field>: node.groupid",
"id" : "<enterprise field>: node.id",
"physicalcountry" : "<enterprise field>: node.physicalcountry"
},
"organization" : "Akamai Connected Cloud",
"os" : "Linux",
"osdistribution" : "sUse",
"osvendor" : "Linux",
"port" : 1741,
"product" : "Control",
"productvendor" : "ConnectWise",
"productversion" : "23.2.9.8466",
"protocol" : "http",
"reverse" : [
"172-105-94-43.ip.linodeusercontent.com"
],
"seen_date" : "2024-11-20",
"source" : "datascan",
"subdomains" : [
"ip.linodeusercontent.com"
],
"subnet" : "172.105.0.0/17",
"tag" : "<enterprise field>: tag",
"tld" : [
"com"
],
"tls" : "false",
"transport" : "tcp",
"url" : "/"
}