mirror of
https://github.com/sasjs/server.git
synced 2025-12-10 19:34:34 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
375f924f45 | ||
|
|
72329e30ed | ||
| 40f95f9072 | |||
|
|
58e8a869ef | ||
|
|
b558a3d01d | ||
| 249604384e |
14
CHANGELOG.md
14
CHANGELOG.md
@@ -1,3 +1,17 @@
|
|||||||
|
## [0.21.6](https://github.com/sasjs/server/compare/v0.21.5...v0.21.6) (2022-09-23)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* in getTokensFromDB handle the scenario when tokens are expired ([40f95f9](https://github.com/sasjs/server/commit/40f95f9072c8685910138d88fd2410f8704fc975))
|
||||||
|
|
||||||
|
## [0.21.5](https://github.com/sasjs/server/compare/v0.21.4...v0.21.5) (2022-09-22)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* made files extensions case insensitive ([2496043](https://github.com/sasjs/server/commit/249604384e42be4c12c88c70a7dff90fc1917a8f))
|
||||||
|
|
||||||
## [0.21.4](https://github.com/sasjs/server/compare/v0.21.3...v0.21.4) (2022-09-21)
|
## [0.21.4](https://github.com/sasjs/server/compare/v0.21.3...v0.21.4) (2022-09-21)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { getFilesFolder } from './file'
|
|||||||
import { RunTimeType } from '.'
|
import { RunTimeType } from '.'
|
||||||
|
|
||||||
export const getRunTimeAndFilePath = async (programPath: string) => {
|
export const getRunTimeAndFilePath = async (programPath: string) => {
|
||||||
const ext = path.extname(programPath)
|
const ext = path.extname(programPath).toLowerCase()
|
||||||
// If programPath (_program) is provided with a ".sas", ".js", ".py" or ".r" extension
|
// If programPath (_program) is provided with a ".sas", ".js", ".py" or ".r" extension
|
||||||
// we should use that extension to determine the appropriate runTime
|
// we should use that extension to determine the appropriate runTime
|
||||||
if (ext && Object.values(RunTimeType).includes(ext.slice(1) as RunTimeType)) {
|
if (ext && Object.values(RunTimeType).includes(ext.slice(1) as RunTimeType)) {
|
||||||
|
|||||||
@@ -1,6 +1,27 @@
|
|||||||
import jwt from 'jsonwebtoken'
|
import jwt from 'jsonwebtoken'
|
||||||
import User from '../model/User'
|
import User from '../model/User'
|
||||||
|
|
||||||
|
const isValidToken = async (
|
||||||
|
token: string,
|
||||||
|
key: string,
|
||||||
|
userId: number,
|
||||||
|
clientId: string
|
||||||
|
) => {
|
||||||
|
const promise = new Promise<boolean>((resolve, reject) =>
|
||||||
|
jwt.verify(token, key, (err, decoded) => {
|
||||||
|
if (err) return reject(false)
|
||||||
|
|
||||||
|
if (decoded?.userId === userId && decoded?.clientId === clientId) {
|
||||||
|
return resolve(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
return reject(false)
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
|
return await promise.then(() => true).catch(() => false)
|
||||||
|
}
|
||||||
|
|
||||||
export const getTokensFromDB = async (userId: number, clientId: string) => {
|
export const getTokensFromDB = async (userId: number, clientId: string) => {
|
||||||
const user = await User.findOne({ id: userId })
|
const user = await User.findOne({ id: userId })
|
||||||
if (!user) return
|
if (!user) return
|
||||||
@@ -13,22 +34,22 @@ export const getTokensFromDB = async (userId: number, clientId: string) => {
|
|||||||
const accessToken = currentTokenObj.accessToken
|
const accessToken = currentTokenObj.accessToken
|
||||||
const refreshToken = currentTokenObj.refreshToken
|
const refreshToken = currentTokenObj.refreshToken
|
||||||
|
|
||||||
const verifiedAccessToken: any = jwt.verify(
|
const isValidAccessToken = await isValidToken(
|
||||||
accessToken,
|
accessToken,
|
||||||
process.secrets.ACCESS_TOKEN_SECRET
|
process.secrets.ACCESS_TOKEN_SECRET,
|
||||||
|
userId,
|
||||||
|
clientId
|
||||||
)
|
)
|
||||||
|
|
||||||
const verifiedRefreshToken: any = jwt.verify(
|
const isValidRefreshToken = await isValidToken(
|
||||||
refreshToken,
|
refreshToken,
|
||||||
process.secrets.REFRESH_TOKEN_SECRET
|
process.secrets.REFRESH_TOKEN_SECRET,
|
||||||
|
userId,
|
||||||
|
clientId
|
||||||
)
|
)
|
||||||
|
|
||||||
if (
|
if (isValidAccessToken && isValidRefreshToken) {
|
||||||
verifiedAccessToken?.userId === userId &&
|
|
||||||
verifiedAccessToken?.clientId === clientId &&
|
|
||||||
verifiedRefreshToken?.userId === userId &&
|
|
||||||
verifiedRefreshToken?.clientId === clientId
|
|
||||||
)
|
|
||||||
return { accessToken, refreshToken }
|
return { accessToken, refreshToken }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -236,7 +236,9 @@ const useEditor = ({
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (selectedFilePath) {
|
if (selectedFilePath) {
|
||||||
setIsLoading(true)
|
setIsLoading(true)
|
||||||
setSelectedFileExtension(selectedFilePath.split('.').pop() ?? '')
|
setSelectedFileExtension(
|
||||||
|
selectedFilePath.split('.').pop()?.toLowerCase() ?? ''
|
||||||
|
)
|
||||||
axios
|
axios
|
||||||
.get(`/SASjsApi/drive/file?_filePath=${selectedFilePath}`)
|
.get(`/SASjsApi/drive/file?_filePath=${selectedFilePath}`)
|
||||||
.then((res: any) => {
|
.then((res: any) => {
|
||||||
@@ -270,8 +272,8 @@ const useEditor = ({
|
|||||||
}, [fileContent, selectedFilePath])
|
}, [fileContent, selectedFilePath])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (runTimes.includes(selectedFileExtension))
|
const fileExtension = selectedFileExtension.toLowerCase()
|
||||||
setSelectedRunTime(selectedFileExtension)
|
if (runTimes.includes(fileExtension)) setSelectedRunTime(fileExtension)
|
||||||
}, [selectedFileExtension, runTimes])
|
}, [selectedFileExtension, runTimes])
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
Reference in New Issue
Block a user