Skip to content

Commit

Permalink
Add config for auto logout after browser inactivity
Browse files Browse the repository at this point in the history
Signed-off-by: Julius Härtl <[email protected]>
  • Loading branch information
juliusknorr authored and rullzer committed Apr 6, 2020
1 parent e96a7d5 commit c21af6d
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 6 deletions.
9 changes: 9 additions & 0 deletions config/config.sample.php
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,15 @@
*/
'session_keepalive' => true,

/**
* Enable or disable the automatic logout after session_lifetime, even if session
* keepalive is enabled. This will make sure that an inactive browser will be logged out
* even if requests to the server might extend the session lifetime.
*
* Defaults to ``false``
*/
'auto_logout' => false,

/**
* Enforce token authentication for clients, which blocks requests using the user
* password for enhanced security. Users need to generate tokens in personal settings
Expand Down
50 changes: 44 additions & 6 deletions core/src/session-heartbeat.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,21 @@

import $ from 'jquery'
import { emit } from '@nextcloud/event-bus'
import { loadState } from '@nextcloud/initial-state'
import { getCurrentUser } from '@nextcloud/auth'

import { generateUrl } from './OC/routing'
import OC from './OC'
import { setToken as setRequestToken } from './OC/requesttoken'
import { setToken as setRequestToken, getToken as getRequestToken } from './OC/requesttoken'

const config = loadState('core', 'config')

/**
* session heartbeat (defaults to enabled)
* @returns {boolean}
*/
const keepSessionAlive = () => {
return OC.config.session_keepalive === undefined
|| !!OC.config.session_keepalive
return config.session_keepalive === undefined
|| !!config.session_keepalive
}

/**
Expand All @@ -41,8 +44,8 @@ const keepSessionAlive = () => {
*/
const getInterval = () => {
let interval = NaN
if (OC.config.session_lifetime) {
interval = Math.floor(OC.config.session_lifetime / 2)
if (config.session_lifetime) {
interval = Math.floor(config.session_lifetime / 2)
}

// minimum one minute, max 24 hours, default 15 minutes
Expand Down Expand Up @@ -83,11 +86,46 @@ const startPolling = () => {
return interval
}

const registerAutoLogout = () => {
if (!config.auto_logout || !getCurrentUser()) {
return
}

let lastActive = Date.now()
window.addEventListener('mousemove', e => {
lastActive = Date.now()
localStorage.setItem('lastActive', lastActive)
})

window.addEventListener('touchstart', e => {
lastActive = Date.now()
localStorage.setItem('lastActive', lastActive)
})

window.addEventListener('storage', e => {
if (e.key !== 'lastActive') {
return
}
lastActive = e.newValue
})

setInterval(function() {
const timeout = Date.now() - config.session_lifetime * 1000
if (lastActive < timeout) {
console.info('Inactivity timout reached, logging out')
const logoutUrl = generateUrl('/logout') + '?requesttoken=' + getRequestToken()
window.location = logoutUrl
}
}, 1000)
}

/**
* Calls the server periodically to ensure that session and CSRF
* token doesn't expire
*/
export const initSessionHeartBeat = () => {
registerAutoLogout()

if (!keepSessionAlive()) {
console.info('session heartbeat disabled')
return
Expand Down

0 comments on commit c21af6d

Please sign in to comment.