@sassoftware/viya-serverjs 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/.babelrc +6 -0
  2. package/.dockerignore +2 -0
  3. package/.env +29 -0
  4. package/.env.proxy +31 -0
  5. package/.env.server +29 -0
  6. package/.eslintignore +4 -0
  7. package/.eslintrc.json +42 -0
  8. package/Dockerfile +44 -0
  9. package/README.md +6 -4
  10. package/cli.js +9 -0
  11. package/images/viya-apiserverjs.png +0 -0
  12. package/lib/{core/config.js → config.js} +5 -24
  13. package/lib/handlers/appCallback.js +62 -0
  14. package/lib/handlers/codeAuth.js +61 -0
  15. package/lib/{core/handlers → handlers}/decodeJwt.js +2 -2
  16. package/lib/handlers/favicon.js +45 -0
  17. package/lib/handlers/getApp.js +77 -0
  18. package/lib/handlers/getApp2.js +48 -0
  19. package/lib/handlers/getUser.js +49 -0
  20. package/lib/{core/handlers → handlers}/index.js +2 -2
  21. package/lib/handlers/keepAlive.js +99 -0
  22. package/lib/handlers/keepAlive2.js +33 -0
  23. package/lib/handlers/logon.js +44 -0
  24. package/lib/handlers/logout.js +88 -0
  25. package/lib/handlers/proxyMapUri.js +78 -0
  26. package/lib/handlers/proxyOnResponse.js +26 -0
  27. package/lib/handlers/reactDev.js +52 -0
  28. package/lib/handlers/setCookies.js +110 -0
  29. package/lib/{core/iService.js → iService.js} +45 -30
  30. package/lib/index.js +177 -10
  31. package/lib/{core/parseDocker.js → parseDocker.js} +1 -1
  32. package/lib/plugins/SASauth.js +101 -0
  33. package/lib/plugins/appCookie.js +99 -0
  34. package/lib/plugins/setContext.js +56 -0
  35. package/lib/{core/plugins → plugins}/setDefaultRoutes.js +67 -58
  36. package/lib/plugins/setupAuth.js +87 -0
  37. package/lib/{core/plugins → plugins}/setupUserRoutes.js +21 -12
  38. package/lib/plugins/token.js +31 -0
  39. package/lib/schemes/SASTokenScheme.js +71 -0
  40. package/package.json +54 -10
  41. package/packages/core/config.js +86 -0
  42. package/packages/core/handlers/appCallback.js +40 -0
  43. package/packages/core/handlers/codeAuth.js +31 -0
  44. package/packages/core/handlers/decodeJwt.js +11 -0
  45. package/packages/core/handlers/favicon.js +24 -0
  46. package/packages/core/handlers/getApp.js +41 -0
  47. package/packages/core/handlers/getApp2.js +26 -0
  48. package/packages/core/handlers/getUser.js +20 -0
  49. package/packages/core/handlers/index.js +36 -0
  50. package/packages/core/handlers/keepAlive.js +54 -0
  51. package/packages/core/handlers/keepAlive2.js +13 -0
  52. package/packages/core/handlers/logon.js +24 -0
  53. package/packages/core/handlers/logout.js +43 -0
  54. package/{lib → packages}/core/handlers/proxyMapUri.js +25 -36
  55. package/packages/core/handlers/proxyOnResponse.js +12 -0
  56. package/packages/core/handlers/reactDev.js +30 -0
  57. package/packages/core/handlers/setCookies.js +78 -0
  58. package/packages/core/iService.js +369 -0
  59. package/packages/core/index.js +249 -0
  60. package/packages/core/parseDocker.js +33 -0
  61. package/packages/core/plugins/SASauth.js +79 -0
  62. package/packages/core/plugins/appCookie.js +49 -0
  63. package/packages/core/plugins/setContext.js +34 -0
  64. package/packages/core/plugins/setDefaultRoutes.js +262 -0
  65. package/packages/core/plugins/setupAuth.js +48 -0
  66. package/packages/core/plugins/setupUserRoutes.js +48 -0
  67. package/packages/core/plugins/token.js +10 -0
  68. package/packages/core/schemes/SASTokenScheme.js +43 -0
  69. package/packages/core/visionIndex.html +24 -0
  70. package/packages/examples/apitest/.env +11 -0
  71. package/packages/examples/apitest/.eslintrc.json +42 -0
  72. package/packages/examples/apitest/Dockerfile +41 -0
  73. package/packages/examples/apitest/api.js +88 -0
  74. package/packages/examples/apitest/appenv.js +6 -0
  75. package/packages/examples/apitest/docker-compose.yml +10 -0
  76. package/packages/examples/apitest/package.json +19 -0
  77. package/packages/examples/apitest/public/data/Cluster_SDOH1.sas +182 -0
  78. package/packages/examples/apitest/public/data/Cluster_SDOH6.sas +180 -0
  79. package/packages/examples/apitest/public/data/LeNet_snzrle.astore +0 -0
  80. package/packages/examples/apitest/public/data/NeuralNetwork_High_med.sas +2409 -0
  81. package/packages/examples/apitest/public/data/NeuralNetwork_high_med1.sas +2409 -0
  82. package/packages/examples/apitest/public/data/ast/GBlocalcopy.sasast +0 -0
  83. package/packages/examples/apitest/public/data/ast/LeNet_snzrle.astore +0 -0
  84. package/packages/examples/apitest/public/data/ast/gb_IrisGB.sasast +0 -0
  85. package/packages/examples/apitest/public/data/ast/paysimsvdd.sasast +0 -0
  86. package/packages/examples/apitest/public/data/ast/svmlocalcopy.sasast +0 -0
  87. package/packages/examples/apitest/public/data/cars.csv +429 -0
  88. package/packages/examples/apitest/public/data/cluster_test2.sas7bdat +0 -0
  89. package/packages/examples/apitest/public/data/cmdList.txt +15 -0
  90. package/packages/examples/apitest/public/data/gradBoost.sashdat +0 -0
  91. package/packages/examples/apitest/public/data/iris.csv +151 -0
  92. package/packages/examples/apitest/public/data/model1.sas7bdat +0 -0
  93. package/packages/examples/apitest/public/favicon.ico +0 -0
  94. package/packages/examples/apitest/public/index.html +316 -0
  95. package/packages/examples/apitest/public/index2.html +102 -0
  96. package/packages/examples/apitest/public/logon.html +42 -0
  97. package/packages/examples/apitest/public/myapp/secondary.html +1 -0
  98. package/packages/examples/apitest/public/myapp/test.js +2 -0
  99. package/packages/examples/apitest/public/onlogoff.html +53 -0
  100. package/packages/examples/apitest/start.sh +15 -0
  101. package/packages/examples/app/.env +32 -0
  102. package/packages/examples/app/.envProxy +19 -0
  103. package/packages/examples/app/.envimpl +12 -0
  104. package/packages/examples/app/.eslintrc.json +42 -0
  105. package/packages/examples/app/Dockerfile +42 -0
  106. package/packages/examples/app/appenv.js +6 -0
  107. package/packages/examples/app/certs/ca.crt +19 -0
  108. package/packages/examples/app/certs/tls.crt +25 -0
  109. package/packages/examples/app/certs/tls.key +28 -0
  110. package/packages/examples/app/certs/tls.sh +5 -0
  111. package/packages/examples/app/docker-compose.yml +12 -0
  112. package/packages/examples/app/index.js +15 -0
  113. package/packages/examples/app/package.json +20 -0
  114. package/packages/examples/app/public/casread.html +324 -0
  115. package/packages/examples/app/public/data/Cluster_SDOH1.sas +182 -0
  116. package/packages/examples/app/public/data/Cluster_SDOH6.sas +180 -0
  117. package/packages/examples/app/public/data/LeNet_snzrle.astore +0 -0
  118. package/packages/examples/app/public/data/NeuralNetwork_High_med.sas +2409 -0
  119. package/packages/examples/app/public/data/NeuralNetwork_high_med1.sas +2409 -0
  120. package/packages/examples/app/public/data/ast/GBlocalcopy.sasast +0 -0
  121. package/packages/examples/app/public/data/ast/LeNet_snzrle.astore +0 -0
  122. package/packages/examples/app/public/data/ast/gb_IrisGB.sasast +0 -0
  123. package/packages/examples/app/public/data/ast/paysimsvdd.sasast +0 -0
  124. package/packages/examples/app/public/data/ast/svmlocalcopy.sasast +0 -0
  125. package/packages/examples/app/public/data/cars.csv +429 -0
  126. package/packages/examples/app/public/data/cluster_test2.sas7bdat +0 -0
  127. package/packages/examples/app/public/data/cmdList.txt +15 -0
  128. package/packages/examples/app/public/data/gradBoost.sashdat +0 -0
  129. package/packages/examples/app/public/data/iris.csv +151 -0
  130. package/packages/examples/app/public/data/model1.sas7bdat +0 -0
  131. package/packages/examples/app/public/favicon.ico +0 -0
  132. package/packages/examples/app/public/index.html +332 -0
  133. package/packages/examples/app/public/indexProxy.html +346 -0
  134. package/packages/examples/app/public/indextest.html +316 -0
  135. package/packages/examples/app/public/logon.html +44 -0
  136. package/packages/examples/app/public/micburger.html +345 -0
  137. package/packages/examples/app/public/micburger.txt.html +311 -0
  138. package/packages/examples/app/public/myapp/secondary.html +1 -0
  139. package/packages/examples/app/public/myapp/test.js +2 -0
  140. package/packages/examples/app/public/sara.txt +345 -0
  141. package/packages/examples/app/public/testva2.html +311 -0
  142. package/packages/examples/app/startup.sh +15 -0
  143. package/packages/examples/appdocker/.env +21 -0
  144. package/packages/examples/appdocker/.envProxy +22 -0
  145. package/packages/examples/appdocker/.envimpl +12 -0
  146. package/packages/examples/appdocker/.eslintrc.json +42 -0
  147. package/packages/examples/appdocker/Dockerfile +43 -0
  148. package/packages/examples/appdocker/appenv.js +6 -0
  149. package/packages/examples/appdocker/certs/ca.crt +19 -0
  150. package/packages/examples/appdocker/certs/tls.crt +25 -0
  151. package/packages/examples/appdocker/certs/tls.key +28 -0
  152. package/packages/examples/appdocker/certs/tls.sh +5 -0
  153. package/packages/examples/appdocker/docker-compose.yml +12 -0
  154. package/packages/examples/appdocker/index.js +15 -0
  155. package/packages/examples/appdocker/package.json +20 -0
  156. package/packages/examples/appdocker/public/data/Cluster_SDOH1.sas +182 -0
  157. package/packages/examples/appdocker/public/data/Cluster_SDOH6.sas +180 -0
  158. package/packages/examples/appdocker/public/data/LeNet_snzrle.astore +0 -0
  159. package/packages/examples/appdocker/public/data/NeuralNetwork_High_med.sas +2409 -0
  160. package/packages/examples/appdocker/public/data/NeuralNetwork_high_med1.sas +2409 -0
  161. package/packages/examples/appdocker/public/data/ast/GBlocalcopy.sasast +0 -0
  162. package/packages/examples/appdocker/public/data/ast/LeNet_snzrle.astore +0 -0
  163. package/packages/examples/appdocker/public/data/ast/gb_IrisGB.sasast +0 -0
  164. package/packages/examples/appdocker/public/data/ast/paysimsvdd.sasast +0 -0
  165. package/packages/examples/appdocker/public/data/ast/svmlocalcopy.sasast +0 -0
  166. package/packages/examples/appdocker/public/data/cars.csv +429 -0
  167. package/packages/examples/appdocker/public/data/cluster_test2.sas7bdat +0 -0
  168. package/packages/examples/appdocker/public/data/cmdList.txt +15 -0
  169. package/packages/examples/appdocker/public/data/gradBoost.sashdat +0 -0
  170. package/packages/examples/appdocker/public/data/iris.csv +151 -0
  171. package/packages/examples/appdocker/public/data/model1.sas7bdat +0 -0
  172. package/packages/examples/appdocker/public/favicon.ico +0 -0
  173. package/packages/examples/appdocker/public/index.html +346 -0
  174. package/packages/examples/appdocker/public/indexProxy.html +346 -0
  175. package/packages/examples/appdocker/public/indextest.html +316 -0
  176. package/packages/examples/appdocker/public/logon.html +44 -0
  177. package/packages/examples/appdocker/public/myapp/secondary.html +1 -0
  178. package/packages/examples/appdocker/public/myapp/test.js +2 -0
  179. package/packages/examples/appdocker/startup.sh +15 -0
  180. package/packages/examples/apptest/.env +28 -0
  181. package/packages/examples/apptest/.envProxy +22 -0
  182. package/packages/examples/apptest/.envimpl +12 -0
  183. package/packages/examples/apptest/.eslintrc.json +42 -0
  184. package/packages/examples/apptest/Dockerfile +44 -0
  185. package/packages/examples/apptest/appDir/app1/design.html +350 -0
  186. package/packages/examples/apptest/appDir/app1/index.html +353 -0
  187. package/packages/examples/apptest/appDir/index.html +350 -0
  188. package/packages/examples/apptest/appenv.js +6 -0
  189. package/packages/examples/apptest/docker-compose.yml +12 -0
  190. package/packages/examples/apptest/index.js +444 -0
  191. package/packages/examples/apptest/package.json +24 -0
  192. package/packages/examples/apptest/public/casread2.html +321 -0
  193. package/packages/examples/apptest/public/data/Cluster_SDOH1.sas +182 -0
  194. package/packages/examples/apptest/public/data/Cluster_SDOH6.sas +180 -0
  195. package/packages/examples/apptest/public/data/LeNet_snzrle.astore +0 -0
  196. package/packages/examples/apptest/public/data/NeuralNetwork_High_med.sas +2409 -0
  197. package/packages/examples/apptest/public/data/NeuralNetwork_high_med1.sas +2409 -0
  198. package/packages/examples/apptest/public/data/ast/GBlocalcopy.sasast +0 -0
  199. package/packages/examples/apptest/public/data/ast/LeNet_snzrle.astore +0 -0
  200. package/packages/examples/apptest/public/data/ast/gb_IrisGB.sasast +0 -0
  201. package/packages/examples/apptest/public/data/ast/paysimsvdd.sasast +0 -0
  202. package/packages/examples/apptest/public/data/ast/svmlocalcopy.sasast +0 -0
  203. package/packages/examples/apptest/public/data/cars.csv +429 -0
  204. package/packages/examples/apptest/public/data/cluster_test2.sas7bdat +0 -0
  205. package/packages/examples/apptest/public/data/cmdList.txt +15 -0
  206. package/packages/examples/apptest/public/data/gradBoost.sashdat +0 -0
  207. package/packages/examples/apptest/public/data/iris.csv +151 -0
  208. package/packages/examples/apptest/public/data/model1.sas7bdat +0 -0
  209. package/packages/examples/apptest/public/design.html +349 -0
  210. package/packages/examples/apptest/public/favicon.ico +0 -0
  211. package/packages/examples/apptest/public/help.html +1 -0
  212. package/packages/examples/apptest/public/index.html +353 -0
  213. package/packages/examples/apptest/public/index2.html +353 -0
  214. package/packages/examples/apptest/public/indexProxy.html +346 -0
  215. package/packages/examples/apptest/public/indextest.html +316 -0
  216. package/packages/examples/apptest/public/logon.html +44 -0
  217. package/packages/examples/apptest/public/myapp/q.html +349 -0
  218. package/packages/examples/apptest/public/myapp/secondary.html +1 -0
  219. package/packages/examples/apptest/public/myapp/test.js +2 -0
  220. package/packages/examples/apptest/public/push1.html +187 -0
  221. package/packages/examples/apptest/startup.sh +15 -0
  222. package/packages/examples/apptesti/.env +13 -0
  223. package/packages/examples/apptesti/.eslintrc.json +42 -0
  224. package/packages/examples/apptesti/Dockerfile +42 -0
  225. package/packages/examples/apptesti/appenv.js +6 -0
  226. package/packages/examples/apptesti/certs/ca.crt +19 -0
  227. package/packages/examples/apptesti/certs/tls.crt +25 -0
  228. package/packages/examples/apptesti/certs/tls.key +28 -0
  229. package/packages/examples/apptesti/certs/tls.sh +5 -0
  230. package/packages/examples/apptesti/docker-compose.yml +12 -0
  231. package/{lib/cli.js → packages/examples/apptesti/index.js} +4 -5
  232. package/packages/examples/apptesti/package.json +20 -0
  233. package/packages/examples/apptesti/public/data/Cluster_SDOH1.sas +182 -0
  234. package/packages/examples/apptesti/public/data/Cluster_SDOH6.sas +180 -0
  235. package/packages/examples/apptesti/public/data/LeNet_snzrle.astore +0 -0
  236. package/packages/examples/apptesti/public/data/NeuralNetwork_High_med.sas +2409 -0
  237. package/packages/examples/apptesti/public/data/NeuralNetwork_high_med1.sas +2409 -0
  238. package/packages/examples/apptesti/public/data/ast/GBlocalcopy.sasast +0 -0
  239. package/packages/examples/apptesti/public/data/ast/LeNet_snzrle.astore +0 -0
  240. package/packages/examples/apptesti/public/data/ast/gb_IrisGB.sasast +0 -0
  241. package/packages/examples/apptesti/public/data/ast/paysimsvdd.sasast +0 -0
  242. package/packages/examples/apptesti/public/data/ast/svmlocalcopy.sasast +0 -0
  243. package/packages/examples/apptesti/public/data/cars.csv +429 -0
  244. package/packages/examples/apptesti/public/data/cluster_test2.sas7bdat +0 -0
  245. package/packages/examples/apptesti/public/data/cmdList.txt +15 -0
  246. package/packages/examples/apptesti/public/data/gradBoost.sashdat +0 -0
  247. package/packages/examples/apptesti/public/data/iris.csv +151 -0
  248. package/packages/examples/apptesti/public/data/model1.sas7bdat +0 -0
  249. package/packages/examples/apptesti/public/favicon.ico +0 -0
  250. package/packages/examples/apptesti/public/index.html +346 -0
  251. package/packages/examples/apptesti/public/indexProxy.html +346 -0
  252. package/packages/examples/apptesti/public/indextest.html +316 -0
  253. package/packages/examples/apptesti/public/logon.html +44 -0
  254. package/packages/examples/apptesti/public/main.html +346 -0
  255. package/packages/examples/apptesti/public/myapp/secondary.html +1 -0
  256. package/packages/examples/apptesti/public/myapp/test.js +2 -0
  257. package/packages/examples/apptesti/startup.sh +15 -0
  258. package/packages/examples/basic/.env +10 -0
  259. package/packages/examples/basic/.eslintrc.json +42 -0
  260. package/packages/examples/basic/Dockerfile +41 -0
  261. package/packages/examples/basic/api.js +88 -0
  262. package/packages/examples/basic/appenv.js +6 -0
  263. package/packages/examples/basic/docker-compose.yml +10 -0
  264. package/packages/examples/basic/package.json +19 -0
  265. package/packages/examples/basic/public/data/Cluster_SDOH1.sas +182 -0
  266. package/packages/examples/basic/public/data/Cluster_SDOH6.sas +180 -0
  267. package/packages/examples/basic/public/data/LeNet_snzrle.astore +0 -0
  268. package/packages/examples/basic/public/data/NeuralNetwork_High_med.sas +2409 -0
  269. package/packages/examples/basic/public/data/NeuralNetwork_high_med1.sas +2409 -0
  270. package/packages/examples/basic/public/data/ast/GBlocalcopy.sasast +0 -0
  271. package/packages/examples/basic/public/data/ast/LeNet_snzrle.astore +0 -0
  272. package/packages/examples/basic/public/data/ast/gb_IrisGB.sasast +0 -0
  273. package/packages/examples/basic/public/data/ast/paysimsvdd.sasast +0 -0
  274. package/packages/examples/basic/public/data/ast/svmlocalcopy.sasast +0 -0
  275. package/packages/examples/basic/public/data/cars.csv +429 -0
  276. package/packages/examples/basic/public/data/cluster_test2.sas7bdat +0 -0
  277. package/packages/examples/basic/public/data/cmdList.txt +15 -0
  278. package/packages/examples/basic/public/data/gradBoost.sashdat +0 -0
  279. package/packages/examples/basic/public/data/iris.csv +151 -0
  280. package/packages/examples/basic/public/data/model1.sas7bdat +0 -0
  281. package/packages/examples/basic/public/favicon.ico +0 -0
  282. package/packages/examples/basic/public/index.html +29 -0
  283. package/packages/examples/basic/public/index2.html +102 -0
  284. package/packages/examples/basic/public/logon.html +42 -0
  285. package/packages/examples/basic/public/myapp/secondary.html +1 -0
  286. package/packages/examples/basic/public/myapp/test.js +2 -0
  287. package/packages/examples/basic/public/onlogoff.html +53 -0
  288. package/packages/examples/basic/start.sh +15 -0
  289. package/packages/examples/proxytest/.env +23 -0
  290. package/packages/examples/proxytest/.envimpl +11 -0
  291. package/packages/examples/proxytest/.eslintrc.json +42 -0
  292. package/packages/examples/proxytest/Dockerfile +42 -0
  293. package/packages/examples/proxytest/appenv.js +6 -0
  294. package/packages/examples/proxytest/docker-compose.yml +12 -0
  295. package/packages/examples/proxytest/index.js +57 -0
  296. package/packages/examples/proxytest/package.json +18 -0
  297. package/packages/examples/proxytest/public/data/Cluster_SDOH1.sas +182 -0
  298. package/packages/examples/proxytest/public/data/Cluster_SDOH6.sas +180 -0
  299. package/packages/examples/proxytest/public/data/LeNet_snzrle.astore +0 -0
  300. package/packages/examples/proxytest/public/data/NeuralNetwork_High_med.sas +2409 -0
  301. package/packages/examples/proxytest/public/data/NeuralNetwork_high_med1.sas +2409 -0
  302. package/packages/examples/proxytest/public/data/ast/GBlocalcopy.sasast +0 -0
  303. package/packages/examples/proxytest/public/data/ast/LeNet_snzrle.astore +0 -0
  304. package/packages/examples/proxytest/public/data/ast/gb_IrisGB.sasast +0 -0
  305. package/packages/examples/proxytest/public/data/ast/paysimsvdd.sasast +0 -0
  306. package/packages/examples/proxytest/public/data/ast/svmlocalcopy.sasast +0 -0
  307. package/packages/examples/proxytest/public/data/cars.csv +429 -0
  308. package/packages/examples/proxytest/public/data/cluster_test2.sas7bdat +0 -0
  309. package/packages/examples/proxytest/public/data/cmdList.txt +15 -0
  310. package/packages/examples/proxytest/public/data/gradBoost.sashdat +0 -0
  311. package/packages/examples/proxytest/public/data/iris.csv +151 -0
  312. package/packages/examples/proxytest/public/data/model1.sas7bdat +0 -0
  313. package/packages/examples/proxytest/public/favicon.ico +0 -0
  314. package/packages/examples/proxytest/public/index.html +357 -0
  315. package/packages/examples/proxytest/public/index.js +57 -0
  316. package/packages/examples/proxytest/public/indextest.html +316 -0
  317. package/packages/examples/proxytest/public/logon.html +44 -0
  318. package/packages/examples/proxytest/public/main.html +357 -0
  319. package/packages/examples/proxytest/public/myapp/secondary.html +1 -0
  320. package/packages/examples/proxytest/public/myapp/test.js +2 -0
  321. package/packages/examples/proxytest/public/restaf.js +2461 -0
  322. package/packages/examples/proxytest/public/restaf.min.js +11 -0
  323. package/packages/examples/proxytest/public/sas/iris.txt +10 -0
  324. package/packages/examples/proxytest/startup.sh +15 -0
  325. package/public/casread2.html +321 -0
  326. package/public/data/Cluster_SDOH1.sas +182 -0
  327. package/public/data/Cluster_SDOH6.sas +180 -0
  328. package/public/data/LeNet_snzrle.astore +0 -0
  329. package/public/data/NeuralNetwork_High_med.sas +2409 -0
  330. package/public/data/NeuralNetwork_high_med1.sas +2409 -0
  331. package/public/data/ast/GBlocalcopy.sasast +0 -0
  332. package/public/data/ast/LeNet_snzrle.astore +0 -0
  333. package/public/data/ast/gb_IrisGB.sasast +0 -0
  334. package/public/data/ast/paysimsvdd.sasast +0 -0
  335. package/public/data/ast/svmlocalcopy.sasast +0 -0
  336. package/public/data/cars.csv +429 -0
  337. package/public/data/cluster_test2.sas7bdat +0 -0
  338. package/public/data/cmdList.txt +15 -0
  339. package/public/data/gradBoost.sashdat +0 -0
  340. package/public/data/iris.csv +151 -0
  341. package/public/data/model1.sas7bdat +0 -0
  342. package/public/design.html +350 -0
  343. package/public/display.html +354 -0
  344. package/public/favicon.ico +0 -0
  345. package/public/help.html +1 -0
  346. package/public/index.html +354 -0
  347. package/public/index2.html +353 -0
  348. package/public/indexProxy.html +350 -0
  349. package/public/indextest.html +316 -0
  350. package/public/logon.html +44 -0
  351. package/public/myapp/q.html +349 -0
  352. package/public/myapp/secondary.html +1 -0
  353. package/public/myapp/test.js +2 -0
  354. package/public/push1.html +187 -0
  355. package/server.js +444 -0
  356. package/src/config.js +90 -0
  357. package/src/handlers/appCallback.js +40 -0
  358. package/src/handlers/codeAuth.js +31 -0
  359. package/src/handlers/decodeJwt.js +11 -0
  360. package/src/handlers/favicon.js +24 -0
  361. package/src/handlers/getApp.js +52 -0
  362. package/src/handlers/getApp2.js +26 -0
  363. package/src/handlers/getUser.js +20 -0
  364. package/src/handlers/index.js +36 -0
  365. package/src/handlers/keepAlive.js +54 -0
  366. package/src/handlers/keepAlive2.js +13 -0
  367. package/src/handlers/logon.js +24 -0
  368. package/src/handlers/logout.js +43 -0
  369. package/src/handlers/proxyMapUri.js +56 -0
  370. package/src/handlers/proxyOnResponse.js +12 -0
  371. package/src/handlers/reactDev.js +30 -0
  372. package/src/handlers/setCookies.js +76 -0
  373. package/src/iService.js +369 -0
  374. package/src/index.js +243 -0
  375. package/src/parseDocker.js +32 -0
  376. package/src/plugins/SASauth.js +79 -0
  377. package/src/plugins/appCookie.js +49 -0
  378. package/src/plugins/setContext.js +34 -0
  379. package/src/plugins/setDefaultRoutes.js +262 -0
  380. package/src/plugins/setupAuth.js +48 -0
  381. package/src/plugins/setupUserRoutes.js +48 -0
  382. package/src/plugins/token.js +10 -0
  383. package/src/schemes/SASTokenScheme.js +43 -0
  384. package/src/visionIndex.html +24 -0
  385. package/start.sh +15 -0
  386. package/lib/core/handlers/appCallback.js +0 -51
  387. package/lib/core/handlers/codeAuth.js +0 -61
  388. package/lib/core/handlers/favicon.js +0 -45
  389. package/lib/core/handlers/getApp.js +0 -67
  390. package/lib/core/handlers/getApp2.js +0 -48
  391. package/lib/core/handlers/getUser.js +0 -49
  392. package/lib/core/handlers/keepAlive.js +0 -96
  393. package/lib/core/handlers/keepAlive2.js +0 -33
  394. package/lib/core/handlers/logon.js +0 -44
  395. package/lib/core/handlers/logout.js +0 -88
  396. package/lib/core/handlers/proxyOnResponse.js +0 -26
  397. package/lib/core/handlers/reactDev.js +0 -52
  398. package/lib/core/handlers/setCookies.js +0 -116
  399. package/lib/core/index.js +0 -195
  400. package/lib/core/plugins/SASauth.js +0 -100
  401. package/lib/core/plugins/appCookie.js +0 -98
  402. package/lib/core/plugins/setContext.js +0 -55
  403. package/lib/core/plugins/setupAuth.js +0 -86
  404. package/lib/core/plugins/token.js +0 -31
  405. package/lib/core/schemes/SASTokenScheme.js +0 -71
@@ -0,0 +1,369 @@
1
+ /*
2
+ * ------------------------------------------------------------------------------------
3
+ * * Copyright (c) SAS Institute Inc.
4
+ * * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * * you may not use this file except in compliance with the License.
6
+ * * You may obtain a copy of the License at
7
+ * *
8
+ * * http://www.apache.org/licenses/LICENSE-2.0
9
+ * *
10
+ * * Unless required by applicable law or agreed to in writing, software
11
+ * * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ * ----------------------------------------------------------------------------------------
16
+ *
17
+ */
18
+
19
+ let fs = require('fs');
20
+ let debug = require('debug')('service');
21
+ let debug2 = require('debug')('tls');
22
+ // let isDocker = require('is-docker');
23
+ let Hapi = require('@hapi/hapi');
24
+ let H202 = require('@hapi/h2o2');
25
+ // const { isSameSiteNoneCompatible } = require('should-send-same-site-none');
26
+ let NodeCache = require("node-cache-promise");
27
+ let Vision = require('@hapi/vision');
28
+ let inert = require('@hapi/inert');
29
+ let selfsigned = require('selfsigned');
30
+ import setupAuth from './plugins/setupAuth';
31
+
32
+ let os = require('os');
33
+
34
+ function iService (userRouteTable, useDefault, asset, allAppEnv, serverMode, userInfo) {
35
+ // process.env.APPHOST_ADDR = process.env.APPHOST;
36
+ const init = async () => {
37
+
38
+ if (process.env.APPHOST === '*') {
39
+ process.env.APPHOST = os.hostname();
40
+ }
41
+ let defaultMaxBytes = 10485760;
42
+ let maxBytes;
43
+ if (isNaN(process.env.PAYLOADMAXBYTES)) {
44
+ maxBytes = defaultMaxBytes;
45
+ } else {
46
+ maxBytes = Number(process.env.PAYLOADMAXBYTES);
47
+ }
48
+ let isSameSite = 'None';
49
+ let isSecure = false;
50
+
51
+ if (process.env.SAMESITE != null) {
52
+ let [s1, s2] = process.env.SAMESITE.split(',');
53
+ isSameSite = s1;
54
+ isSecure = s2 === 'secure' ? true : false;
55
+ if (process.env.HTTPS !== 'true') {
56
+ isSecure = false;
57
+ }
58
+ }
59
+
60
+
61
+ let sConfig = {
62
+ port: process.env.APPPORT,
63
+ host: process.env.APPHOST,
64
+
65
+ state: {
66
+ isSameSite: isSameSite,
67
+ isSecure : isSecure,
68
+
69
+ },
70
+
71
+
72
+ routes: {
73
+ payload: {
74
+ maxBytes: maxBytes
75
+ },
76
+ cors: {
77
+ origin : ['*'],
78
+ credentials: true,
79
+
80
+ "headers": ["Accept", "Authorization", "Content-Type", "If-None-Match", "Accept-language"]
81
+ /*
82
+ 'Access-Control-Allow-Methods': ['GET', 'POST', 'OPTIONS'],
83
+ additionalHeaders : ['multipart/form-data', 'content-disposition'],
84
+ additionalExposedHeaders : ['location'],
85
+ */
86
+ }
87
+
88
+ },
89
+ };
90
+ if (process.env.HAPIDEBUG === 'YES') {
91
+ sConfig.debug = { request: '*' };
92
+ }
93
+ debug(JSON.stringify(sConfig, null,4));
94
+ if (process.env.HTTPS === 'true') {
95
+ sConfig.tls = await getCertificates();
96
+ debug('Setup of SSL certificates completed');
97
+ } else {
98
+ debug('Running with no SSL certificates');
99
+ }
100
+ if (asset !== null) {
101
+ sConfig.routes.files= { relativeTo: asset };
102
+ }
103
+
104
+ debug2(
105
+ `Application information:
106
+ APPLOC : ${process.env.APPLOC}
107
+ APPENTRY: ${process.env.APPENTRY}
108
+ `
109
+ );
110
+
111
+ let hapiServer = Hapi.server(sConfig);
112
+
113
+ /*
114
+ const cache = hapiServer.cache({ segment: 'sessions', expiresIn: 3 * 24 * 60 * 60 * 1000 });
115
+ hapiServer.app.cache = cache;
116
+ */
117
+
118
+ let nodeCacheOptions = {
119
+ stdTTL : 1 * 24 * 60 * 60 * 1000,
120
+ checkPeriod : 3600,
121
+ errorOnMissing: true,
122
+ useClones : false,
123
+ deleteOnExpire: true,
124
+ };
125
+ let storeCache = new NodeCache(nodeCacheOptions);
126
+ hapiServer.app.cache = storeCache;
127
+
128
+ // common plugins
129
+ let visionOptions = {
130
+ engines : { html: require('handlebars') },
131
+ relativeTo: __dirname,
132
+ path : '.',
133
+ };
134
+ await hapiServer.register(Vision);
135
+ hapiServer.views(visionOptions);
136
+ await hapiServer.register(inert);
137
+ if (process.env.HTTPS === 'true') {
138
+ await hapiServer.register({ plugin: require('hapi-require-https'), options: {} });
139
+ }
140
+ // register H202 for proxy handling
141
+ // https://hapi.dev/module/h2o2/api/?v=10.0.1
142
+
143
+ await hapiServer.register(H202);
144
+ /*
145
+ await hapiServer.register({
146
+ plugin : require('hapi-pino'),
147
+ options: {
148
+ prettyPrint: process.env.NODE_ENV !== 'production',
149
+ level : process.env.LOGLEVEL == null ? 'silent' : process.env.LOGLEVEL,
150
+ },
151
+ });
152
+ */
153
+
154
+ // setup authentication related plugins
155
+ let options = {
156
+ serverMode : serverMode,
157
+ authFlow : process.env.AUTHFLOW,
158
+ host : process.env.VIYA_SERVER,
159
+ isSameSite : isSameSite,
160
+ isSecure : isSecure,
161
+ ns : (allAppEnv.LOGONPAYLOAD != null) ? allAppEnv.LOGONPAYLOAD.ns : null,
162
+ nsHost : (allAppEnv.LOGONPAYLOAD != null) ? allAppEnv.LOGONPAYLOAD.nsHost : null,
163
+ redirect : process.env.REDIRECT,
164
+ clientId : process.env.CLIENTID,
165
+ clientSecret : process.env.CLIENTSECRET,
166
+ redirectTo : `/${process.env.APPNAME}/logon`,
167
+ allAppEnv : allAppEnv,
168
+ useHapiCookie : true,
169
+ appName : process.env.APPNAME,
170
+ appHost : process.env.APPHOST,
171
+ appPort : process.env.APPPORT,
172
+ userRouteTable: userRouteTable,
173
+ useDefault : useDefault, /* not used - left here for potential reuse */
174
+ userInfo : userInfo,
175
+ https : process.env.HTTPS,
176
+ authDefault : false, /* set later in setDefaultRoutes */
177
+ authLogon : false /* set later in setDefaultRoutes */
178
+
179
+ };
180
+
181
+ debug2('Options',options);
182
+ if (process.env.AUTHFLOW != null) {
183
+ await setupAuth(hapiServer, options);
184
+ if (process.env.PREAUTH === 'YES') {
185
+ console.log('Preauth enabled');
186
+ hapiServer.ext('onPreAuth', (request, h) => {
187
+ debugger;
188
+ if (!request.auth.isAuthenticated && !request.path.startsWith(`/login`)) {
189
+ const redirectTo = `${request.path}?${new URLSearchParams(request.query).toString()}`;
190
+ console.log('Redirect to login', {redirectTo});
191
+ debugger;
192
+ return h.redirect(`/login`).takeover();
193
+ }
194
+ return h.continue;
195
+ });
196
+ }
197
+ }
198
+ hapiServer.log('Plugin', process.env.PLUGIN);
199
+
200
+ if (process.env.PLUGIN === 'hapi-swagger' && serverMode === 'api') {
201
+ let swaggerOptions = {
202
+ "info": {
203
+ "title" : `API for ${process.env.APPNAME}`,
204
+ "version" : "0.0.1",
205
+ "description": "This document was auto-generated at run time"
206
+ },
207
+ "schemes" : ["http", "https"],
208
+ "cors" : true,
209
+ "debug" : true,
210
+ "jsonPath" : `/${options.appName}/swagger.json`,
211
+ "jsonRoutePath" : `/${options.appName}/swagger.json`,
212
+ "documentationPage": true,
213
+ "documentationPath": `/${options.appName}/documentation`,
214
+ "swaggerUI" : true,
215
+ "swaggerUIPath" : `/${options.appName}/swaggerui`,
216
+ auth : options.authDefault
217
+ };
218
+
219
+ if (userInfo != null) {
220
+ let override = userInfo(options, 'SWAGGEROPTIONS');
221
+ swaggerOptions = {...swaggerOptions, ...override};
222
+ }
223
+
224
+ debug('Swagger Options:' ,swaggerOptions);
225
+ await hapiServer.register({ plugin: serverMode, options: swaggerOptions });
226
+ } else if (process.env.PLUGIN == 'hapi-openapi' && serverMode === 'api') {
227
+ console.log('hapi-openapi', 'coming soon');
228
+ }
229
+
230
+
231
+ //
232
+ // Start server
233
+ //
234
+ // eslint-disable-next-line no-unused-vars
235
+ let allRoutes = hapiServer.table();
236
+ await hapiServer.start();
237
+ let hh = hapiServer.info.uri;
238
+ hh = hh.replace(/0.0.0.0/, 'localhost');
239
+ console.log('====================================================================================');
240
+ console.log('Server Start Time: ', Date());
241
+ let msg =
242
+ options.serverMode === 'app'
243
+ ? `Visit ${hh}/${process.env.APPNAME} to access application`
244
+ : `Visit ${hh}/${process.env.APPNAME}/api to access swagger`;
245
+ console.log('\x1b[1m%s\x1b[0m',msg);
246
+ console.log('NOTE: If running in container use the exported port');
247
+ process.env.APPSERVER = `${hh}/${process.env.APPNAME}`;
248
+ process.env.HEALTH = 'true';
249
+ console.log('====================================================================================');
250
+ };
251
+
252
+ process.on('unhandledRejection', (err) => {
253
+ console.log(err);
254
+ process.exit(1);
255
+ });
256
+ init();
257
+ }
258
+
259
+ async function getCertificates () {
260
+
261
+ let tls = {};
262
+ debug2('Getting tls certificates');
263
+ debug2('tls.crt', process.env['tls.crt'] != null);
264
+ debug2('tls.key', process.env['tls.key'] != null);
265
+ debug2('TLS_PFX', process.env.TLS_PFX != null);
266
+ debug2('TLS_PW', process.env.TLS_PW != null);
267
+ debug2('TLS_CERT', process.env.TLS_CERT != null);
268
+ debug2('TLS_CRT', process.env.TLS_CRT != null);
269
+ debug2('TLS_CREATE', process.env.TLS_CREATE != null);
270
+ if (process.env.TLS_CERT != null && process.env.TLS_CERT.length > 0) {
271
+ /* backward compatability */
272
+ debug2('TLS set: TLS_CERT');
273
+ tls.cert = fs.readFileSync(process.env.TLS_CERT);
274
+ tls.key = fs.readFileSync(process.env.TLS_KEY);
275
+ } else if (process.env.TLS_PFX != null) {
276
+ debug2('TLS set: PFX');
277
+ tls.pfx = fs.readFileSync(process.env.TLS_PFX);
278
+ if (process.env.TLS_PW != null) {
279
+ tls.passphrase = process.env.TLS_PW;
280
+ }
281
+ } else if (process.env.TLS_CRT != null && process.env.TLS_CRT.trim().length > 0) {
282
+ /* new key names to conform to k8s*/
283
+ debug2('TLS set: TLS_CRT');
284
+ tls.cert = process.env.TLS_CRT;
285
+ tls.key = process.env.TLS_KEY;
286
+ } else if (process.env['tls.crt'] != null) {
287
+ tls.cert = process.env['tls.crt'];
288
+ tls.key = process.env['tls.key'];
289
+ } else if (process.env.TLS_CREATE != null) {
290
+ /* unsigned certificate */
291
+ debug2('TLS set: TLS_CREATE=', process.env.TLS_CREATE);
292
+ tls = await getTls();
293
+ }
294
+
295
+ if (process.env.TLS_CABUNDLE != null) {
296
+ tls.CA = fs.readFileSync(process.env.TLS_CABUNDLE);
297
+ }
298
+ debug2('TLS', tls);
299
+ if (Object.keys(tls).length > 0) {
300
+ return tls;
301
+ } else {
302
+ console.log('Warning: The current host protocol is https: No TLS certificate information has been specified.');
303
+ return tls;
304
+ }
305
+ }
306
+
307
+ async function getTls () {
308
+ let options = {
309
+ keySize : 2048,
310
+ days : 360,
311
+ algorithm : "sha256",
312
+ clientCertificate: true,
313
+ extensions : {},
314
+ };
315
+ let subjt = process.env.TLS_CREATE.replaceAll('"', '').trim();
316
+ let subj = subjt.split(',');
317
+
318
+ let d = {};
319
+ subj.map(c => {
320
+ let r = c.split(':');
321
+ d[ r[ 0 ] ] = r[ 1 ];
322
+ return { value: r[ 1 ] };
323
+ });
324
+
325
+ // TLS_CREATE=C:US,ST:NC,L:Cary,O:SAS Institute,OU:STO,CN:localhost,ALT:na.sas.com
326
+ let attr = [
327
+ {
328
+ name : 'commonName',
329
+ value: d.CN /*process.env.APPHOST*/,
330
+ },
331
+ {
332
+ name : 'countryName',
333
+ value: d.C
334
+ }, {
335
+ shortName: 'ST',
336
+ value : d.ST
337
+ }, {
338
+ name : 'localityName',
339
+ value: d.L,
340
+ }, {
341
+ name : 'organizationName',
342
+ value: d.O
343
+ },
344
+ {
345
+ shortName: 'OU',
346
+ value : d.OU
347
+ }
348
+ ];
349
+
350
+ options.extensions.altNames = [
351
+ // { type: 6, value: `http://${process.env.APPHOST}:${process.env.APPPORT}/${process.env.APPNAME}` },
352
+ { type: 6, value: `https://${process.env.APPHOST}:${process.env.APPPORT}/${process.env.APPNAME}` },
353
+ { type: 6, value: `https://${process.env.APPHOST}:${process.env.APPPORT}/${process.env.APPNAME}/api` },
354
+ { type: 6, value: `https://${process.env.APPHOST}:${process.env.APPPORT}/${process.env.APPNAME}/logon` },
355
+ { type: 6, value: `https://${process.env.APPHOST}/${process.env.APPNAME}` },
356
+ { type: 6, value: `https://${process.env.APPHOST}/${process.env.APPNAME}/api` },
357
+ { type: 6, value: `https://${process.env.APPHOST}/${process.env.APPNAME}/logon` },
358
+ ];
359
+ debug('tls options ', JSON.stringify(options, null,4));
360
+ let pems = selfsigned.generate(attr, options);
361
+ let tls = {
362
+ cert: pems.cert,
363
+ key : pems.private
364
+ };
365
+ return tls;
366
+
367
+
368
+ }
369
+ export default iService;
package/src/index.js ADDED
@@ -0,0 +1,243 @@
1
+ /*
2
+ * ------------------------------------------------------------------------------------
3
+ * * Copyright (c) SAS Institute Inc.
4
+ * * Licensed under the Apache License, Version 2.0 (the 'License');
5
+ * * you may not use this file except in compliance with the License.
6
+ * * You may obtain a copy of the License at
7
+ * *
8
+ * * http://www.apache.org/licenses/LICENSE-2.0
9
+ * *
10
+ * * Unless required by applicable law or agreed to in writing, software
11
+ * * distributed under the License is distributed on an 'AS IS' BASIS,
12
+ * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ * ----------------------------------------------------------------------------------------
16
+ *
17
+ */
18
+
19
+ import "core-js/stable";
20
+ import "regenerator-runtime/runtime";
21
+ import fs from "fs";
22
+ import iService from "./iService";
23
+ import config from "./config";
24
+ let debug = require("debug")("startup");
25
+
26
+ module.exports = function appServer(
27
+ uTable,
28
+ useDefault,
29
+ serverMode,
30
+ customize
31
+ ) {
32
+ let argv = require("yargs").argv;
33
+ let env = argv.env == null ? null : argv.env;
34
+ let appenv = argv.appenv == null ? null : argv.appenv;
35
+ let docker = argv.docker == null ? null : argv.docker;
36
+ serverMode = serverMode == null ? "app": serverMode;
37
+ process.env.SERVERMODE = serverMode;
38
+
39
+ if (useDefault == null) {
40
+ useDefault = true;
41
+ }
42
+ console.log(
43
+ "Initialization started ============================================================"
44
+ );
45
+ console.log(`version: 2, Build Date: `, Date());
46
+ console.log(
47
+ `\nCommand Line Configuration:
48
+ Dockerfile: ${docker}
49
+ env file : ${env}
50
+ appenv : ${appenv}
51
+ customize : ${customize != null},
52
+ serverMode: ${serverMode}
53
+ `
54
+ );
55
+
56
+ iapp(null, env, docker, uTable, useDefault, serverMode, customize);
57
+ };
58
+
59
+ function iapp(
60
+ appSrc,
61
+ rafEnv,
62
+ dockerFile,
63
+ uTable,
64
+ useDefault,
65
+ serverMode,
66
+ customize
67
+ ) {
68
+ let asset = setup(rafEnv, dockerFile);
69
+ if (appSrc == null) {
70
+ appSrc = process.env.APPENV == null ? null : process.env.APPENV;
71
+ }
72
+ if (appSrc != null) {
73
+ console.log("appSrc", `+${appSrc}+`);
74
+ createPayload(appSrc, (err, r) => {
75
+ if (err) {
76
+ console.log(err);
77
+ console.log("createPayload failed");
78
+ process.exit(1);
79
+ } else {
80
+ iService(uTable, useDefault, asset, r, serverMode, customize);
81
+ }
82
+ });
83
+ } else {
84
+ let appEnv = getAllEnv({});
85
+ iService(uTable, useDefault, asset, appEnv, serverMode, customize);
86
+ }
87
+ }
88
+
89
+ function setup(rafEnv, dockerFile) {
90
+ config(rafEnv, dockerFile);
91
+ let asset = process.env.APPLOC === "." ? process.cwd() : process.env.APPLOC;
92
+ process.env.APPASSET = asset;
93
+ return asset;
94
+ }
95
+
96
+ function createPayload(srcName, cb) {
97
+ let src = fs.readFileSync(srcName, "utf8");
98
+ if (src === null) {
99
+ cb(`Error: ${srcName} was not found. `);
100
+ }
101
+ try {
102
+ // console.log(src);
103
+ let f = new Function(src);
104
+ console.log(`${srcName} compile completed`);
105
+ let r = f();
106
+ f = null;
107
+
108
+ let ar = getAllEnv(r);
109
+ cb(null, ar);
110
+ } catch (err) {
111
+ console.log(`${srcName} compile failed`);
112
+ cb(err);
113
+ }
114
+ }
115
+
116
+ function getAllEnv(userData) {
117
+ let env;
118
+ let l = null;
119
+ let host = trimit("VIYA_SERVER");
120
+ if (host === 'none' || host == null) {
121
+ console.log('Note: setting host to null');
122
+ host = null;
123
+ }
124
+
125
+ if (process.env.AUTHTYPE != null) {
126
+ process.env.AUTHFLOW = process.env.AUTHTYPE;
127
+ }
128
+
129
+ let authflow = trimit("AUTHFLOW");
130
+ if (authflow === "authorization_code" || authflow === "code") {
131
+ authflow = "server";
132
+ }
133
+
134
+ if (host === null) {
135
+ authflow = null;
136
+ console.log('Note: setting authflow to null');
137
+ }
138
+
139
+ process.env.AUTHFLOW = authflow;
140
+ // let redirect = (process.env.REDIRECT != null) ? process.env.REDIRECT : null;
141
+ let redirect = trimit("REDIRECT");
142
+
143
+ let clientID = trimit("CLIENTID");
144
+
145
+ // eslint-disable-next-line no-unused-vars
146
+ let clientSecret = trimit("CLIENTSECRET");
147
+ let keepAlive = trimit("KEEPALIVE");
148
+ let appName = trimit("APPNAME");
149
+ let ns = trimit("NAMESPACE");
150
+ let nsHost = trimit("NSHOST");
151
+
152
+ l = {
153
+ authflow: authflow,
154
+ redirect: redirect,
155
+
156
+ host: host,
157
+ clientID: clientID,
158
+ appName: appName,
159
+
160
+ keepAlive: null,
161
+ useToken: process.env.USETOKEN,
162
+
163
+ ns: ns,
164
+ nsHost: nsHost,
165
+ };
166
+ if (authflow === "server" || authflow === "implicit") {
167
+ if (authflow === "implicit") {
168
+ if (redirect === null) {
169
+ redirect = `${appName}/callback`;
170
+ process.env.REDIRECT = "callback";
171
+ } else {
172
+ if (redirect !== null && redirect.indexOf("/") !== 0) {
173
+ redirect =
174
+ redirect.indexOf("http") != -1
175
+ ? redirect
176
+ : `${process.env.APPNAME}/${redirect}`;
177
+ }
178
+ }
179
+ l.redirect = redirect;
180
+ }
181
+
182
+ if (authflow === "server" && keepAlive === "YES") {
183
+ let protocol = process.env.HTTPS === "true" ? "https://" : "http://";
184
+ l.keepAlive = `${protocol}${process.env.APPHOST}:${process.env.APPPORT}/${appName}/keepAlive`;
185
+ l.keepAlive = l.keepAlive.replace(/0.0.0.0/, "localhost");
186
+ }
187
+ if (process.env.TIMERS != null) {
188
+ l.timers = process.env.TIMERS;
189
+ }
190
+ }
191
+ // allow for no authtype
192
+ l = {
193
+ authType: authflow,
194
+ redirect: redirect,
195
+
196
+ host: host,
197
+ clientID: clientID,
198
+ appName: appName,
199
+
200
+ keepAlive: null,
201
+ useToken: process.env.USETOKEN,
202
+
203
+ ns: ns,
204
+ nsHost: nsHost,
205
+ };
206
+
207
+ // pick up the app env's - replacement for appenv.js
208
+ // appenv.js still supported for backward compatibility
209
+ for (let key in process.env) {
210
+ debug(key);
211
+ if (key.indexOf("APPENV_") === 0) {
212
+ let k = key.substring(7);
213
+ let v = process.env[key];
214
+ if (v != null && v.trim().length > 0) {
215
+ if (v.startsWith('$')) {
216
+ v = process.env[v.substring(1)];
217
+ }
218
+ userData[k] = (v != null) ? v.trim() : null;
219
+ } else {
220
+ userData[k] = null;
221
+
222
+ }
223
+ }
224
+ }
225
+
226
+ env = {
227
+ LOGONPAYLOAD: l,
228
+ APPENV: userData,
229
+ };
230
+ console.log("Final APPENV configuration for the server");
231
+ console.log(JSON.stringify(env, null, 4));
232
+ console.log(Date());
233
+ return env;
234
+ }
235
+
236
+ function trimit(e) {
237
+ let a = process.env[e];
238
+ if (a == null) {
239
+ return null;
240
+ }
241
+ a = a.trim();
242
+ return a.length === 0 ? null : a;
243
+ }
@@ -0,0 +1,32 @@
1
+ /*
2
+ * Copyright © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ 'use strict';
6
+ let parser = require('docker-file-parser');
7
+ let fs = require('fs');
8
+
9
+ function parseDocker (dockerFile) {
10
+ ;
11
+ let d = fs.readFileSync(dockerFile, 'utf8');
12
+ let data = parser.parse(d);
13
+ data.forEach(d => {
14
+ if (d.name === 'EXPOSE') {
15
+ process.env.EXPOSEDPORT = d.args[0];
16
+ console.log(`Exposed port: ${process.env.EXPOSEDPORT}`);
17
+ } else if (d.name === 'ENV') {
18
+ for (let key in d.args) {
19
+ let v = d.args[key];
20
+ if (v.length === 0) {
21
+ console.log(
22
+ `Value for ${key} inherited as ${process.env[key]}`
23
+ );
24
+ } else {
25
+ process.env[key] = v;
26
+ }
27
+ }
28
+ }
29
+ });
30
+ }
31
+
32
+ export default parseDocker;