1<!doctype html> 2<html lang="en"> 3 <head> 4
4<script data-server-standalone-bootstrap>window.__VM_STANDALONE_INIT__={"APPINIT":"{\"name\": \"Fortra\", \"branded_title\": \"Fortra Vulnerability Management\", \"branded_title_short\": \"Fortra VM\", \"primary_color\": \"#006a56\", \"secondary_color\": \"#8fe5f2\", \"url\": \"https://fortra.com\", \"powered_by_name\": \"Fortra\", \"powered_by_url\": \"https://www.fortra.com\", \"phone\": \"1-888-273-1412\", \"email\": \"[email protected]\", \"logo\": \"/themes/c6d7ce01d2ac449fbdcb9b72a9847c97/fortra-logomark-sky-bluex32.png\", \"login_logo\": \"/themes/c6d7ce01d2ac449fbdcb9b72a9847c97/Login_Logo_fortra-logo-sky-blue_180x31.png\", \"favicon\": \"/themes/c6d7ce01d2ac449fbdcb9b72a9847c97/fortra-logomark-forest-greenx32.ico\", \"security_seal_logo\": \"/themes/c6d7ce01d2ac449fbdcb9b72a9847c97/Fortra_Icon-green.jpg\", \"security_seal_alt_logo\": null, \"report_watermark\": \"/themes/c6d7ce01d2ac449fbdcb9b72a9847c97/Fortra_Report_Cover.pdf\", \"report_watermark_landscape\": \"/themes/c6d7ce01d2ac449fbdcb9b72a9847c97/backgrounds_landscape.pdf\", \"is_themed\": false, \"theme_name\": \"Fortra VM\", \"current_year\": 2026}","shell_base_url":"/","api_base_url":"/api","session_api_path":"/api/session_v2/","api_surface_mode":"legacy","tld":"us.frontline.cloud","build_version":"20260918.0740-52584-5b89c28de35df1c0d1fd55cab841b848a6cd5d3b","full_version":"7.10.2-20260918.0740-52584-5b89c28de35df1c0d1fd55cab841b848a6cd5d3b","display_version":"7.10.2","standalone_host":"https://vm.us.frontline.cloud","on_prem":false,"platform_host":"https://platform.fortra.com/vm","vhost":"","default_api_region":"us","is_multiregion":true,"available_regions":[],"allow_public_api_docs":true,"userpilot_app_token":"NX-16a95c94","userpilot_instance_id":"prod-us"};</script>
4 5 <meta charset="UTF-8" /> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 <title>Fortra VM | loading ...</title> 8 <style> 9 :root { 10 --vm-shell-primary-color: #006a56; 11 --vm-shell-secondary-color: #8fe5f2; 12 --vm-shell-page-background: #f6f7f9; 13 } 14 15 html, 16 body, 17 #root { 18 margin: 0; 19 min-height: 100%; 20 } 21 22 body { 23 background: var(--vm-shell-page-background); 24 color: #1a1f24; 25 font-family: "IBM Plex Sans", "Helvetica Neue", sans-serif; 26 } 27 28 .standalone-shell__preload { 29 min-height: 100vh; 30 display: flex; 31 align-items: center; 32 justify-content: center; 33 background: var(--vm-shell-primary-color); 34 color: #ffffff; 35 } 36 37 .standalone-shell__preload-inner { 38 display: flex; 39 flex-direction: column; 40 align-items: center; 41 gap: 1rem; 42 text-align: center; 43 padding: 2rem; 44 } 45 46 .standalone-shell__preload-logo { 47 max-height: 56px; 48 width: auto; 49 } 50 51 .standalone-shell__preload-brand { 52 font-size: 1.5rem; 53 font-weight: 700; 54 letter-spacing: 0.08em; 55 text-transform: uppercase; 56 } 57 58 .standalone-shell__preload-copy { 59 opacity: 0.88; 60 } 61 </style> 62
62<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/system.min.js"></script>
62 63
63<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/extras/amd.min.js"></script>
63 64
64<script type="systemjs-importmap"> 65 { 66 "imports": { 67 "single-spa": "https://cdn.jsdelivr.net/npm/[email protected]/lib/system/single-spa.min.js", 68 "@fortra-platform/vm-auth": "/platform/fortra-platform-vm-auth.js", 69 "@fortra-platform/vm-legacy": "/platform/fortra-platform-vm-legacy.js", 70 "@fortra-platform/vm-react": "/platform/fortra-platform-vm-react.js" 71 } 72 } 73 </script>
73 74
74<script> 75 (function () { 76 var DEFAULT_APP_INIT = { 77 name: 'Fortra', 78 branded_title: 'Fortra Vulnerability Management', 79 branded_title_short: 'Fortra VM', 80 primary_color: '#006a56', 81 secondary_color: '#8fe5f2', 82 url: 'https://fortra.com', 83 phone: '1-888-273-1412', 84 email: '[email protected]', 85 logo: '/static/img/fortra_logo.png', 86 login_logo: '/static/img/fortra_logo-reversed.png', 87 favicon: '/favicon.ico', 88 theme_name: 'Fortra VM', 89 is_themed: false 90 }; 91 var ON_PREM_SHELL_BASE_URL = '/fvm/ui'; 92 var REQUIRED_APP_INIT_FIELDS = ['branded_title', 'branded_title_short']; 93 94 function asRecord(value) { 95 return value && typeof value === 'object' ? value : {}; 96 } 97 98 function isRecord(value) { 99 return Boolean(value) && typeof value === 'object' && !Array.isArray(value); 100 } 101 102 function asString(value, fallback) { 103 return typeof value === 'string' && value.trim() ? value : (fallback || ''); 104 } 105 106 function parseAppInit(value) { 107 if (value === undefined || value === null || value === '') { 108 throw new Error('Standalone bootstrap is missing required APPINIT configuration.'); 109 } 110 111 var parsedValue = value; 112 if (typeof value === 'string') { 113 if (!value.trim()) { 114 throw new Error('Standalone bootstrap APPINIT cannot be empty.'); 115 } 116 117 try { 118 parsedValue = JSON.parse(value); 119 } catch (_error) { 120 throw new Error('Standalone bootstrap APPINIT must be valid JSON.'); 121 } 122 } 123 124 if (!isRecord(parsedValue) || Object.keys(parsedValue).length === 0) { 125 throw new Error('Standalone bootstrap APPINIT must be a non-empty object.'); 126 } 127 128 var missingFields = REQUIRED_APP_INIT_FIELDS.filter(function (field) { 129 return !asString(parsedValue[field]); 130 }); 131 if (missingFields.length) { 132 throw new Error('Standalone bootstrap APPINIT is missing required fields: ' + missingFields.join(', ') + '.'); 133 } 134 135 return parsedValue; 136 } 137 138 function normalizeBaseUrl(value) { 139 var raw = String(value || '').trim(); 140 var candidate = raw || '/'; 141 var withLeadingSlash = candidate.charAt(0) === '/' ? candidate : '/' + candidate; 142 if (withLeadingSlash === '/') { 143 return '/'; 144 } 145 return withLeadingSlash.replace(/\/+$/, ''); 146 } 147 148 function deriveShellBaseUrlFromLocation(pathname) { 149 var normalizedPathname = String(pathname || '/'); 150 if (isPathAtBase(normalizedPathname, '/standalone-shell')) { 151 return '/standalone-shell'; 152 } 153 if (isPathAtBase(normalizedPathname, ON_PREM_SHELL_BASE_URL)) { 154 return ON_PREM_SHELL_BASE_URL; 155 } 156 if (isDeploymentStandaloneLegacyRoute(normalizedPathname)) { 157 return '/'; 158 } 159 var productRootMatch = normalizedPathname.match(/^\/(vm|was)(?=\/|$)/); 160 return productRootMatch ? '/' + productRootMatch[1] : '/'; 161 } 162 163 function isPathAtBase(pathname, baseUrl) { 164 return ( 165 pathname === baseUrl || 166 pathname.indexOf(baseUrl + '/') === 0 || 167 pathname.indexOf(baseUrl + '?') === 0 || 168 pathname.indexOf(baseUrl + '#') === 0 169 ); 170 } 171 172 function isDeploymentStandaloneLegacyRoute(pathname) { 173 return /^\/(?:vm|was)\/[^/]+\/account\/[^/]+(?:\/|$)/.test(String(pathname || '/')); 174 } 175 176 function isEmbeddedProductShellRoute(pathname) { 177 return /^\/(?:vm|was)\/(?:ng|re|auth)(?:\/|$)/.test(String(pathname || '/')); 178 } 179 180 function normalizeStandaloneShellBaseUrl(configuredShellBaseUrl, inferredShellBaseUrl, pathname) { 181 var normalizedConfiguredShellBaseUrl = configuredShellBaseUrl 182 ? normalizeBaseUrl(configuredShellBaseUrl) 183 : undefined; 184 185 if ( 186 normalizedConfiguredShellBaseUrl && 187 /^\/(?:vm|was)$/.test(normalizedConfiguredShellBaseUrl) && 188 isDeploymentStandaloneLegacyRoute(pathname) 189 ) { 190 return '/'; 191 } 192 193 if ( 194 normalizedConfiguredShellBaseUrl === '/' && 195 /^\/(?:vm|was)$/.test(inferredShellBaseUrl) && 196 isEmbeddedProductShellRoute(pathname) 197 ) { 198 return inferredShellBaseUrl; 199 } 200 201 return configuredShellBaseUrl || inferredShellBaseUrl; 202 } 203 204 function deriveApiBaseUrlFromShellBase(shellBaseUrl) { 205 var normalizedShellBaseUrl = normalizeBaseUrl(shellBaseUrl); 206 return normalizedShellBaseUrl === ON_PREM_SHELL_BASE_URL 207 ? normalizedShellBaseUrl + '/api' 208 : '/api'; 209 } 210 211 function prefixOnPremBrowserPath(path, shellBaseUrl) { 212 var candidate = asString(path); 213 var normalizedShellBaseUrl = normalizeBaseUrl(shellBaseUrl); 214 if ( 215 !candidate || 216 normalizedShellBaseUrl !== ON_PREM_SHELL_BASE_URL || 217 isPathAtBase(candidate, ON_PREM_SHELL_BASE_URL) || 218 candidate.charAt(0) !== '/' || 219 candidate.indexOf('//') === 0 220 ) { 221 return candidate; 222 } 223 224 return ON_PREM_SHELL_BASE_URL + candidate; 225 } 226 227 function prefixAppInitBrowserPaths(appInit, shellBaseUrl) { 228 appInit.logo = prefixOnPremBrowserPath(appInit.logo, shellBaseUrl); 229 appInit.login_logo = prefixOnPremBrowserPath(appInit.login_logo, shellBaseUrl); 230 appInit.favicon = prefixOnPremBrowserPath(appInit.favicon, shellBaseUrl); 231 appInit.company_logo = prefixOnPremBrowserPath(appInit.company_logo, shellBaseUrl); 232 return appInit; 233 } 234 235 function asBoolean(value) { 236 return value === true; 237 } 238 239 function asStringArray(value) { 240 if (!Array.isArray(value)) { 241 return undefined; 242 } 243 244 return value.filter(function (item) { 245 return typeof item === 'string' && Boolean(item.trim()); 246 }); 247 } 248 249 function normalizePayload(raw) { 250 var source = asRecord(raw); 251 var appInitSource = parseAppInit(source.APPINIT); 252 var pathname = window.location.pathname; 253 var configuredShellBaseUrl = asString(source.shell_base_url || source.shellBaseUrl); 254 var apiBaseUrl = asString(source.api_base_url || source.apiBaseUrl); 255 var inferredShellBaseUrl = deriveShellBaseUrlFromLocation(pathname); 256 var shellBaseUrl = normalizeStandaloneShellBaseUrl( 257 configuredShellBaseUrl, 258 inferredShellBaseUrl, 259 pathname 260 ); 261 if (!apiBaseUrl) { 262 apiBaseUrl = deriveApiBaseUrlFromShellBase(shellBaseUrl); 263 } 264 var appInit = { 265 name: asString(appInitSource.name, DEFAULT_APP_INIT.name), 266 branded_title: asString(appInitSource.branded_title, DEFAULT_APP_INIT.branded_title), 267 branded_title_short: asString(appInitSource.branded_title_short, DEFAULT_APP_INIT.branded_title_short), 268 primary_color: asString(appInitSource.primary_color, DEFAULT_APP_INIT.primary_color), 269 secondary_color: asString(appInitSource.secondary_color, DEFAULT_APP_INIT.secondary_color), 270 url: asString(appInitSource.url, DEFAULT_APP_INIT.url), 271 phone: asString(appInitSource.phone, DEFAULT_APP_INIT.phone), 272 email: asString(appInitSource.email, DEFAULT_APP_INIT.email), 273 logo: asString(appInitSource.logo, DEFAULT_APP_INIT.logo), 274 login_logo: asString(appInitSource.login_logo, DEFAULT_APP_INIT.login_logo), 275 favicon: asString(appInitSource.favicon, DEFAULT_APP_INIT.favicon), 276 theme_name: asString(appInitSource.theme_name, DEFAULT_APP_INIT.theme_name), 277 is_themed: typeof appInitSource.is_themed === 'boolean' ? appInitSource.is_themed : false 278 }; 279 appInit = prefixAppInitBrowserPaths(appInit, shellBaseUrl); 280 281 return { 282 appInit: appInit, 283 APPINIT: JSON.stringify(appInit), 284 shellBaseUrl: shellBaseUrl, 285 apiBaseUrl: apiBaseUrl, 286 sessionApiPath: normalizeSessionApiPath(source.session_api_path || source.sessionApiPath), 287 apiSurfaceMode: asString(source.api_surface_mode || source.apiSurfaceMode), 288 buildVersion: asString(source.build_version || source.buildVersion), 289 fullVersion: asString(source.full_version || source.fullVersion), 290 displayVersion: asString(source.display_version || source.displayVersion), 291 standaloneHost: asString(source.standalone_host || source.standaloneHost), 292 tld: asString(source.tld),
293 onPrem: asBoolean(source.on_prem) || asBoolean(source.onPrem), 294 fortraVmPlatformUrl: asString( 295 source.FORTRA_VM_PLATFORM_URL || source.platform_host || source.fortraVmPlatformUrl 296 ), 297 vhost: asString(source.vhost), 298 defaultApiRegion: asString(source.default_api_region || source.defaultApiRegion), 299 isMultiregion: asBoolean(source.is_multiregion) || asBoolean(source.isMultiregion), 300 availableRegions: asStringArray(source.available_regions || source.availableRegions), 301 allowPublicApiDocs: source.allow_public_api_docs === true || source.allowPublicApiDocs === true, 302 userpilotAppToken: asString(source.userpilot_app_token || source.userpilotAppToken), 303 userpilotInstanceId: asString(source.userpilot_instance_id || source.userpilotInstanceId) 304 }; 305 } 306 307 function normalizeSessionApiPath(path) { 308 var raw = asString(path); 309 if (!raw) { 310 return undefined; 311 } 312 var withLeadingSlash = raw.charAt(0) === '/' ? raw : '/' + raw; 313 return withLeadingSlash.replace(/\/?$/, '/'); 314 } 315 316 function toAssetUrl(value) { 317 var candidate = asString(value); 318 if (!candidate) { 319 return ''; 320 } 321 322 if (/^(https?:)?\/\//.test(candidate) || candidate.indexOf('data:') === 0) { 323 return candidate; 324 } 325 326 return new URL(candidate, window.location.origin).toString(); 327 } 328 329 function ensureFaviconLink() { 330 var existing = document.querySelector('link[rel="icon"], link[rel="shortcut icon"]'); 331 332 if (existing && existing.tagName === 'LINK') { 333 return existing; 334 } 335 336 var link = document.createElement('link'); 337 link.rel = 'icon'; 338 document.head.appendChild(link); 339 return link; 340 } 341 342 function apply(payload) { 343 var appInit = payload.appInit; 344 var loginLogoUrl = toAssetUrl(appInit.login_logo || appInit.logo); 345 var faviconUrl = toAssetUrl(appInit.favicon); 346 var headerLogoUrl = toAssetUrl(appInit.logo || appInit.company_logo); 347 348 document.title = appInit.branded_title_short + ' | loading ...'; 349 document.documentElement.style.setProperty('--vm-shell-primary-color', appInit.primary_color); 350 document.documentElement.style.setProperty('--vm-shell-secondary-color', appInit.secondary_color); 351 352 if (faviconUrl) { 353 var favicon = ensureFaviconLink(); 354 favicon.href = faviconUrl; 355 favicon.type = 'image/x-icon'; 356 } 357 358 var shortBrand = document.querySelector('[data-standalone-brand-short]'); 359 if (shortBrand) { 360 shortBrand.textContent = appInit.branded_title_short; 361 } 362 363 var longBrand = document.querySelector('[data-standalone-brand-long]'); 364 if (longBrand) { 365 longBrand.textContent = appInit.branded_title; 366 } 367 368 var preloadLogo = document.querySelector('[data-standalone-brand-logo]'); 369 if (preloadLogo && preloadLogo.tagName === 'IMG') { 370 preloadLogo.src = loginLogoUrl || headerLogoUrl; 371 preloadLogo.alt = appInit.branded_title_short; 372 preloadLogo.hidden = !(loginLogoUrl || headerLogoUrl); 373 } 374 375 window.__VM_STANDALONE_INIT__ = payload; 376 } 377 378 window.__VM_STANDALONE_INIT_PROMISE__ = window.__VM_STANDALONE_INIT__ 379 ? Promise.resolve(normalizePayload(window.__VM_STANDALONE_INIT__)).then(function (payload) { 380 apply(payload); 381 return payload; 382 }) 383 : Promise.resolve(normalizePayload({ APPINIT: DEFAULT_APP_INIT })).then(function (payload) { 384 apply(payload); 385 return payload; 386 }); 387 })(); 388 </script>
388 389
389<script type="module" crossorigin src="/standalone-shell/assets/index-CdGGxXJb.js"></script>
389 390 <link rel="stylesheet" crossorigin href="/standalone-shell/assets/index-BXDcvyCL.css"> 391 </head> 392 <body> 393 <div id="root"> 394 <div class="standalone-shell__preload"> 395 <div class="standalone-shell__preload-inner"> 396 <img class="standalone-shell__preload-logo" data-standalone-brand-logo hidden /> 397 <div class="standalone-shell__preload-brand" data-standalone-brand-short>Fortra VM</div> 398 <div class="standalone-shell__preload-copy" data-standalone-brand-long> 399 Fortra Vulnerability Management 400 </div> 401 </div> 402 </div> 403 </div> 404 </body> 405 </html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.