From 21af8176a102db9f4a88754f87838458128a239b Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Wed, 5 Dec 2012 14:18:32 +0100 Subject: [PATCH 1/7] listen for redirect events --- assets/scripts/app/auth.coffee | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/assets/scripts/app/auth.coffee b/assets/scripts/app/auth.coffee index 260da1d2..0a47aa74 100644 --- a/assets/scripts/app/auth.coffee +++ b/assets/scripts/app/auth.coffee @@ -49,13 +49,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,9 +83,12 @@ receiveMessage: (event) -> if event.origin == @expectedOrigin() - 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}") + 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}") else console.log("unexpected message #{event.origin}: #{event.data}") From 4a443aee413c52dfb6556544437d2106953777d1 Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Wed, 5 Dec 2012 14:36:57 +0100 Subject: [PATCH 2/7] allow setting the storage --- lib/travis/web/set_token.rb | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/travis/web/set_token.rb b/lib/travis/web/set_token.rb index 13a3222f..7a334bb6 100644 --- a/lib/travis/web/set_token.rb +++ b/lib/travis/web/set_token.rb @@ -17,8 +17,12 @@ module Travis def info_for(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.to_s.empty? + [storage, token, user, request.fullpath] + end end end end @@ -26,7 +30,8 @@ end __END__ From f6c983978f8b0e6086e2944193c163ec2e6b27dc Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Thu, 6 Dec 2012 14:44:00 +0100 Subject: [PATCH 3/7] only allow sessionStorage and localStorage --- lib/travis/web/set_token.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/travis/web/set_token.rb b/lib/travis/web/set_token.rb index 7a334bb6..ce999553 100644 --- a/lib/travis/web/set_token.rb +++ b/lib/travis/web/set_token.rb @@ -20,7 +20,7 @@ module Travis 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.to_s.empty? + storage = 'sessionStorage' if storage != 'localStorage' [storage, token, user, request.fullpath] end end From eed223d19d9c2fc595a783dbd0bae212c3d7d75b Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Thu, 6 Dec 2012 15:49:36 +0100 Subject: [PATCH 4/7] throw params in case or mismatch --- lib/travis/web/set_token.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/travis/web/set_token.rb b/lib/travis/web/set_token.rb index ce999553..d182045c 100644 --- a/lib/travis/web/set_token.rb +++ b/lib/travis/web/set_token.rb @@ -11,17 +11,19 @@ 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' 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' - [storage, token, user, request.fullpath] + info = [storage, token, user, request.fullpath] + Rack::Response.new(template % info).finish + else + [200, {'Content-Type' => 'text/plain'}, [request.params.inspect]] end end end From b4a1535533395b9be3cb89351055ce17f2048d70 Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Thu, 6 Dec 2012 16:58:28 +0100 Subject: [PATCH 5/7] check user --- assets/scripts/app/auth.coffee | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/assets/scripts/app/auth.coffee b/assets/scripts/app/auth.coffee index 0a47aa74..1dff3e26 100644 --- a/assets/scripts/app/auth.coffee +++ b/assets/scripts/app/auth.coffee @@ -17,7 +17,9 @@ autoSignIn: (path) -> console.log 'autoSignIn' if user = sessionStorage.getItem('travis.user') - @setData(user: JSON.parse(user)) + 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() From c3e1bb7d67287178e89d7f09c6b0848bec3d4535 Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Thu, 6 Dec 2012 17:11:32 +0100 Subject: [PATCH 6/7] only sign in once --- assets/scripts/app/auth.coffee | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/assets/scripts/app/auth.coffee b/assets/scripts/app/auth.coffee index 1dff3e26..c1bfe18d 100644 --- a/assets/scripts/app/auth.coffee +++ b/assets/scripts/app/auth.coffee @@ -16,7 +16,11 @@ # for auto signin then we're trying to sign in. autoSignIn: (path) -> console.log 'autoSignIn' - if user = sessionStorage.getItem('travis.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) @@ -34,6 +38,7 @@ signOut: -> localStorage.removeItem('travis.auto_signin') localStorage.removeItem('travis.locale') + localStorage.removeItem('travis.user') sessionStorage.clear() @setData() From 6f8a5860afdf2ffdaee3292e64cf55ff2a7109bb Mon Sep 17 00:00:00 2001 From: Konstantin Haase Date: Thu, 6 Dec 2012 17:13:08 +0100 Subject: [PATCH 7/7] remove printf debugging --- lib/travis/web/set_token.rb | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/travis/web/set_token.rb b/lib/travis/web/set_token.rb index d182045c..af73cbdc 100644 --- a/lib/travis/web/set_token.rb +++ b/lib/travis/web/set_token.rb @@ -22,8 +22,6 @@ module Travis storage = 'sessionStorage' if storage != 'localStorage' info = [storage, token, user, request.fullpath] Rack::Response.new(template % info).finish - else - [200, {'Content-Type' => 'text/plain'}, [request.params.inspect]] end end end