@@ -9,6 +9,7 @@ import { Server as http } from 'http'
99import remail from 'email-regex'
1010import dom from 'vd'
1111import cors from 'cors'
12+ import request from 'superagent' ;
1213
1314// our code
1415import Slack from './slack'
@@ -22,6 +23,8 @@ export default function slackin ({
2223 token,
2324 interval = 5000 , // jshint ignore:line
2425 org,
26+ gcaptcha_secret,
27+ gcaptcha_sitekey,
2528 css,
2629 coc,
2730 cors : useCors = false ,
@@ -33,6 +36,8 @@ export default function slackin ({
3336 // must haves
3437 if ( ! token ) throw new Error ( 'Must provide a `token`.' )
3538 if ( ! org ) throw new Error ( 'Must provide an `org`.' )
39+ if ( ! gcaptcha_secret ) throw new Error ( 'Must provide a `gcaptcha_secret`.' )
40+ if ( ! gcaptcha_sitekey ) throw new Error ( 'Must provide an `gcaptcha_sitekey`.' )
3641
3742 if ( channels ) {
3843 // convert to an array
@@ -84,11 +89,12 @@ export default function slackin ({
8489 dom ( 'title' ,
8590 'Join ' , name , ' on Slack!'
8691 ) ,
92+ dom ( "script src=https://www.google.com/recaptcha/api.js" ) ,
8793 dom ( 'meta name=viewport content="width=device-width,initial-scale=1.0,minimum-scale=1.0,user-scalable=no"' ) ,
8894 dom ( 'link rel="shortcut icon" href=https://slack.global.ssl.fastly.net/272a/img/icons/favicon-32.png' ) ,
8995 css && dom ( 'link rel=stylesheet' , { href : css } )
9096 ) ,
91- splash ( { coc, path, css, name, org, logo, channels, active, total } )
97+ splash ( { coc, path, css, name, org, logo, channels, active, total, gcaptcha_sitekey } )
9298 )
9399 res . type ( 'html' )
94100 res . send ( page . toHTML ( ) )
@@ -130,13 +136,20 @@ export default function slackin ({
130136 }
131137
132138 let email = req . body . email
139+ let captcha_response = req . body [ 'g-recaptcha-response' ] ;
133140
134141 if ( ! email ) {
135142 return res
136143 . status ( 400 )
137144 . json ( { msg : 'No email provided' } )
138145 }
139146
147+ if ( captcha_response == undefined || ! captcha_response . length ) {
148+ return res
149+ . status ( 400 )
150+ . send ( { msg : 'Invalid captcha' } ) ;
151+ }
152+
140153 if ( ! remail ( ) . test ( email ) ) {
141154 return res
142155 . status ( 400 )
@@ -156,23 +169,67 @@ export default function slackin ({
156169 . json ( { msg : 'Agreement to CoC is mandatory' } )
157170 }
158171
159- invite ( { token, org, email, channel : chanId } , err => {
160- if ( err ) {
161- if ( err . message === `Sending you to Slack...` ) {
162- return res
163- . status ( 303 )
164- . json ( { msg : err . message , redirectUrl : `https://${ org } .slack.com` } )
165- }
172+ /////////////////////////////////////////////////////////////////////////
173+
166174
175+ const captcha_data = {
176+ secret : gcaptcha_secret ,
177+ response : captcha_response ,
178+ remoteip : req . connection . remoteAddress
179+ }
180+
181+
182+ const captcha_callback = ( err , resp ) => {
183+
184+ if ( err ) {
167185 return res
168186 . status ( 400 )
169- . json ( { msg : err . message } )
187+ . send ( { msg : err } ) ;
188+
189+ } else {
190+
191+ if ( resp . body . success ) {
192+
193+ let chanId = slack . channel ? slack . channel . id : null ;
194+
195+ invite ( { token, org, email, channel : chanId } , err => {
196+ if ( err ) {
197+ if ( err . message === `Sending you to Slack...` ) {
198+ return res
199+ . status ( 303 )
200+ . json ( { msg : err . message , redirectUrl : `https://${ org } .slack.com` } )
201+ }
202+
203+ return res
204+ . status ( 400 )
205+ . json ( { msg : err . message } )
206+ }
207+
208+ res
209+ . status ( 200 )
210+ . json ( { msg : 'WOOT. Check your email!' } )
211+ } ) ;
212+
213+ } else {
214+
215+ if ( err ) {
216+ return res
217+ . status ( 400 )
218+ . send ( { msg : "Captcha check failed" } ) ;
219+ }
220+ }
221+
170222 }
171223
172- res
173- . status ( 200 )
174- . json ( { msg : 'WOOT. Check your email!' } )
175- } )
224+ }
225+
226+
227+ request . post ( 'https://www.google.com/recaptcha/api/siteverify' )
228+ . type ( 'form' )
229+ . send ( captcha_data )
230+ . end ( captcha_callback ) ;
231+
232+
176233 } )
177234
178235 // iframe
0 commit comments