@sap-ux/axios-extension 0.4.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.
- package/LICENSE +201 -0
- package/README.adoc +61 -0
- package/dist/abap/abap-service-provider.d.ts +64 -0
- package/dist/abap/abap-service-provider.d.ts.map +1 -0
- package/dist/abap/abap-service-provider.js +133 -0
- package/dist/abap/abap-service-provider.js.map +1 -0
- package/dist/abap/app-index-service.d.ts +26 -0
- package/dist/abap/app-index-service.d.ts.map +1 -0
- package/dist/abap/app-index-service.js +38 -0
- package/dist/abap/app-index-service.js.map +1 -0
- package/dist/abap/ato.d.ts +25 -0
- package/dist/abap/ato.d.ts.map +1 -0
- package/dist/abap/ato.js +35 -0
- package/dist/abap/ato.js.map +1 -0
- package/dist/abap/catalog/base.d.ts +44 -0
- package/dist/abap/catalog/base.d.ts.map +1 -0
- package/dist/abap/catalog/base.js +33 -0
- package/dist/abap/catalog/base.js.map +1 -0
- package/dist/abap/catalog/index.d.ts +4 -0
- package/dist/abap/catalog/index.d.ts.map +1 -0
- package/dist/abap/catalog/index.js +16 -0
- package/dist/abap/catalog/index.js.map +1 -0
- package/dist/abap/catalog/v2-catalog-service.d.ts +66 -0
- package/dist/abap/catalog/v2-catalog-service.d.ts.map +1 -0
- package/dist/abap/catalog/v2-catalog-service.js +175 -0
- package/dist/abap/catalog/v2-catalog-service.js.map +1 -0
- package/dist/abap/catalog/v4-catalog-service.d.ts +49 -0
- package/dist/abap/catalog/v4-catalog-service.d.ts.map +1 -0
- package/dist/abap/catalog/v4-catalog-service.js +88 -0
- package/dist/abap/catalog/v4-catalog-service.js.map +1 -0
- package/dist/abap/index.d.ts +7 -0
- package/dist/abap/index.d.ts.map +1 -0
- package/dist/abap/index.js +24 -0
- package/dist/abap/index.js.map +1 -0
- package/dist/abap/message.d.ts +69 -0
- package/dist/abap/message.d.ts.map +1 -0
- package/dist/abap/message.js +82 -0
- package/dist/abap/message.js.map +1 -0
- package/dist/abap/ui5-abap-repository-service.d.ts +109 -0
- package/dist/abap/ui5-abap-repository-service.d.ts.map +1 -0
- package/dist/abap/ui5-abap-repository-service.js +264 -0
- package/dist/abap/ui5-abap-repository-service.js.map +1 -0
- package/dist/auth/connection.d.ts +40 -0
- package/dist/auth/connection.d.ts.map +1 -0
- package/dist/auth/connection.js +194 -0
- package/dist/auth/connection.js.map +1 -0
- package/dist/auth/error.d.ts +28 -0
- package/dist/auth/error.d.ts.map +1 -0
- package/dist/auth/error.js +37 -0
- package/dist/auth/error.js.map +1 -0
- package/dist/auth/index.d.ts +19 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +64 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/redirect.d.ts +20 -0
- package/dist/auth/redirect.d.ts.map +1 -0
- package/dist/auth/redirect.js +27 -0
- package/dist/auth/redirect.js.map +1 -0
- package/dist/auth/static.d.ts +2 -0
- package/dist/auth/static.d.ts.map +1 -0
- package/dist/auth/static.js +129 -0
- package/dist/auth/static.js.map +1 -0
- package/dist/auth/uaa.d.ts +107 -0
- package/dist/auth/uaa.d.ts.map +1 -0
- package/dist/auth/uaa.js +258 -0
- package/dist/auth/uaa.js.map +1 -0
- package/dist/base/odata-service.d.ts +49 -0
- package/dist/base/odata-service.d.ts.map +1 -0
- package/dist/base/odata-service.js +119 -0
- package/dist/base/odata-service.js.map +1 -0
- package/dist/base/service-provider.d.ts +50 -0
- package/dist/base/service-provider.d.ts.map +1 -0
- package/dist/base/service-provider.js +56 -0
- package/dist/base/service-provider.js.map +1 -0
- package/dist/factory.d.ts +48 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +136 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.attachConnectionHandler = exports.Cookies = exports.CSRF = void 0;
|
|
7
|
+
const error_1 = require("./error");
|
|
8
|
+
const detect_content_type_1 = __importDefault(require("detect-content-type"));
|
|
9
|
+
var CSRF;
|
|
10
|
+
(function (CSRF) {
|
|
11
|
+
CSRF["RequestHeaderName"] = "X-Csrf-Token";
|
|
12
|
+
CSRF["RequestHeaderValue"] = "Fetch";
|
|
13
|
+
CSRF["ResponseHeaderName"] = "x-csrf-token";
|
|
14
|
+
})(CSRF = exports.CSRF || (exports.CSRF = {}));
|
|
15
|
+
/**
|
|
16
|
+
* Helper class for managing cookies.
|
|
17
|
+
*/
|
|
18
|
+
class Cookies {
|
|
19
|
+
constructor() {
|
|
20
|
+
this.cookies = {};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Update the cookies based on 'set-cookie' headers of a response.
|
|
24
|
+
*
|
|
25
|
+
* @param response http response containing a headers object
|
|
26
|
+
* @returns cookies object
|
|
27
|
+
*/
|
|
28
|
+
setCookies(response) {
|
|
29
|
+
if (response.headers && response.headers['set-cookie']) {
|
|
30
|
+
response.headers['set-cookie'].forEach((cookieString) => this.addCookie(cookieString));
|
|
31
|
+
}
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Update cookies based on a string representing a cookie.
|
|
36
|
+
*
|
|
37
|
+
* @param cookieString string representing a cookie
|
|
38
|
+
* @returns cookies object
|
|
39
|
+
*/
|
|
40
|
+
addCookie(cookieString) {
|
|
41
|
+
var _a;
|
|
42
|
+
const cookie = cookieString.split(';');
|
|
43
|
+
const [key, ...values] = (_a = cookie[0]) === null || _a === void 0 ? void 0 : _a.split('=');
|
|
44
|
+
const value = values === null || values === void 0 ? void 0 : values.join('='); // Account for embedded '=' in the value
|
|
45
|
+
if (key && cookieString.indexOf('Max-Age=0') >= 0) {
|
|
46
|
+
delete this.cookies[key];
|
|
47
|
+
}
|
|
48
|
+
else if (key && value) {
|
|
49
|
+
this.cookies[key] = value;
|
|
50
|
+
}
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Serialize all cookies as string formatted for the 'Cookie' header.
|
|
55
|
+
*
|
|
56
|
+
* @returns serialized cookies
|
|
57
|
+
*/
|
|
58
|
+
toString() {
|
|
59
|
+
const cookies = [];
|
|
60
|
+
Object.keys(this.cookies).forEach((key) => {
|
|
61
|
+
cookies.push(`${key}=${this.cookies[key]}`);
|
|
62
|
+
});
|
|
63
|
+
return cookies.join('; ');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.Cookies = Cookies;
|
|
67
|
+
/**
|
|
68
|
+
* Check the response if SAML is required.
|
|
69
|
+
*
|
|
70
|
+
* @param response response from the backend
|
|
71
|
+
* @returns true if SAML is required
|
|
72
|
+
*/
|
|
73
|
+
function isSamlLogonNeeded(response) {
|
|
74
|
+
return ((response === null || response === void 0 ? void 0 : response.status) === 200 &&
|
|
75
|
+
isHtmlResponse(response) &&
|
|
76
|
+
typeof response.data === 'string' &&
|
|
77
|
+
!!response.data.match(/saml/i));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* SAP systems can choose to respond with a 200 and an HTML login page that the module cannot handle, therefore, convert it into a 401.
|
|
81
|
+
*
|
|
82
|
+
* @param response response from the backend
|
|
83
|
+
* @throws an error with status 401 if an HTML form is returned
|
|
84
|
+
*/
|
|
85
|
+
function throwIfHtmlLoginForm(response) {
|
|
86
|
+
if ((response === null || response === void 0 ? void 0 : response.status) !== 200) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (response.headers['sap-err-id'] === 'ICFLOGONREQUIRED' || isHtmlLoginForm(response)) {
|
|
90
|
+
const err = new Error();
|
|
91
|
+
err.response = { status: 401 };
|
|
92
|
+
err.isAxiosError = true;
|
|
93
|
+
err.toJSON = () => {
|
|
94
|
+
return { status: 401 };
|
|
95
|
+
};
|
|
96
|
+
throw err;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* @param response
|
|
101
|
+
* @returns true if the contents are determined to be HTML
|
|
102
|
+
*/
|
|
103
|
+
function isHtmlResponse(response) {
|
|
104
|
+
return getContentType(response.headers['content-type'], response.data).startsWith('text/html');
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* @param response
|
|
108
|
+
* @returns true if we get an HTML login form
|
|
109
|
+
*/
|
|
110
|
+
function isHtmlLoginForm(response) {
|
|
111
|
+
return isHtmlResponse(response) && typeof response.data === 'string' && !!response.data.match(/log[io]n/i);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* @param contentTypeHeader
|
|
115
|
+
* @param responseData
|
|
116
|
+
* @returns content type
|
|
117
|
+
*/
|
|
118
|
+
function getContentType(contentTypeHeader, responseData) {
|
|
119
|
+
var _a, _b;
|
|
120
|
+
if (contentTypeHeader) {
|
|
121
|
+
return contentTypeHeader.toLowerCase();
|
|
122
|
+
}
|
|
123
|
+
else if (typeof responseData === 'string') {
|
|
124
|
+
// Try to infer it from the data
|
|
125
|
+
return (_b = (_a = detect_content_type_1.default(Buffer.from(responseData))) === null || _a === void 0 ? void 0 : _a.toLowerCase()) !== null && _b !== void 0 ? _b : '';
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
return '';
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Attach a connection handler to the given service provider.
|
|
133
|
+
*
|
|
134
|
+
* @param provider any service provider
|
|
135
|
+
*/
|
|
136
|
+
function attachConnectionHandler(provider) {
|
|
137
|
+
// fetch xsrf token with the first request
|
|
138
|
+
const oneTimeReqInterceptorId = provider.interceptors.request.use((request) => {
|
|
139
|
+
var _a;
|
|
140
|
+
request.headers = (_a = request.headers) !== null && _a !== void 0 ? _a : {};
|
|
141
|
+
request.headers[CSRF.RequestHeaderName] = CSRF.RequestHeaderValue;
|
|
142
|
+
provider.interceptors.request.eject(oneTimeReqInterceptorId);
|
|
143
|
+
return request;
|
|
144
|
+
});
|
|
145
|
+
// throw error on connection issues and remove interceptor if successfully connected
|
|
146
|
+
const oneTimeRespInterceptorId = provider.interceptors.response.use((response) => {
|
|
147
|
+
var _a, _b, _c, _d;
|
|
148
|
+
if (response.status >= 400) {
|
|
149
|
+
throw new error_1.ConnectionError(response.statusText, response);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
// if a redirect to a SAML login page happened try again with disable saml param
|
|
153
|
+
if (isSamlLogonNeeded(response) && ((_a = provider.defaults.params) === null || _a === void 0 ? void 0 : _a.saml2) !== 'disabled') {
|
|
154
|
+
provider.defaults.params = (_b = provider.defaults.params) !== null && _b !== void 0 ? _b : {};
|
|
155
|
+
provider.defaults.params.saml2 = 'disabled';
|
|
156
|
+
return provider.request(response.config);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
throwIfHtmlLoginForm(response);
|
|
160
|
+
// remember xsrf token
|
|
161
|
+
if ((_c = response.headers) === null || _c === void 0 ? void 0 : _c[CSRF.ResponseHeaderName]) {
|
|
162
|
+
provider.defaults.headers = (_d = provider.defaults.headers) !== null && _d !== void 0 ? _d : {
|
|
163
|
+
common: {},
|
|
164
|
+
// eslint-disable-next-line quote-props
|
|
165
|
+
delete: {},
|
|
166
|
+
put: {},
|
|
167
|
+
get: {},
|
|
168
|
+
post: {},
|
|
169
|
+
head: {},
|
|
170
|
+
patch: {}
|
|
171
|
+
};
|
|
172
|
+
provider.defaults.headers.common[CSRF.RequestHeaderName] =
|
|
173
|
+
response.headers[CSRF.ResponseHeaderName];
|
|
174
|
+
}
|
|
175
|
+
provider.interceptors.response.eject(oneTimeRespInterceptorId);
|
|
176
|
+
return response;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
// always add cookies to outgoing requests
|
|
181
|
+
provider.interceptors.request.use((request) => {
|
|
182
|
+
var _a;
|
|
183
|
+
request.headers = (_a = request.headers) !== null && _a !== void 0 ? _a : {};
|
|
184
|
+
request.headers.cookie = provider.cookies.toString();
|
|
185
|
+
return request;
|
|
186
|
+
});
|
|
187
|
+
// remember new cookies from each new response
|
|
188
|
+
provider.interceptors.response.use((response) => {
|
|
189
|
+
provider.cookies.setCookies(response);
|
|
190
|
+
return response;
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
exports.attachConnectionHandler = attachConnectionHandler;
|
|
194
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/auth/connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AxiosResponse } from 'axios';
|
|
2
|
+
/** Wraps `Error`. Used as base class for other specific errors */
|
|
3
|
+
export declare abstract class BaseError<T> extends Error {
|
|
4
|
+
readonly cause: T;
|
|
5
|
+
/**
|
|
6
|
+
* Constructor taking a message and any object.
|
|
7
|
+
*
|
|
8
|
+
* @param message human readable error message
|
|
9
|
+
* @param cause object causing the issue
|
|
10
|
+
*/
|
|
11
|
+
constructor(message: string, cause?: T);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Error representing a connection problem.
|
|
15
|
+
*/
|
|
16
|
+
export declare class ConnectionError extends BaseError<AxiosResponse> {
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Error representing a timeout.
|
|
20
|
+
*/
|
|
21
|
+
export declare class TimeoutError extends BaseError<Error> {
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Error representing a timeout from a UAA service.
|
|
25
|
+
*/
|
|
26
|
+
export declare class UAATimeoutError extends TimeoutError {
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../src/auth/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,kEAAkE;AAClE,8BAAsB,SAAS,CAAC,CAAC,CAAE,SAAQ,KAAK;IAC5C,SAAgB,KAAK,EAAE,CAAC,CAAC;IAEzB;;;;;OAKG;gBACS,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;CAKzC;AACD;;GAEG;AACH,qBAAa,eAAgB,SAAQ,SAAS,CAAC,aAAa,CAAC;CAAG;AAEhE;;GAEG;AACH,qBAAa,YAAa,SAAQ,SAAS,CAAC,KAAK,CAAC;CAAG;AAErD;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY;CAAG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UAATimeoutError = exports.TimeoutError = exports.ConnectionError = exports.BaseError = void 0;
|
|
4
|
+
/** Wraps `Error`. Used as base class for other specific errors */
|
|
5
|
+
class BaseError extends Error {
|
|
6
|
+
/**
|
|
7
|
+
* Constructor taking a message and any object.
|
|
8
|
+
*
|
|
9
|
+
* @param message human readable error message
|
|
10
|
+
* @param cause object causing the issue
|
|
11
|
+
*/
|
|
12
|
+
constructor(message, cause) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.cause = cause;
|
|
15
|
+
this.name = this.constructor.name;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
exports.BaseError = BaseError;
|
|
19
|
+
/**
|
|
20
|
+
* Error representing a connection problem.
|
|
21
|
+
*/
|
|
22
|
+
class ConnectionError extends BaseError {
|
|
23
|
+
}
|
|
24
|
+
exports.ConnectionError = ConnectionError;
|
|
25
|
+
/**
|
|
26
|
+
* Error representing a timeout.
|
|
27
|
+
*/
|
|
28
|
+
class TimeoutError extends BaseError {
|
|
29
|
+
}
|
|
30
|
+
exports.TimeoutError = TimeoutError;
|
|
31
|
+
/**
|
|
32
|
+
* Error representing a timeout from a UAA service.
|
|
33
|
+
*/
|
|
34
|
+
class UAATimeoutError extends TimeoutError {
|
|
35
|
+
}
|
|
36
|
+
exports.UAATimeoutError = UAATimeoutError;
|
|
37
|
+
//# sourceMappingURL=error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/auth/error.ts"],"names":[],"mappings":";;;AAEA,kEAAkE;AAClE,MAAsB,SAAa,SAAQ,KAAK;IAG5C;;;;;OAKG;IACH,YAAY,OAAe,EAAE,KAAS;QAClC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACtC,CAAC;CACJ;AAdD,8BAcC;AACD;;GAEG;AACH,MAAa,eAAgB,SAAQ,SAAwB;CAAG;AAAhE,0CAAgE;AAEhE;;GAEG;AACH,MAAa,YAAa,SAAQ,SAAgB;CAAG;AAArD,oCAAqD;AAErD;;GAEG;AACH,MAAa,eAAgB,SAAQ,YAAY;CAAG;AAApD,0CAAoD"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ServiceInfo } from '@sap-ux/btp-utils';
|
|
2
|
+
import type { Axios } from 'axios';
|
|
3
|
+
import type { AbapServiceProvider } from '../abap';
|
|
4
|
+
import { RefreshTokenChanged, Uaa } from './uaa';
|
|
5
|
+
export * from './connection';
|
|
6
|
+
export * from './error';
|
|
7
|
+
export { ServiceInfo, RefreshTokenChanged, Uaa };
|
|
8
|
+
/**
|
|
9
|
+
* @param provider
|
|
10
|
+
*/
|
|
11
|
+
export declare function attachBasicAuthInterceptor(provider: Axios): void;
|
|
12
|
+
/**
|
|
13
|
+
* @param provider
|
|
14
|
+
* @param service
|
|
15
|
+
* @param refreshToken
|
|
16
|
+
* @param refreshTokenUpdateCb
|
|
17
|
+
*/
|
|
18
|
+
export declare function attachUaaAuthInterceptor(provider: AbapServiceProvider, service: ServiceInfo, refreshToken?: string, refreshTokenUpdateCb?: RefreshTokenChanged): void;
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,KAAK,EAAqC,MAAM,OAAO,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEjD,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAAG,EAAE,CAAC;AAEjD;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,KAAK,GAAG,IAAI,CAMhE;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACpC,QAAQ,EAAE,mBAAmB,EAC7B,OAAO,EAAE,WAAW,EACpB,YAAY,CAAC,EAAE,MAAM,EACrB,oBAAoB,CAAC,EAAE,mBAAmB,GAC3C,IAAI,CAkBN"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
13
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
14
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
15
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
16
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
17
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
18
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.attachUaaAuthInterceptor = exports.attachBasicAuthInterceptor = exports.Uaa = void 0;
|
|
23
|
+
const uaa_1 = require("./uaa");
|
|
24
|
+
Object.defineProperty(exports, "Uaa", { enumerable: true, get: function () { return uaa_1.Uaa; } });
|
|
25
|
+
__exportStar(require("./connection"), exports);
|
|
26
|
+
__exportStar(require("./error"), exports);
|
|
27
|
+
/**
|
|
28
|
+
* @param provider
|
|
29
|
+
*/
|
|
30
|
+
function attachBasicAuthInterceptor(provider) {
|
|
31
|
+
const oneTimeInterceptorId = provider.interceptors.response.use((response) => {
|
|
32
|
+
delete provider.defaults.auth;
|
|
33
|
+
provider.interceptors.response.eject(oneTimeInterceptorId);
|
|
34
|
+
return response;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
exports.attachBasicAuthInterceptor = attachBasicAuthInterceptor;
|
|
38
|
+
/**
|
|
39
|
+
* @param provider
|
|
40
|
+
* @param service
|
|
41
|
+
* @param refreshToken
|
|
42
|
+
* @param refreshTokenUpdateCb
|
|
43
|
+
*/
|
|
44
|
+
function attachUaaAuthInterceptor(provider, service, refreshToken, refreshTokenUpdateCb) {
|
|
45
|
+
const uaa = new uaa_1.Uaa(service, provider.log);
|
|
46
|
+
let token;
|
|
47
|
+
// provide function to fetch user infos from UAA if needed
|
|
48
|
+
provider.user = () => __awaiter(this, void 0, void 0, function* () {
|
|
49
|
+
token = token !== null && token !== void 0 ? token : (yield uaa.getAccessToken(refreshToken, refreshTokenUpdateCb));
|
|
50
|
+
return uaa.getUserInfo(token);
|
|
51
|
+
});
|
|
52
|
+
const oneTimeInterceptorId = provider.interceptors.request.use((request) => __awaiter(this, void 0, void 0, function* () {
|
|
53
|
+
var _a;
|
|
54
|
+
token = token !== null && token !== void 0 ? token : (yield uaa.getAccessToken(refreshToken, refreshTokenUpdateCb));
|
|
55
|
+
// add token as auth header
|
|
56
|
+
request.headers = (_a = request.headers) !== null && _a !== void 0 ? _a : {};
|
|
57
|
+
request.headers.authorization = `bearer ${token}`;
|
|
58
|
+
// remove this interceptor since it is not needed anymore
|
|
59
|
+
provider.interceptors.request.eject(oneTimeInterceptorId);
|
|
60
|
+
return request;
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
exports.attachUaaAuthInterceptor = attachUaaAuthInterceptor;
|
|
64
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAGA,+BAAiD;AAKN,oFALb,SAAG,OAKa;AAH9C,+CAA6B;AAC7B,0CAAwB;AAIxB;;GAEG;AACH,SAAgB,0BAA0B,CAAC,QAAe;IACtD,MAAM,oBAAoB,GAAG,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAuB,EAAE,EAAE;QACxF,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC9B,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC3D,OAAO,QAAQ,CAAC;IACpB,CAAC,CAAC,CAAC;AACP,CAAC;AAND,gEAMC;AAED;;;;;GAKG;AACH,SAAgB,wBAAwB,CACpC,QAA6B,EAC7B,OAAoB,EACpB,YAAqB,EACrB,oBAA0C;IAE1C,MAAM,GAAG,GAAG,IAAI,SAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,KAAa,CAAC;IAClB,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,GAAG,GAAS,EAAE;QACvB,KAAK,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAChF,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAA,CAAC;IAEF,MAAM,oBAAoB,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAO,OAA2B,EAAE,EAAE;;QACjG,KAAK,GAAG,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,YAAY,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAChF,2BAA2B;QAC3B,OAAO,CAAC,OAAO,SAAG,OAAO,CAAC,OAAO,mCAAI,EAAE,CAAC;QACxC,OAAO,CAAC,OAAO,CAAC,aAAa,GAAG,UAAU,KAAK,EAAE,CAAC;QAClD,yDAAyD;QACzD,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC;IACnB,CAAC,CAAA,CAAC,CAAC;AACP,CAAC;AAvBD,4DAuBC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Class representing a local OAuth redirect listener.
|
|
3
|
+
*/
|
|
4
|
+
export declare class Redirect {
|
|
5
|
+
static readonly path = "/oauth/client/redirect";
|
|
6
|
+
private readonly port;
|
|
7
|
+
/**
|
|
8
|
+
* Constructor with a port number.
|
|
9
|
+
*
|
|
10
|
+
* @param port port on which the redirect service is listening.
|
|
11
|
+
*/
|
|
12
|
+
constructor(port: number);
|
|
13
|
+
/**
|
|
14
|
+
* Get the url for the redirect service.
|
|
15
|
+
*
|
|
16
|
+
* @returns a string representing the redirect url.
|
|
17
|
+
*/
|
|
18
|
+
url(): string;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=redirect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redirect.d.ts","sourceRoot":"","sources":["../../src/auth/redirect.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,QAAQ;IACjB,gBAAuB,IAAI,4BAA4B;IACvD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAE9B;;;;OAIG;gBACS,IAAI,EAAE,MAAM;IAIxB;;;;OAIG;IACI,GAAG,IAAI,MAAM;CAGvB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Redirect = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Class representing a local OAuth redirect listener.
|
|
6
|
+
*/
|
|
7
|
+
class Redirect {
|
|
8
|
+
/**
|
|
9
|
+
* Constructor with a port number.
|
|
10
|
+
*
|
|
11
|
+
* @param port port on which the redirect service is listening.
|
|
12
|
+
*/
|
|
13
|
+
constructor(port) {
|
|
14
|
+
this.port = port;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get the url for the redirect service.
|
|
18
|
+
*
|
|
19
|
+
* @returns a string representing the redirect url.
|
|
20
|
+
*/
|
|
21
|
+
url() {
|
|
22
|
+
return `http://localhost:${this.port}${Redirect.path}`;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.Redirect = Redirect;
|
|
26
|
+
Redirect.path = '/oauth/client/redirect';
|
|
27
|
+
//# sourceMappingURL=redirect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redirect.js","sourceRoot":"","sources":["../../src/auth/redirect.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,QAAQ;IAIjB;;;;OAIG;IACH,YAAY,IAAY;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACI,GAAG;QACN,OAAO,oBAAoB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC3D,CAAC;;AApBL,4BAqBC;AApB0B,aAAI,GAAG,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static.d.ts","sourceRoot":"","sources":["../../src/auth/static.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,eAAgB,MAAM,aAAa,MAAM,KAAG,MA8H3E,CAAC"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.redirectSuccessHtml = void 0;
|
|
4
|
+
exports.redirectSuccessHtml = (logoutUrl, systemId) => `
|
|
5
|
+
<html>
|
|
6
|
+
|
|
7
|
+
<head>
|
|
8
|
+
<meta http-equiv="content-type" content="text/html; charset=windows-1252">
|
|
9
|
+
<title>${systemId ? systemId + ': ' : ''}Authentication Successful</title>
|
|
10
|
+
<style>
|
|
11
|
+
body {
|
|
12
|
+
background: #ffffff;
|
|
13
|
+
text-align: center;
|
|
14
|
+
width: 100%;
|
|
15
|
+
height: 100%;
|
|
16
|
+
overflow: hidden;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.content {
|
|
20
|
+
display: table;
|
|
21
|
+
position: absolute;
|
|
22
|
+
width: 100%;
|
|
23
|
+
height: 80%;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.valigned {
|
|
27
|
+
display: table-cell;
|
|
28
|
+
vertical-align: middle;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.lowerCenter {
|
|
32
|
+
display: table-cell;
|
|
33
|
+
vertical-align: bottom;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.footer {
|
|
37
|
+
position: absolute;
|
|
38
|
+
bottom: 0;
|
|
39
|
+
left: 0;
|
|
40
|
+
width: 100%;
|
|
41
|
+
z-index: -1;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.footerLeft {
|
|
45
|
+
float: left;
|
|
46
|
+
margin-left: 20px;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.footerRight {
|
|
50
|
+
float: right;
|
|
51
|
+
margin-right: 20px;
|
|
52
|
+
position: absolute;
|
|
53
|
+
bottom: 0px;
|
|
54
|
+
right: 0px;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.centerText {
|
|
58
|
+
font-style: normal;
|
|
59
|
+
font-family: Arial;
|
|
60
|
+
font-size: 26px;
|
|
61
|
+
color: #444444;
|
|
62
|
+
z-index: 1;
|
|
63
|
+
}
|
|
64
|
+
.centerLink {
|
|
65
|
+
font-style: normal;
|
|
66
|
+
font-family: Arial, Helvetica, sans-serif;
|
|
67
|
+
font-size: 18px;
|
|
68
|
+
text-decoration: none;
|
|
69
|
+
color: #224679;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.errorTextHeader {
|
|
73
|
+
font-style: normal;
|
|
74
|
+
font-family: Arial;
|
|
75
|
+
font-size: 40px;
|
|
76
|
+
color: #444444;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.bottomText {
|
|
80
|
+
align: center;
|
|
81
|
+
font-style: normal;
|
|
82
|
+
font-family: Arial;
|
|
83
|
+
font-size: 14px;
|
|
84
|
+
color: #444444;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.biggerBottomText {
|
|
88
|
+
align: center;
|
|
89
|
+
font-style: normal;
|
|
90
|
+
font-family: Arial;
|
|
91
|
+
font-size: 16px;
|
|
92
|
+
color: #444444;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.detailTable {
|
|
96
|
+
align: bottom;
|
|
97
|
+
vertical-align: middle;
|
|
98
|
+
margin-left: auto;
|
|
99
|
+
margin-right: auto;
|
|
100
|
+
font-style: normal;
|
|
101
|
+
font-family: Arial;
|
|
102
|
+
font-size: 16px;
|
|
103
|
+
color: #444444;
|
|
104
|
+
}
|
|
105
|
+
</style>
|
|
106
|
+
</head>
|
|
107
|
+
|
|
108
|
+
<body>
|
|
109
|
+
<div class="content">
|
|
110
|
+
<div class="valigned">
|
|
111
|
+
<p class="centerText"><span class="errorTextHeader">You can close this tab now.</span></p>
|
|
112
|
+
${logoutUrl
|
|
113
|
+
? '<a class="centerLink" href="' + logoutUrl + '">(Click here to log off the current user)</a>'
|
|
114
|
+
: ''}
|
|
115
|
+
</div>
|
|
116
|
+
</div>
|
|
117
|
+
<div class="footer">
|
|
118
|
+
<div class="footerLeft"><img width='150' height='80' title='' alt='SAP logo'
|
|
119
|
+
src='data:image/png;base64,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'>
|
|
120
|
+
</div>
|
|
121
|
+
<div class="footerRight">
|
|
122
|
+
<p class="bottomText"><span class="biggerBottomText">©</span>2020 SAP SE, All rights reserved.</p>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
</body>
|
|
126
|
+
|
|
127
|
+
</html>
|
|
128
|
+
`;
|
|
129
|
+
//# sourceMappingURL=static.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static.js","sourceRoot":"","sources":["../../src/auth/static.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG,CAAC,SAAkB,EAAE,QAAiB,EAAU,EAAE,CAAC;;;;;aAKzE,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAwG5B,SAAS;IACL,CAAC,CAAC,8BAA8B,GAAG,SAAS,GAAG,gDAAgD;IAC/F,CAAC,CAAC,EACV;;;;;;;;;;;;;;CAcX,CAAC"}
|