Code |
Context
if (Configure::read() > 0) {
include ($___viewFn);
$___viewFn = "/usr/local/NetSapiens/netsapiens-portals/views/layouts/landing.ctp"
$___dataForView = array(
"today_date_string" => "August 28, 2026, 12:16 pm",
"failCount" => false,
"lastUser" => "@",
"content_for_layout" => "
<style>
/* Hide all login content initially to prevent flash */
#login-group, #LoginForm, .alert, .separator, .sso-container {
display: none !important;
}
#LoginForm {
overflow: auto;
margin: 0 0 8px;
}
.separator {
margin-top: 12px;
display: flex;
position: relative;
margin: 1rem 0;
text-align: center;
justify-content: space-between;
align-items: center;
flex: 1
}
.separator__content {
margin: 0 3rem
}
.separator::before, .separator::after {
flex: 1;
content: '';
border-bottom: 1px solid #5f6c72
}
.separator--light {
font-weight: 700;
letter-spacing: 1px;
text-transform: uppercase;
color: #969ea2;
font-size: 1.3rem
}
.separator--light::before, .separator--light::after {
border-color: #dadfe2
}
.sso-container {
padding: 2px 0 8px;
text-align: center;
}
.sso-container:last-of-type {
margin-bottom: 20px;
}
#login-group.with-redirect-uri {
margin-top: 10px;
}
</style>
<div id="login-spinner" class="loading-container relative"
style="margin: auto; position: absolute !important;top: 0;left: 0;background: transparent; display: none;">
<div class="loading-spinner la-ball-spin-clockwise">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
</div>
<div id="login-group" class="">
<div id="login-box">
<div id="login-logo">
<img src="https://dw.nseng.dev/ns-api/?object=image&action=read&server=dw.nseng.dev&filename=portal_landing.png&server=dw.nseng.dev"/>
</div>
<form action="/portal/login/login" id="LoginForm" class="form-stacked" method="post" accept-charset="utf-8"><div style="display:none;"><input type="hidden" name="_method" value="POST" /></div> <div class='hide'>
<input name="data[Login][vendor]" type="text" id="SsoVendor" /><input name="data[Login][id_token]" type="text" id="SsoIdToken" /> </div>
<div id="login-fields">
<div>
<label for="username">Login Name</label>
<div>
<input name="data[Login][username]" type="text" id="LoginUsername" /> </div>
</div>
<div>
<label for="password">Password</label>
<div>
<input type="password" name="data[Login][password]" class="hide" id="LoginPassword" /> </div>
</div>
</div>
<div id="login-submit" style="padding-bottom: 15px;">
<div class="submit"><input class="btn btn-large color-primary" update="#login" complete="hideModalIf("#login");" type="submit" value="Log In" /></div> </div>
<div id="reset-container" style="margin-bottom: 12px;">
<div id="reset-links">
<a href="/portal/resets/forgotlogin"
style="padding-right: 7px;">Forgot Login Name</a>|<a
href="/portal/resets/forgotpassword"
style="padding-left: 7px;">Forgot Password</a>
</div>
</div>
<div id="ssoSeparator" class="separator separator--light" style="display: none">
<span class="separator__content">OR</span>
</div>
<style>
#appleid-signin {
display: none;
}
</style>
</form> </div>
<div class="new-user-container">
<a href="/portal/resets/newuser">Are you a new user?</a>
</div>
<div class="login-language-container">
</div>
<div id="footer">
<p>Copyright © 2011–2026 by NetSapiens, Inc.</p>
<p>Manager Portal: Version 45.0.0 </p>
</div><!-- /login-box -->
</div><!-- /login-group -->
<script type="text/javascript">
var debugMode = localStorage.getItem('debug') === 'true';
var ns_t = localStorage.getItem('ns_t');
var ns_t_refresh = localStorage.getItem('ns_t_refresh');
if (ns_t_refresh != '' && ns_t_refresh != null) {
ns_t = ns_t_refresh;
}
try {
var jwt = parseJwt(ns_t);
} catch (e) {
if (debugMode) console.log('Error parsing JWT token:', e);
var jwt = null;
}
// Add delay to prevent timing issues with JWT auto-login
setTimeout(function() {
// Handle auth redirect based on token availability
if (!ns_t) {
if (debugMode) console.log('No ns_t token found, redirecting to auth app');
// No JWT token exists, redirect to auth app (spinner stays visible)
window.location.replace('https://' + window.location.host + '/auth/?r=portal');
return;
}
// Check if token is valid and not expired
if (!jwt || !jwt.exp || jwt.exp <= (Date.now().getTime() / 1000)) {
if (debugMode) console.log('Token is invalid or expired, redirecting to auth app');
if (debugMode) console.table(jwt);
// Token is invalid or expired, redirect to auth app
window.location.replace('https://' + window.location.host + '/auth/?r=portal');
// clear the ns_t and ns_t_refresh tokens in localStorage
localStorage.removeItem('ns_t');
localStorage.removeItem('ns_t_refresh');
return;
}
if ($.cookie('is_mask') == null && jwt) {
if (debugMode) console.log('should be calling in here with delay');
if (debugMode) {
console.log('jwtautologin ts:', localStorage.getItem('jwtAutoLoginTS'));
console.log('Date.now:', Date.now().getTime());
console.log('jwt exp:', jwt.exp);
}
// Debug the condition components
var jwtAutoLoginTS = localStorage.getItem('jwtAutoLoginTS');
var currentTime = Date.now().getTime();
var thirtySecondsAgo = currentTime - 30000;
var parsedTS = jwtAutoLoginTS ? parseInt(jwtAutoLoginTS) : null;
if (debugMode) {
console.log('=== DEBUG AUTO-LOGIN CONDITION ===');
console.log('jwtAutoLoginTS (raw):', jwtAutoLoginTS);
console.log('jwtAutoLoginTS (parsed):', parsedTS);
console.log('currentTime:', currentTime);
console.log('thirtySecondsAgo:', thirtySecondsAgo);
console.log('jwtAutoLoginTS == null:', jwtAutoLoginTS == null);
console.log('parsedTS < thirtySecondsAgo:', parsedTS < thirtySecondsAgo);
console.log('First part (null check):', jwtAutoLoginTS == null);
console.log('Second part (time check):', parsedTS < thirtySecondsAgo);
console.log('Overall condition result:', (jwtAutoLoginTS == null || parsedTS < thirtySecondsAgo));
console.log('=== END DEBUG ===');
}
if (jwtAutoLoginTS == null || parsedTS < thirtySecondsAgo) {
if (jwt.exp > (Date.now().getTime() / 1000)) {
if (debugMode) console.log('Starting delayed JWT auto-login process');
$('#login-spinner').show();
$('#login-group').hide();
var username = jwt.login || jwt.sub;
var expires = jwt.exp;
localStorage.setItem('jwtAutoLoginTS', Date.now().getTime());
if (debugMode) console.log('Auto logging in user:', username, ' token expires at ', new Date(expires * 1000).toLocaleString());
if (debugMode) console.log('calling loginwithtoken');
window.location.replace("/portal/login/loginwithtoken?iframe=no&refresh_token=" + ns_t + "&username=" + username + "&avoidExpiredRedirect=true");
} else {
if (debugMode) console.log('JWT token is expired, redirecting to auth app');
}
} else {
if (debugMode) console.log('Auto-login blocked - timestamp too recent. jwtAutoLoginTS:', jwtAutoLoginTS, 'parsed:', parsedTS, 'threshold:', thirtySecondsAgo);
}
}
}, 300); // 300ms delay to ensure all components are ready
function parseJwt(token) {
if (token) {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
var jsonPayload = decodeURIComponent(atob(base64).split('').map(function (c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload);
}
};
</script>
<script type="text/javascript">
//OMP-1256
//When auto-logged out, prevent redirect to controller if logging back in as a different user
loginForm = $('.form-stacked');
loginURL = loginForm.attr('action');
if (loginURL.indexOf('page=') !== -1) {
pageURL = loginURL;
noPageURL = pageURL.replace(/(&?|\?)page=[a-z]*/g, '');
usernameInput = $('#LoginUsername');
origUsername = "@";
usernameInput.on("input", function () {
newUsername = usernameInput.val();
if (newUsername != origUsername) {
loginForm.attr('action', noPageURL);
//window.history.pushState({},"", noPageURL);
} else {
loginForm.attr('action', pageURL);
//window.history.pushState({},"", pageURL);
}
});
}
function enableLogin() {
$('.submit input').removeAttr("disabled");
}
function onSubmit() {
$('form').submit();
}
</script>
",
"scripts_for_layout" => "",
"title_for_layout" => "Login",
"form" => FormHelper
FormHelper::$helpers = array
FormHelper::$fieldset = array
FormHelper::$__options = array
FormHelper::$fields = array
FormHelper::$requestType = "post"
FormHelper::$defaultModel = NULL
FormHelper::$_inputDefaults = array
FormHelper::$_lastAction = "/portal/login/login"
FormHelper::$Sess = Sess object
FormHelper::$base = "/portal"
FormHelper::$webroot = "/portal/"
FormHelper::$theme = NULL
FormHelper::$here = "/portal/"
FormHelper::$params = array
FormHelper::$action = "index"
FormHelper::$plugin = NULL
FormHelper::$data = NULL
FormHelper::$namedArgs = NULL
FormHelper::$argSeparator = NULL
FormHelper::$validationErrors = NULL
FormHelper::$tags = array
FormHelper::$__tainted = NULL
FormHelper::$__cleaned = NULL
FormHelper::$Html = HtmlHelper object,
"recaptcha" => RecaptchaHelper
RecaptchaHelper::$helpers = array
RecaptchaHelper::$Sess = Sess object
RecaptchaHelper::$base = "/portal"
RecaptchaHelper::$webroot = "/portal/"
RecaptchaHelper::$theme = NULL
RecaptchaHelper::$here = "/portal/"
RecaptchaHelper::$params = array
RecaptchaHelper::$action = "index"
RecaptchaHelper::$plugin = NULL
RecaptchaHelper::$data = NULL
RecaptchaHelper::$namedArgs = NULL
RecaptchaHelper::$argSeparator = NULL
RecaptchaHelper::$validationErrors = NULL
RecaptchaHelper::$tags = array
RecaptchaHelper::$__tainted = NULL
RecaptchaHelper::$__cleaned = NULL
RecaptchaHelper::$form = FormHelper object,
"jqueryEngine" => JqueryEngineHelper
JqueryEngineHelper::$_optionMap = array
JqueryEngineHelper::$_callbackArguments = array
JqueryEngineHelper::$jQueryObject = "$"
JqueryEngineHelper::$useNative = true
JqueryEngineHelper::$selection = NULL
JqueryEngineHelper::$bufferedMethods = array
JqueryEngineHelper::$Sess = Sess object
JqueryEngineHelper::$helpers = NULL
JqueryEngineHelper::$base = "/portal"
JqueryEngineHelper::$webroot = "/portal/"
JqueryEngineHelper::$theme = NULL
JqueryEngineHelper::$here = "/portal/"
JqueryEngineHelper::$params = array
JqueryEngineHelper::$action = "index"
JqueryEngineHelper::$plugin = NULL
JqueryEngineHelper::$data = NULL
JqueryEngineHelper::$namedArgs = NULL
JqueryEngineHelper::$argSeparator = NULL
JqueryEngineHelper::$validationErrors = NULL
JqueryEngineHelper::$tags = array
JqueryEngineHelper::$__tainted = NULL
JqueryEngineHelper::$__cleaned = NULL,
"js" => JsHelper
JsHelper::$bufferScripts = false
JsHelper::$helpers = array
JsHelper::$__jsVars = array
JsHelper::$__bufferedScripts = array
JsHelper::$__engineName = "JqueryEngine"
JsHelper::$setVariable = "app"
JsHelper::$Sess = Sess object
JsHelper::$base = "/portal"
JsHelper::$webroot = "/portal/"
JsHelper::$theme = NULL
JsHelper::$here = "/portal/"
JsHelper::$params = array
JsHelper::$action = "index"
JsHelper::$plugin = NULL
JsHelper::$data = NULL
JsHelper::$namedArgs = NULL
JsHelper::$argSeparator = NULL
JsHelper::$validationErrors = NULL
JsHelper::$tags = array
JsHelper::$__tainted = NULL
JsHelper::$__cleaned = NULL
JsHelper::$Html = HtmlHelper object
JsHelper::$Form = FormHelper object
JsHelper::$JqueryEngine = JqueryEngineHelper object,
"sess" => SessHelper
SessHelper::$sessObj = Sess object
SessHelper::$Sess = Sess object
SessHelper::$helpers = NULL
SessHelper::$base = "/portal"
SessHelper::$webroot = "/portal/"
SessHelper::$theme = NULL
SessHelper::$here = "/portal/"
SessHelper::$params = array
SessHelper::$action = "index"
SessHelper::$plugin = NULL
SessHelper::$data = NULL
SessHelper::$namedArgs = NULL
SessHelper::$argSeparator = NULL
SessHelper::$validationErrors = NULL
SessHelper::$tags = array
SessHelper::$__tainted = NULL
SessHelper::$__cleaned = NULL,
"nstime" => NstimeHelper
NstimeHelper::$helpers = array
NstimeHelper::$Sess = Sess object
NstimeHelper::$base = "/portal"
NstimeHelper::$webroot = "/portal/"
NstimeHelper::$theme = NULL
NstimeHelper::$here = "/portal/"
NstimeHelper::$params = array
NstimeHelper::$action = "index"
NstimeHelper::$plugin = NULL
NstimeHelper::$data = NULL
NstimeHelper::$namedArgs = NULL
NstimeHelper::$argSeparator = NULL
NstimeHelper::$validationErrors = NULL
NstimeHelper::$tags = array
NstimeHelper::$__tainted = NULL
NstimeHelper::$__cleaned = NULL
NstimeHelper::$Session = SessionHelper object
NstimeHelper::$Uiconfig = UiconfigHelper object
NstimeHelper::$Localization = LocalizationHelper object,
"contacts" => ContactsHelper
ContactsHelper::$helpers = array
ContactsHelper::$Sess = Sess object
ContactsHelper::$base = "/portal"
ContactsHelper::$webroot = "/portal/"
ContactsHelper::$theme = NULL
ContactsHelper::$here = "/portal/"
ContactsHelper::$params = array
ContactsHelper::$action = "index"
ContactsHelper::$plugin = NULL
ContactsHelper::$data = NULL
ContactsHelper::$namedArgs = NULL
ContactsHelper::$argSeparator = NULL
ContactsHelper::$validationErrors = NULL
ContactsHelper::$tags = array
ContactsHelper::$__tainted = NULL
ContactsHelper::$__cleaned = NULL
ContactsHelper::$Session = SessionHelper object
ContactsHelper::$UiConfig = UiconfigHelper object
ContactsHelper::$Phonenumber = PhonenumberHelper object,
"phonenumber" => PhonenumberHelper
PhonenumberHelper::$helpers = array
PhonenumberHelper::$Sess = Sess object
PhonenumberHelper::$base = "/portal"
PhonenumberHelper::$webroot = "/portal/"
PhonenumberHelper::$theme = NULL
PhonenumberHelper::$here = "/portal/"
PhonenumberHelper::$params = array
PhonenumberHelper::$action = "index"
PhonenumberHelper::$plugin = NULL
PhonenumberHelper::$data = NULL
PhonenumberHelper::$namedArgs = NULL
PhonenumberHelper::$argSeparator = NULL
PhonenumberHelper::$validationErrors = NULL
PhonenumberHelper::$tags = array
PhonenumberHelper::$__tainted = NULL
PhonenumberHelper::$__cleaned = NULL
PhonenumberHelper::$Session = SessionHelper object
PhonenumberHelper::$Uiconfig = UiconfigHelper object
PhonenumberHelper::$Contacts = ContactsHelper object,
"uiConfig" => UiconfigHelper
UiconfigHelper::$helpers = array
UiconfigHelper::$Sess = Sess object
UiconfigHelper::$base = "/portal"
UiconfigHelper::$webroot = "/portal/"
UiconfigHelper::$theme = NULL
UiconfigHelper::$here = "/portal/"
UiconfigHelper::$params = array
UiconfigHelper::$action = "index"
UiconfigHelper::$plugin = NULL
UiconfigHelper::$data = NULL
UiconfigHelper::$namedArgs = NULL
UiconfigHelper::$argSeparator = NULL
UiconfigHelper::$validationErrors = NULL
UiconfigHelper::$tags = array
UiconfigHelper::$__tainted = NULL
UiconfigHelper::$__cleaned = NULL
UiconfigHelper::$Html = HtmlHelper object
UiconfigHelper::$Session = SessionHelper object
UiconfigHelper::$Form = FormHelper object,
"messages" => MessagesHelper
MessagesHelper::$helpers = array
MessagesHelper::$Sess = Sess object
MessagesHelper::$base = "/portal"
MessagesHelper::$webroot = "/portal/"
MessagesHelper::$theme = NULL
MessagesHelper::$here = "/portal/"
MessagesHelper::$params = array
MessagesHelper::$action = "index"
MessagesHelper::$plugin = NULL
MessagesHelper::$data = NULL
MessagesHelper::$namedArgs = NULL
MessagesHelper::$argSeparator = NULL
MessagesHelper::$validationErrors = NULL
MessagesHelper::$tags = array
MessagesHelper::$__tainted = NULL
MessagesHelper::$__cleaned = NULL
MessagesHelper::$Session = SessionHelper object
MessagesHelper::$Html = HtmlHelper object
MessagesHelper::$UiConfig = UiconfigHelper object
MessagesHelper::$Phonenumber = PhonenumberHelper object
MessagesHelper::$Contacts = ContactsHelper object
MessagesHelper::$Nstime = NstimeHelper object,
"nshtml" => NshtmlHelper
NshtmlHelper::$helpers = array
NshtmlHelper::$Sess = Sess object
NshtmlHelper::$base = "/portal"
NshtmlHelper::$webroot = "/portal/"
NshtmlHelper::$theme = NULL
NshtmlHelper::$here = "/portal/"
NshtmlHelper::$params = array
NshtmlHelper::$action = "index"
NshtmlHelper::$plugin = NULL
NshtmlHelper::$data = NULL
NshtmlHelper::$namedArgs = NULL
NshtmlHelper::$argSeparator = NULL
NshtmlHelper::$validationErrors = NULL
NshtmlHelper::$tags = array
NshtmlHelper::$__tainted = NULL
NshtmlHelper::$__cleaned = NULL
NshtmlHelper::$Html = HtmlHelper object,
"localization" => LocalizationHelper
LocalizationHelper::$helpers = array
LocalizationHelper::$Sess = Sess object
LocalizationHelper::$base = "/portal"
LocalizationHelper::$webroot = "/portal/"
LocalizationHelper::$theme = NULL
LocalizationHelper::$here = "/portal/"
LocalizationHelper::$params = array
LocalizationHelper::$action = "index"
LocalizationHelper::$plugin = NULL
LocalizationHelper::$data = NULL
LocalizationHelper::$namedArgs = NULL
LocalizationHelper::$argSeparator = NULL
LocalizationHelper::$validationErrors = NULL
LocalizationHelper::$tags = array
LocalizationHelper::$__tainted = NULL
LocalizationHelper::$__cleaned = NULL
LocalizationHelper::$Session = SessionHelper object
LocalizationHelper::$Uiconfig = UiconfigHelper object,
"help" => HelpHelper
HelpHelper::$helpers = array
HelpHelper::$Sess = Sess object
HelpHelper::$base = "/portal"
HelpHelper::$webroot = "/portal/"
HelpHelper::$theme = NULL
HelpHelper::$here = "/portal/"
HelpHelper::$params = array
HelpHelper::$action = "index"
HelpHelper::$plugin = NULL
HelpHelper::$data = NULL
HelpHelper::$namedArgs = NULL
HelpHelper::$argSeparator = NULL
HelpHelper::$validationErrors = NULL
HelpHelper::$tags = array
HelpHelper::$__tainted = NULL
HelpHelper::$__cleaned = NULL
HelpHelper::$Session = SessionHelper object
HelpHelper::$Uiconfig = UiconfigHelper object
HelpHelper::$Html = HtmlHelper object,
"session" => SessionHelper
SessionHelper::$helpers = array
SessionHelper::$__active = true
SessionHelper::$valid = false
SessionHelper::$error = false
SessionHelper::$_userAgent = "37def5f933e411292a31b5ff3bbfd296"
SessionHelper::$path = "/"
SessionHelper::$lastError = NULL
SessionHelper::$security = "medium"
SessionHelper::$time = 1787944575
SessionHelper::$sessionTime = 1787992575
SessionHelper::$cookieLifeTime = false
SessionHelper::$cookieSameSite = "Lax"
SessionHelper::$watchKeys = array
SessionHelper::$id = NULL
SessionHelper::$host = NULL
SessionHelper::$timeout = NULL
SessionHelper::$base = "/portal"
SessionHelper::$webroot = "/portal/"
SessionHelper::$here = "/portal/"
SessionHelper::$params = array
SessionHelper::$action = "index"
SessionHelper::$data = NULL
SessionHelper::$theme = NULL
SessionHelper::$plugin = NULL,
"html" => HtmlHelper
HtmlHelper::$tags = array
HtmlHelper::$_crumbs = array
HtmlHelper::$__includedScripts = array
HtmlHelper::$_scriptBlockOptions = array
HtmlHelper::$__docTypes = array
HtmlHelper::$Sess = Sess object
HtmlHelper::$helpers = NULL
HtmlHelper::$base = "/portal"
HtmlHelper::$webroot = "/portal/"
HtmlHelper::$theme = NULL
HtmlHelper::$here = "/portal/"
HtmlHelper::$params = array
HtmlHelper::$action = "index"
HtmlHelper::$plugin = NULL
HtmlHelper::$data = NULL
HtmlHelper::$namedArgs = NULL
HtmlHelper::$argSeparator = NULL
HtmlHelper::$validationErrors = NULL
HtmlHelper::$__tainted = NULL
HtmlHelper::$__cleaned = NULL,
"uiconfig" => UiconfigHelper
UiconfigHelper::$helpers = array
UiconfigHelper::$Sess = Sess object
UiconfigHelper::$base = "/portal"
UiconfigHelper::$webroot = "/portal/"
UiconfigHelper::$theme = NULL
UiconfigHelper::$here = "/portal/"
UiconfigHelper::$params = array
UiconfigHelper::$action = "index"
UiconfigHelper::$plugin = NULL
UiconfigHelper::$data = NULL
UiconfigHelper::$namedArgs = NULL
UiconfigHelper::$argSeparator = NULL
UiconfigHelper::$validationErrors = NULL
UiconfigHelper::$tags = array
UiconfigHelper::$__tainted = NULL
UiconfigHelper::$__cleaned = NULL
UiconfigHelper::$Html = HtmlHelper object
UiconfigHelper::$Session = SessionHelper object
UiconfigHelper::$Form = FormHelper object
)
$loadHelpers = false
$cached = true
$loadedHelpers = array()
$today_date_string = "August 28, 2026, 12:16 pm"
$failCount = false
$lastUser = "@"
$content_for_layout = "
<style>
/* Hide all login content initially to prevent flash */
#login-group, #LoginForm, .alert, .separator, .sso-container {
display: none !important;
}
#LoginForm {
overflow: auto;
margin: 0 0 8px;
}
.separator {
margin-top: 12px;
display: flex;
position: relative;
margin: 1rem 0;
text-align: center;
justify-content: space-between;
align-items: center;
flex: 1
}
.separator__content {
margin: 0 3rem
}
.separator::before, .separator::after {
flex: 1;
content: '';
border-bottom: 1px solid #5f6c72
}
.separator--light {
font-weight: 700;
letter-spacing: 1px;
text-transform: uppercase;
color: #969ea2;
font-size: 1.3rem
}
.separator--light::before, .separator--light::after {
border-color: #dadfe2
}
.sso-container {
padding: 2px 0 8px;
text-align: center;
}
.sso-container:last-of-type {
margin-bottom: 20px;
}
#login-group.with-redirect-uri {
margin-top: 10px;
}
</style>
<div id="login-spinner" class="loading-container relative"
style="margin: auto; position: absolute !important;top: 0;left: 0;background: transparent; display: none;">
<div class="loading-spinner la-ball-spin-clockwise">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
</div>
<div id="login-group" class="">
<div id="login-box">
<div id="login-logo">
<img src="https://dw.nseng.dev/ns-api/?object=image&action=read&server=dw.nseng.dev&filename=portal_landing.png&server=dw.nseng.dev"/>
</div>
<form action="/portal/login/login" id="LoginForm" class="form-stacked" method="post" accept-charset="utf-8"><div style="display:none;"><input type="hidden" name="_method" value="POST" /></div> <div class='hide'>
<input name="data[Login][vendor]" type="text" id="SsoVendor" /><input name="data[Login][id_token]" type="text" id="SsoIdToken" /> </div>
<div id="login-fields">
<div>
<label for="username">Login Name</label>
<div>
<input name="data[Login][username]" type="text" id="LoginUsername" /> </div>
</div>
<div>
<label for="password">Password</label>
<div>
<input type="password" name="data[Login][password]" class="hide" id="LoginPassword" /> </div>
</div>
</div>
<div id="login-submit" style="padding-bottom: 15px;">
<div class="submit"><input class="btn btn-large color-primary" update="#login" complete="hideModalIf("#login");" type="submit" value="Log In" /></div> </div>
<div id="reset-container" style="margin-bottom: 12px;">
<div id="reset-links">
<a href="/portal/resets/forgotlogin"
style="padding-right: 7px;">Forgot Login Name</a>|<a
href="/portal/resets/forgotpassword"
style="padding-left: 7px;">Forgot Password</a>
</div>
</div>
<div id="ssoSeparator" class="separator separator--light" style="display: none">
<span class="separator__content">OR</span>
</div>
<style>
#appleid-signin {
display: none;
}
</style>
</form> </div>
<div class="new-user-container">
<a href="/portal/resets/newuser">Are you a new user?</a>
</div>
<div class="login-language-container">
</div>
<div id="footer">
<p>Copyright © 2011–2026 by NetSapiens, Inc.</p>
<p>Manager Portal: Version 45.0.0 </p>
</div><!-- /login-box -->
</div><!-- /login-group -->
<script type="text/javascript">
var debugMode = localStorage.getItem('debug') === 'true';
var ns_t = localStorage.getItem('ns_t');
var ns_t_refresh = localStorage.getItem('ns_t_refresh');
if (ns_t_refresh != '' && ns_t_refresh != null) {
ns_t = ns_t_refresh;
}
try {
var jwt = parseJwt(ns_t);
} catch (e) {
if (debugMode) console.log('Error parsing JWT token:', e);
var jwt = null;
}
// Add delay to prevent timing issues with JWT auto-login
setTimeout(function() {
// Handle auth redirect based on token availability
if (!ns_t) {
if (debugMode) console.log('No ns_t token found, redirecting to auth app');
// No JWT token exists, redirect to auth app (spinner stays visible)
window.location.replace('https://' + window.location.host + '/auth/?r=portal');
return;
}
// Check if token is valid and not expired
if (!jwt || !jwt.exp || jwt.exp <= (Date.now().getTime() / 1000)) {
if (debugMode) console.log('Token is invalid or expired, redirecting to auth app');
if (debugMode) console.table(jwt);
// Token is invalid or expired, redirect to auth app
window.location.replace('https://' + window.location.host + '/auth/?r=portal');
// clear the ns_t and ns_t_refresh tokens in localStorage
localStorage.removeItem('ns_t');
localStorage.removeItem('ns_t_refresh');
return;
}
if ($.cookie('is_mask') == null && jwt) {
if (debugMode) console.log('should be calling in here with delay');
if (debugMode) {
console.log('jwtautologin ts:', localStorage.getItem('jwtAutoLoginTS'));
console.log('Date.now:', Date.now().getTime());
console.log('jwt exp:', jwt.exp);
}
// Debug the condition components
var jwtAutoLoginTS = localStorage.getItem('jwtAutoLoginTS');
var currentTime = Date.now().getTime();
var thirtySecondsAgo = currentTime - 30000;
var parsedTS = jwtAutoLoginTS ? parseInt(jwtAutoLoginTS) : null;
if (debugMode) {
console.log('=== DEBUG AUTO-LOGIN CONDITION ===');
console.log('jwtAutoLoginTS (raw):', jwtAutoLoginTS);
console.log('jwtAutoLoginTS (parsed):', parsedTS);
console.log('currentTime:', currentTime);
console.log('thirtySecondsAgo:', thirtySecondsAgo);
console.log('jwtAutoLoginTS == null:', jwtAutoLoginTS == null);
console.log('parsedTS < thirtySecondsAgo:', parsedTS < thirtySecondsAgo);
console.log('First part (null check):', jwtAutoLoginTS == null);
console.log('Second part (time check):', parsedTS < thirtySecondsAgo);
console.log('Overall condition result:', (jwtAutoLoginTS == null || parsedTS < thirtySecondsAgo));
console.log('=== END DEBUG ===');
}
if (jwtAutoLoginTS == null || parsedTS < thirtySecondsAgo) {
if (jwt.exp > (Date.now().getTime() / 1000)) {
if (debugMode) console.log('Starting delayed JWT auto-login process');
$('#login-spinner').show();
$('#login-group').hide();
var username = jwt.login || jwt.sub;
var expires = jwt.exp;
localStorage.setItem('jwtAutoLoginTS', Date.now().getTime());
if (debugMode) console.log('Auto logging in user:', username, ' token expires at ', new Date(expires * 1000).toLocaleString());
if (debugMode) console.log('calling loginwithtoken');
window.location.replace("/portal/login/loginwithtoken?iframe=no&refresh_token=" + ns_t + "&username=" + username + "&avoidExpiredRedirect=true");
} else {
if (debugMode) console.log('JWT token is expired, redirecting to auth app');
}
} else {
if (debugMode) console.log('Auto-login blocked - timestamp too recent. jwtAutoLoginTS:', jwtAutoLoginTS, 'parsed:', parsedTS, 'threshold:', thirtySecondsAgo);
}
}
}, 300); // 300ms delay to ensure all components are ready
function parseJwt(token) {
if (token) {
var base64Url = token.split('.')[1];
var base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
var jsonPayload = decodeURIComponent(atob(base64).split('').map(function (c) {
return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
}).join(''));
return JSON.parse(jsonPayload);
}
};
</script>
<script type="text/javascript">
//OMP-1256
//When auto-logged out, prevent redirect to controller if logging back in as a different user
loginForm = $('.form-stacked');
loginURL = loginForm.attr('action');
if (loginURL.indexOf('page=') !== -1) {
pageURL = loginURL;
noPageURL = pageURL.replace(/(&?|\?)page=[a-z]*/g, '');
usernameInput = $('#LoginUsername');
origUsername = "@";
usernameInput.on("input", function () {
newUsername = usernameInput.val();
if (newUsername != origUsername) {
loginForm.attr('action', noPageURL);
//window.history.pushState({},"", noPageURL);
} else {
loginForm.attr('action', pageURL);
//window.history.pushState({},"", pageURL);
}
});
}
function enableLogin() {
$('.submit input').removeAttr("disabled");
}
function onSubmit() {
$('form').submit();
}
</script>
"
$scripts_for_layout = ""
$title_for_layout = "Login"
$form = FormHelper
FormHelper::$helpers = array
FormHelper::$fieldset = array
FormHelper::$__options = array
FormHelper::$fields = array
FormHelper::$requestType = "post"
FormHelper::$defaultModel = NULL
FormHelper::$_inputDefaults = array
FormHelper::$_lastAction = "/portal/login/login"
FormHelper::$Sess = Sess object
FormHelper::$base = "/portal"
FormHelper::$webroot = "/portal/"
FormHelper::$theme = NULL
FormHelper::$here = "/portal/"
FormHelper::$params = array
FormHelper::$action = "index"
FormHelper::$plugin = NULL
FormHelper::$data = NULL
FormHelper::$namedArgs = NULL
FormHelper::$argSeparator = NULL
FormHelper::$validationErrors = NULL
FormHelper::$tags = array
FormHelper::$__tainted = NULL
FormHelper::$__cleaned = NULL
FormHelper::$Html = HtmlHelper object
$recaptcha = RecaptchaHelper
RecaptchaHelper::$helpers = array
RecaptchaHelper::$Sess = Sess object
RecaptchaHelper::$base = "/portal"
RecaptchaHelper::$webroot = "/portal/"
RecaptchaHelper::$theme = NULL
RecaptchaHelper::$here = "/portal/"
RecaptchaHelper::$params = array
RecaptchaHelper::$action = "index"
RecaptchaHelper::$plugin = NULL
RecaptchaHelper::$data = NULL
RecaptchaHelper::$namedArgs = NULL
RecaptchaHelper::$argSeparator = NULL
RecaptchaHelper::$validationErrors = NULL
RecaptchaHelper::$tags = array
RecaptchaHelper::$__tainted = NULL
RecaptchaHelper::$__cleaned = NULL
RecaptchaHelper::$form = FormHelper object
$jqueryEngine = JqueryEngineHelper
JqueryEngineHelper::$_optionMap = array
JqueryEngineHelper::$_callbackArguments = array
JqueryEngineHelper::$jQueryObject = "$"
JqueryEngineHelper::$useNative = true
JqueryEngineHelper::$selection = NULL
JqueryEngineHelper::$bufferedMethods = array
JqueryEngineHelper::$Sess = Sess object
JqueryEngineHelper::$helpers = NULL
JqueryEngineHelper::$base = "/portal"
JqueryEngineHelper::$webroot = "/portal/"
JqueryEngineHelper::$theme = NULL
JqueryEngineHelper::$here = "/portal/"
JqueryEngineHelper::$params = array
JqueryEngineHelper::$action = "index"
JqueryEngineHelper::$plugin = NULL
JqueryEngineHelper::$data = NULL
JqueryEngineHelper::$namedArgs = NULL
JqueryEngineHelper::$argSeparator = NULL
JqueryEngineHelper::$validationErrors = NULL
JqueryEngineHelper::$tags = array
JqueryEngineHelper::$__tainted = NULL
JqueryEngineHelper::$__cleaned = NULL
$js = JsHelper
JsHelper::$bufferScripts = false
JsHelper::$helpers = array
JsHelper::$__jsVars = array
JsHelper::$__bufferedScripts = array
JsHelper::$__engineName = "JqueryEngine"
JsHelper::$setVariable = "app"
JsHelper::$Sess = Sess object
JsHelper::$base = "/portal"
JsHelper::$webroot = "/portal/"
JsHelper::$theme = NULL
JsHelper::$here = "/portal/"
JsHelper::$params = array
JsHelper::$action = "index"
JsHelper::$plugin = NULL
JsHelper::$data = NULL
JsHelper::$namedArgs = NULL
JsHelper::$argSeparator = NULL
JsHelper::$validationErrors = NULL
JsHelper::$tags = array
JsHelper::$__tainted = NULL
JsHelper::$__cleaned = NULL
JsHelper::$Html = HtmlHelper object
JsHelper::$Form = FormHelper object
JsHelper::$JqueryEngine = JqueryEngineHelper object
$sess = SessHelper
SessHelper::$sessObj = Sess object
SessHelper::$Sess = Sess object
SessHelper::$helpers = NULL
SessHelper::$base = "/portal"
SessHelper::$webroot = "/portal/"
SessHelper::$theme = NULL
SessHelper::$here = "/portal/"
SessHelper::$params = array
SessHelper::$action = "index"
SessHelper::$plugin = NULL
SessHelper::$data = NULL
SessHelper::$namedArgs = NULL
SessHelper::$argSeparator = NULL
SessHelper::$validationErrors = NULL
SessHelper::$tags = array
SessHelper::$__tainted = NULL
SessHelper::$__cleaned = NULL
$nstime = NstimeHelper
NstimeHelper::$helpers = array
NstimeHelper::$Sess = Sess object
NstimeHelper::$base = "/portal"
NstimeHelper::$webroot = "/portal/"
NstimeHelper::$theme = NULL
NstimeHelper::$here = "/portal/"
NstimeHelper::$params = array
NstimeHelper::$action = "index"
NstimeHelper::$plugin = NULL
NstimeHelper::$data = NULL
NstimeHelper::$namedArgs = NULL
NstimeHelper::$argSeparator = NULL
NstimeHelper::$validationErrors = NULL
NstimeHelper::$tags = array
NstimeHelper::$__tainted = NULL
NstimeHelper::$__cleaned = NULL
NstimeHelper::$Session = SessionHelper object
NstimeHelper::$Uiconfig = UiconfigHelper object
NstimeHelper::$Localization = LocalizationHelper object
$contacts = ContactsHelper
ContactsHelper::$helpers = array
ContactsHelper::$Sess = Sess object
ContactsHelper::$base = "/portal"
ContactsHelper::$webroot = "/portal/"
ContactsHelper::$theme = NULL
ContactsHelper::$here = "/portal/"
ContactsHelper::$params = array
ContactsHelper::$action = "index"
ContactsHelper::$plugin = NULL
ContactsHelper::$data = NULL
ContactsHelper::$namedArgs = NULL
ContactsHelper::$argSeparator = NULL
ContactsHelper::$validationErrors = NULL
ContactsHelper::$tags = array
ContactsHelper::$__tainted = NULL
ContactsHelper::$__cleaned = NULL
ContactsHelper::$Session = SessionHelper object
ContactsHelper::$UiConfig = UiconfigHelper object
ContactsHelper::$Phonenumber = PhonenumberHelper object
$phonenumber = PhonenumberHelper
PhonenumberHelper::$helpers = array
PhonenumberHelper::$Sess = Sess object
PhonenumberHelper::$base = "/portal"
PhonenumberHelper::$webroot = "/portal/"
PhonenumberHelper::$theme = NULL
PhonenumberHelper::$here = "/portal/"
PhonenumberHelper::$params = array
PhonenumberHelper::$action = "index"
PhonenumberHelper::$plugin = NULL
PhonenumberHelper::$data = NULL
PhonenumberHelper::$namedArgs = NULL
PhonenumberHelper::$argSeparator = NULL
PhonenumberHelper::$validationErrors = NULL
PhonenumberHelper::$tags = array
PhonenumberHelper::$__tainted = NULL
PhonenumberHelper::$__cleaned = NULL
PhonenumberHelper::$Session = SessionHelper object
PhonenumberHelper::$Uiconfig = UiconfigHelper object
PhonenumberHelper::$Contacts = ContactsHelper object
$uiConfig = UiconfigHelper
UiconfigHelper::$helpers = array
UiconfigHelper::$Sess = Sess object
UiconfigHelper::$base = "/portal"
UiconfigHelper::$webroot = "/portal/"
UiconfigHelper::$theme = NULL
UiconfigHelper::$here = "/portal/"
UiconfigHelper::$params = array
UiconfigHelper::$action = "index"
UiconfigHelper::$plugin = NULL
UiconfigHelper::$data = NULL
UiconfigHelper::$namedArgs = NULL
UiconfigHelper::$argSeparator = NULL
UiconfigHelper::$validationErrors = NULL
UiconfigHelper::$tags = array
UiconfigHelper::$__tainted = NULL
UiconfigHelper::$__cleaned = NULL
UiconfigHelper::$Html = HtmlHelper object
UiconfigHelper::$Session = SessionHelper object
UiconfigHelper::$Form = FormHelper object
$messages = MessagesHelper
MessagesHelper::$helpers = array
MessagesHelper::$Sess = Sess object
MessagesHelper::$base = "/portal"
MessagesHelper::$webroot = "/portal/"
MessagesHelper::$theme = NULL
MessagesHelper::$here = "/portal/"
MessagesHelper::$params = array
MessagesHelper::$action = "index"
MessagesHelper::$plugin = NULL
MessagesHelper::$data = NULL
MessagesHelper::$namedArgs = NULL
MessagesHelper::$argSeparator = NULL
MessagesHelper::$validationErrors = NULL
MessagesHelper::$tags = array
MessagesHelper::$__tainted = NULL
MessagesHelper::$__cleaned = NULL
MessagesHelper::$Session = SessionHelper object
MessagesHelper::$Html = HtmlHelper object
MessagesHelper::$UiConfig = UiconfigHelper object
MessagesHelper::$Phonenumber = PhonenumberHelper object
MessagesHelper::$Contacts = ContactsHelper object
MessagesHelper::$Nstime = NstimeHelper object
$nshtml = NshtmlHelper
NshtmlHelper::$helpers = array
NshtmlHelper::$Sess = Sess object
NshtmlHelper::$base = "/portal"
NshtmlHelper::$webroot = "/portal/"
NshtmlHelper::$theme = NULL
NshtmlHelper::$here = "/portal/"
NshtmlHelper::$params = array
NshtmlHelper::$action = "index"
NshtmlHelper::$plugin = NULL
NshtmlHelper::$data = NULL
NshtmlHelper::$namedArgs = NULL
NshtmlHelper::$argSeparator = NULL
NshtmlHelper::$validationErrors = NULL
NshtmlHelper::$tags = array
NshtmlHelper::$__tainted = NULL
NshtmlHelper::$__cleaned = NULL
NshtmlHelper::$Html = HtmlHelper object
$localization = LocalizationHelper
LocalizationHelper::$helpers = array
LocalizationHelper::$Sess = Sess object
LocalizationHelper::$base = "/portal"
LocalizationHelper::$webroot = "/portal/"
LocalizationHelper::$theme = NULL
LocalizationHelper::$here = "/portal/"
LocalizationHelper::$params = array
LocalizationHelper::$action = "index"
LocalizationHelper::$plugin = NULL
LocalizationHelper::$data = NULL
LocalizationHelper::$namedArgs = NULL
LocalizationHelper::$argSeparator = NULL
LocalizationHelper::$validationErrors = NULL
LocalizationHelper::$tags = array
LocalizationHelper::$__tainted = NULL
LocalizationHelper::$__cleaned = NULL
LocalizationHelper::$Session = SessionHelper object
LocalizationHelper::$Uiconfig = UiconfigHelper object
$help = HelpHelper
HelpHelper::$helpers = array
HelpHelper::$Sess = Sess object
HelpHelper::$base = "/portal"
HelpHelper::$webroot = "/portal/"
HelpHelper::$theme = NULL
HelpHelper::$here = "/portal/"
HelpHelper::$params = array
HelpHelper::$action = "index"
HelpHelper::$plugin = NULL
HelpHelper::$data = NULL
HelpHelper::$namedArgs = NULL
HelpHelper::$argSeparator = NULL
HelpHelper::$validationErrors = NULL
HelpHelper::$tags = array
HelpHelper::$__tainted = NULL
HelpHelper::$__cleaned = NULL
HelpHelper::$Session = SessionHelper object
HelpHelper::$Uiconfig = UiconfigHelper object
HelpHelper::$Html = HtmlHelper object
$session = SessionHelper
SessionHelper::$helpers = array
SessionHelper::$__active = true
SessionHelper::$valid = false
SessionHelper::$error = false
SessionHelper::$_userAgent = "37def5f933e411292a31b5ff3bbfd296"
SessionHelper::$path = "/"
SessionHelper::$lastError = NULL
SessionHelper::$security = "medium"
SessionHelper::$time = 1787944575
SessionHelper::$sessionTime = 1787992575
SessionHelper::$cookieLifeTime = false
SessionHelper::$cookieSameSite = "Lax"
SessionHelper::$watchKeys = array
SessionHelper::$id = NULL
SessionHelper::$host = NULL
SessionHelper::$timeout = NULL
SessionHelper::$base = "/portal"
SessionHelper::$webroot = "/portal/"
SessionHelper::$here = "/portal/"
SessionHelper::$params = array
SessionHelper::$action = "index"
SessionHelper::$data = NULL
SessionHelper::$theme = NULL
SessionHelper::$plugin = NULL
$html = HtmlHelper
HtmlHelper::$tags = array
HtmlHelper::$_crumbs = array
HtmlHelper::$__includedScripts = array
HtmlHelper::$_scriptBlockOptions = array
HtmlHelper::$__docTypes = array
HtmlHelper::$Sess = Sess object
HtmlHelper::$helpers = NULL
HtmlHelper::$base = "/portal"
HtmlHelper::$webroot = "/portal/"
HtmlHelper::$theme = NULL
HtmlHelper::$here = "/portal/"
HtmlHelper::$params = array
HtmlHelper::$action = "index"
HtmlHelper::$plugin = NULL
HtmlHelper::$data = NULL
HtmlHelper::$namedArgs = NULL
HtmlHelper::$argSeparator = NULL
HtmlHelper::$validationErrors = NULL
HtmlHelper::$__tainted = NULL
HtmlHelper::$__cleaned = NULL
$uiconfig = UiconfigHelper
UiconfigHelper::$helpers = array
UiconfigHelper::$Sess = Sess object
UiconfigHelper::$base = "/portal"
UiconfigHelper::$webroot = "/portal/"
UiconfigHelper::$theme = NULL
UiconfigHelper::$here = "/portal/"
UiconfigHelper::$params = array
UiconfigHelper::$action = "index"
UiconfigHelper::$plugin = NULL
UiconfigHelper::$data = NULL
UiconfigHelper::$namedArgs = NULL
UiconfigHelper::$argSeparator = NULL
UiconfigHelper::$validationErrors = NULL
UiconfigHelper::$tags = array
UiconfigHelper::$__tainted = NULL
UiconfigHelper::$__cleaned = NULL
UiconfigHelper::$Html = HtmlHelper object
UiconfigHelper::$Session = SessionHelper object
UiconfigHelper::$Form = FormHelper objectinclude - APP/views/layouts/landing.ctp, line 13
View::_render() - CORE/cake/libs/view/view.php, line 736
View::renderLayout() - CORE/cake/libs/view/view.php, line 494
View::render() - CORE/cake/libs/view/view.php, line 440
Controller::render() - CORE/cake/libs/controller/controller.php, line 909
Dispatcher::_invoke() - CORE/cake/dispatcher.php, line 207
Dispatcher::dispatch() - CORE/cake/dispatcher.php, line 171
[main] - APP/webroot/index.php, line 121