1
+ const mongoose = require ( 'mongoose' ) ;
2
+ const bcrypt = require ( 'bcrypt' ) ;
3
+ const jwt = require ( 'jsonwebtoken' ) ;
4
+
5
+ const connUri = process . env . MONGO_LOCAL_CONN_URL ;
6
+ const User = require ( '../models/users' ) ;
7
+
8
+ function set_cors ( req , res ) {
9
+ if ( req . get ( 'origin' ) ) {
10
+ res . header ( 'Access-Control-Allow-Origin' , req . get ( 'origin' ) )
11
+ res . header ( 'Access-Control-Allow-Credentials' , true )
12
+ } else {
13
+ res . header ( 'Access-Control-Allow-Origin' , null )
14
+ res . header ( 'Access-Control-Allow-Credentials' , true )
15
+ }
16
+ return res ;
17
+ } ;
18
+
19
+
20
+
21
+ module . exports = {
22
+ add : ( req , res ) => {
23
+ mongoose . connect ( connUri , { useNewUrlParser : true , useUnifiedTopology : true } , ( err ) => {
24
+ let result = { } ;
25
+ let status = 201 ;
26
+ res . set ( 'Cache-Control' , 'no-store, no-cache, must-revalidate, private' )
27
+ if ( ! err ) {
28
+ const { username, password } = req . body ;
29
+
30
+
31
+ User . findOne ( { username} , function ( err , obj ) {
32
+ if ( obj != null ) {
33
+ if ( obj . username ) {
34
+ status = 409 ;
35
+ res . set ( { 'content-type' : 'text/html; charset=null' } ) ;
36
+ res . status ( status ) . send ( 'User ' + obj . username + ' already exists' ) ;
37
+ }
38
+ } else {
39
+
40
+ const { username, password } = req . body ;
41
+ const user = new User ( req . body ) ; // document = instance of a model
42
+ // TODO: We can hash the password here as well before we insert
43
+ user . save ( ( err , user ) => {
44
+ if ( ! err ) {
45
+ result . status = status ;
46
+ result . user = user . username ;
47
+ result . password = user . password ;
48
+ } else {
49
+ status = 500 ;
50
+ result . status = status ;
51
+ result . error = err ;
52
+ }
53
+ res . status ( status ) . send ( result ) ;
54
+ // Close the connection after saving
55
+ mongoose . connection . close ( ) ;
56
+ } ) ;
57
+
58
+ }
59
+
60
+ } ) ;
61
+
62
+ } else {
63
+ status = 500 ;
64
+ result . status = status ;
65
+ result . error = err ;
66
+ res . status ( status ) . send ( result ) ;
67
+
68
+ mongoose . connection . close ( ) ;
69
+ }
70
+
71
+ } ) ;
72
+
73
+ } ,
74
+
75
+ checkadmin : ( req , res ) => {
76
+ res . set ( 'Cache-Control' , 'no-store, no-cache, must-revalidate, private' )
77
+ const token = req . headers . authorization . split ( ' ' ) [ 1 ] ; // Bearer <token>
78
+ const options = {
79
+ expiresIn : '2d' ,
80
+ issuer : 'https://github.com/snoopysecurity' ,
81
+ permissions : [ "user:admin" ]
82
+ } ;
83
+ result = jwt . verify ( token , process . env . JWT_SECRET , options ) ;
84
+ if ( result . permissions . includes ( 'user:admin' ) ) {
85
+ endresult = { }
86
+ endresult [ 'Success' ] = 'User is Admin Privileged'
87
+ endresult [ 'AdminURL' ] = '/api/v2/users'
88
+ res . send ( endresult ) ;
89
+ } else {
90
+ endresult = { }
91
+ endresult [ 'Error' ] = 'Error: User is missing [user:admin] privilege'
92
+ endresult [ 'User' ] = result . user
93
+ res . send ( endresult ) ;
94
+
95
+ }
96
+ } ,
97
+
98
+
99
+
100
+ login : ( req , res ) => {
101
+ const { username, password } = req . body ;
102
+ //set_cors(req,res);
103
+ res . set ( 'Cache-Control' , 'no-store, no-cache, must-revalidate, private' )
104
+ mongoose . connect ( connUri , { useNewUrlParser : true , useUnifiedTopology : true } , ( err ) => {
105
+ let result = { } ;
106
+ let status = 200 ;
107
+ if ( ! err ) {
108
+
109
+ User . findOne ( { username} , ( err , user ) => {
110
+ if ( ! err && user ) {
111
+ // We could compare passwords in our model instead of below as well
112
+ bcrypt . compare ( password , user . password ) . then ( match => {
113
+ if ( match ) {
114
+ status = 200 ;
115
+ if ( user . admin == true ) {
116
+ const payload = { user : user . username , "permissions" : [
117
+ "user:read" ,
118
+ "user:write" ,
119
+ "user:admin"
120
+ ] } ;
121
+ const options = { expiresIn : '2d' , issuer : 'https://github.com/snoopysecurity' } ;
122
+ const secret = process . env . JWT_SECRET ;
123
+ const token = jwt . sign ( payload , secret , options ) ;
124
+
125
+ result . token = token ;
126
+ result . status = status ;
127
+ result . result = user ;
128
+ } else {
129
+
130
+ const payload = { user : user . username , "permissions" : [
131
+ "user:read" ,
132
+ "user:write"
133
+ ] } ;
134
+ const options = { expiresIn : '2d' , issuer : 'https://github.com/snoopysecurity' } ;
135
+ const secret = process . env . JWT_SECRET ;
136
+ const token = jwt . sign ( payload , secret , options ) ;
137
+
138
+ result . token = token ;
139
+ result . status = status ;
140
+ result . result = user ;
141
+ }
142
+ // Create a token
143
+
144
+ } else {
145
+ status = 401 ;
146
+ result . status = status ;
147
+ result . error = `Authentication error` ;
148
+ }
149
+ res . setHeader ( 'Authorization' , 'Bearer ' + result . token ) ;
150
+ //res.cookie("SESSIONID", result.token, {httpOnly:true, secure:true});
151
+ res . status ( status ) . send ( result ) ;
152
+ } ) . catch ( err => {
153
+ status = 500 ;
154
+ result . status = status ;
155
+ result . error = err ;
156
+ res . status ( status ) . send ( result ) ;
157
+
158
+ mongoose . connection . close ( ) ;
159
+ } ) ;
160
+ } else {
161
+ status = 404 ;
162
+ result . status = status ;
163
+ result . error = 'Login Failed! User ' + username + ' not found!' ;
164
+ res . status ( status ) . send ( result ) ;
165
+ }
166
+ } ) . then ( ( ) =>
167
+ mongoose . connection . close ( ) ) ;
168
+ } else {
169
+ status = 500 ;
170
+ result . status = status ;
171
+ result . error = err ;
172
+ res . status ( status ) . send ( result ) ;
173
+
174
+ mongoose . connection . close ( ) ;
175
+ }
176
+ } ) ;
177
+ } ,
178
+
179
+ getAll : ( req , res ) => {
180
+ //res = set_cors(req,res)
181
+ res . set ( 'Cache-Control' , 'no-store, no-cache, must-revalidate, private' )
182
+ mongoose . connect ( connUri , { useNewUrlParser : true , useUnifiedTopology : true } , ( err ) => {
183
+ let result = { } ;
184
+ let status = 200 ;
185
+ if ( ! err ) {
186
+
187
+ if ( result ) {
188
+ User . find ( { } , ( err , users ) => {
189
+ if ( ! err ) {
190
+ result . status = status ;
191
+ result . error = err ;
192
+ result . result = users ;
193
+ } else {
194
+ status = 500 ;
195
+ result . status = status ;
196
+ result . error = err ;
197
+ }
198
+ res . status ( status ) . send ( result ) ;
199
+ } ) . then ( ( ) => mongoose . connection . close ( ) ) ;
200
+ } else {
201
+ status = 401 ;
202
+ result . status = status ;
203
+ result . error = `Authentication error` ;
204
+ res . status ( status ) . send ( result ) ;
205
+
206
+ mongoose . connection . close ( ) ;
207
+ }
208
+ } else {
209
+ status = 500 ;
210
+ result . status = status ;
211
+ result . error = err ;
212
+ res . status ( status ) . send ( result ) ;
213
+
214
+ mongoose . connection . close ( ) ;
215
+ }
216
+ } ) ;
217
+ }
218
+ } ;
0 commit comments