Explorar el Código

saml session/error logging

GitOrigin-RevId: bc5e5cafbd4c5da7ba33891fa738efa9a95c5332
Ersun Warncke hace 7 años
padre
commit
7ea1a03c6b

+ 16 - 0
services/web/app/src/Features/Errors/ErrorController.js

@@ -2,6 +2,8 @@ let ErrorController
 const Errors = require('./Errors')
 const logger = require('logger-sharelatex')
 const AuthenticationController = require('../Authentication/AuthenticationController')
+const SamlLogHandler = require('../SamlLog/SamlLogHandler')
+const _ = require('lodash')
 
 module.exports = ErrorController = {
   notFound(req, res) {
@@ -21,6 +23,20 @@ module.exports = ErrorController = {
 
   handleError(error, req, res, next) {
     const user = AuthenticationController.getSessionUser(req)
+    // log errors related to SAML flow
+    if (req.session.saml) {
+      const providerId = _.get(req.session.saml, 'universityId', '').toString()
+      SamlLogHandler.log(providerId, req.sessionID, {
+        error: {
+          message: error && error.message,
+          stack: error && error.stack
+        },
+        path: req.path,
+        query: req.query,
+        saml: req.session.saml,
+        user_id: user && user._id
+      })
+    }
     if (error.code === 'EBADCSRFTOKEN') {
       logger.warn(
         { err: error, url: req.url, method: req.method, user },

+ 20 - 0
services/web/app/src/Features/SamlLog/SamlLogHandler.js

@@ -0,0 +1,20 @@
+const { SamlLog } = require('../../models/SamlLog')
+const logger = require('logger-sharelatex')
+
+function log(providerId, sessionId, data) {
+  const samlLog = new SamlLog()
+  samlLog.providerId = providerId
+  samlLog.sessionId = sessionId
+  samlLog.data = data
+  samlLog.save(err => {
+    if (err) {
+      logger.error({ err }, 'SamlLog Error')
+    }
+  })
+}
+
+const SamlLogHandler = {
+  log
+}
+
+module.exports = SamlLogHandler

+ 26 - 0
services/web/app/src/models/SamlLog.js

@@ -0,0 +1,26 @@
+const Settings = require('settings-sharelatex')
+const mongoose = require('mongoose')
+const { Schema } = mongoose
+
+const SamlLogSchema = new Schema(
+  {
+    createdAt: { type: Date, default: () => new Date() },
+    data: { type: Object, default: {} },
+    providerId: { type: String, default: '' },
+    sessionId: { type: String, default: '' }
+  },
+  {
+    collection: 'samlLogs'
+  }
+)
+
+const conn = mongoose.createConnection(Settings.mongo.url, {
+  server: { poolSize: Settings.mongo.poolSize || 10 },
+  config: { autoIndex: false }
+})
+
+const SamlLog = conn.model('SamlLog', SamlLogSchema)
+
+mongoose.model('SamlLog', SamlLogSchema)
+exports.SamlLog = SamlLog
+exports.SamlLogSchema = SamlLogSchema