@studyportals/cors 2.6.0 → 2.6.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.
- package/.codeclimate.yml +25 -0
- package/.github/CODEOWNERS +1 -0
- package/.nycrc +22 -0
- package/.travis.yml +18 -0
- package/README.md +110 -0
- package/{index.d.ts → bin/index.d.ts} +2 -2
- package/{index.js → bin/index.js} +18 -18
- package/{src → bin/src}/domain/allowed-domain-reg-ex-list.d.ts +10 -10
- package/{src → bin/src}/domain/allowed-domain-reg-ex-list.js +27 -28
- package/{src → bin/src}/domain/allowed-explicit-domains-rules.d.ts +42 -42
- package/{src → bin/src}/domain/allowed-explicit-domains-rules.js +42 -43
- package/{src → bin/src}/domain/cors.d.ts +16 -16
- package/{src → bin/src}/domain/cors.js +37 -37
- package/{src → bin/src}/domain/enums/environment.d.ts +4 -4
- package/{src → bin/src}/domain/enums/environment.js +8 -8
- package/{src → bin/src}/domain/enums/index.d.ts +2 -2
- package/{src → bin/src}/domain/enums/index.js +18 -18
- package/{src → bin/src}/domain/enums/scope.d.ts +4 -4
- package/{src → bin/src}/domain/enums/scope.js +8 -8
- package/{src → bin/src}/domain/index.d.ts +3 -3
- package/{src → bin/src}/domain/index.js +19 -19
- package/{src → bin/src}/implementations/express-middleware.d.ts +5 -5
- package/{src → bin/src}/implementations/express-middleware.js +27 -27
- package/{src → bin/src}/implementations/index.d.ts +3 -3
- package/{src → bin/src}/implementations/index.js +19 -19
- package/{src → bin/src}/implementations/options.d.ts +8 -8
- package/{src → bin/src}/implementations/options.js +49 -49
- package/{src → bin/src}/implementations/s3-rules.d.ts +5 -5
- package/{src → bin/src}/implementations/s3-rules.js +12 -12
- package/index.ts +2 -0
- package/package.json +38 -38
- package/src/domain/allowed-domain-reg-ex-list.ts +26 -0
- package/src/domain/allowed-explicit-domains-rules.ts +56 -0
- package/src/domain/cors.ts +32 -0
- package/src/domain/enums/environment.ts +4 -0
- package/src/domain/enums/index.ts +2 -0
- package/src/domain/enums/scope.ts +4 -0
- package/src/domain/index.ts +3 -0
- package/src/implementations/express-middleware.ts +21 -0
- package/src/implementations/index.ts +3 -0
- package/src/implementations/options.ts +50 -0
- package/src/implementations/s3-rules.ts +12 -0
- package/test/domain/cors.s3.test.ts +92 -0
- package/test/domain/cors.valid.domain.test.ts +155 -0
- package/test/mocha.opts +3 -0
- package/tsconfig.json +38 -0
- package/tslint.json +132 -0
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./environment"), exports);
|
|
18
|
-
__exportStar(require("./scope"), exports);
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./environment"), exports);
|
|
18
|
+
__exportStar(require("./scope"), exports);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare enum Scope {
|
|
2
|
-
Student = 0,
|
|
3
|
-
UniAdmin = 1
|
|
4
|
-
}
|
|
1
|
+
export declare enum Scope {
|
|
2
|
+
Student = 0,
|
|
3
|
+
UniAdmin = 1
|
|
4
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Scope = void 0;
|
|
4
|
-
var Scope;
|
|
5
|
-
(function (Scope) {
|
|
6
|
-
Scope[Scope["Student"] = 0] = "Student";
|
|
7
|
-
Scope[Scope["UniAdmin"] = 1] = "UniAdmin";
|
|
8
|
-
})(Scope = exports.Scope || (exports.Scope = {}));
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Scope = void 0;
|
|
4
|
+
var Scope;
|
|
5
|
+
(function (Scope) {
|
|
6
|
+
Scope[Scope["Student"] = 0] = "Student";
|
|
7
|
+
Scope[Scope["UniAdmin"] = 1] = "UniAdmin";
|
|
8
|
+
})(Scope = exports.Scope || (exports.Scope = {}));
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from './cors';
|
|
2
|
-
export * from './allowed-domain-reg-ex-list';
|
|
3
|
-
export * from './enums';
|
|
1
|
+
export * from './cors';
|
|
2
|
+
export * from './allowed-domain-reg-ex-list';
|
|
3
|
+
export * from './enums';
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./cors"), exports);
|
|
18
|
-
__exportStar(require("./allowed-domain-reg-ex-list"), exports);
|
|
19
|
-
__exportStar(require("./enums"), exports);
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./cors"), exports);
|
|
18
|
+
__exportStar(require("./allowed-domain-reg-ex-list"), exports);
|
|
19
|
+
__exportStar(require("./enums"), exports);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { RequestHandler } from 'express';
|
|
2
|
-
import { Environment, Scope } from '../domain/enums';
|
|
3
|
-
export declare class ExpressMiddleware {
|
|
4
|
-
static getMiddleWare(scope: Scope, environment?: Environment): RequestHandler;
|
|
5
|
-
}
|
|
1
|
+
import { RequestHandler } from 'express';
|
|
2
|
+
import { Environment, Scope } from '../domain/enums';
|
|
3
|
+
export declare class ExpressMiddleware {
|
|
4
|
+
static getMiddleWare(scope: Scope, environment?: Environment): RequestHandler;
|
|
5
|
+
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.ExpressMiddleware = void 0;
|
|
13
|
-
const domain_1 = require("../domain");
|
|
14
|
-
const enums_1 = require("../domain/enums");
|
|
15
|
-
class ExpressMiddleware {
|
|
16
|
-
static getMiddleWare(scope, environment = enums_1.Environment.Production) {
|
|
17
|
-
const cors = new domain_1.CORS(scope, environment);
|
|
18
|
-
return (req, res, next) => __awaiter(this, void 0, void 0, function* () {
|
|
19
|
-
const origin = req.get('origin') || '';
|
|
20
|
-
if (yield cors.isValidDomain(origin)) {
|
|
21
|
-
res.header('Access-Control-Allow-Origin', origin);
|
|
22
|
-
}
|
|
23
|
-
next();
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
exports.ExpressMiddleware = ExpressMiddleware;
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ExpressMiddleware = void 0;
|
|
13
|
+
const domain_1 = require("../domain");
|
|
14
|
+
const enums_1 = require("../domain/enums");
|
|
15
|
+
class ExpressMiddleware {
|
|
16
|
+
static getMiddleWare(scope, environment = enums_1.Environment.Production) {
|
|
17
|
+
const cors = new domain_1.CORS(scope, environment);
|
|
18
|
+
return (req, res, next) => __awaiter(this, void 0, void 0, function* () {
|
|
19
|
+
const origin = req.get('origin') || '';
|
|
20
|
+
if (yield cors.isValidDomain(origin)) {
|
|
21
|
+
res.header('Access-Control-Allow-Origin', origin);
|
|
22
|
+
}
|
|
23
|
+
next();
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.ExpressMiddleware = ExpressMiddleware;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from './options';
|
|
2
|
-
export * from './express-middleware';
|
|
3
|
-
export * from './s3-rules';
|
|
1
|
+
export * from './options';
|
|
2
|
+
export * from './express-middleware';
|
|
3
|
+
export * from './s3-rules';
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./options"), exports);
|
|
18
|
-
__exportStar(require("./express-middleware"), exports);
|
|
19
|
-
__exportStar(require("./s3-rules"), exports);
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./options"), exports);
|
|
18
|
+
__exportStar(require("./express-middleware"), exports);
|
|
19
|
+
__exportStar(require("./s3-rules"), exports);
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Environment, Scope } from '../domain/enums';
|
|
2
|
-
export declare class OptionsLambda {
|
|
3
|
-
private cors;
|
|
4
|
-
constructor(scope: Scope, environment?: Environment);
|
|
5
|
-
getLowercasedHeaders(event: any): any;
|
|
6
|
-
getOrigin(event: any): string;
|
|
7
|
-
getHandler(): (event: any) => Promise<any>;
|
|
8
|
-
}
|
|
1
|
+
import { Environment, Scope } from '../domain/enums';
|
|
2
|
+
export declare class OptionsLambda {
|
|
3
|
+
private cors;
|
|
4
|
+
constructor(scope: Scope, environment?: Environment);
|
|
5
|
+
getLowercasedHeaders(event: any): any;
|
|
6
|
+
getOrigin(event: any): string;
|
|
7
|
+
getHandler(): (event: any) => Promise<any>;
|
|
8
|
+
}
|
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.OptionsLambda = void 0;
|
|
13
|
-
const domain_1 = require("../domain");
|
|
14
|
-
const enums_1 = require("../domain/enums");
|
|
15
|
-
class OptionsLambda {
|
|
16
|
-
constructor(scope, environment = enums_1.Environment.Production) {
|
|
17
|
-
this.cors = new domain_1.CORS(scope, environment);
|
|
18
|
-
}
|
|
19
|
-
getLowercasedHeaders(event) {
|
|
20
|
-
const headers = {};
|
|
21
|
-
Object.keys(event.headers).forEach((key) => {
|
|
22
|
-
headers[key.toLowerCase()] = event.headers[key];
|
|
23
|
-
});
|
|
24
|
-
return headers;
|
|
25
|
-
}
|
|
26
|
-
getOrigin(event) {
|
|
27
|
-
const headers = this.getLowercasedHeaders(event);
|
|
28
|
-
return headers['origin'];
|
|
29
|
-
}
|
|
30
|
-
getHandler() {
|
|
31
|
-
return (event) => __awaiter(this, void 0, void 0, function* () {
|
|
32
|
-
const origin = this.getOrigin(event);
|
|
33
|
-
const headers = {
|
|
34
|
-
'Cache-Control': 'max-age=600, s-maxage=600, proxy-revalidate',
|
|
35
|
-
};
|
|
36
|
-
if (yield this.cors.isValidDomain(origin)) {
|
|
37
|
-
headers['Access-Control-Allow-Origin'] = origin;
|
|
38
|
-
headers['Access-Control-Allow-Headers'] = 'authorization, x-api-key, content-type';
|
|
39
|
-
headers['Access-Control-Allow-Methods'] = 'GET, POST, DELETE, PATCH, HEAD, PUT, OPTIONS';
|
|
40
|
-
headers['Access-Control-Max-Age'] = '600';
|
|
41
|
-
}
|
|
42
|
-
return {
|
|
43
|
-
statusCode: 200,
|
|
44
|
-
headers,
|
|
45
|
-
};
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
exports.OptionsLambda = OptionsLambda;
|
|
1
|
+
'use strict';
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.OptionsLambda = void 0;
|
|
13
|
+
const domain_1 = require("../domain");
|
|
14
|
+
const enums_1 = require("../domain/enums");
|
|
15
|
+
class OptionsLambda {
|
|
16
|
+
constructor(scope, environment = enums_1.Environment.Production) {
|
|
17
|
+
this.cors = new domain_1.CORS(scope, environment);
|
|
18
|
+
}
|
|
19
|
+
getLowercasedHeaders(event) {
|
|
20
|
+
const headers = {};
|
|
21
|
+
Object.keys(event.headers).forEach((key) => {
|
|
22
|
+
headers[key.toLowerCase()] = event.headers[key];
|
|
23
|
+
});
|
|
24
|
+
return headers;
|
|
25
|
+
}
|
|
26
|
+
getOrigin(event) {
|
|
27
|
+
const headers = this.getLowercasedHeaders(event);
|
|
28
|
+
return headers['origin'];
|
|
29
|
+
}
|
|
30
|
+
getHandler() {
|
|
31
|
+
return (event) => __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
const origin = this.getOrigin(event);
|
|
33
|
+
const headers = {
|
|
34
|
+
'Cache-Control': 'max-age=600, s-maxage=600, proxy-revalidate',
|
|
35
|
+
};
|
|
36
|
+
if (yield this.cors.isValidDomain(origin)) {
|
|
37
|
+
headers['Access-Control-Allow-Origin'] = origin;
|
|
38
|
+
headers['Access-Control-Allow-Headers'] = 'authorization, x-api-key, content-type';
|
|
39
|
+
headers['Access-Control-Allow-Methods'] = 'GET, POST, DELETE, PATCH, HEAD, PUT, OPTIONS';
|
|
40
|
+
headers['Access-Control-Max-Age'] = '600';
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
statusCode: 200,
|
|
44
|
+
headers,
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.OptionsLambda = OptionsLambda;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CorsRule } from '../domain/allowed-explicit-domains-rules';
|
|
2
|
-
import { Environment, Scope } from '../domain/enums';
|
|
3
|
-
export declare class S3Rules {
|
|
4
|
-
static generate(scope: Scope, environment?: Environment): CorsRule[];
|
|
5
|
-
}
|
|
1
|
+
import { CorsRule } from '../domain/allowed-explicit-domains-rules';
|
|
2
|
+
import { Environment, Scope } from '../domain/enums';
|
|
3
|
+
export declare class S3Rules {
|
|
4
|
+
static generate(scope: Scope, environment?: Environment): CorsRule[];
|
|
5
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.S3Rules = void 0;
|
|
4
|
-
const domain_1 = require("../domain");
|
|
5
|
-
const enums_1 = require("../domain/enums");
|
|
6
|
-
class S3Rules {
|
|
7
|
-
static generate(scope, environment = enums_1.Environment.Production) {
|
|
8
|
-
const cors = new domain_1.CORS(scope, environment);
|
|
9
|
-
return cors.getS3Rules();
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
exports.S3Rules = S3Rules;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.S3Rules = void 0;
|
|
4
|
+
const domain_1 = require("../domain");
|
|
5
|
+
const enums_1 = require("../domain/enums");
|
|
6
|
+
class S3Rules {
|
|
7
|
+
static generate(scope, environment = enums_1.Environment.Production) {
|
|
8
|
+
const cors = new domain_1.CORS(scope, environment);
|
|
9
|
+
return cors.getS3Rules();
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.S3Rules = S3Rules;
|
package/index.ts
ADDED
package/package.json
CHANGED
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@studyportals/cors",
|
|
3
|
-
"version": "2.6.
|
|
4
|
-
"description": "",
|
|
5
|
-
"main": "bin/index.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"test": "mocha test/**/*.test.ts",
|
|
8
|
-
"test:watch": "mocha -w --reporter min test/**/*.test.ts",
|
|
9
|
-
"deploy-patch": "npm version patch && npm run deploy",
|
|
10
|
-
"deploy-minor": "npm version minor && npm run deploy",
|
|
11
|
-
"deploy-major": "npm version major && npm run deploy",
|
|
12
|
-
"prepare-deployment": "cp package.json bin/package.json",
|
|
13
|
-
"deploy": "npm run build && npm run prepare-deployment && npm publish bin",
|
|
14
|
-
"build": "rm -rf bin && tsc && rm -rf bin/test",
|
|
15
|
-
"lint": "tslint 'src/**/*.ts'",
|
|
16
|
-
"lint-fix": "tslint --fix 'src/**/*.ts'",
|
|
17
|
-
"test:coverage": "nyc mocha test/**/*.test.ts"
|
|
18
|
-
},
|
|
19
|
-
"private": false,
|
|
20
|
-
"author": "SP - Samurai Pizza Cats",
|
|
21
|
-
"license": "BSD3",
|
|
22
|
-
"dependencies": {
|
|
23
|
-
"@types/express": "^4.17.3"
|
|
24
|
-
},
|
|
25
|
-
"devDependencies": {
|
|
26
|
-
"@types/chai": "^4.1.7",
|
|
27
|
-
"@types/node": "^10.12.15",
|
|
28
|
-
"chai": "^4.2.0",
|
|
29
|
-
"mocha": "^5.2.0",
|
|
30
|
-
"mocha-typescript": "1.1.12",
|
|
31
|
-
"nyc": "^13.3.0",
|
|
32
|
-
"ts-loader": "^2.3.7",
|
|
33
|
-
"ts-node": "^7.0.1",
|
|
34
|
-
"tslint": "^5.11.0",
|
|
35
|
-
"typemoq": "^2.1.0",
|
|
36
|
-
"typescript": "^4.8.4"
|
|
37
|
-
}
|
|
38
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@studyportals/cors",
|
|
3
|
+
"version": "2.6.1",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "bin/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"test": "mocha test/**/*.test.ts",
|
|
8
|
+
"test:watch": "mocha -w --reporter min test/**/*.test.ts",
|
|
9
|
+
"deploy-patch": "npm version patch && npm run deploy",
|
|
10
|
+
"deploy-minor": "npm version minor && npm run deploy",
|
|
11
|
+
"deploy-major": "npm version major && npm run deploy",
|
|
12
|
+
"prepare-deployment": "cp package.json bin/package.json",
|
|
13
|
+
"deploy": "npm run build && npm run prepare-deployment && npm publish ./bin",
|
|
14
|
+
"build": "rm -rf bin && tsc && rm -rf bin/test",
|
|
15
|
+
"lint": "tslint 'src/**/*.ts'",
|
|
16
|
+
"lint-fix": "tslint --fix 'src/**/*.ts'",
|
|
17
|
+
"test:coverage": "nyc mocha test/**/*.test.ts"
|
|
18
|
+
},
|
|
19
|
+
"private": false,
|
|
20
|
+
"author": "SP - Samurai Pizza Cats",
|
|
21
|
+
"license": "BSD3",
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@types/express": "^4.17.3"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/chai": "^4.1.7",
|
|
27
|
+
"@types/node": "^10.12.15",
|
|
28
|
+
"chai": "^4.2.0",
|
|
29
|
+
"mocha": "^5.2.0",
|
|
30
|
+
"mocha-typescript": "1.1.12",
|
|
31
|
+
"nyc": "^13.3.0",
|
|
32
|
+
"ts-loader": "^2.3.7",
|
|
33
|
+
"ts-node": "^7.0.1",
|
|
34
|
+
"tslint": "^5.11.0",
|
|
35
|
+
"typemoq": "^2.1.0",
|
|
36
|
+
"typescript": "^4.8.4"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Environment } from './enums/environment';
|
|
2
|
+
import { Scope } from './enums/scope';
|
|
3
|
+
|
|
4
|
+
export const AllowedDomainRegExList = {
|
|
5
|
+
[Scope.Student]: {
|
|
6
|
+
[Environment.Production]: [
|
|
7
|
+
/^https?:\/\/(www(?:\.dev)?|cypress\.rc|rc|beta|[0-9]{4,16}(?:-bob)?\.rc)\.mastersportal\.(com|fyi)(?::3030)?$/,
|
|
8
|
+
/^https?:\/\/(www(?:\.dev)?|cypress\.rc|rc|beta|[0-9]{4,16}(?:-bob)?\.rc)\.bachelorsportal\.(com|fyi)(?::3030)?$/,
|
|
9
|
+
/^https?:\/\/(www(?:\.dev)?|cypress\.rc|rc|beta|[0-9]{4,16}(?:-bob)?\.rc)\.phdportal\.(com|fyi)(?::3030)?$/,
|
|
10
|
+
/^https?:\/\/(www(?:\.dev)?|cypress\.rc|rc|beta|[0-9]{4,16}(?:-bob)?\.rc)\.preparationcoursesportal\.(com|fyi)(?::3030)?$/,
|
|
11
|
+
/^https?:\/\/(www(?:\.dev)?|cypress\.rc|rc|beta|[0-9]{4,16}(?:-bob)?\.rc)\.distancelearningportal\.(com|fyi)(?::3030)?$/,
|
|
12
|
+
/^https?:\/\/(www(?:\.dev)?|cypress\.rc|rc|beta|[0-9]{4,16}(?:-bob)?\.rc)\.shortcoursesportal\.(com|fyi)(?::3030)?$/,
|
|
13
|
+
/^https?:\/\/(www.)?admissiontestportal.com?$/,
|
|
14
|
+
/^https?:\/\/studentemailing\.prtl\.co$/,
|
|
15
|
+
/^https?:\/\/scholarship\.mastersportal\.com$/,
|
|
16
|
+
/^https?:\/\/search-page\.prtl\.co$/,
|
|
17
|
+
],
|
|
18
|
+
[Environment.Testing]: [
|
|
19
|
+
/(.*?)/,
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
[Scope.UniAdmin]: {
|
|
23
|
+
[Environment.Production]: [/(.*?)/],
|
|
24
|
+
[Environment.Testing]: [/(.*?)/],
|
|
25
|
+
},
|
|
26
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Environment } from "./enums/environment";
|
|
2
|
+
import { Scope } from "./enums/scope";
|
|
3
|
+
|
|
4
|
+
export type AllowedExplicitDomainsRulesType = typeof AllowedExplicitDomainsRules
|
|
5
|
+
|
|
6
|
+
export type CorsRule = {
|
|
7
|
+
allowedOrigins: string[],
|
|
8
|
+
allowedMethods: string[],
|
|
9
|
+
allowedHeaders: string[],
|
|
10
|
+
exposedHeaders: string[],
|
|
11
|
+
maxAge: number,
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const AllowedExplicitDomainsRules = {
|
|
15
|
+
[Scope.Student]: {
|
|
16
|
+
[Environment.Production]: {
|
|
17
|
+
allowedOrigins: ["*.mastersportal.com","*.bachelorsportal.com","*.shortcoursesportal.com",
|
|
18
|
+
"*.distancelearningportal.com","*.preparationcoursesportal.com","*.phdportal.com",
|
|
19
|
+
"*.prtl.co","*.rc.mastersportal.fyi","*.rc.bachelorsportal.fyi","*.rc.shortcoursesportal.fyi",
|
|
20
|
+
"*.rc.distancelearningportal.fyi","*.rc.preparationcoursesportal.fyi","*.rc.phdportal.fyi",
|
|
21
|
+
"*.admissiontestportal.com", "https://admissiontestportal.com"],
|
|
22
|
+
allowedHeaders: ["Authorization"],
|
|
23
|
+
allowedMethods: ["GET"],
|
|
24
|
+
exposedHeaders: [],
|
|
25
|
+
maxAge: 3000
|
|
26
|
+
|
|
27
|
+
},
|
|
28
|
+
[Environment.Testing]: {
|
|
29
|
+
allowedOrigins: ["*"],
|
|
30
|
+
allowedMethods: ["GET"],
|
|
31
|
+
allowedHeaders: ["Authorization"],
|
|
32
|
+
exposedHeaders: [],
|
|
33
|
+
maxAge: 3000
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
[Scope.UniAdmin]: {
|
|
37
|
+
[Environment.Production]: {
|
|
38
|
+
allowedOrigins: ["*.studyportals.eu"],
|
|
39
|
+
allowedHeaders: ["Authorization"],
|
|
40
|
+
allowedMethods: ["GET","POST"],
|
|
41
|
+
exposedHeaders: [],
|
|
42
|
+
maxAge: 3000
|
|
43
|
+
|
|
44
|
+
},
|
|
45
|
+
[Environment.Testing]: {
|
|
46
|
+
allowedOrigins: [ "*-uniadmin.prtl.fyi",
|
|
47
|
+
"*.administration.tst.studyportals.eu","administration.tst.studyportals.eu",
|
|
48
|
+
"https://administration.dev.studyportals.eu:*",
|
|
49
|
+
"*-uniadmin.studyportals.eu"],
|
|
50
|
+
allowedMethods: ["GET"],
|
|
51
|
+
allowedHeaders: ["*"],
|
|
52
|
+
exposedHeaders: [],
|
|
53
|
+
maxAge: 3000
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { AllowedDomainRegExList } from './allowed-domain-reg-ex-list';
|
|
2
|
+
import { AllowedExplicitDomainsRules, CorsRule } from './allowed-explicit-domains-rules';
|
|
3
|
+
import { Environment } from './enums/environment';
|
|
4
|
+
import { Scope } from './enums/scope';
|
|
5
|
+
|
|
6
|
+
export class CORS {
|
|
7
|
+
|
|
8
|
+
private regExes: RegExp[];
|
|
9
|
+
private s3Rules: CorsRule[]
|
|
10
|
+
|
|
11
|
+
constructor(scope: Scope, environment: Environment = Environment.Production) {
|
|
12
|
+
this.regExes = AllowedDomainRegExList[scope][environment];
|
|
13
|
+
this.s3Rules = [ AllowedExplicitDomainsRules[scope][environment] ] ;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* isValidDomain
|
|
18
|
+
*/
|
|
19
|
+
public async isValidDomain(domain: string): Promise<boolean> {
|
|
20
|
+
const hasMatch = this.regExes.filter((regex) => domain.match(regex) !== null);
|
|
21
|
+
return (hasMatch.length !== 0);
|
|
22
|
+
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* getIamRules
|
|
27
|
+
*/
|
|
28
|
+
public getS3Rules(): CorsRule[] {
|
|
29
|
+
return this.s3Rules;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { NextFunction, Request, RequestHandler, Response } from 'express';
|
|
2
|
+
import { CORS } from '../domain';
|
|
3
|
+
import { Environment, Scope } from '../domain/enums';
|
|
4
|
+
|
|
5
|
+
export class ExpressMiddleware {
|
|
6
|
+
|
|
7
|
+
public static getMiddleWare(scope: Scope, environment: Environment = Environment.Production): RequestHandler {
|
|
8
|
+
const cors = new CORS(scope, environment);
|
|
9
|
+
|
|
10
|
+
return async (req: Request, res: Response, next: NextFunction) => {
|
|
11
|
+
const origin = req.get('origin') || '';
|
|
12
|
+
|
|
13
|
+
if (await cors.isValidDomain(origin)) {
|
|
14
|
+
res.header('Access-Control-Allow-Origin', origin);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
next();
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
}
|
|
21
|
+
}
|