Skip to content

Commit 4c60bfb

Browse files
authored
Merge pull request #370 from jc21/develop
v2.2.3
2 parents dcf8364 + 1716747 commit 4c60bfb

20 files changed

+436
-68
lines changed

.version

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.2.2
1+
2.2.3

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<p align="center">
22
<img src="https://nginxproxymanager.com/github.png">
33
<br><br>
4-
<img src="https://img.shields.io/badge/version-2.2.2-green.svg?style=for-the-badge">
4+
<img src="https://img.shields.io/badge/version-2.2.3-green.svg?style=for-the-badge">
55
<a href="https://hub.docker.com/repository/docker/jc21/nginx-proxy-manager">
66
<img src="https://img.shields.io/docker/stars/jc21/nginx-proxy-manager.svg?style=for-the-badge">
77
</a>

backend/internal/access-list.js

+70-20
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
const _ = require('lodash');
2-
const fs = require('fs');
3-
const batchflow = require('batchflow');
4-
const logger = require('../logger').access;
5-
const error = require('../lib/error');
6-
const accessListModel = require('../models/access_list');
7-
const accessListAuthModel = require('../models/access_list_auth');
8-
const proxyHostModel = require('../models/proxy_host');
9-
const internalAuditLog = require('./audit-log');
10-
const internalNginx = require('./nginx');
11-
const utils = require('../lib/utils');
1+
const _ = require('lodash');
2+
const fs = require('fs');
3+
const batchflow = require('batchflow');
4+
const logger = require('../logger').access;
5+
const error = require('../lib/error');
6+
const accessListModel = require('../models/access_list');
7+
const accessListAuthModel = require('../models/access_list_auth');
8+
const accessListClientModel = require('../models/access_list_client');
9+
const proxyHostModel = require('../models/proxy_host');
10+
const internalAuditLog = require('./audit-log');
11+
const internalNginx = require('./nginx');
12+
const utils = require('../lib/utils');
1213

1314
function omissions () {
1415
return ['is_deleted'];
@@ -29,14 +30,16 @@ const internalAccessList = {
2930
.omit(omissions())
3031
.insertAndFetch({
3132
name: data.name,
33+
satify_any: data.satify_any,
3234
owner_user_id: access.token.getUserId(1)
3335
});
3436
})
3537
.then((row) => {
3638
data.id = row.id;
3739

38-
// Now add the items
3940
let promises = [];
41+
42+
// Now add the items
4043
data.items.map((item) => {
4144
promises.push(accessListAuthModel
4245
.query()
@@ -48,13 +51,27 @@ const internalAccessList = {
4851
);
4952
});
5053

54+
// Now add the clients
55+
if (typeof data.clients !== 'undefined' && data.clients) {
56+
data.clients.map((client) => {
57+
promises.push(accessListClientModel
58+
.query()
59+
.insert({
60+
access_list_id: row.id,
61+
address: client.address,
62+
directive: client.directive
63+
})
64+
);
65+
});
66+
}
67+
5168
return Promise.all(promises);
5269
})
5370
.then(() => {
5471
// re-fetch with expansions
5572
return internalAccessList.get(access, {
5673
id: data.id,
57-
expand: ['owner', 'items']
74+
expand: ['owner', 'items', 'clients', 'proxy_hosts.access_list.clients']
5875
}, true /* <- skip masking */);
5976
})
6077
.then((row) => {
@@ -64,7 +81,7 @@ const internalAccessList = {
6481
return internalAccessList.build(row)
6582
.then(() => {
6683
if (row.proxy_host_count) {
67-
return internalNginx.reload();
84+
return internalNginx.bulkGenerateConfigs('proxy_host', row.proxy_hosts);
6885
}
6986
})
7087
.then(() => {
@@ -109,7 +126,8 @@ const internalAccessList = {
109126
.query()
110127
.where({id: data.id})
111128
.patch({
112-
name: data.name
129+
name: data.name,
130+
satify_any: data.satify_any,
113131
});
114132
}
115133
})
@@ -153,6 +171,38 @@ const internalAccessList = {
153171
});
154172
}
155173
})
174+
.then(() => {
175+
// Check for clients and add/update/remove them
176+
if (typeof data.clients !== 'undefined' && data.clients) {
177+
let promises = [];
178+
179+
data.clients.map(function (client) {
180+
if (client.address) {
181+
promises.push(accessListClientModel
182+
.query()
183+
.insert({
184+
access_list_id: data.id,
185+
address: client.address,
186+
directive: client.directive
187+
})
188+
);
189+
}
190+
});
191+
192+
let query = accessListClientModel
193+
.query()
194+
.delete()
195+
.where('access_list_id', data.id);
196+
197+
return query
198+
.then(() => {
199+
// Add new items
200+
if (promises.length) {
201+
return Promise.all(promises);
202+
}
203+
});
204+
}
205+
})
156206
.then(() => {
157207
// Add to audit log
158208
return internalAuditLog.add(access, {
@@ -166,14 +216,14 @@ const internalAccessList = {
166216
// re-fetch with expansions
167217
return internalAccessList.get(access, {
168218
id: data.id,
169-
expand: ['owner', 'items']
219+
expand: ['owner', 'items', 'clients', 'proxy_hosts.access_list.clients']
170220
}, true /* <- skip masking */);
171221
})
172222
.then((row) => {
173223
return internalAccessList.build(row)
174224
.then(() => {
175225
if (row.proxy_host_count) {
176-
return internalNginx.reload();
226+
return internalNginx.bulkGenerateConfigs('proxy_host', row.proxy_hosts);
177227
}
178228
})
179229
.then(() => {
@@ -204,7 +254,7 @@ const internalAccessList = {
204254
.joinRaw('LEFT JOIN `proxy_host` ON `proxy_host`.`access_list_id` = `access_list`.`id` AND `proxy_host`.`is_deleted` = 0')
205255
.where('access_list.is_deleted', 0)
206256
.andWhere('access_list.id', data.id)
207-
.allowEager('[owner,items,proxy_hosts]')
257+
.allowEager('[owner,items,clients,proxy_hosts,proxy_hosts.access_list.clients]')
208258
.omit(['access_list.is_deleted'])
209259
.first();
210260

@@ -246,7 +296,7 @@ const internalAccessList = {
246296
delete: (access, data) => {
247297
return access.can('access_lists:delete', data.id)
248298
.then(() => {
249-
return internalAccessList.get(access, {id: data.id, expand: ['proxy_hosts', 'items']});
299+
return internalAccessList.get(access, {id: data.id, expand: ['proxy_hosts', 'items', 'clients']});
250300
})
251301
.then((row) => {
252302
if (!row) {
@@ -330,7 +380,7 @@ const internalAccessList = {
330380
.where('access_list.is_deleted', 0)
331381
.groupBy('access_list.id')
332382
.omit(['access_list.is_deleted'])
333-
.allowEager('[owner,items]')
383+
.allowEager('[owner,items,clients]')
334384
.orderBy('access_list.name', 'ASC');
335385

336386
if (access_data.permission_visibility !== 'all') {

backend/internal/proxy-host.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ const internalProxyHost = {
7373
// re-fetch with cert
7474
return internalProxyHost.get(access, {
7575
id: row.id,
76-
expand: ['certificate', 'owner', 'access_list']
76+
expand: ['certificate', 'owner', 'access_list.clients']
7777
});
7878
})
7979
.then((row) => {
@@ -186,7 +186,7 @@ const internalProxyHost = {
186186
.then(() => {
187187
return internalProxyHost.get(access, {
188188
id: data.id,
189-
expand: ['owner', 'certificate', 'access_list']
189+
expand: ['owner', 'certificate', 'access_list.clients']
190190
})
191191
.then((row) => {
192192
// Configure nginx
@@ -219,7 +219,7 @@ const internalProxyHost = {
219219
.query()
220220
.where('is_deleted', 0)
221221
.andWhere('id', data.id)
222-
.allowEager('[owner,access_list,certificate]')
222+
.allowEager('[owner,access_list,access_list.clients,certificate]')
223223
.first();
224224

225225
if (access_data.permission_visibility !== 'all') {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
const migrate_name = 'access_list_client';
2+
const logger = require('../logger').migrate;
3+
4+
/**
5+
* Migrate
6+
*
7+
* @see http://knexjs.org/#Schema
8+
*
9+
* @param {Object} knex
10+
* @param {Promise} Promise
11+
* @returns {Promise}
12+
*/
13+
exports.up = function (knex/*, Promise*/) {
14+
15+
logger.info('[' + migrate_name + '] Migrating Up...');
16+
17+
return knex.schema.createTable('access_list_client', (table) => {
18+
table.increments().primary();
19+
table.dateTime('created_on').notNull();
20+
table.dateTime('modified_on').notNull();
21+
table.integer('access_list_id').notNull().unsigned();
22+
table.string('address').notNull();
23+
table.string('directive').notNull();
24+
table.json('meta').notNull();
25+
26+
})
27+
.then(function () {
28+
logger.info('[' + migrate_name + '] access_list_client Table created');
29+
30+
return knex.schema.table('access_list', function (access_list) {
31+
access_list.integer('satify_any').notNull().defaultTo(0);
32+
});
33+
})
34+
.then(() => {
35+
logger.info('[' + migrate_name + '] access_list Table altered');
36+
});
37+
};
38+
39+
/**
40+
* Undo Migrate
41+
*
42+
* @param {Object} knex
43+
* @param {Promise} Promise
44+
* @returns {Promise}
45+
*/
46+
exports.down = function (knex/*, Promise*/) {
47+
logger.info('[' + migrate_name + '] Migrating Down...');
48+
49+
return knex.schema.dropTable('access_list_client')
50+
.then(() => {
51+
logger.info('[' + migrate_name + '] access_list_client Table dropped');
52+
});
53+
};

backend/models/access_list.js

+20-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
// Objection Docs:
22
// http://vincit.github.io/objection.js/
33

4-
const db = require('../db');
5-
const Model = require('objection').Model;
6-
const User = require('./user');
7-
const AccessListAuth = require('./access_list_auth');
4+
const db = require('../db');
5+
const Model = require('objection').Model;
6+
const User = require('./user');
7+
const AccessListAuth = require('./access_list_auth');
8+
const AccessListClient = require('./access_list_client');
89

910
Model.knex(db);
1011

@@ -62,6 +63,17 @@ class AccessList extends Model {
6263
qb.omit(['id', 'created_on', 'modified_on', 'access_list_id', 'meta']);
6364
}
6465
},
66+
clients: {
67+
relation: Model.HasManyRelation,
68+
modelClass: AccessListClient,
69+
join: {
70+
from: 'access_list.id',
71+
to: 'access_list_client.access_list_id'
72+
},
73+
modify: function (qb) {
74+
qb.omit(['id', 'created_on', 'modified_on', 'access_list_id', 'meta']);
75+
}
76+
},
6577
proxy_hosts: {
6678
relation: Model.HasManyRelation,
6779
modelClass: ProxyHost,
@@ -76,6 +88,10 @@ class AccessList extends Model {
7688
}
7789
};
7890
}
91+
92+
get satisfy() {
93+
return this.satify_any ? 'satisfy any' : 'satisfy all';
94+
}
7995
}
8096

8197
module.exports = AccessList;

backend/models/access_list_client.js

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// Objection Docs:
2+
// http://vincit.github.io/objection.js/
3+
4+
const db = require('../db');
5+
const Model = require('objection').Model;
6+
7+
Model.knex(db);
8+
9+
class AccessListClient extends Model {
10+
$beforeInsert () {
11+
this.created_on = Model.raw('NOW()');
12+
this.modified_on = Model.raw('NOW()');
13+
14+
// Default for meta
15+
if (typeof this.meta === 'undefined') {
16+
this.meta = {};
17+
}
18+
}
19+
20+
$beforeUpdate () {
21+
this.modified_on = Model.raw('NOW()');
22+
}
23+
24+
static get name () {
25+
return 'AccessListClient';
26+
}
27+
28+
static get tableName () {
29+
return 'access_list_client';
30+
}
31+
32+
static get jsonAttributes () {
33+
return ['meta'];
34+
}
35+
36+
static get relationMappings () {
37+
return {
38+
access_list: {
39+
relation: Model.HasOneRelation,
40+
modelClass: require('./access_list'),
41+
join: {
42+
from: 'access_list_client.access_list_id',
43+
to: 'access_list.id'
44+
},
45+
modify: function (qb) {
46+
qb.where('access_list.is_deleted', 0);
47+
qb.omit(['created_on', 'modified_on', 'is_deleted', 'access_list_id']);
48+
}
49+
}
50+
};
51+
}
52+
53+
get rule() {
54+
return `${this.directive} ${this.address}`;
55+
}
56+
}
57+
58+
module.exports = AccessListClient;

0 commit comments

Comments
 (0)