3
3
const _ = require ( 'lodash' ) ;
4
4
const error = require ( '../lib/error' ) ;
5
5
const proxyHostModel = require ( '../models/proxy_host' ) ;
6
+ const internalHost = require ( './host' ) ;
6
7
7
8
function omissions ( ) {
8
9
return [ 'is_deleted' ] ;
@@ -16,60 +17,39 @@ const internalProxyHost = {
16
17
* @returns {Promise }
17
18
*/
18
19
create : ( access , data ) => {
19
- let auth = data . auth || null ;
20
- delete data . auth ;
21
-
22
- data . avatar = data . avatar || '' ;
23
- data . roles = data . roles || [ ] ;
24
-
25
- if ( typeof data . is_disabled !== 'undefined' ) {
26
- data . is_disabled = data . is_disabled ? 1 : 0 ;
27
- }
28
-
29
20
return access . can ( 'proxy_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
+ } )
30
38
. then ( ( ) => {
31
- data . avatar = gravatar . url ( data . email , { default : 'mm' } ) ;
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
+ }
32
45
33
- return userModel
46
+ return proxyHostModel
34
47
. query ( )
35
48
. omit ( omissions ( ) )
36
49
. insertAndFetch ( data ) ;
37
50
} )
38
- . then ( user => {
39
- if ( auth ) {
40
- return authModel
41
- . query ( )
42
- . insert ( {
43
- user_id : user . id ,
44
- type : auth . type ,
45
- secret : auth . secret ,
46
- meta : { }
47
- } )
48
- . then ( ( ) => {
49
- return user ;
50
- } ) ;
51
- } else {
52
- return user ;
53
- }
54
- } )
55
- . then ( user => {
56
- // Create permissions row as well
57
- let is_admin = data . roles . indexOf ( 'admin' ) !== - 1 ;
58
-
59
- return userPermissionModel
60
- . query ( )
61
- . insert ( {
62
- user_id : user . id ,
63
- visibility : is_admin ? 'all' : 'user' ,
64
- proxy_hosts : 'manage' ,
65
- redirection_hosts : 'manage' ,
66
- dead_hosts : 'manage' ,
67
- streams : 'manage' ,
68
- access_lists : 'manage'
69
- } )
70
- . then ( ( ) => {
71
- return internalProxyHost . get ( access , { id : user . id , expand : [ 'permissions' ] } ) ;
72
- } ) ;
51
+ . then ( row => {
52
+ return _ . omit ( row , omissions ( ) ) ;
73
53
} ) ;
74
54
} ,
75
55
@@ -82,63 +62,49 @@ const internalProxyHost = {
82
62
* @return {Promise }
83
63
*/
84
64
update : ( access , data ) => {
85
- if ( typeof data . is_disabled !== 'undefined' ) {
86
- data . is_disabled = data . is_disabled ? 1 : 0 ;
87
- }
88
-
89
65
return access . can ( 'proxy_hosts:update' , data . id )
90
- . then ( ( ) => {
91
-
92
- // Make sure that the user being updated doesn't change their email to another user that is already using it
93
- // 1. get user we want to update
94
- return internalProxyHost . get ( access , { id : data . id } )
95
- . then ( user => {
96
-
97
- // 2. if email is to be changed, find other users with that email
98
- if ( typeof data . email !== 'undefined' ) {
99
- data . email = data . email . toLowerCase ( ) . trim ( ) ;
100
-
101
- if ( user . email !== data . email ) {
102
- return internalProxyHost . isEmailAvailable ( data . email , data . id )
103
- . then ( available => {
104
- if ( ! available ) {
105
- throw new error . ValidationError ( 'Email address already in use - ' + data . email ) ;
106
- }
107
-
108
- return user ;
109
- } ) ;
110
- }
111
- }
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 = [ ] ;
112
69
113
- // No change to email:
114
- return user ;
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 , 'proxy' , data . id ) ) ;
115
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
+ }
116
84
} )
117
- . then ( user => {
118
- if ( user . id !== data . id ) {
85
+ . then ( ( ) => {
86
+ return internalProxyHost . get ( access , { id : data . id } ) ;
87
+ } )
88
+ . then ( row => {
89
+ if ( row . id !== data . id ) {
119
90
// Sanity check that something crazy hasn't happened
120
- throw new error . InternalValidationError ( 'User could not be updated, IDs do not match: ' + user . id + ' !== ' + data . id ) ;
91
+ throw new error . InternalValidationError ( 'Proxy Host could not be updated, IDs do not match: ' + row . id + ' !== ' + data . id ) ;
121
92
}
122
93
123
- data . avatar = gravatar . url ( data . email || user . email , { default : 'mm' } ) ;
124
-
125
- return userModel
94
+ return proxyHostModel
126
95
. query ( )
127
96
. omit ( omissions ( ) )
128
- . patchAndFetchById ( user . id , data )
129
- . then ( saved_user => {
130
- return _ . omit ( saved_user , omissions ( ) ) ;
97
+ . patchAndFetchById ( row . id , data )
98
+ . then ( saved_row => {
99
+ return _ . omit ( saved_row , omissions ( ) ) ;
131
100
} ) ;
132
- } )
133
- . then ( ( ) => {
134
- return internalProxyHost . get ( access , { id : data . id } ) ;
135
101
} ) ;
136
102
} ,
137
103
138
104
/**
139
105
* @param {Access } access
140
- * @param {Object } [ data]
141
- * @param {Integer } [ data.id] Defaults to the token user
106
+ * @param {Object } data
107
+ * @param {Integer } data.id
142
108
* @param {Array } [data.expand]
143
109
* @param {Array } [data.omit]
144
110
* @return {Promise }
@@ -153,14 +119,18 @@ const internalProxyHost = {
153
119
}
154
120
155
121
return access . can ( 'proxy_hosts:get' , data . id )
156
- . then ( ( ) => {
157
- let query = userModel
122
+ . then ( access_data => {
123
+ let query = proxyHostModel
158
124
. query ( )
159
125
. where ( 'is_deleted' , 0 )
160
126
. andWhere ( 'id' , data . id )
161
127
. allowEager ( '[permissions]' )
162
128
. first ( ) ;
163
129
130
+ if ( access_data . permission_visibility !== 'all' ) {
131
+ query . andWhere ( 'owner_user_id' , access . token . get ( 'attrs' ) . id ) ;
132
+ }
133
+
164
134
// Custom omissions
165
135
if ( typeof data . omit !== 'undefined' && data . omit !== null ) {
166
136
query . omit ( data . omit ) ;
@@ -193,19 +163,14 @@ const internalProxyHost = {
193
163
. then ( ( ) => {
194
164
return internalProxyHost . get ( access , { id : data . id } ) ;
195
165
} )
196
- . then ( user => {
197
- if ( ! user ) {
166
+ . then ( row => {
167
+ if ( ! row ) {
198
168
throw new error . ItemNotFoundError ( data . id ) ;
199
169
}
200
170
201
- // Make sure user can't delete themselves
202
- if ( user . id === access . token . get ( 'attrs' ) . id ) {
203
- throw new error . PermissionError ( 'You cannot delete yourself.' ) ;
204
- }
205
-
206
- return userModel
171
+ return proxyHostModel
207
172
. query ( )
208
- . where ( 'id' , user . id )
173
+ . where ( 'id' , row . id )
209
174
. patch ( {
210
175
is_deleted : 1
211
176
} ) ;
@@ -231,7 +196,8 @@ const internalProxyHost = {
231
196
. where ( 'is_deleted' , 0 )
232
197
. groupBy ( 'id' )
233
198
. omit ( [ 'is_deleted' ] )
234
- . orderBy ( 'domain_name' , 'ASC' ) ;
199
+ . allowEager ( '[owner,access_list]' )
200
+ . orderBy ( 'domain_names' , 'ASC' ) ;
235
201
236
202
if ( access_data . permission_visibility !== 'all' ) {
237
203
query . andWhere ( 'owner_user_id' , access . token . get ( 'attrs' ) . id ) ;
@@ -240,7 +206,7 @@ const internalProxyHost = {
240
206
// Query is used for searching
241
207
if ( typeof search_query === 'string' ) {
242
208
query . where ( function ( ) {
243
- this . where ( 'domain_name ' , 'like' , '%' + search_query + '%' ) ;
209
+ this . where ( 'domain_names ' , 'like' , '%' + search_query + '%' ) ;
244
210
} ) ;
245
211
}
246
212
0 commit comments