@@ -13,15 +13,24 @@ module.exports = function (options) {
13
13
seneca . add ( { role : plugin , cmd : 'token' } , cmd_token ) ;
14
14
seneca . add ( { role : plugin , cmd : 'profile' } , cmd_profile ) ;
15
15
16
- // Note : currently got from the config, this may be moved to the database in the near future..
16
+ // NOTE : currently got from the config, this may be moved to the database in the near future..
17
17
function _verifyClientId ( clientId , cb ) {
18
- setImmediate ( function ( ) {
19
- if ( ! options . clients [ clientId ] ) return cb ( 'Invalid client_id: ' + clientId ) ;
20
- return cb ( ) ;
18
+ if ( ! options . clients [ clientId ] ) return cb ( 'Invalid client_id: ' + clientId ) ;
19
+ return cb ( ) ;
20
+ }
21
+
22
+ function _verifyCallbackUrl ( callback , cb ) {
23
+ var allowed = _ . map ( options . clients , 'baseUrl' ) ;
24
+ var valid = _ . some ( allowed , function ( url ) {
25
+ // We can't use _.includes as it match for partials which is insecure
26
+ return _ . isEqual ( url , callback ) ;
21
27
} ) ;
28
+ if ( ! valid ) return cb ( 'Invalid callback_url: ' + callback ) ;
29
+ return cb ( ) ;
22
30
}
23
31
24
32
function _getAccessCodeForUser ( user , cb ) {
33
+ // NOTE : maybe use load for security sake ??????!!
25
34
seneca . make$ ( OAUTH2_ENTITY ) . list$ ( { userid : user . id } , function ( err , auths ) {
26
35
if ( err ) return cb ( err ) ;
27
36
if ( auths . length > 0 ) return cb ( null , auths [ 0 ] . code ) ;
@@ -63,18 +72,19 @@ module.exports = function (options) {
63
72
}
64
73
65
74
function getUser ( auths , done ) {
75
+ // Why.
66
76
var userEntity = seneca . make ( 'sys/user' ) ;
67
77
userEntity . load$ ( auths [ 0 ] . userid , done ) ;
68
78
}
69
79
70
80
function checkPermissions ( user , done ) {
71
- seneca . act ( { role : 'cd-profiles' , cmd : 'list ' , query : { userId : user . id } } , function ( err , profiles ) {
81
+ seneca . act ( { role : 'cd-profiles' , cmd : 'load_user_profile ' , userId : user . id } , function ( err , userProfile ) {
72
82
if ( err ) return done ( err ) ;
73
- var userProfile = profiles [ 0 ] ;
74
83
user . profileId = userProfile . id ;
75
84
if ( userProfile . userType === 'champion' ) user . isChampion = true ;
76
85
if ( userProfile . userType === 'attendee-o13' ) user . isYouthOver13 = true ;
77
86
if ( userProfile . userType === 'mentor' ) user . isMentor = true ;
87
+ if ( userProfile . userType === 'parent-guardian' ) user . isParent = true ;
78
88
79
89
seneca . act ( { role : 'cd-dojos' , cmd : 'load_usersdojos' , query : { userId : user . id } } , function ( err , usersDojos ) {
80
90
if ( err ) return done ( err ) ;
@@ -87,9 +97,11 @@ module.exports = function (options) {
87
97
var mentorTypeFound = _ . find ( usersDojos , function ( userDojo ) {
88
98
return _ . contains ( userDojo . userTypes , 'mentor' ) ;
89
99
} ) ;
100
+ var verifyFound = _ . any ( usersDojos , 'backgroundChecked' ) ;
90
101
if ( championTypeFound ) user . isChampion = true ;
91
102
if ( youthOver13TypeFound ) user . isYouthOver13 = true ;
92
103
if ( mentorTypeFound ) user . isMentor = true ;
104
+ if ( verifyFound ) user . isVerified = true ;
93
105
return done ( null , user ) ;
94
106
} ) ;
95
107
} ) ;
@@ -100,31 +112,54 @@ module.exports = function (options) {
100
112
if ( args . response_type !== 'code' ) {
101
113
return done ( null , { error : 'Only authorization code auth supported!' } ) ;
102
114
}
103
-
104
- _verifyClientId ( args . client_id , function ( err ) {
105
- if ( err ) return done ( null , { error : err } ) ;
106
-
107
- if ( ! args . user ) {
108
- return done ( null , {
109
- http$ : {
110
- redirect : '/login?redirect=' + args [ 'redirect_uri' ]
115
+ async . waterfall ( [
116
+ function ( waterfallCb ) {
117
+ if ( args . redirect_uri ) {
118
+ _verifyCallbackUrl ( args . redirect_uri , function ( err ) {
119
+ if ( err ) {
120
+ return done ( null , {
121
+ error : err ,
122
+ http$ : {
123
+ status : 403
124
+ }
125
+ } ) ;
126
+ } else {
127
+ waterfallCb ( ) ;
128
+ }
129
+ } ) ;
130
+ } else {
131
+ return done ( null , { error : 'Missing callback_url' , http$ : { status : 422 } } ) ;
132
+ }
133
+ } ,
134
+ function ( waterfallCb ) {
135
+ _verifyClientId ( args . client_id , function ( err ) {
136
+ if ( err ) return done ( null , { error : err } ) ;
137
+ if ( ! args . user ) {
138
+ return done ( null , {
139
+ http$ : {
140
+ redirect : '/login?redirect=' + args . redirect_uri
141
+ }
142
+ } ) ;
143
+ } else {
144
+ waterfallCb ( ) ;
111
145
}
112
146
} ) ;
113
- }
114
-
115
- _getAccessCodeForUser ( args . user , function ( err , code ) {
116
- if ( err ) return done ( null , { error : err , http$ : { status : 500 } } ) ;
117
-
118
- done ( null , {
119
- http$ : {
120
- redirect : args [ 'redirect_uri' ] + '?code=' + code
121
- }
147
+ } ,
148
+ function ( waterfallCb ) {
149
+ _getAccessCodeForUser ( args . user , function ( err , code ) {
150
+ if ( err ) return done ( null , { error : err , http$ : { status : 500 } } ) ;
151
+ done ( null , {
152
+ http$ : {
153
+ redirect : args . redirect_uri + '?code=' + code
154
+ }
155
+ } ) ;
122
156
} ) ;
123
- } ) ;
124
- } ) ;
157
+ }
158
+ ] ) ;
125
159
}
126
160
127
161
function cmd_token ( args , done ) {
162
+ // TODO : check if code exists maybe ?
128
163
_getAccessTokenForAccessCode ( args . code , function ( err , access_token ) {
129
164
if ( err ) return done ( null , { error : err , http$ : { status : 500 } } ) ;
130
165
@@ -146,6 +181,8 @@ module.exports = function (options) {
146
181
isChampion : user . isChampion ,
147
182
isYouthOver13 : user . isYouthOver13 ,
148
183
isMentor : user . isMentor ,
184
+ isParent : user . isParent ,
185
+ isVerified : user . isVerified ,
149
186
profileId : user . profileId
150
187
} ;
151
188
return done ( null , profile ) ;
0 commit comments