From d9057bc33bacd2d3a8df757ce71f79d611716ad9 Mon Sep 17 00:00:00 2001 From: Saad Jutt Date: Wed, 10 Nov 2021 08:04:45 +0500 Subject: [PATCH] chore: added preProgramVariables --- api/src/controllers/Execution.ts | 15 ++++++++++++++- api/src/controllers/Session.ts | 4 +++- api/src/middlewares/authenticateToken.ts | 1 + api/src/routes/api/stp.ts | 20 ++++++++++++++++++-- api/src/types/index.ts | 5 +++-- api/src/utils/verifyTokenInDB.ts | 1 + 6 files changed, 40 insertions(+), 6 deletions(-) diff --git a/api/src/controllers/Execution.ts b/api/src/controllers/Execution.ts index 76378b2..5169ca3 100644 --- a/api/src/controllers/Execution.ts +++ b/api/src/controllers/Execution.ts @@ -5,7 +5,7 @@ import { readFile, fileExists, createFile } from '@sasjs/utils' import { configuration } from '../../package.json' import { promisify } from 'util' import { execFile } from 'child_process' -import { Session, TreeNode } from '../types' +import { PreProgramVars, Session, TreeNode } from '../types' import { generateFileUploadSasCode, getTmpFilesFolderPath } from '../utils' const execFilePromise = promisify(execFile) @@ -13,6 +13,7 @@ const execFilePromise = promisify(execFile) export class ExecutionController { async execute( program = '', + preProgramVariables?: PreProgramVars, autoExec?: string, session?: Session, vars?: any, @@ -45,7 +46,19 @@ export class ExecutionController { let webout = path.join(session.path, 'webout.txt') await createFile(webout, '') + const tokenFile = path.join(session.path, 'accessToken.txt') + await createFile( + tokenFile, + preProgramVariables?.accessToken ?? 'accessToken' + ) + program = ` +%let _sasjs_tokenfile=${tokenFile}; +%let _sasjs_username=${preProgramVariables?.username}; +%let _sasjs_userid=${preProgramVariables?.userId}; +%let _sasjs_displayname=${preProgramVariables?.displayName}; +%let _sasjs_apiserverurl=${preProgramVariables?.serverUrl}; +%let _sasjs_apipath=/SASjsApi/stp/execute; %let sasjsprocessmode=Stored Program; filename _webout "${webout}"; ${program}` diff --git a/api/src/controllers/Session.ts b/api/src/controllers/Session.ts index 3e9af19..abdf014 100644 --- a/api/src/controllers/Session.ts +++ b/api/src/controllers/Session.ts @@ -70,7 +70,9 @@ export class SessionController { this.scheduleSessionDestroy(session) - this.executionController.execute('', autoExec, session).catch(() => {}) + this.executionController + .execute('', undefined, autoExec, session) + .catch(() => {}) this.sessions.push(session) diff --git a/api/src/middlewares/authenticateToken.ts b/api/src/middlewares/authenticateToken.ts index b4d9ddf..45e1d07 100644 --- a/api/src/middlewares/authenticateToken.ts +++ b/api/src/middlewares/authenticateToken.ts @@ -46,6 +46,7 @@ const authenticateToken = ( if (user) { if (user.isActive) { req.user = user + if (tokenType === 'accessToken') req.accessToken = token return next() } else return res.sendStatus(401) } diff --git a/api/src/routes/api/stp.ts b/api/src/routes/api/stp.ts index d7ab22a..e891a97 100644 --- a/api/src/routes/api/stp.ts +++ b/api/src/routes/api/stp.ts @@ -1,5 +1,5 @@ import express from 'express' -import { isExecutionQuery } from '../../types' +import { isExecutionQuery, PreProgramVars } from '../../types' import path from 'path' import { getTmpFilesFolderPath, makeFilesNamesMap } from '../../utils' import { ExecutionController, FileUploadController } from '../../controllers' @@ -16,7 +16,9 @@ stpRouter.get('/execute', async (req, res) => { .replace(new RegExp('/', 'g'), path.sep) + '.sas' await new ExecutionController() - .execute(sasCodePath, undefined, undefined, { ...req.query }) + .execute(sasCodePath, getPreProgramVariables(req), undefined, undefined, { + ...req.query + }) .then((result: {}) => { res.status(200).send(result) }) @@ -62,6 +64,7 @@ stpRouter.post( await new ExecutionController() .execute( sasCodePath, + getPreProgramVariables(req), undefined, req.sasSession, { ...req.query, ...req.body }, @@ -90,4 +93,17 @@ stpRouter.post( } ) +const getPreProgramVariables = (req: any): PreProgramVars => { + const host = req.get('host') + const protocol = req.protocol + '://' + const { user, accessToken } = req + return { + username: user.username, + userId: user.userId, + displayName: user.displayName, + serverUrl: protocol + host, + accessToken + } +} + export default stpRouter diff --git a/api/src/types/index.ts b/api/src/types/index.ts index 2b8f15a..81bbff6 100644 --- a/api/src/types/index.ts +++ b/api/src/types/index.ts @@ -1,7 +1,8 @@ // TODO: uppercase types export * from './Execution' -export * from './Request' export * from './FileTree' -export * from './Session' export * from './InfoJWT' +export * from './PreProgramVars' +export * from './Request' +export * from './Session' export * from './TreeNode' diff --git a/api/src/utils/verifyTokenInDB.ts b/api/src/utils/verifyTokenInDB.ts index 3ce6917..f8397bb 100644 --- a/api/src/utils/verifyTokenInDB.ts +++ b/api/src/utils/verifyTokenInDB.ts @@ -19,6 +19,7 @@ export const verifyTokenInDB = async ( userId: dbUser.id, clientId, username: dbUser.username, + displayName: dbUser.displayName, isAdmin: dbUser.isAdmin, isActive: dbUser.isActive }