Эх сурвалжийг харах

WIP: display sessions on a page

Shane Kilkelly 10 жил өмнө
parent
commit
894c549ec6

+ 9 - 0
services/web/app/coffee/Features/User/UserPagesController.coffee

@@ -1,5 +1,6 @@
 UserLocator = require("./UserLocator")
 UserLocator = require("./UserLocator")
 UserGetter = require("./UserGetter")
 UserGetter = require("./UserGetter")
+UserSessionsManager = require("./UserSessionsManager")
 ErrorController = require("../Errors/ErrorController")
 ErrorController = require("../Errors/ErrorController")
 logger = require("logger-sharelatex")
 logger = require("logger-sharelatex")
 Settings = require("settings-sharelatex")
 Settings = require("settings-sharelatex")
@@ -63,3 +64,11 @@ module.exports =
 				user: user,
 				user: user,
 				languages: Settings.languages,
 				languages: Settings.languages,
 				accountSettingsTabActive: true
 				accountSettingsTabActive: true
+
+	sessionsPage: (req, res, next) ->
+		user_id = AuthenticationController.getLoggedInUserId(req)
+		logger.log user: user_id, "loading settings page"
+		UserSessionsManager.getAllUserSessions user_id, (err, sessions) ->
+			res.render 'user/sessions',
+				title: "sessions"
+				sessions: sessions

+ 26 - 0
services/web/app/coffee/Features/User/UserSessionsManager.coffee

@@ -3,6 +3,7 @@ redis = require('redis-sharelatex')
 logger = require("logger-sharelatex")
 logger = require("logger-sharelatex")
 Async = require('async')
 Async = require('async')
 _ = require('underscore')
 _ = require('underscore')
+crypto = require('crypto')
 
 
 rclient = redis.createClient(Settings.redis.web)
 rclient = redis.createClient(Settings.redis.web)
 
 
@@ -55,6 +56,31 @@ module.exports = UserSessionsManager =
 				UserSessionsManager._checkSessions(user, () ->)
 				UserSessionsManager._checkSessions(user, () ->)
 				callback()
 				callback()
 
 
+	getAllUserSessions: (user_id, callback=(err, sessionKeys)->) ->
+		sessionSetKey = UserSessionsManager._sessionSetKey({_id: user_id})
+		rclient.smembers sessionSetKey, (err, sessionKeys) ->
+			if err?
+				logger.err {user_id}, "error getting all session keys for user from redis"
+				return callback(err)
+			rclient.mget sessionKeys, (err, sessions) ->
+				if err?
+					logger.err {user_id}, "error getting all sessions for user from redis"
+					return callback(err)
+
+				hashedSessionKeys = sessionKeys.map (key) ->
+					crypto.createHash('md5').update(key).digest('hex')
+				expiries = sessions.map (s) ->
+					if s == null
+						return null
+					s = JSON.parse(s)
+					s?.user?.session_created or s?.passport?.user?.session_created
+				pairs = _.zip(hashedSessionKeys, expiries)
+				result = []
+				for pair in pairs
+					result.push {id: pair[0], expires: pair[1]}
+				console.log ">> result:", result
+				return callback(null, result)
+
 	revokeAllUserSessions: (user, retain, callback=(err)->) ->
 	revokeAllUserSessions: (user, retain, callback=(err)->) ->
 		if !retain
 		if !retain
 			retain = []
 			retain = []

+ 2 - 0
services/web/app/coffee/router.coffee

@@ -88,6 +88,8 @@ module.exports = class Router
 		webRouter.post '/user/settings', AuthenticationController.requireLogin(), UserController.updateUserSettings
 		webRouter.post '/user/settings', AuthenticationController.requireLogin(), UserController.updateUserSettings
 		webRouter.post '/user/password/update', AuthenticationController.requireLogin(), UserController.changePassword
 		webRouter.post '/user/password/update', AuthenticationController.requireLogin(), UserController.changePassword
 
 
+		webRouter.get '/user/sessions', AuthenticationController.requireLogin(), UserPagesController.sessionsPage
+
 		webRouter.delete '/user/newsletter/unsubscribe', AuthenticationController.requireLogin(), UserController.unsubscribe
 		webRouter.delete '/user/newsletter/unsubscribe', AuthenticationController.requireLogin(), UserController.unsubscribe
 		webRouter.delete '/user', AuthenticationController.requireLogin(), UserController.deleteUser
 		webRouter.delete '/user', AuthenticationController.requireLogin(), UserController.deleteUser
 
 

+ 14 - 0
services/web/app/views/user/sessions.jade

@@ -0,0 +1,14 @@
+extends ../layout
+
+block content
+	.content.content-alt
+		.container
+			.row
+				.col-md-10.col-md-offset-1.col-lg-8.col-lg-offset-2
+					.card
+						.page-header
+							h1  #{translate("your_sessions")}
+						.sessions-list
+							each session in sessions
+								div.session
+									| #{session.id} - #{session.expires}