@ytsaurus/ui 1.12.2 → 1.13.1

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 (176) hide show
  1. package/build/cjs/@types/core.d.ts +38 -0
  2. package/build/cjs/server/components/layout-config.js +6 -1
  3. package/build/cjs/server/components/layout-config.js.map +1 -1
  4. package/build/cjs/server/components/oauth.d.ts +26 -0
  5. package/build/cjs/server/components/oauth.js +123 -0
  6. package/build/cjs/server/components/oauth.js.map +1 -0
  7. package/build/cjs/server/components/yt-auth.d.ts +6 -0
  8. package/build/cjs/server/components/yt-auth.js +23 -0
  9. package/build/cjs/server/components/yt-auth.js.map +1 -0
  10. package/build/cjs/server/controllers/login.d.ts +0 -1
  11. package/build/cjs/server/controllers/login.js +4 -26
  12. package/build/cjs/server/controllers/login.js.map +1 -1
  13. package/build/cjs/server/controllers/logout.d.ts +2 -0
  14. package/build/cjs/server/controllers/logout.js +15 -0
  15. package/build/cjs/server/controllers/logout.js.map +1 -0
  16. package/build/cjs/server/controllers/oauth-login.d.ts +4 -0
  17. package/build/cjs/server/controllers/oauth-login.js +30 -0
  18. package/build/cjs/server/controllers/oauth-login.js.map +1 -0
  19. package/build/cjs/server/index.js +9 -1
  20. package/build/cjs/server/index.js.map +1 -1
  21. package/build/cjs/server/middlewares/authorization.d.ts +2 -0
  22. package/build/cjs/server/middlewares/authorization.js +42 -0
  23. package/build/cjs/server/middlewares/authorization.js.map +1 -0
  24. package/build/cjs/server/middlewares/oauth.d.ts +2 -0
  25. package/build/cjs/server/middlewares/oauth.js +27 -0
  26. package/build/cjs/server/middlewares/oauth.js.map +1 -0
  27. package/build/cjs/server/middlewares/yt-auth.d.ts +1 -1
  28. package/build/cjs/server/middlewares/yt-auth.js +10 -42
  29. package/build/cjs/server/middlewares/yt-auth.js.map +1 -1
  30. package/build/cjs/server/routes.js +6 -1
  31. package/build/cjs/server/routes.js.map +1 -1
  32. package/build/cjs/server/utils/authorization.d.ts +6 -0
  33. package/build/cjs/server/utils/authorization.js +33 -0
  34. package/build/cjs/server/utils/authorization.js.map +1 -0
  35. package/build/cjs/shared/constants/index.d.ts +3 -0
  36. package/build/cjs/shared/constants/index.js +3 -1
  37. package/build/cjs/shared/constants/index.js.map +1 -1
  38. package/build/cjs/shared/yt-types.d.ts +2 -0
  39. package/build/cjs/ui/components/Login/LoginFormPage/LoginFormPage.js +23 -5
  40. package/build/cjs/ui/components/Login/LoginFormPage/LoginFormPage.js.map +1 -1
  41. package/build/cjs/ui/components/Login/LoginPageWrapper/LoginPageWrapper.css +8 -0
  42. package/build/cjs/ui/components/Login/LoginPageWrapper/LoginPageWrapper.css.map +1 -1
  43. package/build/cjs/ui/components/NumberInput/NumberInput.d.ts +1 -1
  44. package/build/cjs/ui/containers/AppNavigation/AppNavigation.js +2 -0
  45. package/build/cjs/ui/containers/AppNavigation/AppNavigation.js.map +1 -1
  46. package/build/cjs/ui/containers/AppNavigation/AppNavigationComponent.d.ts +1 -1
  47. package/build/cjs/ui/containers/AppNavigation/AppNavigationComponent.js +5 -7
  48. package/build/cjs/ui/containers/AppNavigation/AppNavigationComponent.js.map +1 -1
  49. package/build/cjs/ui/containers/AppNavigation/AppNavigationPageLayout.d.ts +2 -0
  50. package/build/cjs/ui/containers/AppNavigation/AppNavigationPageLayout.js.map +1 -1
  51. package/build/cjs/ui/rum/constants.d.ts +5 -1
  52. package/build/cjs/ui/rum/constants.js +5 -2
  53. package/build/cjs/ui/rum/constants.js.map +1 -1
  54. package/build/cjs/ui/rum/rum-counter.js +1 -1
  55. package/build/cjs/ui/rum/rum-counter.js.map +1 -1
  56. package/build/cjs/ui/store/actions/system/masters.d.ts +7 -5
  57. package/build/cjs/ui/store/actions/system/masters.js +305 -235
  58. package/build/cjs/ui/store/actions/system/masters.js.map +1 -1
  59. package/build/cjs/ui/store/reducers/global/index.d.ts +1 -0
  60. package/build/cjs/ui/store/reducers/global/index.js +1 -0
  61. package/build/cjs/ui/store/reducers/global/index.js.map +1 -1
  62. package/build/cjs/ui/store/reducers/system/masters.d.ts +2 -2
  63. package/build/cjs/ui/store/reducers/system/masters.js.map +1 -1
  64. package/build/cjs/ui/store/selectors/global/index.d.ts +4 -0
  65. package/build/cjs/ui/store/selectors/global/index.js +14 -4
  66. package/build/cjs/ui/store/selectors/global/index.js.map +1 -1
  67. package/build/cjs/ui/store/selectors/system/masters.d.ts +1 -1
  68. package/build/cjs/ui/store/selectors/system/masters.js.map +1 -1
  69. package/build/esm/@types/core.d.ts +38 -0
  70. package/build/esm/server/components/layout-config.js +7 -2
  71. package/build/esm/server/components/layout-config.js.map +1 -1
  72. package/build/esm/server/components/oauth.d.ts +26 -0
  73. package/build/esm/server/components/oauth.js +169 -0
  74. package/build/esm/server/components/oauth.js.map +1 -0
  75. package/build/esm/server/components/yt-auth.d.ts +6 -0
  76. package/build/esm/server/components/yt-auth.js +17 -0
  77. package/build/esm/server/components/yt-auth.js.map +1 -0
  78. package/build/esm/server/controllers/login.d.ts +0 -1
  79. package/build/esm/server/controllers/login.js +41 -88
  80. package/build/esm/server/controllers/login.js.map +1 -1
  81. package/build/esm/server/controllers/logout.d.ts +2 -0
  82. package/build/esm/server/controllers/logout.js +11 -0
  83. package/build/esm/server/controllers/logout.js.map +1 -0
  84. package/build/esm/server/controllers/oauth-login.d.ts +4 -0
  85. package/build/esm/server/controllers/oauth-login.js +50 -0
  86. package/build/esm/server/controllers/oauth-login.js.map +1 -0
  87. package/build/esm/server/index.js +7 -2
  88. package/build/esm/server/index.js.map +1 -1
  89. package/build/esm/server/middlewares/authorization.d.ts +2 -0
  90. package/build/esm/server/middlewares/authorization.js +74 -0
  91. package/build/esm/server/middlewares/authorization.js.map +1 -0
  92. package/build/esm/server/middlewares/oauth.d.ts +2 -0
  93. package/build/esm/server/middlewares/oauth.js +50 -0
  94. package/build/esm/server/middlewares/oauth.js.map +1 -0
  95. package/build/esm/server/middlewares/yt-auth.d.ts +1 -1
  96. package/build/esm/server/middlewares/yt-auth.js +8 -58
  97. package/build/esm/server/middlewares/yt-auth.js.map +1 -1
  98. package/build/esm/server/routes.js +16 -2
  99. package/build/esm/server/routes.js.map +1 -1
  100. package/build/esm/server/utils/authorization.d.ts +6 -0
  101. package/build/esm/server/utils/authorization.js +28 -0
  102. package/build/esm/server/utils/authorization.js.map +1 -0
  103. package/build/esm/shared/constants/index.d.ts +3 -0
  104. package/build/esm/shared/constants/index.js +2 -1
  105. package/build/esm/shared/constants/index.js.map +1 -1
  106. package/build/esm/shared/yt-types.d.ts +2 -0
  107. package/build/esm/ui/components/Login/LoginFormPage/LoginFormPage.js +24 -6
  108. package/build/esm/ui/components/Login/LoginFormPage/LoginFormPage.js.map +1 -1
  109. package/build/esm/ui/components/Login/LoginPageWrapper/LoginPageWrapper.css +8 -0
  110. package/build/esm/ui/components/Login/LoginPageWrapper/LoginPageWrapper.css.map +1 -1
  111. package/build/esm/ui/components/Login/LoginPageWrapper/LoginPageWrapper.scss +12 -0
  112. package/build/esm/ui/components/NumberInput/NumberInput.d.ts +1 -1
  113. package/build/esm/ui/containers/AppNavigation/AppNavigation.js +3 -1
  114. package/build/esm/ui/containers/AppNavigation/AppNavigation.js.map +1 -1
  115. package/build/esm/ui/containers/AppNavigation/AppNavigationComponent.d.ts +1 -1
  116. package/build/esm/ui/containers/AppNavigation/AppNavigationComponent.js +5 -7
  117. package/build/esm/ui/containers/AppNavigation/AppNavigationComponent.js.map +1 -1
  118. package/build/esm/ui/containers/AppNavigation/AppNavigationPageLayout.d.ts +2 -0
  119. package/build/esm/ui/containers/AppNavigation/AppNavigationPageLayout.js.map +1 -1
  120. package/build/esm/ui/rum/constants.d.ts +5 -1
  121. package/build/esm/ui/rum/constants.js +5 -2
  122. package/build/esm/ui/rum/constants.js.map +1 -1
  123. package/build/esm/ui/rum/rum-counter.js +1 -1
  124. package/build/esm/ui/rum/rum-counter.js.map +1 -1
  125. package/build/esm/ui/store/actions/system/masters.d.ts +7 -5
  126. package/build/esm/ui/store/actions/system/masters.js +303 -233
  127. package/build/esm/ui/store/actions/system/masters.js.map +1 -1
  128. package/build/esm/ui/store/reducers/global/index.d.ts +1 -0
  129. package/build/esm/ui/store/reducers/global/index.js +1 -0
  130. package/build/esm/ui/store/reducers/global/index.js.map +1 -1
  131. package/build/esm/ui/store/reducers/system/masters.d.ts +2 -2
  132. package/build/esm/ui/store/reducers/system/masters.js.map +1 -1
  133. package/build/esm/ui/store/selectors/global/index.d.ts +4 -0
  134. package/build/esm/ui/store/selectors/global/index.js +12 -2
  135. package/build/esm/ui/store/selectors/global/index.js.map +1 -1
  136. package/build/esm/ui/store/selectors/system/masters.d.ts +1 -1
  137. package/build/esm/ui/store/selectors/system/masters.js.map +1 -1
  138. package/dist/public/build/assets-manifest.json +12 -12
  139. package/dist/public/build/css/{main.136a49c7.css → main.e919e247.css} +2 -2
  140. package/dist/public/build/css/main.e919e247.css.map +1 -0
  141. package/dist/public/build/js/89.07445d46.chunk.js +2 -0
  142. package/dist/public/build/js/89.07445d46.chunk.js.map +1 -0
  143. package/dist/public/build/js/main.4eb01db4.js +3 -0
  144. package/dist/public/build/js/{main.f91e3651.js.map → main.4eb01db4.js.map} +1 -1
  145. package/dist/public/build/js/{runtime.6c8d85d3.js → runtime.9491563b.js} +2 -2
  146. package/dist/public/build/js/{runtime.6c8d85d3.js.map → runtime.9491563b.js.map} +1 -1
  147. package/dist/public/build/manifest.json +8 -8
  148. package/dist/server/components/layout-config.js +6 -1
  149. package/dist/server/components/oauth.d.ts +26 -0
  150. package/dist/server/components/oauth.js +123 -0
  151. package/dist/server/components/yt-auth.d.ts +6 -0
  152. package/dist/server/components/yt-auth.js +23 -0
  153. package/dist/server/controllers/login.d.ts +0 -1
  154. package/dist/server/controllers/login.js +4 -26
  155. package/dist/server/controllers/logout.d.ts +2 -0
  156. package/dist/server/controllers/logout.js +15 -0
  157. package/dist/server/controllers/oauth-login.d.ts +4 -0
  158. package/dist/server/controllers/oauth-login.js +30 -0
  159. package/dist/server/index.js +9 -1
  160. package/dist/server/middlewares/authorization.d.ts +2 -0
  161. package/dist/server/middlewares/authorization.js +42 -0
  162. package/dist/server/middlewares/oauth.d.ts +2 -0
  163. package/dist/server/middlewares/oauth.js +27 -0
  164. package/dist/server/middlewares/yt-auth.d.ts +1 -1
  165. package/dist/server/middlewares/yt-auth.js +10 -42
  166. package/dist/server/routes.js +6 -1
  167. package/dist/server/utils/authorization.d.ts +6 -0
  168. package/dist/server/utils/authorization.js +33 -0
  169. package/dist/shared/constants/index.d.ts +3 -0
  170. package/dist/shared/constants/index.js +3 -1
  171. package/package.json +2 -2
  172. package/dist/public/build/css/main.136a49c7.css.map +0 -1
  173. package/dist/public/build/js/89.6ea87438.chunk.js +0 -2
  174. package/dist/public/build/js/89.6ea87438.chunk.js.map +0 -1
  175. package/dist/public/build/js/main.f91e3651.js +0 -3
  176. /package/dist/public/build/js/{main.f91e3651.js.LICENSE.txt → main.4eb01db4.js.LICENSE.txt} +0 -0
@@ -0,0 +1,11 @@
1
+ import { getOAuthLogoutPath, isOAuthAllowed, isUserOAuthLogged } from '../components/oauth';
2
+ import { YTAuthLogout, isYtAuthEnabled } from '../components/yt-auth';
3
+ export function handleLogout(req, res) {
4
+ if (isOAuthAllowed(req) && isUserOAuthLogged(req)) {
5
+ res.redirect(getOAuthLogoutPath(req));
6
+ } else if (isYtAuthEnabled(req.ctx.config)) {
7
+ YTAuthLogout(res);
8
+ }
9
+ res.redirect('/');
10
+ }
11
+ // #sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getOAuthLogoutPath","isOAuthAllowed","isUserOAuthLogged","YTAuthLogout","isYtAuthEnabled","handleLogout","req","res","redirect","ctx","config"],"sources":["logout.ts"],"sourcesContent":["import type {Request, Response} from 'express';\nimport {getOAuthLogoutPath, isOAuthAllowed, isUserOAuthLogged} from '../components/oauth';\nimport {YTAuthLogout, isYtAuthEnabled} from '../components/yt-auth';\n\nexport function handleLogout(req: Request, res: Response) {\n if (isOAuthAllowed(req) && isUserOAuthLogged(req)) {\n res.redirect(getOAuthLogoutPath(req));\n } else if (isYtAuthEnabled(req.ctx.config)) {\n YTAuthLogout(res);\n }\n res.redirect('/');\n}\n"],"mappings":"AACA,SAAQA,kBAAkB,EAAEC,cAAc,EAAEC,iBAAiB,QAAO,qBAAqB;AACzF,SAAQC,YAAY,EAAEC,eAAe,QAAO,uBAAuB;AAEnE,OAAO,SAASC,YAAYA,CAACC,GAAY,EAAEC,GAAa,EAAE;EACtD,IAAIN,cAAc,CAACK,GAAG,CAAC,IAAIJ,iBAAiB,CAACI,GAAG,CAAC,EAAE;IAC/CC,GAAG,CAACC,QAAQ,CAACR,kBAAkB,CAACM,GAAG,CAAC,CAAC;EACzC,CAAC,MAAM,IAAIF,eAAe,CAACE,GAAG,CAACG,GAAG,CAACC,MAAM,CAAC,EAAE;IACxCP,YAAY,CAACI,GAAG,CAAC;EACrB;EACAA,GAAG,CAACC,QAAQ,CAAC,GAAG,CAAC;AACrB"}
@@ -0,0 +1,4 @@
1
+ import type { Request, Response } from 'express';
2
+ export declare function oauthLogin(req: Request, res: Response): void;
3
+ export declare function oauthLogout(_: Request, res: Response): void;
4
+ export declare function oauthCallback(req: Request, res: Response): Promise<void>;
@@ -0,0 +1,50 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
3
+ import { exchangeOAuthToken, getOAuthLoginPath, removeOAuthCookies, saveOAuthTokensInCookies } from '../components/oauth';
4
+ export function oauthLogin(req, res) {
5
+ res.redirect(getOAuthLoginPath(req));
6
+ }
7
+ export function oauthLogout(_, res) {
8
+ removeOAuthCookies(res);
9
+ res.redirect('/');
10
+ }
11
+ export function oauthCallback(_x, _x2) {
12
+ return _oauthCallback.apply(this, arguments);
13
+ }
14
+ function _oauthCallback() {
15
+ _oauthCallback = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(req, res) {
16
+ var code, tokens, message;
17
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
18
+ while (1) switch (_context.prev = _context.next) {
19
+ case 0:
20
+ code = req.query.code;
21
+ if (code) {
22
+ _context.next = 3;
23
+ break;
24
+ }
25
+ throw new Error('Authorization code is not specified');
26
+ case 3:
27
+ _context.prev = 3;
28
+ _context.next = 6;
29
+ return exchangeOAuthToken(req, code);
30
+ case 6:
31
+ tokens = _context.sent;
32
+ saveOAuthTokensInCookies(res, tokens);
33
+ res.redirect('/');
34
+ _context.next = 16;
35
+ break;
36
+ case 11:
37
+ _context.prev = 11;
38
+ _context.t0 = _context["catch"](3);
39
+ req.ctx.logError('exchange token error', _context.t0);
40
+ message = _context.t0 instanceof Error ? _context.t0.message : 'Unknown error';
41
+ res.status(500).send(message);
42
+ case 16:
43
+ case "end":
44
+ return _context.stop();
45
+ }
46
+ }, _callee, null, [[3, 11]]);
47
+ }));
48
+ return _oauthCallback.apply(this, arguments);
49
+ }
50
+ // #sourceMappingURL=oauth-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["exchangeOAuthToken","getOAuthLoginPath","removeOAuthCookies","saveOAuthTokensInCookies","oauthLogin","req","res","redirect","oauthLogout","_","oauthCallback","_x","_x2","_oauthCallback","apply","arguments","_asyncToGenerator","_regeneratorRuntime","mark","_callee","code","tokens","message","wrap","_callee$","_context","prev","next","query","Error","sent","t0","ctx","logError","status","send","stop"],"sources":["oauth-login.ts"],"sourcesContent":["import type {Request, Response} from 'express';\nimport {\n exchangeOAuthToken,\n getOAuthLoginPath,\n removeOAuthCookies,\n saveOAuthTokensInCookies,\n} from '../components/oauth';\n\nexport function oauthLogin(req: Request, res: Response) {\n res.redirect(getOAuthLoginPath(req));\n}\n\nexport function oauthLogout(_: Request, res: Response) {\n removeOAuthCookies(res);\n res.redirect('/');\n}\n\nexport async function oauthCallback(req: Request, res: Response) {\n const {code} = req.query;\n if (!code) {\n throw new Error('Authorization code is not specified');\n }\n\n try {\n const tokens = await exchangeOAuthToken(req, code as string);\n\n saveOAuthTokensInCookies(res, tokens);\n\n res.redirect('/');\n } catch (e) {\n req.ctx.logError('exchange token error', e);\n const message = e instanceof Error ? e.message : 'Unknown error';\n res.status(500).send(message);\n }\n}\n"],"mappings":";;AACA,SACIA,kBAAkB,EAClBC,iBAAiB,EACjBC,kBAAkB,EAClBC,wBAAwB,QACrB,qBAAqB;AAE5B,OAAO,SAASC,UAAUA,CAACC,GAAY,EAAEC,GAAa,EAAE;EACpDA,GAAG,CAACC,QAAQ,CAACN,iBAAiB,CAACI,GAAG,CAAC,CAAC;AACxC;AAEA,OAAO,SAASG,WAAWA,CAACC,CAAU,EAAEH,GAAa,EAAE;EACnDJ,kBAAkB,CAACI,GAAG,CAAC;EACvBA,GAAG,CAACC,QAAQ,CAAC,GAAG,CAAC;AACrB;AAEA,gBAAsBG,aAAaA,CAAAC,EAAA,EAAAC,GAAA;EAAA,OAAAC,cAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA;AAiBlC,SAAAF,eAAA;EAAAA,cAAA,GAAAG,iBAAA,eAAAC,mBAAA,CAAAC,IAAA,CAjBM,SAAAC,QAA6Bd,GAAY,EAAEC,GAAa;IAAA,IAAAc,IAAA,EAAAC,MAAA,EAAAC,OAAA;IAAA,OAAAL,mBAAA,CAAAM,IAAA,UAAAC,SAAAC,QAAA;MAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;QAAA;UACpDP,IAAI,GAAIf,GAAG,CAACuB,KAAK,CAAjBR,IAAI;UAAA,IACNA,IAAI;YAAAK,QAAA,CAAAE,IAAA;YAAA;UAAA;UAAA,MACC,IAAIE,KAAK,CAAC,qCAAqC,CAAC;QAAA;UAAAJ,QAAA,CAAAC,IAAA;UAAAD,QAAA,CAAAE,IAAA;UAAA,OAIjC3B,kBAAkB,CAACK,GAAG,EAAEe,IAAc,CAAC;QAAA;UAAtDC,MAAM,GAAAI,QAAA,CAAAK,IAAA;UAEZ3B,wBAAwB,CAACG,GAAG,EAAEe,MAAM,CAAC;UAErCf,GAAG,CAACC,QAAQ,CAAC,GAAG,CAAC;UAACkB,QAAA,CAAAE,IAAA;UAAA;QAAA;UAAAF,QAAA,CAAAC,IAAA;UAAAD,QAAA,CAAAM,EAAA,GAAAN,QAAA;UAElBpB,GAAG,CAAC2B,GAAG,CAACC,QAAQ,CAAC,sBAAsB,EAAAR,QAAA,CAAAM,EAAG,CAAC;UACrCT,OAAO,GAAGG,QAAA,CAAAM,EAAA,YAAaF,KAAK,GAAGJ,QAAA,CAAAM,EAAA,CAAET,OAAO,GAAG,eAAe;UAChEhB,GAAG,CAAC4B,MAAM,CAAC,GAAG,CAAC,CAACC,IAAI,CAACb,OAAO,CAAC;QAAC;QAAA;UAAA,OAAAG,QAAA,CAAAW,IAAA;MAAA;IAAA,GAAAjB,OAAA;EAAA,CAErC;EAAA,OAAAN,cAAA,CAAAC,KAAA,OAAAC,SAAA;AAAA"}
@@ -1,10 +1,14 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
1
2
  var _nodekit$config$adjus, _nodekit$config3;
2
3
  import path from 'path';
3
4
  import { NodeKit } from '@gravity-ui/nodekit';
4
5
  import { ExpressKit } from '@gravity-ui/expresskit';
5
6
  import { configureApp } from './configure-app';
6
- import { createYTAuthMiddleware } from './middlewares/yt-auth';
7
+ import { createYTAuthorizationResolver } from './middlewares/yt-auth';
7
8
  import routes from './routes';
9
+ import { createOAuthAuthorizationResolver } from './middlewares/oauth';
10
+ import { createAuthMiddleware } from './middlewares/authorization';
11
+ import { authorizationResolver } from './utils/authorization';
8
12
  var nodekit = new NodeKit({
9
13
  configsPath: path.resolve(__dirname, './configs')
10
14
  });
@@ -26,7 +30,8 @@ if (ytAuthCluster) {
26
30
  if (appAuthHandler) {
27
31
  nodekit.ctx.fail(new Error('"appAuthHandler" option will be ignored cause "ytAuthCluster" option is provided.'));
28
32
  }
29
- nodekit.config.appAuthHandler = createYTAuthMiddleware(ytAuthCluster);
33
+ nodekit.config.appBeforeAuthMiddleware = [].concat(_toConsumableArray(nodekit.config.appBeforeAuthMiddleware || []), [authorizationResolver(createOAuthAuthorizationResolver()), authorizationResolver(createYTAuthorizationResolver())]);
34
+ nodekit.config.appAuthHandler = createAuthMiddleware(ytAuthCluster);
30
35
  }
31
36
  (_nodekit$config$adjus = (_nodekit$config3 = nodekit.config).adjustAppConfig) === null || _nodekit$config$adjus === void 0 || _nodekit$config$adjus.call(_nodekit$config3, nodekit);
32
37
  var app = new ExpressKit(nodekit, routes);
@@ -1 +1 @@
1
- {"version":3,"names":["path","NodeKit","ExpressKit","configureApp","createYTAuthMiddleware","routes","nodekit","configsPath","resolve","__dirname","_nodekit$config","config","appName","appEnv","appInstallation","appDevMode","ctx","log","_nodekit$config2","ytAuthCluster","appAuthHandler","fail","Error","_nodekit$config$adjus","_nodekit$config3","adjustAppConfig","call","app","require","main","module","run"],"sources":["index.ts"],"sourcesContent":["import path from 'path';\nimport _reduce from 'lodash/reduce';\nimport {NodeKit} from '@gravity-ui/nodekit';\nimport {ExpressKit} from '@gravity-ui/expresskit';\n\nimport {configureApp} from './configure-app';\n\nimport {createYTAuthMiddleware} from './middlewares/yt-auth';\nimport routes from './routes';\n\nconst nodekit = new NodeKit({configsPath: path.resolve(__dirname, './configs')});\n\nconst {appName, appEnv, appInstallation, appDevMode} = nodekit.config;\nnodekit.ctx.log('AppConfig details', {\n appName,\n appEnv,\n appInstallation,\n appDevMode,\n});\n\nconst {ytAuthCluster, appAuthHandler} = nodekit.config;\n\nif (ytAuthCluster) {\n if (appAuthHandler) {\n nodekit.ctx.fail(\n new Error(\n '\"appAuthHandler\" option will be ignored cause \"ytAuthCluster\" option is provided.',\n ),\n );\n }\n\n nodekit.config.appAuthHandler = createYTAuthMiddleware(ytAuthCluster);\n}\n\nnodekit.config.adjustAppConfig?.(nodekit);\n\nconst app = new ExpressKit(nodekit, routes);\nconfigureApp(app);\n\nif (require.main === module) {\n app.run();\n}\n\nexport default app;\n"],"mappings":";AAAA,OAAOA,IAAI,MAAM,MAAM;AAEvB,SAAQC,OAAO,QAAO,qBAAqB;AAC3C,SAAQC,UAAU,QAAO,wBAAwB;AAEjD,SAAQC,YAAY,QAAO,iBAAiB;AAE5C,SAAQC,sBAAsB,QAAO,uBAAuB;AAC5D,OAAOC,MAAM,MAAM,UAAU;AAE7B,IAAMC,OAAO,GAAG,IAAIL,OAAO,CAAC;EAACM,WAAW,EAAEP,IAAI,CAACQ,OAAO,CAACC,SAAS,EAAE,WAAW;AAAC,CAAC,CAAC;AAEhF,IAAAC,eAAA,GAAuDJ,OAAO,CAACK,MAAM;EAA9DC,OAAO,GAAAF,eAAA,CAAPE,OAAO;EAAEC,MAAM,GAAAH,eAAA,CAANG,MAAM;EAAEC,eAAe,GAAAJ,eAAA,CAAfI,eAAe;EAAEC,UAAU,GAAAL,eAAA,CAAVK,UAAU;AACnDT,OAAO,CAACU,GAAG,CAACC,GAAG,CAAC,mBAAmB,EAAE;EACjCL,OAAO,EAAPA,OAAO;EACPC,MAAM,EAANA,MAAM;EACNC,eAAe,EAAfA,eAAe;EACfC,UAAU,EAAVA;AACJ,CAAC,CAAC;AAEF,IAAAG,gBAAA,GAAwCZ,OAAO,CAACK,MAAM;EAA/CQ,aAAa,GAAAD,gBAAA,CAAbC,aAAa;EAAEC,cAAc,GAAAF,gBAAA,CAAdE,cAAc;AAEpC,IAAID,aAAa,EAAE;EACf,IAAIC,cAAc,EAAE;IAChBd,OAAO,CAACU,GAAG,CAACK,IAAI,CACZ,IAAIC,KAAK,CACL,mFACJ,CACJ,CAAC;EACL;EAEAhB,OAAO,CAACK,MAAM,CAACS,cAAc,GAAGhB,sBAAsB,CAACe,aAAa,CAAC;AACzE;AAEA,CAAAI,qBAAA,IAAAC,gBAAA,GAAAlB,OAAO,CAACK,MAAM,EAACc,eAAe,cAAAF,qBAAA,eAA9BA,qBAAA,CAAAG,IAAA,CAAAF,gBAAA,EAAiClB,OAAO,CAAC;AAEzC,IAAMqB,GAAG,GAAG,IAAIzB,UAAU,CAACI,OAAO,EAAED,MAAM,CAAC;AAC3CF,YAAY,CAACwB,GAAG,CAAC;AAEjB,IAAIC,OAAO,CAACC,IAAI,KAAKC,MAAM,EAAE;EACzBH,GAAG,CAACI,GAAG,CAAC,CAAC;AACb;AAEA,eAAeJ,GAAG"}
1
+ {"version":3,"names":["path","NodeKit","ExpressKit","configureApp","createYTAuthorizationResolver","routes","createOAuthAuthorizationResolver","createAuthMiddleware","authorizationResolver","nodekit","configsPath","resolve","__dirname","_nodekit$config","config","appName","appEnv","appInstallation","appDevMode","ctx","log","_nodekit$config2","ytAuthCluster","appAuthHandler","fail","Error","appBeforeAuthMiddleware","concat","_toConsumableArray","_nodekit$config$adjus","_nodekit$config3","adjustAppConfig","call","app","require","main","module","run"],"sources":["index.ts"],"sourcesContent":["import path from 'path';\nimport _reduce from 'lodash/reduce';\nimport {NodeKit} from '@gravity-ui/nodekit';\nimport {ExpressKit} from '@gravity-ui/expresskit';\n\nimport {configureApp} from './configure-app';\n\nimport {createYTAuthorizationResolver} from './middlewares/yt-auth';\nimport routes from './routes';\nimport {createOAuthAuthorizationResolver} from './middlewares/oauth';\nimport {createAuthMiddleware} from './middlewares/authorization';\nimport {authorizationResolver} from './utils/authorization';\n\nconst nodekit = new NodeKit({configsPath: path.resolve(__dirname, './configs')});\n\nconst {appName, appEnv, appInstallation, appDevMode} = nodekit.config;\nnodekit.ctx.log('AppConfig details', {\n appName,\n appEnv,\n appInstallation,\n appDevMode,\n});\n\nconst {ytAuthCluster, appAuthHandler} = nodekit.config;\n\nif (ytAuthCluster) {\n if (appAuthHandler) {\n nodekit.ctx.fail(\n new Error(\n '\"appAuthHandler\" option will be ignored cause \"ytAuthCluster\" option is provided.',\n ),\n );\n }\n\n nodekit.config.appBeforeAuthMiddleware = [\n ...(nodekit.config.appBeforeAuthMiddleware || []),\n authorizationResolver(createOAuthAuthorizationResolver()),\n authorizationResolver(createYTAuthorizationResolver()),\n ];\n nodekit.config.appAuthHandler = createAuthMiddleware(ytAuthCluster);\n}\n\nnodekit.config.adjustAppConfig?.(nodekit);\n\nconst app = new ExpressKit(nodekit, routes);\nconfigureApp(app);\n\nif (require.main === module) {\n app.run();\n}\n\nexport default app;\n"],"mappings":";;AAAA,OAAOA,IAAI,MAAM,MAAM;AAEvB,SAAQC,OAAO,QAAO,qBAAqB;AAC3C,SAAQC,UAAU,QAAO,wBAAwB;AAEjD,SAAQC,YAAY,QAAO,iBAAiB;AAE5C,SAAQC,6BAA6B,QAAO,uBAAuB;AACnE,OAAOC,MAAM,MAAM,UAAU;AAC7B,SAAQC,gCAAgC,QAAO,qBAAqB;AACpE,SAAQC,oBAAoB,QAAO,6BAA6B;AAChE,SAAQC,qBAAqB,QAAO,uBAAuB;AAE3D,IAAMC,OAAO,GAAG,IAAIR,OAAO,CAAC;EAACS,WAAW,EAAEV,IAAI,CAACW,OAAO,CAACC,SAAS,EAAE,WAAW;AAAC,CAAC,CAAC;AAEhF,IAAAC,eAAA,GAAuDJ,OAAO,CAACK,MAAM;EAA9DC,OAAO,GAAAF,eAAA,CAAPE,OAAO;EAAEC,MAAM,GAAAH,eAAA,CAANG,MAAM;EAAEC,eAAe,GAAAJ,eAAA,CAAfI,eAAe;EAAEC,UAAU,GAAAL,eAAA,CAAVK,UAAU;AACnDT,OAAO,CAACU,GAAG,CAACC,GAAG,CAAC,mBAAmB,EAAE;EACjCL,OAAO,EAAPA,OAAO;EACPC,MAAM,EAANA,MAAM;EACNC,eAAe,EAAfA,eAAe;EACfC,UAAU,EAAVA;AACJ,CAAC,CAAC;AAEF,IAAAG,gBAAA,GAAwCZ,OAAO,CAACK,MAAM;EAA/CQ,aAAa,GAAAD,gBAAA,CAAbC,aAAa;EAAEC,cAAc,GAAAF,gBAAA,CAAdE,cAAc;AAEpC,IAAID,aAAa,EAAE;EACf,IAAIC,cAAc,EAAE;IAChBd,OAAO,CAACU,GAAG,CAACK,IAAI,CACZ,IAAIC,KAAK,CACL,mFACJ,CACJ,CAAC;EACL;EAEAhB,OAAO,CAACK,MAAM,CAACY,uBAAuB,MAAAC,MAAA,CAAAC,kBAAA,CAC9BnB,OAAO,CAACK,MAAM,CAACY,uBAAuB,IAAI,EAAE,IAChDlB,qBAAqB,CAACF,gCAAgC,CAAC,CAAC,CAAC,EACzDE,qBAAqB,CAACJ,6BAA6B,CAAC,CAAC,CAAC,EACzD;EACDK,OAAO,CAACK,MAAM,CAACS,cAAc,GAAGhB,oBAAoB,CAACe,aAAa,CAAC;AACvE;AAEA,CAAAO,qBAAA,IAAAC,gBAAA,GAAArB,OAAO,CAACK,MAAM,EAACiB,eAAe,cAAAF,qBAAA,eAA9BA,qBAAA,CAAAG,IAAA,CAAAF,gBAAA,EAAiCrB,OAAO,CAAC;AAEzC,IAAMwB,GAAG,GAAG,IAAI/B,UAAU,CAACO,OAAO,EAAEJ,MAAM,CAAC;AAC3CF,YAAY,CAAC8B,GAAG,CAAC;AAEjB,IAAIC,OAAO,CAACC,IAAI,KAAKC,MAAM,EAAE;EACzBH,GAAG,CAACI,GAAG,CAAC,CAAC;AACb;AAEA,eAAeJ,GAAG"}
@@ -0,0 +1,2 @@
1
+ import { AppMiddleware } from '@gravity-ui/expresskit';
2
+ export declare function createAuthMiddleware(ytAuthCluster: string): AppMiddleware;
@@ -0,0 +1,74 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _createClass from "@babel/runtime/helpers/createClass";
3
+ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
4
+ import _inherits from "@babel/runtime/helpers/inherits";
5
+ import _createSuper from "@babel/runtime/helpers/createSuper";
6
+ import _wrapNativeSuper from "@babel/runtime/helpers/wrapNativeSuper";
7
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
8
+ import axios from 'axios';
9
+ import { isAuthorized } from '../utils/authorization';
10
+ import { getUserYTApiSetup } from '../components/requestsSetup';
11
+ import { getXSRFToken } from '../components/cluster-queries';
12
+ import { sendError } from '../utils';
13
+ var AuthError = /*#__PURE__*/function (_Error) {
14
+ _inherits(AuthError, _Error);
15
+ var _super = _createSuper(AuthError);
16
+ function AuthError() {
17
+ _classCallCheck(this, AuthError);
18
+ return _super.call(this, 'Authorization required');
19
+ }
20
+ return _createClass(AuthError);
21
+ }( /*#__PURE__*/_wrapNativeSuper(Error));
22
+ function isAuthError(e) {
23
+ var _e$response;
24
+ return e instanceof AuthError || axios.isAxiosError(e) && ((_e$response = e.response) === null || _e$response === void 0 ? void 0 : _e$response.status) === 401;
25
+ }
26
+ export function createAuthMiddleware(ytAuthCluster) {
27
+ return /*#__PURE__*/function () {
28
+ var _authMiddleware = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(req, res, next) {
29
+ var cfg, _yield$getXSRFToken, login, isAuthFailed, error;
30
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
31
+ while (1) switch (_context.prev = _context.next) {
32
+ case 0:
33
+ _context.prev = 0;
34
+ if (isAuthorized(req)) {
35
+ _context.next = 3;
36
+ break;
37
+ }
38
+ throw new AuthError();
39
+ case 3:
40
+ cfg = getUserYTApiSetup(ytAuthCluster, req);
41
+ _context.next = 6;
42
+ return getXSRFToken(req, cfg);
43
+ case 6:
44
+ _yield$getXSRFToken = _context.sent;
45
+ login = _yield$getXSRFToken.login;
46
+ req.yt.login = login;
47
+ _context.next = 18;
48
+ break;
49
+ case 11:
50
+ _context.prev = 11;
51
+ _context.t0 = _context["catch"](0);
52
+ isAuthFailed = isAuthError(_context.t0);
53
+ error = isAuthFailed ? undefined : _context.t0;
54
+ if (!(!req.routeInfo.ui && isAuthFailed)) {
55
+ _context.next = 18;
56
+ break;
57
+ }
58
+ sendError(res, error, 401);
59
+ return _context.abrupt("return");
60
+ case 18:
61
+ next();
62
+ case 19:
63
+ case "end":
64
+ return _context.stop();
65
+ }
66
+ }, _callee, null, [[0, 11]]);
67
+ }));
68
+ function authMiddleware(_x, _x2, _x3) {
69
+ return _authMiddleware.apply(this, arguments);
70
+ }
71
+ return authMiddleware;
72
+ }();
73
+ }
74
+ // #sourceMappingURL=authorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["axios","isAuthorized","getUserYTApiSetup","getXSRFToken","sendError","AuthError","_Error","_inherits","_super","_createSuper","_classCallCheck","call","_createClass","_wrapNativeSuper","Error","isAuthError","e","_e$response","isAxiosError","response","status","createAuthMiddleware","ytAuthCluster","_authMiddleware","_asyncToGenerator","_regeneratorRuntime","mark","_callee","req","res","next","cfg","_yield$getXSRFToken","login","isAuthFailed","error","wrap","_callee$","_context","prev","sent","yt","t0","undefined","routeInfo","ui","abrupt","stop","authMiddleware","_x","_x2","_x3","apply","arguments"],"sources":["authorization.ts"],"sourcesContent":["import axios from 'axios';\nimport {isAuthorized} from '../utils/authorization';\nimport {getUserYTApiSetup} from '../components/requestsSetup';\nimport {AppMiddleware} from '@gravity-ui/expresskit';\nimport {getXSRFToken} from '../components/cluster-queries';\nimport {sendError} from '../utils';\n\nclass AuthError extends Error {\n constructor() {\n super('Authorization required');\n }\n}\n\nfunction isAuthError(e: unknown) {\n return e instanceof AuthError || (axios.isAxiosError(e) && e.response?.status === 401);\n}\n\nexport function createAuthMiddleware(ytAuthCluster: string): AppMiddleware {\n return async function authMiddleware(req, res, next) {\n try {\n if (!isAuthorized(req)) {\n throw new AuthError();\n }\n\n const cfg = getUserYTApiSetup(ytAuthCluster, req);\n const {login} = await getXSRFToken(req, cfg);\n req.yt.login = login;\n } catch (e) {\n const isAuthFailed = isAuthError(e);\n const error = isAuthFailed ? undefined : e;\n\n if (!req.routeInfo.ui && isAuthFailed) {\n sendError(res, error, 401);\n return;\n }\n }\n\n next();\n };\n}\n"],"mappings":";;;;;;;AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAAQC,YAAY,QAAO,wBAAwB;AACnD,SAAQC,iBAAiB,QAAO,6BAA6B;AAE7D,SAAQC,YAAY,QAAO,+BAA+B;AAC1D,SAAQC,SAAS,QAAO,UAAU;AAAC,IAE7BC,SAAS,0BAAAC,MAAA;EAAAC,SAAA,CAAAF,SAAA,EAAAC,MAAA;EAAA,IAAAE,MAAA,GAAAC,YAAA,CAAAJ,SAAA;EACX,SAAAA,UAAA,EAAc;IAAAK,eAAA,OAAAL,SAAA;IAAA,OAAAG,MAAA,CAAAG,IAAA,OACJ,wBAAwB;EAClC;EAAC,OAAAC,YAAA,CAAAP,SAAA;AAAA,gBAAAQ,gBAAA,CAHmBC,KAAK;AAM7B,SAASC,WAAWA,CAACC,CAAU,EAAE;EAAA,IAAAC,WAAA;EAC7B,OAAOD,CAAC,YAAYX,SAAS,IAAKL,KAAK,CAACkB,YAAY,CAACF,CAAC,CAAC,IAAI,EAAAC,WAAA,GAAAD,CAAC,CAACG,QAAQ,cAAAF,WAAA,uBAAVA,WAAA,CAAYG,MAAM,MAAK,GAAI;AAC1F;AAEA,OAAO,SAASC,oBAAoBA,CAACC,aAAqB,EAAiB;EACvE;IAAA,IAAAC,eAAA,GAAAC,iBAAA,eAAAC,mBAAA,CAAAC,IAAA,CAAO,SAAAC,QAA8BC,GAAG,EAAEC,GAAG,EAAEC,IAAI;MAAA,IAAAC,GAAA,EAAAC,mBAAA,EAAAC,KAAA,EAAAC,YAAA,EAAAC,KAAA;MAAA,OAAAV,mBAAA,CAAAW,IAAA,UAAAC,SAAAC,QAAA;QAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAR,IAAA;UAAA;YAAAQ,QAAA,CAAAC,IAAA;YAAA,IAEtCtC,YAAY,CAAC2B,GAAG,CAAC;cAAAU,QAAA,CAAAR,IAAA;cAAA;YAAA;YAAA,MACZ,IAAIzB,SAAS,CAAC,CAAC;UAAA;YAGnB0B,GAAG,GAAG7B,iBAAiB,CAACoB,aAAa,EAAEM,GAAG,CAAC;YAAAU,QAAA,CAAAR,IAAA;YAAA,OAC3B3B,YAAY,CAACyB,GAAG,EAAEG,GAAG,CAAC;UAAA;YAAAC,mBAAA,GAAAM,QAAA,CAAAE,IAAA;YAArCP,KAAK,GAAAD,mBAAA,CAALC,KAAK;YACZL,GAAG,CAACa,EAAE,CAACR,KAAK,GAAGA,KAAK;YAACK,QAAA,CAAAR,IAAA;YAAA;UAAA;YAAAQ,QAAA,CAAAC,IAAA;YAAAD,QAAA,CAAAI,EAAA,GAAAJ,QAAA;YAEfJ,YAAY,GAAGnB,WAAW,CAAAuB,QAAA,CAAAI,EAAE,CAAC;YAC7BP,KAAK,GAAGD,YAAY,GAAGS,SAAS,GAAAL,QAAA,CAAAI,EAAI;YAAA,MAEtC,CAACd,GAAG,CAACgB,SAAS,CAACC,EAAE,IAAIX,YAAY;cAAAI,QAAA,CAAAR,IAAA;cAAA;YAAA;YACjC1B,SAAS,CAACyB,GAAG,EAAEM,KAAK,EAAE,GAAG,CAAC;YAAC,OAAAG,QAAA,CAAAQ,MAAA;UAAA;YAKnChB,IAAI,CAAC,CAAC;UAAC;UAAA;YAAA,OAAAQ,QAAA,CAAAS,IAAA;QAAA;MAAA,GAAApB,OAAA;IAAA,CACV;IAAA,SApBqBqB,cAAcA,CAAAC,EAAA,EAAAC,GAAA,EAAAC,GAAA;MAAA,OAAA5B,eAAA,CAAA6B,KAAA,OAAAC,SAAA;IAAA;IAAA,OAAdL,cAAc;EAAA;AAqBxC"}
@@ -0,0 +1,2 @@
1
+ import { AppMiddleware } from '@gravity-ui/expresskit';
2
+ export declare function createOAuthAuthorizationResolver(): AppMiddleware;
@@ -0,0 +1,50 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
3
+ import { getOAuthAccessToken, isOAuthAllowed, isUserOAuthLogged } from '../components/oauth';
4
+ export function createOAuthAuthorizationResolver() {
5
+ return /*#__PURE__*/function () {
6
+ var _resoleOAuthAuthorize = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(req, res, next) {
7
+ var token;
8
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
9
+ while (1) switch (_context.prev = _context.next) {
10
+ case 0:
11
+ if (!(!isOAuthAllowed(req) || !isUserOAuthLogged(req))) {
12
+ _context.next = 3;
13
+ break;
14
+ }
15
+ next();
16
+ return _context.abrupt("return");
17
+ case 3:
18
+ _context.prev = 3;
19
+ _context.next = 6;
20
+ return getOAuthAccessToken(req, res);
21
+ case 6:
22
+ token = _context.sent;
23
+ req.yt = {
24
+ ytApiAuthHeaders: {
25
+ Authorization: "OAuth ".concat(token)
26
+ }
27
+ };
28
+ req.ctx.log('OAuth: provide a token');
29
+ _context.next = 14;
30
+ break;
31
+ case 11:
32
+ _context.prev = 11;
33
+ _context.t0 = _context["catch"](3);
34
+ req.ctx.logError('Can not resolve access token', _context.t0);
35
+ case 14:
36
+ next();
37
+ return _context.abrupt("return");
38
+ case 16:
39
+ case "end":
40
+ return _context.stop();
41
+ }
42
+ }, _callee, null, [[3, 11]]);
43
+ }));
44
+ function resoleOAuthAuthorize(_x, _x2, _x3) {
45
+ return _resoleOAuthAuthorize.apply(this, arguments);
46
+ }
47
+ return resoleOAuthAuthorize;
48
+ }();
49
+ }
50
+ // #sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["getOAuthAccessToken","isOAuthAllowed","isUserOAuthLogged","createOAuthAuthorizationResolver","_resoleOAuthAuthorize","_asyncToGenerator","_regeneratorRuntime","mark","_callee","req","res","next","token","wrap","_callee$","_context","prev","abrupt","sent","yt","ytApiAuthHeaders","Authorization","concat","ctx","log","t0","logError","stop","resoleOAuthAuthorize","_x","_x2","_x3","apply","arguments"],"sources":["oauth.ts"],"sourcesContent":["import {AppMiddleware} from '@gravity-ui/expresskit';\nimport type {Request, Response} from 'express';\nimport {getOAuthAccessToken, isOAuthAllowed, isUserOAuthLogged} from '../components/oauth';\n\nexport function createOAuthAuthorizationResolver(): AppMiddleware {\n return async function resoleOAuthAuthorize(req: Request, res: Response, next) {\n if (!isOAuthAllowed(req) || !isUserOAuthLogged(req)) {\n next();\n return;\n }\n try {\n const token = await getOAuthAccessToken(req, res);\n req.yt = {\n ytApiAuthHeaders: {\n Authorization: `OAuth ${token}`,\n },\n };\n req.ctx.log('OAuth: provide a token');\n } catch (e) {\n req.ctx.logError('Can not resolve access token', e);\n }\n next();\n return;\n };\n}\n"],"mappings":";;AAEA,SAAQA,mBAAmB,EAAEC,cAAc,EAAEC,iBAAiB,QAAO,qBAAqB;AAE1F,OAAO,SAASC,gCAAgCA,CAAA,EAAkB;EAC9D;IAAA,IAAAC,qBAAA,GAAAC,iBAAA,eAAAC,mBAAA,CAAAC,IAAA,CAAO,SAAAC,QAAoCC,GAAY,EAAEC,GAAa,EAAEC,IAAI;MAAA,IAAAC,KAAA;MAAA,OAAAN,mBAAA,CAAAO,IAAA,UAAAC,SAAAC,QAAA;QAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAJ,IAAA;UAAA;YAAA,MACpE,CAACV,cAAc,CAACQ,GAAG,CAAC,IAAI,CAACP,iBAAiB,CAACO,GAAG,CAAC;cAAAM,QAAA,CAAAJ,IAAA;cAAA;YAAA;YAC/CA,IAAI,CAAC,CAAC;YAAC,OAAAI,QAAA,CAAAE,MAAA;UAAA;YAAAF,QAAA,CAAAC,IAAA;YAAAD,QAAA,CAAAJ,IAAA;YAAA,OAIaX,mBAAmB,CAACS,GAAG,EAAEC,GAAG,CAAC;UAAA;YAA3CE,KAAK,GAAAG,QAAA,CAAAG,IAAA;YACXT,GAAG,CAACU,EAAE,GAAG;cACLC,gBAAgB,EAAE;gBACdC,aAAa,WAAAC,MAAA,CAAWV,KAAK;cACjC;YACJ,CAAC;YACDH,GAAG,CAACc,GAAG,CAACC,GAAG,CAAC,wBAAwB,CAAC;YAACT,QAAA,CAAAJ,IAAA;YAAA;UAAA;YAAAI,QAAA,CAAAC,IAAA;YAAAD,QAAA,CAAAU,EAAA,GAAAV,QAAA;YAEtCN,GAAG,CAACc,GAAG,CAACG,QAAQ,CAAC,8BAA8B,EAAAX,QAAA,CAAAU,EAAG,CAAC;UAAC;YAExDd,IAAI,CAAC,CAAC;YAAC,OAAAI,QAAA,CAAAE,MAAA;UAAA;UAAA;YAAA,OAAAF,QAAA,CAAAY,IAAA;QAAA;MAAA,GAAAnB,OAAA;IAAA,CAEV;IAAA,SAlBqBoB,oBAAoBA,CAAAC,EAAA,EAAAC,GAAA,EAAAC,GAAA;MAAA,OAAA3B,qBAAA,CAAA4B,KAAA,OAAAC,SAAA;IAAA;IAAA,OAApBL,oBAAoB;EAAA;AAmB9C"}
@@ -1,2 +1,2 @@
1
1
  import { AppMiddleware } from '@gravity-ui/expresskit';
2
- export declare function createYTAuthMiddleware(ytAuthCluster: string): AppMiddleware;
2
+ export declare function createYTAuthorizationResolver(): AppMiddleware;
@@ -1,80 +1,30 @@
1
1
  import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
- import _createClass from "@babel/runtime/helpers/createClass";
3
- import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
4
- import _inherits from "@babel/runtime/helpers/inherits";
5
- import _createSuper from "@babel/runtime/helpers/createSuper";
6
- import _wrapNativeSuper from "@babel/runtime/helpers/wrapNativeSuper";
7
2
  import _regeneratorRuntime from "@babel/runtime/regenerator";
8
- import axios from 'axios';
9
3
  import { YT_CYPRESS_COOKIE_NAME } from '../../shared/constants';
10
- import { getXSRFToken } from '../components/cluster-queries';
11
- import { getUserYTApiSetup } from '../components/requestsSetup';
12
- import { sendError } from '../utils';
13
- var AuthError = /*#__PURE__*/function (_Error) {
14
- _inherits(AuthError, _Error);
15
- var _super = _createSuper(AuthError);
16
- function AuthError() {
17
- _classCallCheck(this, AuthError);
18
- return _super.call(this, 'Authorization required');
19
- }
20
- return _createClass(AuthError);
21
- }( /*#__PURE__*/_wrapNativeSuper(Error));
22
- function isAuthError(e) {
23
- var _e$response;
24
- return e instanceof AuthError || axios.isAxiosError(e) && ((_e$response = e.response) === null || _e$response === void 0 ? void 0 : _e$response.status) === 401;
25
- }
26
- export function createYTAuthMiddleware(ytAuthCluster) {
4
+ export function createYTAuthorizationResolver() {
27
5
  return /*#__PURE__*/function () {
28
- var _ytAuthMiddleware = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(req, res, next) {
29
- var secret, cfg, _yield$getXSRFToken, login, isAuthFailed, error;
6
+ var _resoleOAuthAuthorize = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(req, _, next) {
7
+ var secret;
30
8
  return _regeneratorRuntime.wrap(function _callee$(_context) {
31
9
  while (1) switch (_context.prev = _context.next) {
32
10
  case 0:
33
- _context.prev = 0;
34
11
  secret = req.cookies[YT_CYPRESS_COOKIE_NAME];
35
12
  req.yt = {
36
13
  ytApiAuthHeaders: {
37
14
  Cookie: "".concat(YT_CYPRESS_COOKIE_NAME, "=").concat(secret, ";")
38
15
  }
39
16
  };
40
- if (secret) {
41
- _context.next = 5;
42
- break;
43
- }
44
- throw new AuthError();
45
- case 5:
46
- cfg = getUserYTApiSetup(ytAuthCluster, req);
47
- _context.next = 8;
48
- return getXSRFToken(req, cfg);
49
- case 8:
50
- _yield$getXSRFToken = _context.sent;
51
- login = _yield$getXSRFToken.login;
52
- req.yt.login = login;
53
- _context.next = 20;
54
- break;
55
- case 13:
56
- _context.prev = 13;
57
- _context.t0 = _context["catch"](0);
58
- isAuthFailed = isAuthError(_context.t0);
59
- error = isAuthFailed ? undefined : _context.t0;
60
- if (!(!req.routeInfo.ui && isAuthFailed)) {
61
- _context.next = 20;
62
- break;
63
- }
64
- sendError(res, error, 401);
65
- return _context.abrupt("return");
66
- case 20:
67
17
  next();
68
- case 21:
18
+ case 3:
69
19
  case "end":
70
20
  return _context.stop();
71
21
  }
72
- }, _callee, null, [[0, 13]]);
22
+ }, _callee);
73
23
  }));
74
- function ytAuthMiddleware(_x, _x2, _x3) {
75
- return _ytAuthMiddleware.apply(this, arguments);
24
+ function resoleOAuthAuthorize(_x, _x2, _x3) {
25
+ return _resoleOAuthAuthorize.apply(this, arguments);
76
26
  }
77
- return ytAuthMiddleware;
27
+ return resoleOAuthAuthorize;
78
28
  }();
79
29
  }
80
30
  // #sourceMappingURL=yt-auth.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["axios","YT_CYPRESS_COOKIE_NAME","getXSRFToken","getUserYTApiSetup","sendError","AuthError","_Error","_inherits","_super","_createSuper","_classCallCheck","call","_createClass","_wrapNativeSuper","Error","isAuthError","e","_e$response","isAxiosError","response","status","createYTAuthMiddleware","ytAuthCluster","_ytAuthMiddleware","_asyncToGenerator","_regeneratorRuntime","mark","_callee","req","res","next","secret","cfg","_yield$getXSRFToken","login","isAuthFailed","error","wrap","_callee$","_context","prev","cookies","yt","ytApiAuthHeaders","Cookie","concat","sent","t0","undefined","routeInfo","ui","abrupt","stop","ytAuthMiddleware","_x","_x2","_x3","apply","arguments"],"sources":["yt-auth.ts"],"sourcesContent":["import axios from 'axios';\n\nimport {AppMiddleware} from '@gravity-ui/expresskit';\n\nimport {YT_CYPRESS_COOKIE_NAME} from '../../shared/constants';\nimport {getXSRFToken} from '../components/cluster-queries';\nimport {getUserYTApiSetup} from '../components/requestsSetup';\nimport {sendError} from '../utils';\n\nclass AuthError extends Error {\n constructor() {\n super('Authorization required');\n }\n}\n\nfunction isAuthError(e: unknown) {\n return e instanceof AuthError || (axios.isAxiosError(e) && e.response?.status === 401);\n}\n\nexport function createYTAuthMiddleware(ytAuthCluster: string): AppMiddleware {\n return async function ytAuthMiddleware(req, res, next) {\n try {\n const secret: string = req.cookies[YT_CYPRESS_COOKIE_NAME];\n\n req.yt = {\n ytApiAuthHeaders: {\n Cookie: `${YT_CYPRESS_COOKIE_NAME}=${secret};`,\n },\n };\n\n if (!secret) {\n throw new AuthError();\n }\n\n const cfg = getUserYTApiSetup(ytAuthCluster, req);\n const {login} = await getXSRFToken(req, cfg);\n req.yt.login = login;\n } catch (e) {\n const isAuthFailed = isAuthError(e);\n const error = isAuthFailed ? undefined : e;\n\n if (!req.routeInfo.ui && isAuthFailed) {\n sendError(res, error, 401);\n return;\n }\n }\n\n next();\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["YT_CYPRESS_COOKIE_NAME","createYTAuthorizationResolver","_resoleOAuthAuthorize","_asyncToGenerator","_regeneratorRuntime","mark","_callee","req","_","next","secret","wrap","_callee$","_context","prev","cookies","yt","ytApiAuthHeaders","Cookie","concat","stop","resoleOAuthAuthorize","_x","_x2","_x3","apply","arguments"],"sources":["yt-auth.ts"],"sourcesContent":["import type {Request, Response} from 'express';\nimport {AppMiddleware} from '@gravity-ui/expresskit';\nimport {YT_CYPRESS_COOKIE_NAME} from '../../shared/constants';\n\nexport function createYTAuthorizationResolver(): AppMiddleware {\n return async function resoleOAuthAuthorize(req: Request, _: Response, next) {\n const secret: string = req.cookies[YT_CYPRESS_COOKIE_NAME];\n req.yt = {\n ytApiAuthHeaders: {\n Cookie: `${YT_CYPRESS_COOKIE_NAME}=${secret};`,\n },\n };\n next();\n };\n}\n"],"mappings":";;AAEA,SAAQA,sBAAsB,QAAO,wBAAwB;AAE7D,OAAO,SAASC,6BAA6BA,CAAA,EAAkB;EAC3D;IAAA,IAAAC,qBAAA,GAAAC,iBAAA,eAAAC,mBAAA,CAAAC,IAAA,CAAO,SAAAC,QAAoCC,GAAY,EAAEC,CAAW,EAAEC,IAAI;MAAA,IAAAC,MAAA;MAAA,OAAAN,mBAAA,CAAAO,IAAA,UAAAC,SAAAC,QAAA;QAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAJ,IAAA;UAAA;YAChEC,MAAc,GAAGH,GAAG,CAACQ,OAAO,CAACf,sBAAsB,CAAC;YAC1DO,GAAG,CAACS,EAAE,GAAG;cACLC,gBAAgB,EAAE;gBACdC,MAAM,KAAAC,MAAA,CAAKnB,sBAAsB,OAAAmB,MAAA,CAAIT,MAAM;cAC/C;YACJ,CAAC;YACDD,IAAI,CAAC,CAAC;UAAC;UAAA;YAAA,OAAAI,QAAA,CAAAO,IAAA;QAAA;MAAA,GAAAd,OAAA;IAAA,CACV;IAAA,SARqBe,oBAAoBA,CAAAC,EAAA,EAAAC,GAAA,EAAAC,GAAA;MAAA,OAAAtB,qBAAA,CAAAuB,KAAA,OAAAC,SAAA;IAAA;IAAA,OAApBL,oBAAoB;EAAA;AAS9C"}
@@ -9,12 +9,14 @@ import { handleClusterInfo } from './controllers/cluster-info';
9
9
  import { clusterVersions } from './controllers/clusters';
10
10
  import { tableColumnPresetGet, tableColumnPresetSave } from './controllers/table-column-preset';
11
11
  import { ping } from './controllers/ping';
12
- import { handleChangePassword, handleLogin, handleLogout } from './controllers/login';
12
+ import { handleChangePassword, handleLogin } from './controllers/login';
13
13
  import { getClusterPools } from './controllers/scheduling-pools';
14
14
  import { markdownToHtmlHandler } from './controllers/markdown-to-html';
15
15
  import { odinProxyApi } from './controllers/odin-proxy-api';
16
16
  import { getClustersAvailability } from './controllers/availability';
17
17
  import { chytProxyApi } from './controllers/chyt-api';
18
+ import { oauthCallback, oauthLogin, oauthLogout } from './controllers/oauth-login';
19
+ import { handleLogout } from './controllers/logout';
18
20
  var HOME_INDEX_TARGET = {
19
21
  handler: homeIndex,
20
22
  ui: true
@@ -42,10 +44,22 @@ var routes = {
42
44
  handler: handleLogin,
43
45
  ui: true
44
46
  },
45
- 'POST /api/yt/logout': {
47
+ 'GET /api/yt/logout': {
46
48
  handler: handleLogout,
47
49
  ui: true
48
50
  },
51
+ 'GET /oauth/login': {
52
+ handler: oauthLogin,
53
+ ui: true
54
+ },
55
+ 'GET /api/oauth/callback': {
56
+ handler: oauthCallback,
57
+ ui: true
58
+ },
59
+ 'GET /api/oauth/logout/callback': {
60
+ handler: oauthLogout,
61
+ ui: true
62
+ },
49
63
  'POST /api/yt/change-password': {
50
64
  handler: handleChangePassword,
51
65
  ui: true
@@ -1 +1 @@
1
- {"version":3,"names":["AuthPolicy","clusterParams","ytTvmApiHandler","handleRemoteCopy","ytProxyApi","settingsCreate","settingsDeleteItem","settingsGet","settingsGetItem","settingsSetItem","homeIndex","homeRedirect","handleClusterInfo","clusterVersions","tableColumnPresetGet","tableColumnPresetSave","ping","handleChangePassword","handleLogin","handleLogout","getClusterPools","markdownToHtmlHandler","odinProxyApi","getClustersAvailability","chytProxyApi","HOME_INDEX_TARGET","handler","ui","routes","authPolicy","disabled"],"sources":["routes.ts"],"sourcesContent":["import {AppRouteDescription, AppRoutes, AuthPolicy} from '@gravity-ui/expresskit';\nimport {clusterParams} from './controllers/cluster-params';\nimport {ytTvmApiHandler} from './controllers/yt-api';\nimport {handleRemoteCopy} from './controllers/remote-copy';\nimport {ytProxyApi} from './controllers/yt-proxy-api';\nimport {\n settingsCreate,\n settingsDeleteItem,\n settingsGet,\n settingsGetItem,\n settingsSetItem,\n} from './controllers/settings';\nimport {homeIndex, homeRedirect} from './controllers/home';\nimport {handleClusterInfo} from './controllers/cluster-info';\n\nimport {clusterVersions} from './controllers/clusters';\nimport {tableColumnPresetGet, tableColumnPresetSave} from './controllers/table-column-preset';\nimport {ping} from './controllers/ping';\nimport {handleChangePassword, handleLogin, handleLogout} from './controllers/login';\nimport {getClusterPools} from './controllers/scheduling-pools';\nimport {markdownToHtmlHandler} from './controllers/markdown-to-html';\nimport {odinProxyApi} from './controllers/odin-proxy-api';\nimport {getClustersAvailability} from './controllers/availability';\nimport {chytProxyApi} from './controllers/chyt-api';\n\nconst HOME_INDEX_TARGET: AppRouteDescription = {handler: homeIndex, ui: true};\n\nconst routes: AppRoutes = {\n 'GET /change-password/': HOME_INDEX_TARGET,\n 'GET /': HOME_INDEX_TARGET,\n 'GET /ping': {handler: ping, authPolicy: AuthPolicy.disabled},\n 'GET /api/cluster-info/:cluster': {handler: handleClusterInfo},\n 'GET /api/cluster-params/:cluster': {handler: clusterParams},\n 'GET /api/clusters/versions': {handler: clusterVersions},\n 'GET /api/pool-names/:cluster': {handler: getClusterPools},\n 'POST /api/yt/login': {handler: handleLogin, ui: true},\n 'POST /api/yt/logout': {handler: handleLogout, ui: true},\n 'POST /api/yt/change-password': {handler: handleChangePassword, ui: true},\n 'POST /api/remote-copy': {handler: handleRemoteCopy},\n\n 'POST /api/markdown-to-html': {handler: markdownToHtmlHandler},\n\n 'GET /api/yt/:cluster/api/:version/:command': {handler: ytTvmApiHandler},\n 'POST /api/yt/:cluster/api/:version/:command': {handler: ytTvmApiHandler},\n 'PUT /api/yt/:cluster/api/:version/:command': {handler: ytTvmApiHandler},\n\n 'GET /api/yt-proxy/:cluster/:command': {handler: ytProxyApi},\n\n 'GET /api/odin/proxy/:action/:cluster?': {handler: odinProxyApi},\n 'GET /api/odin/clusters/availability': {handler: getClustersAvailability},\n\n 'POST /api/chyt/:cluster/:action': {handler: chytProxyApi},\n\n 'GET /api/settings/:username': {handler: settingsGet},\n 'POST /api/settings/:username': {handler: settingsCreate},\n 'GET /api/settings/:username/:path': {handler: settingsGetItem},\n 'PUT /api/settings/:username/:path': {handler: settingsSetItem},\n 'DELETE /api/settings/:username/:path': {handler: settingsDeleteItem},\n\n 'GET /api/table-column-preset/:hash': {\n handler: tableColumnPresetGet,\n },\n 'POST /api/table-column-preset': {handler: tableColumnPresetSave},\n\n 'GET /:cluster/': HOME_INDEX_TARGET,\n 'GET /:cluster/maintenance': {handler: homeRedirect},\n 'GET /:cluster/:page': HOME_INDEX_TARGET,\n 'GET /:cluster/:page/:tab': HOME_INDEX_TARGET,\n 'GET /:cluster/:page/:operation/:tab': HOME_INDEX_TARGET,\n 'GET /:cluster/:page/:operation/:job/:tab': HOME_INDEX_TARGET,\n};\n\nexport default routes;\n"],"mappings":"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"}
1
+ {"version":3,"names":["AuthPolicy","clusterParams","ytTvmApiHandler","handleRemoteCopy","ytProxyApi","settingsCreate","settingsDeleteItem","settingsGet","settingsGetItem","settingsSetItem","homeIndex","homeRedirect","handleClusterInfo","clusterVersions","tableColumnPresetGet","tableColumnPresetSave","ping","handleChangePassword","handleLogin","getClusterPools","markdownToHtmlHandler","odinProxyApi","getClustersAvailability","chytProxyApi","oauthCallback","oauthLogin","oauthLogout","handleLogout","HOME_INDEX_TARGET","handler","ui","routes","authPolicy","disabled"],"sources":["routes.ts"],"sourcesContent":["import {AppRouteDescription, AppRoutes, AuthPolicy} from '@gravity-ui/expresskit';\nimport {clusterParams} from './controllers/cluster-params';\nimport {ytTvmApiHandler} from './controllers/yt-api';\nimport {handleRemoteCopy} from './controllers/remote-copy';\nimport {ytProxyApi} from './controllers/yt-proxy-api';\nimport {\n settingsCreate,\n settingsDeleteItem,\n settingsGet,\n settingsGetItem,\n settingsSetItem,\n} from './controllers/settings';\nimport {homeIndex, homeRedirect} from './controllers/home';\nimport {handleClusterInfo} from './controllers/cluster-info';\n\nimport {clusterVersions} from './controllers/clusters';\nimport {tableColumnPresetGet, tableColumnPresetSave} from './controllers/table-column-preset';\nimport {ping} from './controllers/ping';\nimport {handleChangePassword, handleLogin} from './controllers/login';\nimport {getClusterPools} from './controllers/scheduling-pools';\nimport {markdownToHtmlHandler} from './controllers/markdown-to-html';\nimport {odinProxyApi} from './controllers/odin-proxy-api';\nimport {getClustersAvailability} from './controllers/availability';\nimport {chytProxyApi} from './controllers/chyt-api';\nimport {oauthCallback, oauthLogin, oauthLogout} from './controllers/oauth-login';\nimport {handleLogout} from './controllers/logout';\n\nconst HOME_INDEX_TARGET: AppRouteDescription = {handler: homeIndex, ui: true};\n\nconst routes: AppRoutes = {\n 'GET /change-password/': HOME_INDEX_TARGET,\n 'GET /': HOME_INDEX_TARGET,\n 'GET /ping': {handler: ping, authPolicy: AuthPolicy.disabled},\n 'GET /api/cluster-info/:cluster': {handler: handleClusterInfo},\n 'GET /api/cluster-params/:cluster': {handler: clusterParams},\n 'GET /api/clusters/versions': {handler: clusterVersions},\n 'GET /api/pool-names/:cluster': {handler: getClusterPools},\n 'POST /api/yt/login': {handler: handleLogin, ui: true},\n 'GET /api/yt/logout': {handler: handleLogout, ui: true},\n\n 'GET /oauth/login': {handler: oauthLogin, ui: true},\n 'GET /api/oauth/callback': {handler: oauthCallback, ui: true},\n 'GET /api/oauth/logout/callback': {handler: oauthLogout, ui: true},\n\n 'POST /api/yt/change-password': {handler: handleChangePassword, ui: true},\n 'POST /api/remote-copy': {handler: handleRemoteCopy},\n\n 'POST /api/markdown-to-html': {handler: markdownToHtmlHandler},\n\n 'GET /api/yt/:cluster/api/:version/:command': {handler: ytTvmApiHandler},\n 'POST /api/yt/:cluster/api/:version/:command': {handler: ytTvmApiHandler},\n 'PUT /api/yt/:cluster/api/:version/:command': {handler: ytTvmApiHandler},\n\n 'GET /api/yt-proxy/:cluster/:command': {handler: ytProxyApi},\n\n 'GET /api/odin/proxy/:action/:cluster?': {handler: odinProxyApi},\n 'GET /api/odin/clusters/availability': {handler: getClustersAvailability},\n\n 'POST /api/chyt/:cluster/:action': {handler: chytProxyApi},\n\n 'GET /api/settings/:username': {handler: settingsGet},\n 'POST /api/settings/:username': {handler: settingsCreate},\n 'GET /api/settings/:username/:path': {handler: settingsGetItem},\n 'PUT /api/settings/:username/:path': {handler: settingsSetItem},\n 'DELETE /api/settings/:username/:path': {handler: settingsDeleteItem},\n\n 'GET /api/table-column-preset/:hash': {\n handler: tableColumnPresetGet,\n },\n 'POST /api/table-column-preset': {handler: tableColumnPresetSave},\n\n 'GET /:cluster/': HOME_INDEX_TARGET,\n 'GET /:cluster/maintenance': {handler: homeRedirect},\n 'GET /:cluster/:page': HOME_INDEX_TARGET,\n 'GET /:cluster/:page/:tab': HOME_INDEX_TARGET,\n 'GET /:cluster/:page/:operation/:tab': HOME_INDEX_TARGET,\n 'GET /:cluster/:page/:operation/:job/:tab': HOME_INDEX_TARGET,\n};\n\nexport default routes;\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Request } from 'express';
2
+ import { AppMiddleware } from '@gravity-ui/expresskit';
3
+ import { AuthWay } from '../../shared/constants';
4
+ export declare function isAuthorized(req: Request): boolean;
5
+ export declare function getAuthWay(req: Request): AuthWay | undefined;
6
+ export declare function authorizationResolver(resolver: AppMiddleware): AppMiddleware;
@@ -0,0 +1,28 @@
1
+ import { isUserOAuthLogged } from '../components/oauth';
2
+ export function isAuthorized(req) {
3
+ if (req.yt) {
4
+ var _req$yt$ytApiAuthHead;
5
+ return Boolean(Object.keys((_req$yt$ytApiAuthHead = req.yt.ytApiAuthHeaders) !== null && _req$yt$ytApiAuthHead !== void 0 ? _req$yt$ytApiAuthHead : {}));
6
+ }
7
+ return false;
8
+ }
9
+ export function getAuthWay(req) {
10
+ if (!isAuthorized(req)) {
11
+ return undefined;
12
+ }
13
+ if (isUserOAuthLogged(req)) {
14
+ return 'oauth';
15
+ }
16
+ return 'passwd';
17
+ }
18
+ export function authorizationResolver(resolver) {
19
+ return function (req, res, next) {
20
+ if (isAuthorized(req)) {
21
+ next();
22
+ return;
23
+ }
24
+ resolver(req, res, next);
25
+ return;
26
+ };
27
+ }
28
+ // #sourceMappingURL=authorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["isUserOAuthLogged","isAuthorized","req","yt","_req$yt$ytApiAuthHead","Boolean","Object","keys","ytApiAuthHeaders","getAuthWay","undefined","authorizationResolver","resolver","res","next"],"sources":["authorization.ts"],"sourcesContent":["import type {Request} from 'express';\nimport {AppMiddleware} from '@gravity-ui/expresskit';\nimport {AuthWay} from '../../shared/constants';\nimport {isUserOAuthLogged} from '../components/oauth';\n\nexport function isAuthorized(req: Request) {\n if (req.yt) {\n return Boolean(Object.keys(req.yt.ytApiAuthHeaders ?? {}));\n }\n return false;\n}\n\nexport function getAuthWay(req: Request): AuthWay | undefined {\n if (!isAuthorized(req)) {\n return undefined;\n }\n if (isUserOAuthLogged(req)) {\n return 'oauth';\n }\n return 'passwd';\n}\n\nexport function authorizationResolver(resolver: AppMiddleware): AppMiddleware {\n return (req, res, next) => {\n if (isAuthorized(req)) {\n next();\n return;\n }\n resolver(req, res, next);\n return;\n };\n}\n"],"mappings":"AAGA,SAAQA,iBAAiB,QAAO,qBAAqB;AAErD,OAAO,SAASC,YAAYA,CAACC,GAAY,EAAE;EACvC,IAAIA,GAAG,CAACC,EAAE,EAAE;IAAA,IAAAC,qBAAA;IACR,OAAOC,OAAO,CAACC,MAAM,CAACC,IAAI,EAAAH,qBAAA,GAACF,GAAG,CAACC,EAAE,CAACK,gBAAgB,cAAAJ,qBAAA,cAAAA,qBAAA,GAAI,CAAC,CAAC,CAAC,CAAC;EAC9D;EACA,OAAO,KAAK;AAChB;AAEA,OAAO,SAASK,UAAUA,CAACP,GAAY,EAAuB;EAC1D,IAAI,CAACD,YAAY,CAACC,GAAG,CAAC,EAAE;IACpB,OAAOQ,SAAS;EACpB;EACA,IAAIV,iBAAiB,CAACE,GAAG,CAAC,EAAE;IACxB,OAAO,OAAO;EAClB;EACA,OAAO,QAAQ;AACnB;AAEA,OAAO,SAASS,qBAAqBA,CAACC,QAAuB,EAAiB;EAC1E,OAAO,UAACV,GAAG,EAAEW,GAAG,EAAEC,IAAI,EAAK;IACvB,IAAIb,YAAY,CAACC,GAAG,CAAC,EAAE;MACnBY,IAAI,CAAC,CAAC;MACN;IACJ;IACAF,QAAQ,CAACV,GAAG,EAAEW,GAAG,EAAEC,IAAI,CAAC;IACxB;EACJ,CAAC;AACL"}
@@ -2,6 +2,9 @@ export declare const YT_API_REQUEST_ID_HEADER = "X-Custom-Request-Id";
2
2
  export declare const YT_CYPRESS_COOKIE_NAME = "YTCypressCookie";
3
3
  export declare const YT_LOCAL_CLUSTER_ID = "ui";
4
4
  export declare const ODIN_PAGE_ID = "odin";
5
+ export declare const YT_OAUTH_ACCESS_TOKEN_NAME = "yt_oauth_access_token";
6
+ export declare const YT_OAUTH_REFRESH_TOKEN_NAME = "yt_oauth_refresh_token";
7
+ export type AuthWay = 'oauth' | 'passwd';
5
8
  /**
6
9
  * Allows to succeed requests when master are in read-only mode and the transaction coordinator cell is evicted
7
10
  */
@@ -2,7 +2,8 @@ export var YT_API_REQUEST_ID_HEADER = 'X-Custom-Request-Id';
2
2
  export var YT_CYPRESS_COOKIE_NAME = 'YTCypressCookie';
3
3
  export var YT_LOCAL_CLUSTER_ID = 'ui';
4
4
  export var ODIN_PAGE_ID = 'odin';
5
-
5
+ export var YT_OAUTH_ACCESS_TOKEN_NAME = 'yt_oauth_access_token';
6
+ export var YT_OAUTH_REFRESH_TOKEN_NAME = 'yt_oauth_refresh_token';
6
7
  /**
7
8
  * Allows to succeed requests when master are in read-only mode and the transaction coordinator cell is evicted
8
9
  */
@@ -1 +1 @@
1
- {"version":3,"names":["YT_API_REQUEST_ID_HEADER","YT_CYPRESS_COOKIE_NAME","YT_LOCAL_CLUSTER_ID","ODIN_PAGE_ID","USE_SUPRESS_SYNC","suppress_transaction_coordinator_sync","suppress_upstream_sync"],"sources":["index.ts"],"sourcesContent":["export const YT_API_REQUEST_ID_HEADER = 'X-Custom-Request-Id';\nexport const YT_CYPRESS_COOKIE_NAME = 'YTCypressCookie';\nexport const YT_LOCAL_CLUSTER_ID = 'ui';\nexport const ODIN_PAGE_ID = 'odin';\n\n/**\n * Allows to succeed requests when master are in read-only mode and the transaction coordinator cell is evicted\n */\nexport const USE_SUPRESS_SYNC = {\n suppress_transaction_coordinator_sync: true,\n suppress_upstream_sync: true,\n};\n"],"mappings":"AAAA,OAAO,IAAMA,wBAAwB,GAAG,qBAAqB;AAC7D,OAAO,IAAMC,sBAAsB,GAAG,iBAAiB;AACvD,OAAO,IAAMC,mBAAmB,GAAG,IAAI;AACvC,OAAO,IAAMC,YAAY,GAAG,MAAM;;AAElC;AACA;AACA;AACA,OAAO,IAAMC,gBAAgB,GAAG;EAC5BC,qCAAqC,EAAE,IAAI;EAC3CC,sBAAsB,EAAE;AAC5B,CAAC"}
1
+ {"version":3,"names":["YT_API_REQUEST_ID_HEADER","YT_CYPRESS_COOKIE_NAME","YT_LOCAL_CLUSTER_ID","ODIN_PAGE_ID","YT_OAUTH_ACCESS_TOKEN_NAME","YT_OAUTH_REFRESH_TOKEN_NAME","USE_SUPRESS_SYNC","suppress_transaction_coordinator_sync","suppress_upstream_sync"],"sources":["index.ts"],"sourcesContent":["export const YT_API_REQUEST_ID_HEADER = 'X-Custom-Request-Id';\nexport const YT_CYPRESS_COOKIE_NAME = 'YTCypressCookie';\nexport const YT_LOCAL_CLUSTER_ID = 'ui';\nexport const ODIN_PAGE_ID = 'odin';\n\nexport const YT_OAUTH_ACCESS_TOKEN_NAME = 'yt_oauth_access_token';\nexport const YT_OAUTH_REFRESH_TOKEN_NAME = 'yt_oauth_refresh_token';\n\nexport type AuthWay = 'oauth' | 'passwd';\n\n/**\n * Allows to succeed requests when master are in read-only mode and the transaction coordinator cell is evicted\n */\nexport const USE_SUPRESS_SYNC = {\n suppress_transaction_coordinator_sync: true,\n suppress_upstream_sync: true,\n};\n"],"mappings":"AAAA,OAAO,IAAMA,wBAAwB,GAAG,qBAAqB;AAC7D,OAAO,IAAMC,sBAAsB,GAAG,iBAAiB;AACvD,OAAO,IAAMC,mBAAmB,GAAG,IAAI;AACvC,OAAO,IAAMC,YAAY,GAAG,MAAM;AAElC,OAAO,IAAMC,0BAA0B,GAAG,uBAAuB;AACjE,OAAO,IAAMC,2BAA2B,GAAG,wBAAwB;AAInE;AACA;AACA;AACA,OAAO,IAAMC,gBAAgB,GAAG;EAC5BC,qCAAqC,EAAE,IAAI;EAC3CC,sBAAsB,EAAE;AAC5B,CAAC"}
@@ -233,6 +233,8 @@ export interface ConfigData {
233
233
  uiSettings?: UISettings;
234
234
  metrikaCounterId?: number;
235
235
  allowLoginDialog?: boolean;
236
+ allowOAuth?: boolean;
237
+ oauthButtonLabel?: string;
236
238
  allowUserColumnPresets?: boolean;
237
239
  odinPageEnabled: boolean;
238
240
  }