Returning 10 result(s) out of 13 in 0.101 second(s)

  • 34.76.130.71:7100 (tcp/http) - last seen on 2024-11-07 at 03:23:15 UTC

    • IP
      34.76.130.71
      Network
      34.72.0.0/13
      Domain(s)
      googleusercontent.com
      Device

      <enterprise field>: device.class

      Operating System
      Linux Linux sUse
      URL

      http://34.76.130.71:7100/

      Reverse DNS
      71.130.76.34.bc.googleusercontent.com
      ASN
      AS396982
      Organization
      GOOGLE-CLOUD-PLATFORM
      Protocol
      http
      Source
      datascan
    • Operating System
      Linux Linux sUse
      Product
      ConnectWise Control 23.2.9.8466
      CPE(s)

      <enterprise field>: cpe

    • This feature requires at least a "Lion View" to unlock. Go to our Pricing page for more.

    • Data MD5
      49eab9e205612a0f4919c3fe1c018f72
      HTTP Header MD5
      2ed1d4fb9b05fad4a548cc785a4f3855
      HTTP Body MD5
      931e7ce8ad0e3e0e866f4dc47c151ecd
    • 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-07T03:23:15.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" : "AS396982",
         "city" : "Brussels",
         "country" : "BE",
         "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" : [
            "googleusercontent.com"
         ],
         "geolocus" : {
            "asn" : "AS396982",
            "continent" : "NA",
            "continentname" : "North America",
            "country" : "US",
            "countryname" : "United States",
            "domain" : [
               "google.com",
               "googleusercontent.com"
            ],
            "isineu" : "false",
            "latitude" : "37.09024",
            "location" : "37.09024,-95.712891",
            "longitude" : "-95.712891",
            "netname" : "GOOGL-2",
            "organization" : "Google LLC",
            "subnet" : "34.76.0.0/14"
         },
         "host" : [
            71
         ],
         "hostname" : [
            "71.130.76.34.bc.googleusercontent.com"
         ],
         "ip" : "34.76.130.71",
         "ipv6" : "false",
         "latitude" : "50.8534",
         "location" : "50.8534,4.3470",
         "longitude" : "4.3470",
         "node" : {
            "country" : "<enterprise field>: node.country",
            "groupid" : "<enterprise field>: node.groupid",
            "id" : "<enterprise field>: node.id",
            "physicalcountry" : "<enterprise field>: node.physicalcountry"
         },
         "organization" : "GOOGLE-CLOUD-PLATFORM",
         "os" : "Linux",
         "osdistribution" : "sUse",
         "osvendor" : "Linux",
         "port" : 7100,
         "product" : "Control",
         "productvendor" : "ConnectWise",
         "productversion" : "23.2.9.8466",
         "protocol" : "http",
         "reverse" : [
            "71.130.76.34.bc.googleusercontent.com"
         ],
         "seen_date" : "2024-11-07",
         "source" : "datascan",
         "subdomains" : [
            "130.76.34.bc.googleusercontent.com",
            "34.bc.googleusercontent.com",
            "76.34.bc.googleusercontent.com",
            "bc.googleusercontent.com"
         ],
         "subnet" : "34.72.0.0/13",
         "tag" : "<enterprise field>: tag",
         "tld" : [
            "com"
         ],
         "tls" : "false",
         "transport" : "tcp",
         "url" : "/"
      }
      
  • 4.251.106.224:7100 (tcp/http) - last seen on 2024-11-07 at 01:08:14 UTC

    • IP
      4.251.106.224
      Network
      4.192.0.0/10
      Device

      <enterprise field>: device.class

      Operating System
      Linux Linux sUse
      URL

      http://4.251.106.224:7100/

      ASN
      AS8075
      Organization
      MICROSOFT-CORP-MSN-AS-BLOCK
      Protocol
      http
      Source
      datascan
    • Operating System
      Linux Linux sUse
      Product
      ConnectWise Control 23.2.9.8466
      CPE(s)

      <enterprise field>: cpe

    • This feature requires at least a "Lion View" to unlock. Go to our Pricing page for more.

    • Data MD5
      49eab9e205612a0f4919c3fe1c018f72
      HTTP Header MD5
      2ed1d4fb9b05fad4a548cc785a4f3855
      HTTP Body MD5
      931e7ce8ad0e3e0e866f4dc47c151ecd
    • 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-07T01:08:14.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" : "AS8075",
         "city" : "Paris",
         "country" : "FR",
         "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"
         },
         "geolocus" : {
            "asn" : "AS8075",
            "continent" : "NA",
            "continentname" : "North America",
            "country" : "US",
            "countryname" : "United States",
            "domain" : [
               "microsoft.com"
            ],
            "isineu" : "false",
            "latitude" : "37.09024",
            "location" : "37.09024,-95.712891",
            "longitude" : "-95.712891",
            "netname" : "MSFT",
            "organization" : "Microsoft Corporation",
            "subnet" : "4.251.0.0/17"
         },
         "ip" : "4.251.106.224",
         "ipv6" : "false",
         "latitude" : "48.8323",
         "location" : "48.8323,2.4075",
         "longitude" : "2.4075",
         "node" : {
            "country" : "<enterprise field>: node.country",
            "groupid" : "<enterprise field>: node.groupid",
            "id" : "<enterprise field>: node.id",
            "physicalcountry" : "<enterprise field>: node.physicalcountry"
         },
         "organization" : "MICROSOFT-CORP-MSN-AS-BLOCK",
         "os" : "Linux",
         "osdistribution" : "sUse",
         "osvendor" : "Linux",
         "port" : 7100,
         "product" : "Control",
         "productvendor" : "ConnectWise",
         "productversion" : "23.2.9.8466",
         "protocol" : "http",
         "seen_date" : "2024-11-07",
         "source" : "datascan",
         "subnet" : "4.192.0.0/10",
         "tag" : "<enterprise field>: tag",
         "tls" : "false",
         "transport" : "tcp",
         "url" : "/"
      }
      
  • 34.118.11.238:7100 (tcp/http) - last seen on 2024-11-03 at 11:10:50 UTC

    • IP
      34.118.11.238
      Network
      34.118.0.0/15
      Domain(s)
      googleusercontent.com
      Device

      <enterprise field>: device.class

      Operating System
      Linux Linux sUse
      URL

      http://34.118.11.238:7100/

      Reverse DNS
      238.11.118.34.bc.googleusercontent.com
      ASN
      AS396982
      Organization
      GOOGLE-CLOUD-PLATFORM
      Protocol
      http
      Source
      datascan
    • Operating System
      Linux Linux sUse
      Product
      ConnectWise Control 23.2.9.8466
      CPE(s)

      <enterprise field>: cpe

    • This feature requires at least a "Lion View" to unlock. Go to our Pricing page for more.

    • Data MD5
      49eab9e205612a0f4919c3fe1c018f72
      HTTP Header MD5
      2ed1d4fb9b05fad4a548cc785a4f3855
      HTTP Body MD5
      931e7ce8ad0e3e0e866f4dc47c151ecd
    • 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-03T11:10:50.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" : "AS396982",
         "city" : "Warsaw",
         "country" : "PL",
         "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" : [
            "googleusercontent.com"
         ],
         "geolocus" : {
            "asn" : "AS396982",
            "continent" : "NA",
            "continentname" : "North America",
            "country" : "US",
            "countryname" : "United States",
            "domain" : [
               "google.com",
               "googleusercontent.com"
            ],
            "isineu" : "false",
            "latitude" : "37.09024",
            "location" : "37.09024,-95.712891",
            "longitude" : "-95.712891",
            "netname" : "GOOGL-2",
            "organization" : "Google LLC",
            "subnet" : "34.118.0.0/17"
         },
         "host" : [
            238
         ],
         "hostname" : [
            "238.11.118.34.bc.googleusercontent.com"
         ],
         "ip" : "34.118.11.238",
         "ipv6" : "false",
         "latitude" : "52.2296",
         "location" : "52.2296,21.0067",
         "longitude" : "21.0067",
         "node" : {
            "country" : "<enterprise field>: node.country",
            "groupid" : "<enterprise field>: node.groupid",
            "id" : "<enterprise field>: node.id",
            "physicalcountry" : "<enterprise field>: node.physicalcountry"
         },
         "organization" : "GOOGLE-CLOUD-PLATFORM",
         "os" : "Linux",
         "osdistribution" : "sUse",
         "osvendor" : "Linux",
         "port" : 7100,
         "product" : "Control",
         "productvendor" : "ConnectWise",
         "productversion" : "23.2.9.8466",
         "protocol" : "http",
         "reverse" : [
            "238.11.118.34.bc.googleusercontent.com"
         ],
         "seen_date" : "2024-11-03",
         "source" : "datascan",
         "subdomains" : [
            "11.118.34.bc.googleusercontent.com",
            "118.34.bc.googleusercontent.com",
            "34.bc.googleusercontent.com",
            "bc.googleusercontent.com"
         ],
         "subnet" : "34.118.0.0/15",
         "tag" : "<enterprise field>: tag",
         "tld" : [
            "com"
         ],
         "tls" : "false",
         "transport" : "tcp",
         "url" : "/"
      }
      
  • 96.126.114.193:7100 (tcp/http) - last seen on 2024-11-02 at 12:25:28 UTC

    • IP
      96.126.114.193
      Network
      96.126.96.0/19
      Domain(s)
      linodeusercontent.com
      Device

      <enterprise field>: device.class

      Operating System
      Linux Linux sUse
      URL

      http://96.126.114.193:7100/

      Reverse DNS
      96-126-114-193.ip.linodeusercontent.com
      ASN
      AS63949
      Organization
      Akamai Connected Cloud
      Protocol
      http
      Source
      datascan
    • Operating System
      Linux Linux sUse
      Product
      ConnectWise Control 23.2.9.8466
      CPE(s)

      <enterprise field>: cpe

    • This feature requires at least a "Lion View" to unlock. Go to our Pricing page for more.

    • Data MD5
      49eab9e205612a0f4919c3fe1c018f72
      HTTP Header MD5
      2ed1d4fb9b05fad4a548cc785a4f3855
      HTTP Body MD5
      931e7ce8ad0e3e0e866f4dc47c151ecd
    • 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-02T12:25:28.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" : "Richardson",
         "country" : "US",
         "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" : "96.126.96.0/19"
         },
         "host" : [
            "96-126-114-193"
         ],
         "hostname" : [
            "96-126-114-193.ip.linodeusercontent.com"
         ],
         "ip" : "96.126.114.193",
         "ipv6" : "false",
         "latitude" : "32.9473",
         "location" : "32.9473,-96.7028",
         "longitude" : "-96.7028",
         "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" : 7100,
         "product" : "Control",
         "productvendor" : "ConnectWise",
         "productversion" : "23.2.9.8466",
         "protocol" : "http",
         "reverse" : [
            "96-126-114-193.ip.linodeusercontent.com"
         ],
         "seen_date" : "2024-11-02",
         "source" : "datascan",
         "subdomains" : [
            "ip.linodeusercontent.com"
         ],
         "subnet" : "96.126.96.0/19",
         "tag" : "<enterprise field>: tag",
         "tld" : [
            "com"
         ],
         "tls" : "false",
         "transport" : "tcp",
         "url" : "/"
      }
      
  • 173.255.220.38:7100 (tcp/http) - last seen on 2024-11-01 at 07:30:27 UTC

    • IP
      173.255.220.38
      Network
      173.255.192.0/18
      Device

      <enterprise field>: device.class

      Operating System
      Linux Linux sUse
      URL

      http://173.255.220.38:7100/

      ASN
      AS63949
      Organization
      Akamai Connected Cloud
      Protocol
      http
      Source
      datascan
    • Operating System
      Linux Linux sUse
      Product
      ConnectWise Control 23.2.9.8466
      CPE(s)

      <enterprise field>: cpe

    • This feature requires at least a "Lion View" to unlock. Go to our Pricing page for more.

    • Data MD5
      49eab9e205612a0f4919c3fe1c018f72
      HTTP Header MD5
      2ed1d4fb9b05fad4a548cc785a4f3855
      HTTP Body MD5
      931e7ce8ad0e3e0e866f4dc47c151ecd
    • 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-01T07:30:27.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" : "Fremont",
         "country" : "US",
         "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"
         },
         "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" : "173.255.192.0/18"
         },
         "ip" : "173.255.220.38",
         "ipv6" : "false",
         "latitude" : "37.5625",
         "location" : "37.5625,-122.0004",
         "longitude" : "-122.0004",
         "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" : 7100,
         "product" : "Control",
         "productvendor" : "ConnectWise",
         "productversion" : "23.2.9.8466",
         "protocol" : "http",
         "seen_date" : "2024-11-01",
         "source" : "datascan",
         "subnet" : "173.255.192.0/18",
         "tag" : "<enterprise field>: tag",
         "tls" : "false",
         "transport" : "tcp",
         "url" : "/"
      }
      
  • 34.162.59.87:7100 (tcp/http) - last seen on 2024-10-28 at 07:24:55 UTC

    • IP
      34.162.59.87
      Network
      34.160.0.0/14
      Domain(s)
      googleusercontent.com
      Device

      <enterprise field>: device.class

      Operating System
      Linux Linux sUse
      URL

      http://34.162.59.87:7100/

      Reverse DNS
      87.59.162.34.bc.googleusercontent.com
      ASN
      AS396982
      Organization
      GOOGLE-CLOUD-PLATFORM
      Protocol
      http
      Source
      datascan
    • Operating System
      Linux Linux sUse
      Product
      ConnectWise Control 23.2.9.8466
      CPE(s)

      <enterprise field>: cpe

    • This feature requires at least a "Lion View" to unlock. Go to our Pricing page for more.

    • Data MD5
      49eab9e205612a0f4919c3fe1c018f72
      HTTP Header MD5
      2ed1d4fb9b05fad4a548cc785a4f3855
      HTTP Body MD5
      931e7ce8ad0e3e0e866f4dc47c151ecd
    • 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-10-28T07:24: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" : "AS396982",
         "city" : "Columbus",
         "country" : "US",
         "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" : [
            "googleusercontent.com"
         ],
         "geolocus" : {
            "asn" : "AS396982",
            "continent" : "NA",
            "continentname" : "North America",
            "country" : "US",
            "countryname" : "United States",
            "domain" : [
               "google.com",
               "googleusercontent.com"
            ],
            "isineu" : "false",
            "latitude" : "37.09024",
            "location" : "37.09024,-95.712891",
            "longitude" : "-95.712891",
            "netname" : "GOOGL-2",
            "organization" : "Google LLC",
            "subnet" : "34.162.0.0/16"
         },
         "host" : [
            87
         ],
         "hostname" : [
            "87.59.162.34.bc.googleusercontent.com"
         ],
         "ip" : "34.162.59.87",
         "ipv6" : "false",
         "latitude" : "39.9625",
         "location" : "39.9625,-83.0061",
         "longitude" : "-83.0061",
         "node" : {
            "country" : "<enterprise field>: node.country",
            "groupid" : "<enterprise field>: node.groupid",
            "id" : "<enterprise field>: node.id",
            "physicalcountry" : "<enterprise field>: node.physicalcountry"
         },
         "organization" : "GOOGLE-CLOUD-PLATFORM",
         "os" : "Linux",
         "osdistribution" : "sUse",
         "osvendor" : "Linux",
         "port" : 7100,
         "product" : "Control",
         "productvendor" : "ConnectWise",
         "productversion" : "23.2.9.8466",
         "protocol" : "http",
         "reverse" : [
            "87.59.162.34.bc.googleusercontent.com"
         ],
         "seen_date" : "2024-10-28",
         "source" : "datascan",
         "subdomains" : [
            "162.34.bc.googleusercontent.com",
            "34.bc.googleusercontent.com",
            "59.162.34.bc.googleusercontent.com",
            "bc.googleusercontent.com"
         ],
         "subnet" : "34.160.0.0/14",
         "tag" : "<enterprise field>: tag",
         "tld" : [
            "com"
         ],
         "tls" : "false",
         "transport" : "tcp",
         "url" : "/"
      }
      
  • 143.110.148.112:7100 (tcp/http) - last seen on 2024-10-24 at 19:27:06 UTC

    • IP
      143.110.148.112
      Network
      143.110.128.0/17
      Device

      <enterprise field>: device.class

      Operating System
      Linux Linux sUse
      URL

      http://143.110.148.112:7100/

      ASN
      AS14061
      Organization
      DIGITALOCEAN-ASN
      Protocol
      http
      Source
      datascan
    • Operating System
      Linux Linux sUse
      Product
      ConnectWise Control 23.2.9.8466
      CPE(s)

      <enterprise field>: cpe

    • This feature requires at least a "Lion View" to unlock. Go to our Pricing page for more.

    • Data MD5
      49eab9e205612a0f4919c3fe1c018f72
      HTTP Header MD5
      2ed1d4fb9b05fad4a548cc785a4f3855
      HTTP Body MD5
      931e7ce8ad0e3e0e866f4dc47c151ecd
    • 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-10-24T19:27:06.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" : "AS14061",
         "city" : "Santa Clara",
         "country" : "US",
         "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"
         },
         "geolocus" : {
            "asn" : "AS14061",
            "continent" : "NA",
            "continentname" : "North America",
            "country" : "US",
            "countryname" : "United States",
            "domain" : [
               "digitalocean.com"
            ],
            "isineu" : "false",
            "latitude" : "37.09024",
            "location" : "37.09024,-95.712891",
            "longitude" : "-95.712891",
            "netname" : "DIGITALOCEAN-143-110-128-0",
            "organization" : "DigitalOcean, LLC",
            "subnet" : "143.110.128.0/19"
         },
         "ip" : "143.110.148.112",
         "ipv6" : "false",
         "latitude" : "37.3931",
         "location" : "37.3931,-121.9620",
         "longitude" : "-121.9620",
         "node" : {
            "country" : "<enterprise field>: node.country",
            "groupid" : "<enterprise field>: node.groupid",
            "id" : "<enterprise field>: node.id",
            "physicalcountry" : "<enterprise field>: node.physicalcountry"
         },
         "organization" : "DIGITALOCEAN-ASN",
         "os" : "Linux",
         "osdistribution" : "sUse",
         "osvendor" : "Linux",
         "port" : 7100,
         "product" : "Control",
         "productvendor" : "ConnectWise",
         "productversion" : "23.2.9.8466",
         "protocol" : "http",
         "seen_date" : "2024-10-24",
         "source" : "datascan",
         "subnet" : "143.110.128.0/17",
         "tag" : "<enterprise field>: tag",
         "tls" : "false",
         "transport" : "tcp",
         "url" : "/"
      }
      
  • 18.61.48.225:7100 (tcp/http) - last seen on 2024-10-19 at 19:00:27 UTC

    • IP
      18.61.48.225
      Network
      18.60.0.0/15
      Domain(s)
      amazonaws.com
      Device

      <enterprise field>: device.class

      Operating System
      Linux Linux sUse
      URL

      http://18.61.48.225:7100/

      Reverse DNS
      ec2-18-61-48-225.ap-south-2.compute.amazonaws.com
      ASN
      AS16509
      Organization
      AMAZON-02
      Protocol
      http
      Source
      datascan
    • Operating System
      Linux Linux sUse
      Product
      ConnectWise Control 23.2.9.8466
      CPE(s)

      <enterprise field>: cpe

    • This feature requires at least a "Lion View" to unlock. Go to our Pricing page for more.

    • Data MD5
      49eab9e205612a0f4919c3fe1c018f72
      HTTP Header MD5
      2ed1d4fb9b05fad4a548cc785a4f3855
      HTTP Body MD5
      931e7ce8ad0e3e0e866f4dc47c151ecd
    • 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-10-19T19:00:27.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" : "AS16509",
         "city" : "Hyderabad",
         "country" : "IN",
         "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" : [
            "amazonaws.com"
         ],
         "geolocus" : {
            "asn" : "AS16509",
            "continent" : "AS",
            "continentname" : "Asia",
            "country" : "IN",
            "countryname" : "India",
            "domain" : [
               "amazon.com",
               "amazonaws.com"
            ],
            "isineu" : "false",
            "latitude" : "20.593684",
            "location" : "20.593684,78.96288",
            "longitude" : "78.96288",
            "netname" : "AMAZON-HYD",
            "organization" : "Amazon Data Services India",
            "subnet" : "18.60.0.0/15"
         },
         "host" : [
            "ec2-18-61-48-225"
         ],
         "hostname" : [
            "ec2-18-61-48-225.ap-south-2.compute.amazonaws.com"
         ],
         "ip" : "18.61.48.225",
         "ipv6" : "false",
         "latitude" : "17.3724",
         "location" : "17.3724,78.4378",
         "longitude" : "78.4378",
         "node" : {
            "country" : "<enterprise field>: node.country",
            "groupid" : "<enterprise field>: node.groupid",
            "id" : "<enterprise field>: node.id",
            "physicalcountry" : "<enterprise field>: node.physicalcountry"
         },
         "organization" : "AMAZON-02",
         "os" : "Linux",
         "osdistribution" : "sUse",
         "osvendor" : "Linux",
         "port" : 7100,
         "product" : "Control",
         "productvendor" : "ConnectWise",
         "productversion" : "23.2.9.8466",
         "protocol" : "http",
         "reverse" : [
            "ec2-18-61-48-225.ap-south-2.compute.amazonaws.com"
         ],
         "seen_date" : "2024-10-19",
         "source" : "datascan",
         "subdomains" : [
            "ap-south-2.compute.amazonaws.com",
            "compute.amazonaws.com"
         ],
         "subnet" : "18.60.0.0/15",
         "tag" : "<enterprise field>: tag",
         "tld" : [
            "com"
         ],
         "tls" : "false",
         "transport" : "tcp",
         "url" : "/"
      }
      
  • 4.227.5.136:7100 (tcp/http) - last seen on 2024-10-14 at 19:37:01 UTC

    • IP
      4.227.5.136
      Network
      4.192.0.0/10
      Device

      <enterprise field>: device.class

      Operating System
      Linux Linux sUse
      URL

      http://4.227.5.136:7100/

      ASN
      AS8075
      Organization
      MICROSOFT-CORP-MSN-AS-BLOCK
      Protocol
      http
      Source
      datascan
    • Operating System
      Linux Linux sUse
      Product
      ConnectWise Control 23.2.9.8466
      CPE(s)

      <enterprise field>: cpe

    • This feature requires at least a "Lion View" to unlock. Go to our Pricing page for more.

    • Data MD5
      49eab9e205612a0f4919c3fe1c018f72
      HTTP Header MD5
      2ed1d4fb9b05fad4a548cc785a4f3855
      HTTP Body MD5
      931e7ce8ad0e3e0e866f4dc47c151ecd
    • 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-10-14T19:37:01.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" : "AS8075",
         "city" : "Phoenix",
         "country" : "US",
         "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"
         },
         "geolocus" : {
            "asn" : "AS8075",
            "continent" : "NA",
            "continentname" : "North America",
            "country" : "US",
            "countryname" : "United States",
            "domain" : [
               "microsoft.com"
            ],
            "isineu" : "false",
            "latitude" : "37.09024",
            "location" : "37.09024,-95.712891",
            "longitude" : "-95.712891",
            "netname" : "MSFT",
            "organization" : "Microsoft Corporation",
            "subnet" : "4.227.0.0/16"
         },
         "ip" : "4.227.5.136",
         "ipv6" : "false",
         "latitude" : "33.4475",
         "location" : "33.4475,-112.0866",
         "longitude" : "-112.0866",
         "node" : {
            "country" : "<enterprise field>: node.country",
            "groupid" : "<enterprise field>: node.groupid",
            "id" : "<enterprise field>: node.id",
            "physicalcountry" : "<enterprise field>: node.physicalcountry"
         },
         "organization" : "MICROSOFT-CORP-MSN-AS-BLOCK",
         "os" : "Linux",
         "osdistribution" : "sUse",
         "osvendor" : "Linux",
         "port" : 7100,
         "product" : "Control",
         "productvendor" : "ConnectWise",
         "productversion" : "23.2.9.8466",
         "protocol" : "http",
         "seen_date" : "2024-10-14",
         "source" : "datascan",
         "subnet" : "4.192.0.0/10",
         "tag" : "<enterprise field>: tag",
         "tls" : "false",
         "transport" : "tcp",
         "url" : "/"
      }
      
  • 51.13.112.160:7100 (tcp/http) - last seen on 2024-10-10 at 18:09:32 UTC

    • IP
      51.13.112.160
      Network
      51.12.0.0/15
      Device

      <enterprise field>: device.class

      Operating System
      Linux Linux sUse
      URL

      http://51.13.112.160:7100/

      ASN
      AS8075
      Organization
      MICROSOFT-CORP-MSN-AS-BLOCK
      Protocol
      http
      Source
      datascan
    • Operating System
      Linux Linux sUse
      Product
      ConnectWise Control 23.2.9.8466
      CPE(s)

      <enterprise field>: cpe

    • This feature requires at least a "Lion View" to unlock. Go to our Pricing page for more.

    • Data MD5
      49eab9e205612a0f4919c3fe1c018f72
      HTTP Header MD5
      2ed1d4fb9b05fad4a548cc785a4f3855
      HTTP Body MD5
      931e7ce8ad0e3e0e866f4dc47c151ecd
    • 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-10-10T18:09:32.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" : "AS8075",
         "city" : "Oslo",
         "country" : "NO",
         "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"
         },
         "geolocus" : {
            "asn" : "AS8075",
            "continent" : "EU",
            "continentname" : "Europe",
            "country" : "GB",
            "countryname" : "United Kingdom",
            "domain" : [
               "microsoft.com"
            ],
            "isineu" : "false",
            "latitude" : "55.378051",
            "location" : "55.378051,-3.435973",
            "longitude" : "-3.435973",
            "netname" : "MICROSOFT",
            "organization" : "Microsoft Limited",
            "subnet" : "51.13.0.0/17"
         },
         "ip" : "51.13.112.160",
         "ipv6" : "false",
         "latitude" : "59.9016",
         "location" : "59.9016,10.7343",
         "longitude" : "10.7343",
         "node" : {
            "country" : "<enterprise field>: node.country",
            "groupid" : "<enterprise field>: node.groupid",
            "id" : "<enterprise field>: node.id",
            "physicalcountry" : "<enterprise field>: node.physicalcountry"
         },
         "organization" : "MICROSOFT-CORP-MSN-AS-BLOCK",
         "os" : "Linux",
         "osdistribution" : "sUse",
         "osvendor" : "Linux",
         "port" : 7100,
         "product" : "Control",
         "productvendor" : "ConnectWise",
         "productversion" : "23.2.9.8466",
         "protocol" : "http",
         "seen_date" : "2024-10-10",
         "source" : "datascan",
         "subnet" : "51.12.0.0/15",
         "tag" : "<enterprise field>: tag",
         "tls" : "false",
         "transport" : "tcp",
         "url" : "/"
      }