Employee Portal
HR & Operations Platform
India Gully Enterprise Platform
2FA Required
Open your authenticator app and enter the 6-digit code for India Gully. Code refreshes every 30 seconds.
Need help? Contact support →
Too many failed attempts, account locked for 300s. Contact admin@indiagully.com or call +91 8988 988 988 for immediate unlock.
Authorised users only. All access is logged and monitored.
(function(){ var portal='employee'; /* ── CSRF token ── */ var csrf=Array.from(crypto.getRandomValues(new Uint8Array(16))).map(b=>(b).toString(16).padStart(2,'0')).join(''); var csrfEl=document.getElementById('csrf-'+portal); if(csrfEl) csrfEl.value=csrf; sessionStorage.setItem('ig_csrf_'+portal, csrf); /* TOTP generated by authenticator app — no codes displayed server-side */ /* ── Rate limiting (5 attempts → 5min lockout) ── */ var attKey='ig_attempts_'+portal; var lockKey='ig_lock_'+portal; var form=document.getElementById('login-form-'+portal); function igCheckLockout(){ var lock=parseInt(localStorage.getItem(lockKey)||'0'); if(lock>Date.now()){ var btn=document.getElementById('login-btn-'+portal); if(btn) btn.disabled=true; var banner=document.getElementById('lockout-banner-'+portal); if(banner) banner.style.display='block'; var timerEl=document.getElementById('lockout-timer-'+portal); var iv=setInterval(function(){ var rem=Math.ceil((parseInt(localStorage.getItem(lockKey)||'0')-Date.now())/1000); if(rem<=0){clearInterval(iv);localStorage.removeItem(lockKey);localStorage.setItem(attKey,'0');location.reload();} else if(timerEl) timerEl.textContent=String(rem); },1000); return true; } return false; } igCheckLockout(); if(form) form.addEventListener('submit',function(e){ var lock=parseInt(localStorage.getItem(lockKey)||'0'); if(lock>Date.now()){e.preventDefault();return;} var att=parseInt(localStorage.getItem(attKey)||'0')+1; localStorage.setItem(attKey,String(att)); if(att>=5){localStorage.setItem(lockKey,String(Date.now()+300000));localStorage.setItem(attKey,'0');e.preventDefault();igCheckLockout();} }); /* ── Session timeout (30min inactivity) ── */ var actKey='ig_lastact_'+portal; function igResetTimer(){localStorage.setItem(actKey,String(Date.now()));} ['click','keydown','mousemove','touchstart'].forEach(function(ev){document.addEventListener(ev,igResetTimer,{passive:true});}); igResetTimer(); setInterval(function(){ var last=parseInt(localStorage.getItem(actKey)||String(Date.now())); if(Date.now()-last>30*60*1000){localStorage.setItem(actKey,String(Date.now()));location.href='/portal/'+portal+'?timeout=1';} },60000); })();