Skip to content

Commit d1ede50

Browse files
committed
Pass access manager strategy to mw instead of proxy 🎨
1 parent 3dc2954 commit d1ede50

File tree

7 files changed

+29
-62
lines changed

7 files changed

+29
-62
lines changed

‎server/app.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ app.use(origin());
4141
app.use(express.static(path.join(__dirname, '../dist/')));
4242
if (STORAGE_PATH) app.use(express.static(STORAGE_PATH));
4343
if (storageProxy.isSelfHosted) {
44-
const { proxy: middleware } = require('./shared/storage/proxy/mw')(storage, storageProxy);
45-
app.use(storageProxy.path, middleware);
44+
const { proxy: middleware } = require('./shared/storage/proxy/mw');
45+
app.use(storageProxy.path, middleware(storage, storageProxy.accessManager));
4646
}
4747

4848
// Mount main router.

‎server/repository/index.js‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const proxyAccessManager = require('./proxy');
1212
const { Repository } = require('../shared/database');
1313
const router = require('express').Router();
1414
const storage = require('./storage');
15-
const { setSignedCookies } = require('../shared/storage/proxy/mw')(storage, proxyAccessManager);
15+
const { setSignedCookies } = require('../shared/storage/proxy/mw');
1616

1717
/* eslint-disable require-sort/require-sort */
1818
const activity = require('../activity');
@@ -30,7 +30,7 @@ router
3030

3131
router
3232
.param('repositoryId', getRepository)
33-
.use('/:repositoryId', hasAccess, setSignedCookies);
33+
.use('/:repositoryId', hasAccess, setSignedCookies(proxyAccessManager));
3434

3535
router.route('/')
3636
.get(processQuery({ limit: 100 }), ctrl.index)

‎server/repository/proxy.js‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
'use strict';
22

3+
const { AccessManagerPrototype, config } = require('../shared/storage/proxy');
34
const path = require('path');
4-
const proxy = require('../shared/storage/proxy');
55

66
const storageCookies = {
77
REPOSITORY: 'Storage-Repository'
88
};
99

10-
class RepositoryProxyAccessManager extends proxy.AccessManager {
10+
class RepositoryProxyAccessManager extends AccessManagerPrototype {
1111
getSignedCookies(repositoryId, maxAge) {
1212
const resource = path.join('repository', `${repositoryId}`);
1313
return {
@@ -30,4 +30,4 @@ class RepositoryProxyAccessManager extends proxy.AccessManager {
3030
}
3131
}
3232

33-
module.exports = new RepositoryProxyAccessManager(proxy.config);
33+
module.exports = new RepositoryProxyAccessManager(config);

‎server/shared/storage/proxy/index.js‎

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,29 +31,13 @@ class Proxy {
3131
return this.isSelfHosted && this.provider.path;
3232
}
3333

34-
get AccessManager() {
35-
return this.provider.AccessManager;
36-
}
37-
38-
getSignedCookies(resource, maxAge, accessManager) {
39-
return this.provider.getSignedCookies(resource, maxAge, accessManager);
40-
}
41-
42-
verifyCookies(cookies, resource, accessManager) {
43-
return this.provider.verifyCookies(cookies, resource, accessManager);
44-
}
45-
46-
hasCookies(cookies, ...params) {
47-
return this.provider.hasCookies(cookies, ...params);
34+
get AccessManagerPrototype() {
35+
return this.provider.AccessManagerPrototype;
4836
}
4937

5038
getFileUrl(key) {
5139
return this.provider.getFileUrl(key);
5240
}
53-
54-
getCookieNames(accessManager) {
55-
return this.provider.getCookieNames(accessManager);
56-
}
5741
}
5842

5943
module.exports = new Proxy(config);

‎server/shared/storage/proxy/mw.js‎

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,32 @@
33
const { FORBIDDEN } = require('http-status-codes');
44
const miss = require('mississippi');
55
const path = require('path');
6-
const proxy = require('.');
76
const router = require('express').Router();
87

9-
module.exports = (storage, proxyAccessManager) => {
10-
function getFile(req, res, next) {
8+
function proxy(storage, accessManager) {
9+
return router.get('/*', (req, res, next) => {
1110
const key = req.params[0];
12-
const hasValidCookies = proxy.verifyCookies(req.cookies, key, proxyAccessManager);
11+
const hasValidCookies = accessManager.verifyCookies(req.cookies, key);
1312
if (!hasValidCookies) return res.status(FORBIDDEN).end();
1413
res.type(path.extname(key));
1514
miss.pipe(storage.createReadStream(key), res, err => {
1615
if (err) return next(err);
1716
res.end();
1817
});
19-
}
18+
});
19+
}
2020

21-
function setSignedCookies(req, res, next) {
21+
function setSignedCookies(accessManager) {
22+
return (req, res, next) => {
2223
const repositoryId = req.repository.id;
23-
if (proxy.hasCookies(req.cookies, repositoryId, proxyAccessManager)) return next();
24+
if (accessManager.hasCookies(req.cookies, repositoryId)) return next();
2425
const maxAge = 1000 * 60 * 60; // 1 hour in ms
25-
const cookies = proxy.getSignedCookies(repositoryId, maxAge, proxyAccessManager);
26+
const cookies = accessManager.getSignedCookies(repositoryId, maxAge);
2627
Object.entries(cookies).forEach(([cookie, value]) => {
2728
res.cookie(cookie, value, { maxAge, httpOnly: true });
2829
});
2930
next();
30-
}
31+
};
32+
}
3133

32-
return { proxy: router.get('/*', getFile), setSignedCookies };
33-
};
34+
module.exports = { proxy, setSignedCookies };

‎server/shared/storage/proxy/providers/local/access-manager.js‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ class LocalAccessManager {
1313
this.signer = new NodeRSA(config.privateKey, 'private');
1414
}
1515

16-
getSignedCookies(resource, expires) {
16+
getSignedCookies(resource, maxAge) {
17+
const expires = getExpirationTime(maxAge);
1718
const signature = this.signer.encrypt({ resource, expires }, 'base64');
1819
return {
1920
[storageCookies.SIGNATURE]: signature,
@@ -40,3 +41,8 @@ class LocalAccessManager {
4041
}
4142

4243
module.exports = LocalAccessManager;
44+
45+
function getExpirationTime(maxAge) {
46+
// Expiration unix timestamp in ms
47+
return new Date().getTime() + maxAge;
48+
}
Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
'use strict';
22

33
const AccessManager = require('./access-manager');
4-
const last = require('lodash/last');
54
const { origin } = require('../../../../../../config/server');
65
const urlJoin = require('url-join');
76
const { validateConfig } = require('../../../validation');
@@ -25,36 +24,13 @@ class Local {
2524
return new this(config);
2625
}
2726

28-
get AccessManager() {
27+
get AccessManagerPrototype() {
2928
return AccessManager;
3029
}
3130

32-
getSignedCookies(resource, maxAge, accessManager = this.accessManager) {
33-
const expires = getExpirationTime(maxAge);
34-
return accessManager.getSignedCookies(resource, expires);
35-
}
36-
37-
verifyCookies(cookies, key, accessManager = this.accessManager) {
38-
return accessManager.verifyCookies(cookies, key);
39-
}
40-
41-
hasCookies(cookies, ...params) {
42-
const accessManager = last(params) || this.accessManager;
43-
return accessManager.hasCookies(cookies, ...params);
44-
}
45-
46-
getCookieNames(accessManager = this.accessManager) {
47-
return accessManager.getCookieNames();
48-
}
49-
5031
getFileUrl(key) {
5132
return urlJoin(origin, this.path, key);
5233
}
5334
}
5435

5536
module.exports = { create: Local.create.bind(Local) };
56-
57-
function getExpirationTime(maxAge) {
58-
// Expiration unix timestamp in ms
59-
return new Date().getTime() + maxAge;
60-
}

0 commit comments

Comments
 (0)