@studyportals/cors 2.5.1 → 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.
Files changed (47) hide show
  1. package/.codeclimate.yml +25 -0
  2. package/.github/CODEOWNERS +1 -0
  3. package/.nycrc +22 -0
  4. package/.travis.yml +18 -0
  5. package/README.md +110 -0
  6. package/{index.d.ts → bin/index.d.ts} +2 -2
  7. package/{index.js → bin/index.js} +18 -18
  8. package/{src → bin/src}/domain/allowed-domain-reg-ex-list.d.ts +10 -10
  9. package/{src → bin/src}/domain/allowed-domain-reg-ex-list.js +27 -28
  10. package/{src → bin/src}/domain/allowed-explicit-domains-rules.d.ts +42 -42
  11. package/{src → bin/src}/domain/allowed-explicit-domains-rules.js +42 -43
  12. package/{src → bin/src}/domain/cors.d.ts +16 -16
  13. package/{src → bin/src}/domain/cors.js +37 -37
  14. package/{src → bin/src}/domain/enums/environment.d.ts +4 -4
  15. package/{src → bin/src}/domain/enums/environment.js +8 -8
  16. package/{src → bin/src}/domain/enums/index.d.ts +2 -2
  17. package/{src → bin/src}/domain/enums/index.js +18 -18
  18. package/{src → bin/src}/domain/enums/scope.d.ts +4 -4
  19. package/{src → bin/src}/domain/enums/scope.js +8 -8
  20. package/{src → bin/src}/domain/index.d.ts +3 -3
  21. package/{src → bin/src}/domain/index.js +19 -19
  22. package/{src → bin/src}/implementations/express-middleware.d.ts +5 -5
  23. package/{src → bin/src}/implementations/express-middleware.js +27 -27
  24. package/{src → bin/src}/implementations/index.d.ts +3 -3
  25. package/{src → bin/src}/implementations/index.js +19 -19
  26. package/{src → bin/src}/implementations/options.d.ts +8 -8
  27. package/{src → bin/src}/implementations/options.js +49 -49
  28. package/{src → bin/src}/implementations/s3-rules.d.ts +5 -5
  29. package/{src → bin/src}/implementations/s3-rules.js +12 -12
  30. package/index.ts +2 -0
  31. package/package.json +38 -38
  32. package/src/domain/allowed-domain-reg-ex-list.ts +26 -0
  33. package/src/domain/allowed-explicit-domains-rules.ts +56 -0
  34. package/src/domain/cors.ts +32 -0
  35. package/src/domain/enums/environment.ts +4 -0
  36. package/src/domain/enums/index.ts +2 -0
  37. package/src/domain/enums/scope.ts +4 -0
  38. package/src/domain/index.ts +3 -0
  39. package/src/implementations/express-middleware.ts +21 -0
  40. package/src/implementations/index.ts +3 -0
  41. package/src/implementations/options.ts +50 -0
  42. package/src/implementations/s3-rules.ts +12 -0
  43. package/test/domain/cors.s3.test.ts +92 -0
  44. package/test/domain/cors.valid.domain.test.ts +155 -0
  45. package/test/mocha.opts +3 -0
  46. package/tsconfig.json +38 -0
  47. 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
@@ -0,0 +1,2 @@
1
+ export * from './src/domain';
2
+ export * from './src/implementations';
package/package.json CHANGED
@@ -1,38 +1,38 @@
1
- {
2
- "name": "@studyportals/cors",
3
- "version": "2.5.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
- }
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,4 @@
1
+ export enum Environment {
2
+ Production,
3
+ Testing,
4
+ }
@@ -0,0 +1,2 @@
1
+ export * from './environment';
2
+ export * from './scope';
@@ -0,0 +1,4 @@
1
+ export enum Scope {
2
+ Student,
3
+ UniAdmin
4
+ }
@@ -0,0 +1,3 @@
1
+ export * from './cors';
2
+ export * from './allowed-domain-reg-ex-list';
3
+ export * from './enums';
@@ -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
+ }
@@ -0,0 +1,3 @@
1
+ export * from './options';
2
+ export * from './express-middleware';
3
+ export * from './s3-rules';