forked from nko2/website
/
login.coffee
59 lines (55 loc) · 1.96 KB
/
login.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
app = require '../config/app'
{ ensureAuth, loadPerson, loadPersonTeam } = require './middleware'
Team = app.db.model 'Team'
url = require 'url'
setReturnTo = (req, res, next) ->
unless req.returnTo = req.param('returnTo')
r = url.parse(req.header('referrer') or '')
p = r.pathname
if r.host is req.header('host') and p and p isnt '/login' and p isnt '/'
referrer = "#{p}#{r.search or ''}#{r.hash or ''}"
req.returnTo = referrer
next()
app.get '/login', [setReturnTo], (req, res) ->
req.session.returnTo = req.returnTo
res.render2 'login'
app.get '/login/done', [ensureAuth, loadPerson, loadPersonTeam], (req, res, next) ->
if !req.person
return next 401
else if (!req.user.role || req.user.contestant) and (invite = req.session.invite)
Team.findOne 'invites.code': invite, (err, team) ->
return next err if err
if team
req.person.join team, invite
req.person.save (err) ->
return next err if err
team.save (err) ->
return next err if err
delete req.session.invite
res.redirect "/people/#{req.person}"
else
delete req.session.invite
res.redirect '/teams/new'
else if false and req.user.contestant and (code = req.session.team)
# no longer needed now that all teams are created
Team.findOne code: code, (err, team) ->
return next err if err
if team
res.redirect '/teams/' + team.id
else
delete req.session.team
res.redirect '/teams/new'
else if returnTo = req.session.returnTo
delete req.session.returnTo
res.redirect returnTo
else if req.user.judge or req.user.nomination
res.redirect "/people/#{req.person}"
else if req.team
res.redirect "/teams/#{req.team}"
else
res.redirect '/'
# order matters
app.get '/login/:service?', [setReturnTo], (req, res, next) ->
req.logout()
req.session.returnTo or= req.returnTo
res.redirect "/auth/#{req.param('service') or 'github'}"