HTTP/1.0 200 OK
Server: BlueServer/5.9.9.3
Date: Wed, 06 Nov 2024 01:11:27 GMT
P3P: CP="CAO COR CURa ADMa DEVa OUR IND ONL COM DEM PRE"
Set-Cookie: session=053d6cda3fc177423a5c13775d3275a6; path=/
Access-Control-Allow-Origin: *
Connection: close
Content-Type: text/html; charset=UTF-8
Content-Length: 16954
Cache-Control: no-cache, no-store
X-Frame-Options: SAMEORIGIN
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link rel="icon" id="ui3launcher1">
<link rel="apple-touch-icon" id="ui3launcher2">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="apple-mobile-web-app-capable" content="yes"> <!--iOS Safari-->
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="mobile-web-app-capable" content="yes"><!--Android Chrome-->
<meta name="theme-color" content="#000000">
<link rel="manifest" id="ui3manifest">
<title>Blue Iris Login</title>
<script type="text/javascript">
var login_version = "30";
var bi_version = "5.9.9.3";
var combined_version = login_version + "-" + bi_version;
var appPath = "/" + "/".replace(/^\/+|\/+$/g, '');
if (!appPath.endsWith("/"))
appPath = appPath + "/";
</script>
<script type="text/javascript">
// Each method in suppressErrorCallbacks can inspect the error and return true to suppress reporting of the error.
var suppressErrorCallbacks = [
function (err) // [2020-11-11] LG TV browser injects bad script on line 1 of htm file.
{
return err.line === 1 && err.msg && err.msg.indexOf("'getAttribute'") > -1 && err.url && err.url.indexOf(".htm") > -1;
},
function (err) // [2021-07-19] LG TV browser fails repeatedly.
{
return err.line === 0 && err.charIdx === 0 && err.msg && err.msg.indexOf("Script error.") > -1 && (!err.url || err.url == "");
},
function (err) // ublock origin in Brave browser
{
return err.msg && err.msg == "Uncaught TypeError: Cannot redefine property: getElementById" && err.url === "";
},
function (err) // Edge iOS
{
return err.msg && err.msg.indexOf("instantSearchSDKJSBridgeClearHighlight") > -1;
}
];
window.onerror = function (msg, url, line, charIdx)
{
try
{
var versionStr = "unknown";
if (typeof login_version !== "undefined")
versionStr = login_version;
var biVersionStr = "unknown";
if (typeof bi_version !== "undefined")
biVersionStr = bi_version;
url = url.replace(/\/\/.*?\//, '//censored_hostname/');
var errStr = "An unexpected error has occurred in Blue Iris Login (v " + versionStr + " / " + biVersionStr + "). If you wish to report the error, please SCREENSHOT the browser now.\n\n" + msg + "\nat " + url + " [" + line + ":" + charIdx + "]\n" + navigator.userAgent;
var errObj = { msg: msg, url: url, line: line, charIdx: charIdx, versionStr: versionStr, biVersionStr: biVersionStr };
for (var i = 0; i < suppressErrorCallbacks.length; i++)
{
try
{
if (suppressErrorCallbacks[i](errObj))
{
try { console.log("The following error report was suppressed by callback " + i + ":"); console.error(errStr); }
catch (ex) { }
return;
}
}
catch (ex)
{
try { console.log("Error suppression callback " + i + " had an error:"); console.error(errStr); }
catch (ex) { }
return;
}
}
alert(errStr);
}
catch (ex)
{
alert(ex);
}
};
</script>
<script type="text/javascript">
document.getElementById("ui3manifest").href = 'applet/manifest.json?v=' + combined_version;
document.getElementById("ui3launcher1").href = 'applet/logos/launcher-icon48.png?v=' + combined_version;
document.getElementById("ui3launcher2").href = 'applet/launcher-icon.png?v=' + combined_version;
</script>
<style type="text/css">
body
{
font-family: sans-serif;
background: #212325;
}
#loginLoading
{
display: none;
text-shadow: 0 0 10px rgba(0,0,0,0.3);
position: absolute;
text-align: center;
top: 40%;
width: 100%;
color: #FFFFFF;
}
#loginLoading h1
{
margin: 0 0 20px 0;
font-size: 32px;
}
#loginLoading div
{
font-size: 20px;
}
#login
{
display: none;
}
.checkboxWrapper
{
max-width: 488px;
}
</style>
</head>
<body>
<div id="loginLoading">
<h1>HOME CAMS</h1>
<div>Loading login page...</div>
</div>
<div id="login">
<h1>HOME CAMS</h1>
<input id="txtUn" type="text" class="text" placeholder="Username" autocapitalize="off" autocorrect="off" />
<input id="txtPw" type="password" class="text" placeholder="Password" onkeypress="return pwKeypress(this, event);" autocapitalize="off" autocorrect="off" />
<div class="checkboxWrapper">
<input id="cbLoginAutomatically" type="checkbox" class="checkbox" onchange="cbLoginAutomaticallyClicked();" /><label for="cbLoginAutomatically" id="lblLoginAutomatically"><span class="ui"></span>Log in automatically:</label>
</div>
<div id="status_wrapper_upper"></div>
<input id="btnLogin" type="button" class="btn" value="Log in" onclick="login();" />
<div id="status_wrapper_lower"><div id="status"></div></div>
</div>
<script type="text/javascript">
var loadingOpacity = 0;
function IncreaseLoadingOpacity()
{
loadingOpacity += 0.05;
if (loadingOpacity > 1)
loadingOpacity = 1;
var ele = document.getElementById('loginLoading');
ele.style.display = "block";
ele.style.opacity = loadingOpacity;
if (loadingOpacity < 1)
showLoadingMessageTimeout = setTimeout(IncreaseLoadingOpacity, 33);
}
var showLoadingMessageTimeout = setTimeout(IncreaseLoadingOpacity, 67);
document.write('<link href="applet/loginStyles.css?v=' + combined_version + '" rel="stylesheet" />'
+ '<script src="applet/loginScripts.js?v=' + combined_version + '"><\/script>');
</script>
<script type="text/javascript">
/* eslint no-extra-parens: 0 */
var autologin_timeout_1 = null;
var autologin_timeout_2 = null;
var existingSession = "053d6cda3fc177423a5c13775d3275a6";
var authStatus = "unknown";
var authExempt = "no";
var loginSession = "";
var isStoredDataLoaded = false;
var windowUnloading = false;
var cookiesEnabled;
var localStorageEnabled;
/**
* Changes the current URL by removing the specified query string parameter(s) from it.
* @returns {String} Returns null if successful, otherwise returns the new URL if changing the history state failed.
*/
function NavRemoveUrlParams()
{
var url = RemoveUrlParams.apply(this, arguments);
try { history.replaceState(history.state, "", url); return null; } catch (ex) { return url; }
}
function RemoveUrlParams()
{
var s = location.search;
for (var i = 0; i < arguments.length; i++)
{
var param = arguments[i];
var rx = new RegExp('(&|\\?)' + param + '=[^&?#%]+', 'gi');
s = s.replace(rx, "");
while (s.indexOf("&") === 0)
{
if (s.length > 1)
s = s.substr(1);
else
s = "";
}
if (s.length > 0 && s.indexOf("?") === -1)
s = "?" + s;
}
return location.origin + location.pathname + s + location.hash;
}
NavRemoveUrlParams("session");
$(function ()
{
cookiesEnabled = testCookieFunctionality();
localStorageEnabled = isLocalStorageEnabled();
var skipAutoLogin = GetPersistedValue("bi_override_disable_auto_login_once") === "1";
if (UrlParameters.Get("autologin") === "0")
{
skipAutoLogin = true;
var url = NavRemoveUrlParams("session", "autologin");
if (url)
{
SetPersistedValue("bi_override_disable_auto_login_once", "1");
location.href = url;
return;
}
}
if (skipAutoLogin)
{
SetPersistedValue("bi_override_disable_auto_login_once", "0");
console.log('Auto login was temporarily disabled because "autologin=0" URL parameter was observed (the UI3 "Main Menu" > "Log Out" button sets this parameter).');
}
var lastUnload = GetPersistedValue("bi_lastunload");
if (lastUnload > Date.now())
SetPersistedValue("bi_lastunload", 0);
else if (!skipAutoLogin)
{
skipAutoLogin = Date.now() - lastUnload < 5000;
if (skipAutoLogin)
console.log('Auto login was temporarily disabled because UI3 was determined to be running within the previous 5 seconds.');
}
clearTimeout(showLoadingMessageTimeout);
$("#loginLoading").hide();
$("#login").show();
if (typeof window.JSON === 'undefined')
{
$("#login").html("<div>Your web browser is too old to use the Blue Iris web interface properly.<br><br>To proceed with this browser, disable the \"Secure only\" requirement within Blue Iris's web server settings.</div>");
$("#login").css("color", "#EEEEEE").css("margin", "8px");
return;
}
if (!existingSession || (existingSession.length === 11 && existingSession.startsWith("%") && existingSession.endsWith("%") && existingSession.indexOf("SESSION") === 2))
{
$("#login").html("<div>Session data was not provided as expected. This login page only works when served by Blue Iris 4.8.2.3 or newer.</div>");
$("#login").css("color", "#EEEEEE").css("margin", "8px");
return;
}
if (!localStorageEnabled)
$("#cbLoginAutomatically").parent().text("Note: Local Storage is disabled in your browser, so credentials can not be saved.").css("color", "#EEEEEE");
SetStatus();
$(window).resize(resized);
resized();
window.onbeforeunload = function ()
{
windowUnloading = true;
cbLoginAutomaticallyClicked();
return;
};
// Handle automatic login
if (GetPersistedValue("bi_rememberMe") === "1")
{
$("#cbLoginAutomatically").attr('checked', 'checked');
$("#txtUn").val(Base64.decode(GetPersistedValue("bi_username")));
$("#txtPw").val(Base64.decode(GetPersistedValue("bi_password")));
if (!skipAutoLogin)
{
if ($("#txtUn").val() !== "" && $("#txtPw").val() !== "")
{
login();
}
}
}
else
{
$("#cbLoginAutomatically").removeAttr('checked');
SetPersistedValue("bi_username", "");
SetPersistedValue("bi_password", "");
}
var sessionType = "";
// authExempt predefined values: no, user, admin, unknown (should not happen)
if (authExempt === "user")
sessionType = "anonymous user";
else if (authExempt === "admin")
sessionType = "anonymous admin";
// authStatus predefined values: unknown, admin, anonymous, user
if (authStatus === "admin")
sessionType = "existing admin";
else if (authStatus === "user")
sessionType = "existing user";
else if (authStatus === "anonymous")
sessionType = "existing anonymous user";
if (sessionType)
SetStatus("An " + sessionType + ' session is available. <a href="javascript:UseAltSession(\'' + sessionType + '\')">Click here to use it.</a>');
// Set focus on first empty field
if (!$("#txtUn").val())
$("#txtUn").get(0).focus();
else if (!$("#txtPw").val())
$("#txtPw").get(0).focus();
else
$("#btnLogin").get(0).focus();
isStoredDataLoaded = true;
});
function login()
{
cbLoginAutomaticallyClicked();
$("#btnLogin").val("Logging in ...");
SetStatus();
if (authStatus === "unknown")
loginSession = existingSession;
if (!loginSession)
authenticateNewSession();
else
authenticateSession(loginSession);
}
function authenticateNewSession(user, pass)
{
ExecJSON({ cmd: "login" }, function (response)
{
loginSession = response.session;
authenticateSession(loginSession, true);
}, loginFail);
}
function authenticateSession(session, isNewSession)
{
var myResponse = md5($("#txtUn").val() + ":" + session + ":" + $("#txtPw").val());
ExecJSON({ cmd: "login", session: session, response: myResponse }, function (response)
{
if (response.result === "success")
{
$("#btnLogin").attr("disabled", "disabled").val("Redirecting...");
existingSession = response.session;
LeaveLoginPage();
}
else
{
var isExpired;
if (compareVersions(bi_version, "5.8.1.1") >= 0)
{
isExpired = response.result === "fail"
&& response.data
&& typeof response.data.reason === "string"
&& response.data.reason.toUpperCase() === "INVALID SESSION";
}
else
{
// BI prior to 5.8.1.1 did not return a data.reason string in the case of invalid session.
isExpired = response.result === "fail" && (!response.data || !response.data.reason);
}
if (isExpired && !isNewSession)
{
// This happens when the session we were trying to authenticate has expired.
authenticateNewSession();
}
else
{
$("#cbLoginAutomatically").removeAttr('checked');
SetPersistedValue("bi_rememberMe", "0");
SetPersistedValue("bi_username", "");
SetPersistedValue("bi_password", "");
$("#btnLogin").val("Log in");
HandleError(response.data && response.data.reason ? response.data.reason : "Login failed but Blue Iris did not provide a reason.");
}
}
}, loginFail);
}
function loginFail(jqXHR, textStatus, errorThrown)
{
HandleError("Unable to contact Blue Iris server");
$("#btnLogin").val("Log in");
}
function UseAltSession(sessionType)
{
if (!sessionType)
alert("Error. Please reload.");
else if (sessionType.indexOf("existing") > -1)
LeaveLoginPage();
else
{
existingSession = "";
LeaveLoginPage();
}
}
function LeaveLoginPage()
{
var page = UrlParameters.Get("page");
if (page.match(/timeout\.htm/i))
page = page.replace(/timeout\.htm.*/i, 'ui3.htm');
if (page.indexOf(appPath) !== 0)
page = appPath + page.replace(/^\/+/g, '');
page = page.replace(/[&?]session=[^&?#%]+/gi, '');
if (existingSession)
{
page += (page.indexOf("?") < 0 ? "?" : "&") + "session=" + existingSession;
if (cookiesEnabled)
$.cookie("session", existingSession, { path: "/" });
}
location.href = page + location.hash;
}
function cancelAutoLogin()
{
if (autologin_timeout_1 !== null)
{
clearTimeout(autologin_timeout_1);
autologin_timeout_1 = null;
}
if (autologin_timeout_2 !== null)
{
clearTimeout(autologin_timeout_2);
autologin_timeout_2 = null;
}
$("#btnLogin").val(windowUnloading ? "Redirecting..." : "Log in");
}
function cbLoginAutomaticallyClicked()
{
cancelAutoLogin();
if (!isStoredDataLoaded)
return;
var isChecked = $("#cbLoginAutomatically").is(":checked");
SetPersistedValue("bi_rememberMe", isChecked ? "1" : "0");
SetPersistedValue("bi_username", isChecked ? Base64.encode($("#txtUn").val()) : "");
SetPersistedValue("bi_password", isChecked ? Base64.encode($("#txtPw").val()) : "");
}
function GetPersistedValue(key)
{
var value;
if (localStorageEnabled)
value = localStorage.getItem(key);
if (!value)
value = "";
return value;
}
function SetPersistedValue(key, value)
{
if (localStorageEnabled)
return localStorage.setItem(key, value);
}
function pwKeypress(ele, e)
{
var keycode;
if (window.event) keycode = window.event.keyCode;
else if (typeof e !== "undefined" && e) keycode = e.which;
else return true;
if (keycode === 13)
{
login();
return false;
}
else
return true;
}
function resized()
{
if ($("#status").is(":visible"))
{
$("#status").hide();
$("#status").css("max-width", $("#login").width() + "px");
$("#status").show();
}
$('#login').css({ position: 'absolute', left: ($(window).width() - $('#login').outerWidth()) / 2, top: ($(window).height() - $('#login').outerHeight()) / 2 });
$("#status").css("max-width", $("#login").width() + "px");
var heightTotal = 0;
$("#login").children().each(function (idx, ele)
{
heightTotal += $(ele).outerHeight(true);
});
if (height
{
"@category" : "datascan",
"@timestamp" : "2024-11-06T01:11:29.000Z",
"app" : {
"extract" : {
"domain" : [
"w3.org"
],
"hostname" : [
"www.w3.org"
],
"ip" : [
"5.9.9.3",
"5.8.1.1",
"4.8.2.3"
],
"url" : [
"http://www.w3.org/1999/xhtml"
]
},
"http" : {
"bodymd5" : "9af6f44aee09829fe418a9e61cd6ba82",
"bodymmh3" : 1893832939,
"headermd5" : "caebbb69dd1876eacd3562b2189ba623",
"headermmh3" : 1984320480,
"title" : "Blue Iris Login"
},
"length" : 16384
},
"asn" : "AS12083",
"city" : "Trenton",
"country" : "US",
"data" : "HTTP/1.0 200 OK\r\nServer: BlueServer/5.9.9.3\r\nDate: Wed, 06 Nov 2024 01:11:27 GMT\r\nP3P: CP=\"CAO COR CURa ADMa DEVa OUR IND ONL COM DEM PRE\"\r\nSet-Cookie: session=053d6cda3fc177423a5c13775d3275a6; path=/\r\nAccess-Control-Allow-Origin: *\r\nConnection: close\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Length: 16954\r\nCache-Control: no-cache, no-store\r\nX-Frame-Options: SAMEORIGIN\r\n\r\n<!DOCTYPE html>\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\r\n<head>\r\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\r\n\t<link rel=\"icon\" id=\"ui3launcher1\">\r\n\t<link rel=\"apple-touch-icon\" id=\"ui3launcher2\">\r\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\r\n\t<meta name=\"apple-mobile-web-app-capable\" content=\"yes\"> <!--iOS Safari-->\r\n\t<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black\">\r\n\t<meta name=\"mobile-web-app-capable\" content=\"yes\"><!--Android Chrome-->\r\n\t<meta name=\"theme-color\" content=\"#000000\">\r\n\t<link rel=\"manifest\" id=\"ui3manifest\">\r\n\t<title>Blue Iris Login</title>\r\n\t<script type=\"text/javascript\">\r\n\t\tvar login_version = \"30\";\r\n\t\tvar bi_version = \"5.9.9.3\";\r\n\t\tvar combined_version = login_version + \"-\" + bi_version;\r\n\t\tvar appPath = \"/\" + \"/\".replace(/^\\/+|\\/+$/g, '');\r\n\t\tif (!appPath.endsWith(\"/\"))\r\n\t\t\tappPath = appPath + \"/\";\r\n\t</script>\r\n\t<script type=\"text/javascript\">\r\n\t\t// Each method in suppressErrorCallbacks can inspect the error and return true to suppress reporting of the error.\r\n\t\tvar suppressErrorCallbacks = [\r\n\t\t\tfunction (err) // [2020-11-11] LG TV browser injects bad script on line 1 of htm file.\r\n\t\t\t{\r\n\t\t\t\treturn err.line === 1 && err.msg && err.msg.indexOf(\"'getAttribute'\") > -1 && err.url && err.url.indexOf(\".htm\") > -1;\r\n\t\t\t},\r\n\t\t\tfunction (err) // [2021-07-19] LG TV browser fails repeatedly.\r\n\t\t\t{\r\n\t\t\t\treturn err.line === 0 && err.charIdx === 0 && err.msg && err.msg.indexOf(\"Script error.\") > -1 && (!err.url || err.url == \"\");\r\n\t\t\t},\r\n\t\t\tfunction (err) // ublock origin in Brave browser\r\n\t\t\t{\r\n\t\t\t\treturn err.msg && err.msg == \"Uncaught TypeError: Cannot redefine property: getElementById\" && err.url === \"\";\r\n\t\t\t},\r\n\t\t\tfunction (err) // Edge iOS\r\n\t\t\t{\r\n\t\t\t\treturn err.msg && err.msg.indexOf(\"instantSearchSDKJSBridgeClearHighlight\") > -1;\r\n\t\t\t}\r\n\t\t];\r\n\t\twindow.onerror = function (msg, url, line, charIdx)\r\n\t\t{\r\n\t\t\ttry\r\n\t\t\t{\r\n\t\t\t\tvar versionStr = \"unknown\";\r\n\t\t\t\tif (typeof login_version !== \"undefined\")\r\n\t\t\t\t\tversionStr = login_version;\r\n\t\t\t\tvar biVersionStr = \"unknown\";\r\n\t\t\t\tif (typeof bi_version !== \"undefined\")\r\n\t\t\t\t\tbiVersionStr = bi_version;\r\n\t\t\t\turl = url.replace(/\\/\\/.*?\\//, '//censored_hostname/');\r\n\t\t\t\tvar errStr = \"An unexpected error has occurred in Blue Iris Login (v \" + versionStr + \" / \" + biVersionStr + \"). If you wish to report the error, please SCREENSHOT the browser now.\\n\\n\" + msg + \"\\nat \" + url + \" [\" + line + \":\" + charIdx + \"]\\n\" + navigator.userAgent;\r\n\r\n\t\t\t\tvar errObj = { msg: msg, url: url, line: line, charIdx: charIdx, versionStr: versionStr, biVersionStr: biVersionStr };\r\n\t\t\t\tfor (var i = 0; i < suppressErrorCallbacks.length; i++)\r\n\t\t\t\t{\r\n\t\t\t\t\ttry\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tif (suppressErrorCallbacks[i](errObj))\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\ttry { console.log(\"The following error report was suppressed by callback \" + i + \":\"); console.error(errStr); }\r\n\t\t\t\t\t\t\tcatch (ex) { }\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcatch (ex)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\ttry { console.log(\"Error suppression callback \" + i + \" had an error:\"); console.error(errStr); }\r\n\t\t\t\t\t\tcatch (ex) { }\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\talert(errStr);\r\n\t\t\t}\r\n\t\t\tcatch (ex)\r\n\t\t\t{\r\n\t\t\t\talert(ex);\r\n\t\t\t}\r\n\t\t};\r\n\t</script>\r\n\t<script type=\"text/javascript\">\r\n\t\tdocument.getElementById(\"ui3manifest\").href = 'applet/manifest.json?v=' + combined_version;\r\n\t\tdocument.getElementById(\"ui3launcher1\").href = 'applet/logos/launcher-icon48.png?v=' + combined_version;\r\n\t\tdocument.getElementById(\"ui3launcher2\").href = 'applet/launcher-icon.png?v=' + combined_version;\r\n\t</script>\r\n\t<style type=\"text/css\">\r\n\t\tbody\r\n\t\t{\r\n\t\t\tfont-family: sans-serif;\r\n\t\t\tbackground: #212325;\r\n\t\t}\r\n\r\n\t\t#loginLoading\r\n\t\t{\r\n\t\t\tdisplay: none;\r\n\t\t\ttext-shadow: 0 0 10px rgba(0,0,0,0.3);\r\n\t\t\tposition: absolute;\r\n\t\t\ttext-align: center;\r\n\t\t\ttop: 40%;\r\n\t\t\twidth: 100%;\r\n\t\t\tcolor: #FFFFFF;\r\n\t\t}\r\n\r\n\t\t\t#loginLoading h1\r\n\t\t\t{\r\n\t\t\t\tmargin: 0 0 20px 0;\r\n\t\t\t\tfont-size: 32px;\r\n\t\t\t}\r\n\r\n\t\t\t#loginLoading div\r\n\t\t\t{\r\n\t\t\t\tfont-size: 20px;\r\n\t\t\t}\r\n\r\n\t\t#login\r\n\t\t{\r\n\t\t\tdisplay: none;\r\n\t\t}\r\n\r\n\t\t.checkboxWrapper\r\n\t\t{\r\n\t\t\tmax-width: 488px;\r\n\t\t}\r\n\t</style>\r\n</head>\r\n<body>\r\n\t<div id=\"loginLoading\">\r\n\t\t<h1>HOME CAMS</h1>\r\n\t\t<div>Loading login page...</div>\r\n\t</div>\r\n\t<div id=\"login\">\r\n\t\t<h1>HOME CAMS</h1>\r\n\t\t<input id=\"txtUn\" type=\"text\" class=\"text\" placeholder=\"Username\" autocapitalize=\"off\" autocorrect=\"off\" />\r\n\t\t<input id=\"txtPw\" type=\"password\" class=\"text\" placeholder=\"Password\" onkeypress=\"return pwKeypress(this, event);\" autocapitalize=\"off\" autocorrect=\"off\" />\r\n\t\t<div class=\"checkboxWrapper\">\r\n\t\t\t<input id=\"cbLoginAutomatically\" type=\"checkbox\" class=\"checkbox\" onchange=\"cbLoginAutomaticallyClicked();\" /><label for=\"cbLoginAutomatically\" id=\"lblLoginAutomatically\"><span class=\"ui\"></span>Log in automatically:</label>\r\n\t\t</div>\r\n\t\t<div id=\"status_wrapper_upper\"></div>\r\n\t\t<input id=\"btnLogin\" type=\"button\" class=\"btn\" value=\"Log in\" onclick=\"login();\" />\r\n\t\t<div id=\"status_wrapper_lower\"><div id=\"status\"></div></div>\r\n\t</div>\r\n\t<script type=\"text/javascript\">\r\n\t\tvar loadingOpacity = 0;\r\n\t\tfunction IncreaseLoadingOpacity()\r\n\t\t{\r\n\t\t\tloadingOpacity += 0.05;\r\n\t\t\tif (loadingOpacity > 1)\r\n\t\t\t\tloadingOpacity = 1;\r\n\t\t\tvar ele = document.getElementById('loginLoading');\r\n\t\t\tele.style.display = \"block\";\r\n\t\t\tele.style.opacity = loadingOpacity;\r\n\t\t\tif (loadingOpacity < 1)\r\n\t\t\t\tshowLoadingMessageTimeout = setTimeout(IncreaseLoadingOpacity, 33);\r\n\t\t}\r\n\t\tvar showLoadingMessageTimeout = setTimeout(IncreaseLoadingOpacity, 67);\r\n\r\n\t\tdocument.write('<link href=\"applet/loginStyles.css?v=' + combined_version + '\" rel=\"stylesheet\" />'\r\n\t\t\t+ '<script src=\"applet/loginScripts.js?v=' + combined_version + '\"><\\/script>');\r\n\t</script>\r\n\t<script type=\"text/javascript\">\r\n\t\t/* eslint no-extra-parens: 0 */\r\n\t\tvar autologin_timeout_1 = null;\r\n\t\tvar autologin_timeout_2 = null;\r\n\t\tvar existingSession = \"053d6cda3fc177423a5c13775d3275a6\";\r\n\t\tvar authStatus = \"unknown\";\r\n\t\tvar authExempt = \"no\";\r\n\t\tvar loginSession = \"\";\r\n\t\tvar isStoredDataLoaded = false;\r\n\t\tvar windowUnloading = false;\r\n\t\tvar cookiesEnabled;\r\n\t\tvar localStorageEnabled;\r\n\r\n\t\t/**\r\n\t\t * Changes the current URL by removing the specified query string parameter(s) from it.\r\n\t\t * @returns {String} Returns null if successful, otherwise returns the new URL if changing the history state failed.\r\n\t\t */\r\n\t\tfunction NavRemoveUrlParams()\r\n\t\t{\r\n\t\t\tvar url = RemoveUrlParams.apply(this, arguments);\r\n\t\t\ttry { history.replaceState(history.state, \"\", url); return null; } catch (ex) { return url; }\r\n\t\t}\r\n\t\tfunction RemoveUrlParams()\r\n\t\t{\r\n\t\t\tvar s = location.search;\r\n\t\t\tfor (var i = 0; i < arguments.length; i++)\r\n\t\t\t{\r\n\t\t\t\tvar param = arguments[i];\r\n\t\t\t\tvar rx = new RegExp('(&|\\\\?)' + param + '=[^&?#%]+', 'gi');\r\n\t\t\t\ts = s.replace(rx, \"\");\r\n\t\t\t\twhile (s.indexOf(\"&\") === 0)\r\n\t\t\t\t{\r\n\t\t\t\t\tif (s.length > 1)\r\n\t\t\t\t\t\ts = s.substr(1);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\ts = \"\";\r\n\t\t\t\t}\r\n\t\t\t\tif (s.length > 0 && s.indexOf(\"?\") === -1)\r\n\t\t\t\t\ts = \"?\" + s;\r\n\t\t\t}\r\n\t\t\treturn location.origin + location.pathname + s + location.hash;\r\n\t\t}\r\n\r\n\t\tNavRemoveUrlParams(\"session\");\r\n\r\n\t\t$(function ()\r\n\t\t{\r\n\t\t\tcookiesEnabled = testCookieFunctionality();\r\n\t\t\tlocalStorageEnabled = isLocalStorageEnabled();\r\n\t\t\tvar skipAutoLogin = GetPersistedValue(\"bi_override_disable_auto_login_once\") === \"1\";\r\n\t\t\tif (UrlParameters.Get(\"autologin\") === \"0\")\r\n\t\t\t{\r\n\t\t\t\tskipAutoLogin = true;\r\n\t\t\t\tvar url = NavRemoveUrlParams(\"session\", \"autologin\");\r\n\t\t\t\tif (url)\r\n\t\t\t\t{\r\n\t\t\t\t\tSetPersistedValue(\"bi_override_disable_auto_login_once\", \"1\");\r\n\t\t\t\t\tlocation.href = url;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (skipAutoLogin)\r\n\t\t\t{\r\n\t\t\t\tSetPersistedValue(\"bi_override_disable_auto_login_once\", \"0\");\r\n\t\t\t\tconsole.log('Auto login was temporarily disabled because \"autologin=0\" URL parameter was observed (the UI3 \"Main Menu\" > \"Log Out\" button sets this parameter).');\r\n\t\t\t}\r\n\t\t\tvar lastUnload = GetPersistedValue(\"bi_lastunload\");\r\n\t\t\tif (lastUnload > Date.now())\r\n\t\t\t\tSetPersistedValue(\"bi_lastunload\", 0);\r\n\t\t\telse if (!skipAutoLogin)\r\n\t\t\t{\r\n\t\t\t\tskipAutoLogin = Date.now() - lastUnload < 5000;\r\n\t\t\t\tif (skipAutoLogin)\r\n\t\t\t\t\tconsole.log('Auto login was temporarily disabled because UI3 was determined to be running within the previous 5 seconds.');\r\n\t\t\t}\r\n\t\t\tclearTimeout(showLoadingMessageTimeout);\r\n\t\t\t$(\"#loginLoading\").hide();\r\n\t\t\t$(\"#login\").show();\r\n\t\t\tif (typeof window.JSON === 'undefined')\r\n\t\t\t{\r\n\t\t\t\t$(\"#login\").html(\"<div>Your web browser is too old to use the Blue Iris web interface properly.<br><br>To proceed with this browser, disable the \\\"Secure only\\\" requirement within Blue Iris's web server settings.</div>\");\r\n\t\t\t\t$(\"#login\").css(\"color\", \"#EEEEEE\").css(\"margin\", \"8px\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (!existingSession || (existingSession.length === 11 && existingSession.startsWith(\"%\") && existingSession.endsWith(\"%\") && existingSession.indexOf(\"SESSION\") === 2))\r\n\t\t\t{\r\n\t\t\t\t$(\"#login\").html(\"<div>Session data was not provided as expected. This login page only works when served by Blue Iris 4.8.2.3 or newer.</div>\");\r\n\t\t\t\t$(\"#login\").css(\"color\", \"#EEEEEE\").css(\"margin\", \"8px\");\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (!localStorageEnabled)\r\n\t\t\t\t$(\"#cbLoginAutomatically\").parent().text(\"Note: Local Storage is disabled in your browser, so credentials can not be saved.\").css(\"color\", \"#EEEEEE\");\r\n\t\t\tSetStatus();\r\n\t\t\t$(window).resize(resized);\r\n\t\t\tresized();\r\n\t\t\twindow.onbeforeunload = function ()\r\n\t\t\t{\r\n\t\t\t\twindowUnloading = true;\r\n\t\t\t\tcbLoginAutomaticallyClicked();\r\n\t\t\t\treturn;\r\n\t\t\t};\r\n\t\t\t// Handle automatic login\r\n\t\t\tif (GetPersistedValue(\"bi_rememberMe\") === \"1\")\r\n\t\t\t{\r\n\t\t\t\t$(\"#cbLoginAutomatically\").attr('checked', 'checked');\r\n\t\t\t\t$(\"#txtUn\").val(Base64.decode(GetPersistedValue(\"bi_username\")));\r\n\t\t\t\t$(\"#txtPw\").val(Base64.decode(GetPersistedValue(\"bi_password\")));\r\n\r\n\t\t\t\tif (!skipAutoLogin)\r\n\t\t\t\t{\r\n\t\t\t\t\tif ($(\"#txtUn\").val() !== \"\" && $(\"#txtPw\").val() !== \"\")\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlogin();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t$(\"#cbLoginAutomatically\").removeAttr('checked');\r\n\t\t\t\tSetPersistedValue(\"bi_username\", \"\");\r\n\t\t\t\tSetPersistedValue(\"bi_password\", \"\");\r\n\t\t\t}\r\n\r\n\t\t\tvar sessionType = \"\";\r\n\r\n\t\t\t// authExempt predefined values: no, user, admin, unknown (should not happen)\r\n\t\t\tif (authExempt === \"user\")\r\n\t\t\t\tsessionType = \"anonymous user\";\r\n\t\t\telse if (authExempt === \"admin\")\r\n\t\t\t\tsessionType = \"anonymous admin\";\r\n\r\n\t\t\t// authStatus predefined values: unknown, admin, anonymous, user\r\n\t\t\tif (authStatus === \"admin\")\r\n\t\t\t\tsessionType = \"existing admin\";\r\n\t\t\telse if (authStatus === \"user\")\r\n\t\t\t\tsessionType = \"existing user\";\r\n\t\t\telse if (authStatus === \"anonymous\")\r\n\t\t\t\tsessionType = \"existing anonymous user\";\r\n\r\n\t\t\tif (sessionType)\r\n\t\t\t\tSetStatus(\"An \" + sessionType + ' session is available. <a href=\"javascript:UseAltSession(\\'' + sessionType + '\\')\">Click here to use it.</a>');\r\n\r\n\t\t\t// Set focus on first empty field\r\n\t\t\tif (!$(\"#txtUn\").val())\r\n\t\t\t\t$(\"#txtUn\").get(0).focus();\r\n\t\t\telse if (!$(\"#txtPw\").val())\r\n\t\t\t\t$(\"#txtPw\").get(0).focus();\r\n\t\t\telse\r\n\t\t\t\t$(\"#btnLogin\").get(0).focus();\r\n\r\n\t\t\tisStoredDataLoaded = true;\r\n\t\t});\r\n\t\tfunction login()\r\n\t\t{\r\n\t\t\tcbLoginAutomaticallyClicked();\r\n\t\t\t$(\"#btnLogin\").val(\"Logging in ...\");\r\n\t\t\tSetStatus();\r\n\t\t\tif (authStatus === \"unknown\")\r\n\t\t\t\tloginSession = existingSession;\r\n\r\n\t\t\tif (!loginSession)\r\n\t\t\t\tauthenticateNewSession();\r\n\t\t\telse\r\n\t\t\t\tauthenticateSession(loginSession);\r\n\t\t}\r\n\t\tfunction authenticateNewSession(user, pass)\r\n\t\t{\r\n\t\t\tExecJSON({ cmd: \"login\" }, function (response)\r\n\t\t\t{\r\n\t\t\t\tloginSession = response.session;\r\n\t\t\t\tauthenticateSession(loginSession, true);\r\n\t\t\t}, loginFail);\r\n\t\t}\r\n\t\tfunction authenticateSession(session, isNewSession)\r\n\t\t{\r\n\t\t\tvar myResponse = md5($(\"#txtUn\").val() + \":\" + session + \":\" + $(\"#txtPw\").val());\r\n\t\t\tExecJSON({ cmd: \"login\", session: session, response: myResponse }, function (response)\r\n\t\t\t{\r\n\t\t\t\tif (response.result === \"success\")\r\n\t\t\t\t{\r\n\t\t\t\t\t$(\"#btnLogin\").attr(\"disabled\", \"disabled\").val(\"Redirecting...\");\r\n\t\t\t\t\texistingSession = response.session;\r\n\t\t\t\t\tLeaveLoginPage();\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tvar isExpired;\r\n\t\t\t\t\tif (compareVersions(bi_version, \"5.8.1.1\") >= 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tisExpired = response.result === \"fail\"\r\n\t\t\t\t\t\t\t&& response.data\r\n\t\t\t\t\t\t\t&& typeof response.data.reason === \"string\"\r\n\t\t\t\t\t\t\t&& response.data.reason.toUpperCase() === \"INVALID SESSION\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// BI prior to 5.8.1.1 did not return a data.reason string in the case of invalid session.\r\n\t\t\t\t\t\tisExpired = response.result === \"fail\" && (!response.data || !response.data.reason);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (isExpired && !isNewSession)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// This happens when the session we were trying to authenticate has expired.\r\n\t\t\t\t\t\tauthenticateNewSession();\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t$(\"#cbLoginAutomatically\").removeAttr('checked');\r\n\t\t\t\t\t\tSetPersistedValue(\"bi_rememberMe\", \"0\");\r\n\t\t\t\t\t\tSetPersistedValue(\"bi_username\", \"\");\r\n\t\t\t\t\t\tSetPersistedValue(\"bi_password\", \"\");\r\n\t\t\t\t\t\t$(\"#btnLogin\").val(\"Log in\");\r\n\t\t\t\t\t\tHandleError(response.data && response.data.reason ? response.data.reason : \"Login failed but Blue Iris did not provide a reason.\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}, loginFail);\r\n\t\t}\r\n\t\tfunction loginFail(jqXHR, textStatus, errorThrown)\r\n\t\t{\r\n\t\t\tHandleError(\"Unable to contact Blue Iris server\");\r\n\t\t\t$(\"#btnLogin\").val(\"Log in\");\r\n\t\t}\r\n\t\tfunction UseAltSession(sessionType)\r\n\t\t{\r\n\t\t\tif (!sessionType)\r\n\t\t\t\talert(\"Error. Please reload.\");\r\n\t\t\telse if (sessionType.indexOf(\"existing\") > -1)\r\n\t\t\t\tLeaveLoginPage();\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\texistingSession = \"\";\r\n\t\t\t\tLeaveLoginPage();\r\n\t\t\t}\r\n\t\t}\r\n\t\tfunction LeaveLoginPage()\r\n\t\t{\r\n\t\t\tvar page = UrlParameters.Get(\"page\");\r\n\t\t\tif (page.match(/timeout\\.htm/i))\r\n\t\t\t\tpage = page.replace(/timeout\\.htm.*/i, 'ui3.htm');\r\n\t\t\tif (page.indexOf(appPath) !== 0)\r\n\t\t\t\tpage = appPath + page.replace(/^\\/+/g, '');\r\n\t\t\tpage = page.replace(/[&?]session=[^&?#%]+/gi, '');\r\n\t\t\tif (existingSession)\r\n\t\t\t{\r\n\t\t\t\tpage += (page.indexOf(\"?\") < 0 ? \"?\" : \"&\") + \"session=\" + existingSession;\r\n\t\t\t\tif (cookiesEnabled)\r\n\t\t\t\t\t$.cookie(\"session\", existingSession, { path: \"/\" });\r\n\t\t\t}\r\n\t\t\tlocation.href = page + location.hash;\r\n\t\t}\r\n\t\tfunction cancelAutoLogin()\r\n\t\t{\r\n\t\t\tif (autologin_timeout_1 !== null)\r\n\t\t\t{\r\n\t\t\t\tclearTimeout(autologin_timeout_1);\r\n\t\t\t\tautologin_timeout_1 = null;\r\n\t\t\t}\r\n\t\t\tif (autologin_timeout_2 !== null)\r\n\t\t\t{\r\n\t\t\t\tclearTimeout(autologin_timeout_2);\r\n\t\t\t\tautologin_timeout_2 = null;\r\n\t\t\t}\r\n\t\t\t$(\"#btnLogin\").val(windowUnloading ? \"Redirecting...\" : \"Log in\");\r\n\t\t}\r\n\t\tfunction cbLoginAutomaticallyClicked()\r\n\t\t{\r\n\t\t\tcancelAutoLogin();\r\n\t\t\tif (!isStoredDataLoaded)\r\n\t\t\t\treturn;\r\n\t\t\tvar isChecked = $(\"#cbLoginAutomatically\").is(\":checked\");\r\n\t\t\tSetPersistedValue(\"bi_rememberMe\", isChecked ? \"1\" : \"0\");\r\n\t\t\tSetPersistedValue(\"bi_username\", isChecked ? Base64.encode($(\"#txtUn\").val()) : \"\");\r\n\t\t\tSetPersistedValue(\"bi_password\", isChecked ? Base64.encode($(\"#txtPw\").val()) : \"\");\r\n\t\t}\r\n\t\tfunction GetPersistedValue(key)\r\n\t\t{\r\n\t\t\tvar value;\r\n\t\t\tif (localStorageEnabled)\r\n\t\t\t\tvalue = localStorage.getItem(key);\r\n\t\t\tif (!value)\r\n\t\t\t\tvalue = \"\";\r\n\t\t\treturn value;\r\n\t\t}\r\n\t\tfunction SetPersistedValue(key, value)\r\n\t\t{\r\n\t\t\tif (localStorageEnabled)\r\n\t\t\t\treturn localStorage.setItem(key, value);\r\n\t\t}\r\n\t\tfunction pwKeypress(ele, e)\r\n\t\t{\r\n\t\t\tvar keycode;\r\n\t\t\tif (window.event) keycode = window.event.keyCode;\r\n\t\t\telse if (typeof e !== \"undefined\" && e) keycode = e.which;\r\n\t\t\telse return true;\r\n\r\n\t\t\tif (keycode === 13)\r\n\t\t\t{\r\n\t\t\t\tlogin();\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\treturn true;\r\n\t\t}\r\n\t\tfunction resized()\r\n\t\t{\r\n\t\t\tif ($(\"#status\").is(\":visible\"))\r\n\t\t\t{\r\n\t\t\t\t$(\"#status\").hide();\r\n\t\t\t\t$(\"#status\").css(\"max-width\", $(\"#login\").width() + \"px\");\r\n\t\t\t\t$(\"#status\").show();\r\n\t\t\t}\r\n\t\t\t$('#login').css({ position: 'absolute', left: ($(window).width() - $('#login').outerWidth()) / 2, top: ($(window).height() - $('#login').outerHeight()) / 2 });\r\n\t\t\t$(\"#status\").css(\"max-width\", $(\"#login\").width() + \"px\");\r\n\t\t\tvar heightTotal = 0;\r\n\t\t\t$(\"#login\").children().each(function (idx, ele)\r\n\t\t\t{\r\n\t\t\t\theightTotal += $(ele).outerHeight(true);\r\n\t\t\t});\r\n\t\t\tif (height",
"datamd5" : "6d693daec4a6d0920f4667a656f235ef",
"datammh3" : -1371589578,
"device" : {
"class" : "<enterprise field>: device.class"
},
"domain" : [
"wideopenwest.com"
],
"forward" : "96.27.91.18",
"geolocus" : {
"asn" : "AS12083",
"continent" : "NA",
"continentname" : "North America",
"country" : "US",
"countryname" : "United States",
"domain" : [
"wideopenwest.com",
"wowinc.com"
],
"isineu" : "false",
"latitude" : "37.09024",
"location" : "37.09024,-95.712891",
"longitude" : "-95.712891",
"netname" : "WIDEOPENWEST",
"organization" : "WideOpenWest Finance LLC",
"subnet" : "96.27.0.0/16"
},
"host" : [
"d27-96-18-91"
],
"hostname" : [
"96.27.91.18",
"d27-96-18-91.nap.wideopenwest.com"
],
"ip" : "96.27.91.18",
"ipv6" : "false",
"latitude" : "42.1395",
"location" : "42.1395,-83.1783",
"longitude" : "-83.1783",
"node" : {
"country" : "<enterprise field>: node.country",
"groupid" : "<enterprise field>: node.groupid",
"id" : "<enterprise field>: node.id",
"physicalcountry" : "<enterprise field>: node.physicalcountry"
},
"organization" : "WOW-INTERNET",
"port" : 17755,
"protocol" : "http",
"protocolversion" : "1.0",
"reason" : "OK",
"reverse" : [
"d27-96-18-91.nap.wideopenwest.com"
],
"seen_date" : "2024-11-06",
"source" : "urlscan::redirect",
"status" : 200,
"subdomains" : [
"nap.wideopenwest.com"
],
"subnet" : "96.27.0.0/16",
"tag" : "<enterprise field>: tag",
"tld" : [
"com"
],
"tls" : "false",
"transport" : "tcp",
"url" : "/login.htm?page=%2F"
}