Merge pull request #71 from travis-ci/rkh-better-login

better login
This commit is contained in:
Konstantin Haase 2012-12-06 08:45:49 -08:00
commit 0a61eed7d7
2 changed files with 29 additions and 20 deletions

View File

@ -16,8 +16,14 @@
# for auto signin then we're trying to sign in.
autoSignIn: (path) ->
console.log 'autoSignIn'
if user = sessionStorage.getItem('travis.user')
@setData(user: JSON.parse(user))
global = localStorage.getItem('travis.user')
session = sessionStorage.getItem('travis.user')
user = session || global
if user
localStorage.setItem('travis.user', user) unless global
data = JSON.parse(user)
data = { user: data } unless data.user?
@setData(data)
else if localStorage.getItem('travis.auto_signin')
console.log 'travis.auto_signin', localStorage.getItem('travis.auto_signin')
@signIn()
@ -32,6 +38,7 @@
signOut: ->
localStorage.removeItem('travis.auto_signin')
localStorage.removeItem('travis.locale')
localStorage.removeItem('travis.user')
sessionStorage.clear()
@setData()
@ -49,13 +56,7 @@
# TODO should have clearData() to clean this up
setData: (data) ->
if typeof data == 'string'
# TODO: I sometimes see plain text response "done" when authenticating
# we should track down why is that happening and fix the API
if data == 'done'
data = {}
else
data = JSON.parse(data)
data = JSON.parse(data) if typeof data == 'string'
@storeToken(data.token) if data?.token
console.log 'setData', data.user if data?.user
user = @storeUser(data.user) if data?.user
@ -89,6 +90,9 @@
receiveMessage: (event) ->
if event.origin == @expectedOrigin()
if event.data == 'redirect'
@forceSignIn()
else if event.data.user?
event.data.user.token = event.data.travis_token if event.data.travis_token
@setData(event.data)
console.log("signed in as #{event.data.user.login}")

View File

@ -11,14 +11,18 @@ module Travis
end
def call(env)
return app.call(env) unless info = info_for(env)
Rack::Response.new(template % info).finish
set_info(env) || app.call(env)
end
def info_for(env)
def set_info(env)
return unless env['REQUEST_METHOD'] == 'POST'
info = Rack::Request.new(env).params.values_at('token', 'user')
info if info.first =~ /\A[a-zA-Z\-_\d]+\Z/
request = Rack::Request.new(env)
token, user, storage = request.params.values_at('token', 'user', 'storage')
if token =~ /\A[a-zA-Z\-_\d]+\Z/
storage = 'sessionStorage' if storage != 'localStorage'
info = [storage, token, user, request.fullpath]
Rack::Response.new(template % info).finish
end
end
end
end
@ -26,7 +30,8 @@ end
__END__
<script>
sessionStorage.setItem('travis.token', %p);
sessionStorage.setItem('travis.user', %p);
window.location = '/';
var storage = %s;
storage.setItem('travis.token', %p);
storage.setItem('travis.user', %p);
window.location = %p;
</script>