Skip to content

Commit 5107d15

Browse files
author
Jamie Curnow
committed
404 hosts section and other fixes
1 parent 81b3366 commit 5107d15

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1264
-383
lines changed

src/backend/internal/dead-host.js

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,207 @@
33
const _ = require('lodash');
44
const error = require('../lib/error');
55
const deadHostModel = require('../models/dead_host');
6+
const internalHost = require('./host');
67

78
function omissions () {
89
return ['is_deleted'];
910
}
1011

1112
const internalDeadHost = {
1213

14+
/**
15+
* @param {Access} access
16+
* @param {Object} data
17+
* @returns {Promise}
18+
*/
19+
create: (access, data) => {
20+
return access.can('dead_hosts:create', data)
21+
.then(access_data => {
22+
// Get a list of the ___domain names and check each of them against existing records
23+
let domain_name_check_promises = [];
24+
25+
data.domain_names.map(function (domain_name) {
26+
domain_name_check_promises.push(internalHost.isHostnameTaken(domain_name));
27+
});
28+
29+
return Promise.all(domain_name_check_promises)
30+
.then(check_results => {
31+
check_results.map(function (result) {
32+
if (result.is_taken) {
33+
throw new error.ValidationError(result.hostname + ' is already in use');
34+
}
35+
});
36+
});
37+
})
38+
.then(() => {
39+
// At this point the domains should have been checked
40+
data.owner_user_id = access.token.get('attrs').id;
41+
42+
if (typeof data.meta === 'undefined') {
43+
data.meta = {};
44+
}
45+
46+
return deadHostModel
47+
.query()
48+
.omit(omissions())
49+
.insertAndFetch(data);
50+
})
51+
.then(row => {
52+
return _.omit(row, omissions());
53+
});
54+
},
55+
56+
/**
57+
* @param {Access} access
58+
* @param {Object} data
59+
* @param {Integer} data.id
60+
* @param {String} [data.email]
61+
* @param {String} [data.name]
62+
* @return {Promise}
63+
*/
64+
update: (access, data) => {
65+
return access.can('dead_hosts:update', data.id)
66+
.then(access_data => {
67+
// Get a list of the ___domain names and check each of them against existing records
68+
let domain_name_check_promises = [];
69+
70+
if (typeof data.domain_names !== 'undefined') {
71+
data.domain_names.map(function (domain_name) {
72+
domain_name_check_promises.push(internalHost.isHostnameTaken(domain_name, 'dead', data.id));
73+
});
74+
75+
return Promise.all(domain_name_check_promises)
76+
.then(check_results => {
77+
check_results.map(function (result) {
78+
if (result.is_taken) {
79+
throw new error.ValidationError(result.hostname + ' is already in use');
80+
}
81+
});
82+
});
83+
}
84+
})
85+
.then(() => {
86+
return internalDeadHost.get(access, {id: data.id});
87+
})
88+
.then(row => {
89+
if (row.id !== data.id) {
90+
// Sanity check that something crazy hasn't happened
91+
throw new error.InternalValidationError('404 Host could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id);
92+
}
93+
94+
return deadHostModel
95+
.query()
96+
.omit(omissions())
97+
.patchAndFetchById(row.id, data)
98+
.then(saved_row => {
99+
saved_row.meta = internalHost.cleanMeta(saved_row.meta);
100+
return _.omit(saved_row, omissions());
101+
});
102+
});
103+
},
104+
105+
/**
106+
* @param {Access} access
107+
* @param {Object} data
108+
* @param {Integer} data.id
109+
* @param {Array} [data.expand]
110+
* @param {Array} [data.omit]
111+
* @return {Promise}
112+
*/
113+
get: (access, data) => {
114+
if (typeof data === 'undefined') {
115+
data = {};
116+
}
117+
118+
return access.can('dead_hosts:get', data.id)
119+
.then(access_data => {
120+
let query = deadHostModel
121+
.query()
122+
.where('is_deleted', 0)
123+
.andWhere('id', data.id)
124+
.allowEager('[owner]')
125+
.first();
126+
127+
if (access_data.permission_visibility !== 'all') {
128+
query.andWhere('owner_user_id', access.token.get('attrs').id);
129+
}
130+
131+
// Custom omissions
132+
if (typeof data.omit !== 'undefined' && data.omit !== null) {
133+
query.omit(data.omit);
134+
}
135+
136+
if (typeof data.expand !== 'undefined' && data.expand !== null) {
137+
query.eager('[' + data.expand.join(', ') + ']');
138+
}
139+
140+
return query;
141+
})
142+
.then(row => {
143+
if (row) {
144+
row.meta = internalHost.cleanMeta(row.meta);
145+
return _.omit(row, omissions());
146+
} else {
147+
throw new error.ItemNotFoundError(data.id);
148+
}
149+
});
150+
},
151+
152+
/**
153+
* @param {Access} access
154+
* @param {Object} data
155+
* @param {Integer} data.id
156+
* @param {String} [data.reason]
157+
* @returns {Promise}
158+
*/
159+
delete: (access, data) => {
160+
return access.can('dead_hosts:delete', data.id)
161+
.then(() => {
162+
return internalDeadHost.get(access, {id: data.id});
163+
})
164+
.then(row => {
165+
if (!row) {
166+
throw new error.ItemNotFoundError(data.id);
167+
}
168+
169+
return deadHostModel
170+
.query()
171+
.where('id', row.id)
172+
.patch({
173+
is_deleted: 1
174+
});
175+
})
176+
.then(() => {
177+
return true;
178+
});
179+
},
180+
181+
/**
182+
* @param {Access} access
183+
* @param {Object} data
184+
* @param {Integer} data.id
185+
* @param {Object} data.files
186+
* @returns {Promise}
187+
*/
188+
setCerts: (access, data) => {
189+
return internalDeadHost.get(access, {id: data.id})
190+
.then(row => {
191+
_.map(data.files, (file, name) => {
192+
if (internalHost.allowed_ssl_files.indexOf(name) !== -1) {
193+
row.meta[name] = file.data.toString();
194+
}
195+
});
196+
197+
return internalDeadHost.update(access, {
198+
id: data.id,
199+
meta: row.meta
200+
});
201+
})
202+
.then(row => {
203+
return _.pick(row.meta, internalHost.allowed_ssl_files);
204+
});
205+
},
206+
13207
/**
14208
* All Hosts
15209
*
@@ -26,6 +220,7 @@ const internalDeadHost = {
26220
.where('is_deleted', 0)
27221
.groupBy('id')
28222
.omit(['is_deleted'])
223+
.allowEager('[owner]')
29224
.orderBy('domain_names', 'ASC');
30225

31226
if (access_data.permission_visibility !== 'all') {
@@ -44,6 +239,13 @@ const internalDeadHost = {
44239
}
45240

46241
return query;
242+
})
243+
.then(rows => {
244+
rows.map(row => {
245+
row.meta = internalHost.cleanMeta(row.meta);
246+
});
247+
248+
return rows;
47249
});
48250
},
49251

src/backend/internal/proxy-host.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,6 @@ const internalProxyHost = {
115115
data = {};
116116
}
117117

118-
if (typeof data.id === 'undefined' || !data.id) {
119-
data.id = access.token.get('attrs').id;
120-
}
121-
122118
return access.can('proxy_hosts:get', data.id)
123119
.then(access_data => {
124120
let query = proxyHostModel

src/backend/internal/redirection-host.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,6 @@ const internalRedirectionHost = {
115115
data = {};
116116
}
117117

118-
if (typeof data.id === 'undefined' || !data.id) {
119-
data.id = access.token.get('attrs').id;
120-
}
121-
122118
return access.can('redirection_hosts:get', data.id)
123119
.then(access_data => {
124120
let query = redirectionHostModel

src/backend/internal/stream.js

Lines changed: 132 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,137 @@ function omissions () {
1111
const internalStream = {
1212

1313
/**
14-
* All Hosts
14+
* @param {Access} access
15+
* @param {Object} data
16+
* @returns {Promise}
17+
*/
18+
create: (access, data) => {
19+
return access.can('streams:create', data)
20+
.then(access_data => {
21+
// TODO: At this point the existing ports should have been checked
22+
data.owner_user_id = access.token.get('attrs').id;
23+
24+
if (typeof data.meta === 'undefined') {
25+
data.meta = {};
26+
}
27+
28+
return streamModel
29+
.query()
30+
.omit(omissions())
31+
.insertAndFetch(data);
32+
})
33+
.then(row => {
34+
return _.omit(row, omissions());
35+
});
36+
},
37+
38+
/**
39+
* @param {Access} access
40+
* @param {Object} data
41+
* @param {Integer} data.id
42+
* @param {String} [data.email]
43+
* @param {String} [data.name]
44+
* @return {Promise}
45+
*/
46+
update: (access, data) => {
47+
return access.can('streams:update', data.id)
48+
.then(access_data => {
49+
// TODO: at this point the existing streams should have been checked
50+
return internalStream.get(access, {id: data.id});
51+
})
52+
.then(row => {
53+
if (row.id !== data.id) {
54+
// Sanity check that something crazy hasn't happened
55+
throw new error.InternalValidationError('Stream could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id);
56+
}
57+
58+
return streamModel
59+
.query()
60+
.omit(omissions())
61+
.patchAndFetchById(row.id, data)
62+
.then(saved_row => {
63+
return _.omit(saved_row, omissions());
64+
});
65+
});
66+
},
67+
68+
/**
69+
* @param {Access} access
70+
* @param {Object} data
71+
* @param {Integer} data.id
72+
* @param {Array} [data.expand]
73+
* @param {Array} [data.omit]
74+
* @return {Promise}
75+
*/
76+
get: (access, data) => {
77+
if (typeof data === 'undefined') {
78+
data = {};
79+
}
80+
81+
return access.can('streams:get', data.id)
82+
.then(access_data => {
83+
let query = streamModel
84+
.query()
85+
.where('is_deleted', 0)
86+
.andWhere('id', data.id)
87+
.allowEager('[owner]')
88+
.first();
89+
90+
if (access_data.permission_visibility !== 'all') {
91+
query.andWhere('owner_user_id', access.token.get('attrs').id);
92+
}
93+
94+
// Custom omissions
95+
if (typeof data.omit !== 'undefined' && data.omit !== null) {
96+
query.omit(data.omit);
97+
}
98+
99+
if (typeof data.expand !== 'undefined' && data.expand !== null) {
100+
query.eager('[' + data.expand.join(', ') + ']');
101+
}
102+
103+
return query;
104+
})
105+
.then(row => {
106+
if (row) {
107+
return _.omit(row, omissions());
108+
} else {
109+
throw new error.ItemNotFoundError(data.id);
110+
}
111+
});
112+
},
113+
114+
/**
115+
* @param {Access} access
116+
* @param {Object} data
117+
* @param {Integer} data.id
118+
* @param {String} [data.reason]
119+
* @returns {Promise}
120+
*/
121+
delete: (access, data) => {
122+
return access.can('streams:delete', data.id)
123+
.then(() => {
124+
return internalStream.get(access, {id: data.id});
125+
})
126+
.then(row => {
127+
if (!row) {
128+
throw new error.ItemNotFoundError(data.id);
129+
}
130+
131+
return streamModel
132+
.query()
133+
.where('id', row.id)
134+
.patch({
135+
is_deleted: 1
136+
});
137+
})
138+
.then(() => {
139+
return true;
140+
});
141+
},
142+
143+
/**
144+
* All Streams
15145
*
16146
* @param {Access} access
17147
* @param {Array} [expand]
@@ -26,6 +156,7 @@ const internalStream = {
26156
.where('is_deleted', 0)
27157
.groupBy('id')
28158
.omit(['is_deleted'])
159+
.allowEager('[owner]')
29160
.orderBy('incoming_port', 'ASC');
30161

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

0 commit comments

Comments
 (0)