Skip to content
Snippets Groups Projects
Unverified Commit 51a32f48 authored by xgui3783's avatar xgui3783 Committed by GitHub
Browse files

Merge branch 'staging' into dev

parents c98aca49 1a3d1ee0
No related branches found
No related tags found
No related merge requests found
Showing
with 157 additions and 8 deletions
......@@ -92,6 +92,11 @@ app.get('/', (req, res) => {
res.status(200).send(`${indexTemplate.replace(/\$\$NONCE\$\$/g, res.locals.nonce)}`)
})
/**
* User route, for user profile/management
*/
app.use('/user', require('./user'))
/**
* only use compression for production
* this allows locally built aot to be served without errors
......
const passport = require('passport')
const { configureAuth } = require('./oidc')
const HOSTNAME = process.env.HOSTNAME || 'http://localhost:3000'
const HOST_PATHNAME = process.env.HOST_PATHNAME || ''
const clientId = process.env.HBP_CLIENTID_V2 || 'no hbp id'
const clientSecret = process.env.HBP_CLIENTSECRET_V2 || 'no hbp client secret'
const discoveryUrl = 'https://iam.humanbrainproject.eu/auth/realms/hbp'
const redirectUri = `${HOSTNAME}${HOST_PATHNAME}/hbp-oidc-v2/cb`
const cb = (tokenset, {sub, given_name, family_name, ...rest}, done) => {
return done(null, {
id: `hbp-oidc-v2:${sub}`,
name: `${given_name} ${family_name}`,
type: `hbp-oidc-v2`,
tokenset,
rest
})
}
module.exports = async (app) => {
try {
const { oidcStrategy } = await configureAuth({
clientId,
clientSecret,
discoveryUrl,
redirectUri,
cb,
scope: 'openid email offline_access profile collab.drive',
clientConfig: {
redirect_uris: [ redirectUri ],
response_types: [ 'code' ]
}
})
passport.use('hbp-oidc-v2', oidcStrategy)
app.get('/hbp-oidc-v2/auth', passport.authenticate('hbp-oidc-v2'))
app.get('/hbp-oidc-v2/cb', passport.authenticate('hbp-oidc-v2', {
successRedirect: `${HOST_PATHNAME}/`,
failureRedirect: `${HOST_PATHNAME}/`
}))
} catch (e) {
console.error(e)
}
}
const hbpOidc = require('./hbp-oidc')
const hbpOidc2 = require('./hbp-oidc-v2')
const passport = require('passport')
const objStoreDb = new Map()
const HOST_PATHNAME = process.env.HOST_PATHNAME || ''
......@@ -20,14 +21,7 @@ module.exports = async (app) => {
})
await hbpOidc(app)
app.get('/user', (req, res) => {
if (req.user) {
return res.status(200).send(JSON.stringify(req.user))
} else {
return res.status(401).end()
}
})
await hbpOidc2(app)
app.get('/logout', (req, res) => {
if (req.user && req.user.id) objStoreDb.delete(req.user.id)
......
......@@ -19,6 +19,7 @@
"body-parser": "^1.19.0",
"express": "^4.16.4",
"express-session": "^1.15.6",
"hbp-seafile": "0.0.6",
"helmet-csp": "^2.8.0",
"jwt-decode": "^2.2.0",
"memorystore": "^1.6.1",
......
const router = require('express').Router()
const { readUserData, saveUserData } = require('./store')
const bodyParser = require('body-parser')
const loggedInOnlyMiddleware = (req, res, next) => {
const { user } = req
if (!user) return res.status(401).end()
return next()
}
router.get('', loggedInOnlyMiddleware, (req, res) => {
return res.status(200).send(JSON.stringify(req.user))
})
router.get('/config', loggedInOnlyMiddleware, async (req, res) => {
const { user } = req
try{
const data = await readUserData(user)
res.status(200).json(data)
} catch (e){
console.error(e)
res.status(500).send(e.toString())
}
})
router.post('/config', loggedInOnlyMiddleware, bodyParser.json(), async (req, res) => {
const { user, body } = req
try {
await saveUserData(user, body)
res.status(200).end()
} catch (e) {
console.error(e)
res.status(500).send(e.toString())
}
})
module.exports = router
\ No newline at end of file
const { Seafile } = require('hbp-seafile')
const { Readable } = require('stream')
const IAV_DIR_NAME = `interactive-atlas-viewer`
const IAV_DIRECTORY = `/${IAV_DIR_NAME}/`
const IAV_FILENAME = 'data.json'
const getNewSeafilehandle = async ({ accessToken }) => {
const seafileHandle = new Seafile({ accessToken })
await seafileHandle.init()
return seafileHandle
}
const saveUserData = async (user, data) => {
const { access_token } = user && user.tokenset || {}
if (!access_token) throw new Error(`user or user.tokenset not set can only save logged in user data`)
let handle = await getNewSeafilehandle({ accessToken: access_token })
const s = await handle.ls()
const found = s.find(({ type, name }) => type === 'dir' && name === IAV_DIR_NAME)
// if dir exists, check permission. throw if no writable or readable permission
if (found && !/w/.test(found.permission) && !/r/.test(found.permission)){
throw new Error(`Writing to file not permitted. Current permission: ${found.permission}`)
}
// create new dir if does not exist. Should have rw permission
if (!found) {
await handle.mkdir({ dir: IAV_DIR_NAME })
}
const fileLs = await handle.ls({ dir: IAV_DIRECTORY })
const fileFound = fileLs.find(({ type, name }) => type === 'file' && name === IAV_FILENAME )
const rStream = new Readable()
rStream.path = IAV_FILENAME
rStream.push(JSON.stringify(data))
rStream.push(null)
if(!fileFound) {
return handle.uploadFile({ readStream: rStream, filename: `${IAV_FILENAME}` }, { dir: IAV_DIRECTORY })
}
if (fileFound && !/w/.test(fileFound.permission)) {
return new Error('file permission cannot be written')
}
return handle.updateFile({ dir: IAV_DIRECTORY, replaceFilepath: `${IAV_DIRECTORY}${IAV_FILENAME}` }, { readStream: rStream, filename: IAV_FILENAME })
}
const readUserData = async (user) => {
const { access_token } = user && user.tokenset || {}
if (!access_token) throw new Error(`user or user.tokenset not set can only save logged in user data`)
let handle = await getNewSeafilehandle({ accessToken: access_token })
try {
const r = await handle.readFile({ dir: `${IAV_DIRECTORY}${IAV_FILENAME}` })
return JSON.parse(r)
}catch(e){
return {}
}
}
module.exports = {
saveUserData,
readUserData
}
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-100.png

25.5 KiB | W: | H:

src/res/images/AllenMouseCommonCoordinateFrameworkv32015-100.png

6.71 KiB | W: | H:

src/res/images/AllenMouseCommonCoordinateFrameworkv32015-100.png
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-100.png
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-100.png
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-100.png
  • 2-up
  • Swipe
  • Onion skin
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-200.png

78.4 KiB | W: | H:

src/res/images/AllenMouseCommonCoordinateFrameworkv32015-200.png

20.1 KiB | W: | H:

src/res/images/AllenMouseCommonCoordinateFrameworkv32015-200.png
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-200.png
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-200.png
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-200.png
  • 2-up
  • Swipe
  • Onion skin
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-300.png

150 KiB | W: | H:

src/res/images/AllenMouseCommonCoordinateFrameworkv32015-300.png

38.9 KiB | W: | H:

src/res/images/AllenMouseCommonCoordinateFrameworkv32015-300.png
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-300.png
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-300.png
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-300.png
  • 2-up
  • Swipe
  • Onion skin
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-400.png

235 KiB | W: | H:

src/res/images/AllenMouseCommonCoordinateFrameworkv32015-400.png

62.6 KiB | W: | H:

src/res/images/AllenMouseCommonCoordinateFrameworkv32015-400.png
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-400.png
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-400.png
src/res/images/AllenMouseCommonCoordinateFrameworkv32015-400.png
  • 2-up
  • Swipe
  • Onion skin
src/res/images/AllenMouseCommonCoordinateFrameworkv32015.png

433 KiB | W: | H:

src/res/images/AllenMouseCommonCoordinateFrameworkv32015.png

615 KiB | W: | H:

src/res/images/AllenMouseCommonCoordinateFrameworkv32015.png
src/res/images/AllenMouseCommonCoordinateFrameworkv32015.png
src/res/images/AllenMouseCommonCoordinateFrameworkv32015.png
src/res/images/AllenMouseCommonCoordinateFrameworkv32015.png
  • 2-up
  • Swipe
  • Onion skin
src/res/images/BigBrainHistology-100.png

22.1 KiB | W: | H:

src/res/images/BigBrainHistology-100.png

7.24 KiB | W: | H:

src/res/images/BigBrainHistology-100.png
src/res/images/BigBrainHistology-100.png
src/res/images/BigBrainHistology-100.png
src/res/images/BigBrainHistology-100.png
  • 2-up
  • Swipe
  • Onion skin
src/res/images/BigBrainHistology-200.png

75.9 KiB | W: | H:

src/res/images/BigBrainHistology-200.png

21.9 KiB | W: | H:

src/res/images/BigBrainHistology-200.png
src/res/images/BigBrainHistology-200.png
src/res/images/BigBrainHistology-200.png
src/res/images/BigBrainHistology-200.png
  • 2-up
  • Swipe
  • Onion skin
src/res/images/BigBrainHistology-300.png

161 KiB | W: | H:

src/res/images/BigBrainHistology-300.png

43.3 KiB | W: | H:

src/res/images/BigBrainHistology-300.png
src/res/images/BigBrainHistology-300.png
src/res/images/BigBrainHistology-300.png
src/res/images/BigBrainHistology-300.png
  • 2-up
  • Swipe
  • Onion skin
src/res/images/BigBrainHistology-400.png

270 KiB | W: | H:

src/res/images/BigBrainHistology-400.png

69.9 KiB | W: | H:

src/res/images/BigBrainHistology-400.png
src/res/images/BigBrainHistology-400.png
src/res/images/BigBrainHistology-400.png
src/res/images/BigBrainHistology-400.png
  • 2-up
  • Swipe
  • Onion skin
src/res/images/BigBrainHistology.png

574 KiB | W: | H:

src/res/images/BigBrainHistology.png

877 KiB | W: | H:

src/res/images/BigBrainHistology.png
src/res/images/BigBrainHistology.png
src/res/images/BigBrainHistology.png
src/res/images/BigBrainHistology.png
  • 2-up
  • Swipe
  • Onion skin
src/res/images/ICBM2009cNonlinearAsymmetric-100.png

19.2 KiB | W: | H:

src/res/images/ICBM2009cNonlinearAsymmetric-100.png

6.87 KiB | W: | H:

src/res/images/ICBM2009cNonlinearAsymmetric-100.png
src/res/images/ICBM2009cNonlinearAsymmetric-100.png
src/res/images/ICBM2009cNonlinearAsymmetric-100.png
src/res/images/ICBM2009cNonlinearAsymmetric-100.png
  • 2-up
  • Swipe
  • Onion skin
src/res/images/ICBM2009cNonlinearAsymmetric-200.png

54.5 KiB | W: | H:

src/res/images/ICBM2009cNonlinearAsymmetric-200.png

19.9 KiB | W: | H:

src/res/images/ICBM2009cNonlinearAsymmetric-200.png
src/res/images/ICBM2009cNonlinearAsymmetric-200.png
src/res/images/ICBM2009cNonlinearAsymmetric-200.png
src/res/images/ICBM2009cNonlinearAsymmetric-200.png
  • 2-up
  • Swipe
  • Onion skin
src/res/images/ICBM2009cNonlinearAsymmetric-300.png

101 KiB | W: | H:

src/res/images/ICBM2009cNonlinearAsymmetric-300.png

37.6 KiB | W: | H:

src/res/images/ICBM2009cNonlinearAsymmetric-300.png
src/res/images/ICBM2009cNonlinearAsymmetric-300.png
src/res/images/ICBM2009cNonlinearAsymmetric-300.png
src/res/images/ICBM2009cNonlinearAsymmetric-300.png
  • 2-up
  • Swipe
  • Onion skin
src/res/images/ICBM2009cNonlinearAsymmetric-400.png

155 KiB | W: | H:

src/res/images/ICBM2009cNonlinearAsymmetric-400.png

60.2 KiB | W: | H:

src/res/images/ICBM2009cNonlinearAsymmetric-400.png
src/res/images/ICBM2009cNonlinearAsymmetric-400.png
src/res/images/ICBM2009cNonlinearAsymmetric-400.png
src/res/images/ICBM2009cNonlinearAsymmetric-400.png
  • 2-up
  • Swipe
  • Onion skin
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment