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. # for auto signin then we're trying to sign in.
autoSignIn: (path) -> autoSignIn: (path) ->
console.log 'autoSignIn' console.log 'autoSignIn'
if user = sessionStorage.getItem('travis.user') global = localStorage.getItem('travis.user')
@setData(user: JSON.parse(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') else if localStorage.getItem('travis.auto_signin')
console.log 'travis.auto_signin', localStorage.getItem('travis.auto_signin') console.log 'travis.auto_signin', localStorage.getItem('travis.auto_signin')
@signIn() @signIn()
@ -32,6 +38,7 @@
signOut: -> signOut: ->
localStorage.removeItem('travis.auto_signin') localStorage.removeItem('travis.auto_signin')
localStorage.removeItem('travis.locale') localStorage.removeItem('travis.locale')
localStorage.removeItem('travis.user')
sessionStorage.clear() sessionStorage.clear()
@setData() @setData()
@ -49,13 +56,7 @@
# TODO should have clearData() to clean this up # TODO should have clearData() to clean this up
setData: (data) -> setData: (data) ->
if typeof data == 'string' data = JSON.parse(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)
@storeToken(data.token) if data?.token @storeToken(data.token) if data?.token
console.log 'setData', data.user if data?.user console.log 'setData', data.user if data?.user
user = @storeUser(data.user) if data?.user user = @storeUser(data.user) if data?.user
@ -89,9 +90,12 @@
receiveMessage: (event) -> receiveMessage: (event) ->
if event.origin == @expectedOrigin() if event.origin == @expectedOrigin()
event.data.user.token = event.data.travis_token if event.data.travis_token if event.data == 'redirect'
@setData(event.data) @forceSignIn()
console.log("signed in as #{event.data.user.login}") 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}")
else else
console.log("unexpected message #{event.origin}: #{event.data}") console.log("unexpected message #{event.origin}: #{event.data}")

View File

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