dot_net_services 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/LICENSE +21 -24
  2. data/README +26 -16
  3. data/Rakefile +65 -0
  4. data/lib/acs/saml_token_provider.rb +54 -0
  5. data/lib/acs/shared_secret_token_provider.rb +55 -0
  6. data/lib/acs/simple_api_auth_token_provider.rb +57 -0
  7. data/lib/acs/simple_web_token_provider.rb +54 -0
  8. data/lib/acs/token_constants.rb +112 -0
  9. data/lib/acs/token_info.rb +33 -0
  10. data/lib/acs/token_provider.rb +74 -0
  11. data/lib/acs/token_validator.rb +114 -0
  12. data/lib/common/dot_net_services_environment.rb +61 -0
  13. data/lib/common/environment.yml +23 -0
  14. data/lib/common/host_name_config.yml +45 -0
  15. data/lib/dot_net_services.rb +31 -144
  16. data/lib/service_bus/http_proxy.rb +34 -0
  17. data/lib/service_bus/locked_message_info.rb +34 -0
  18. data/lib/service_bus/message_buffer.rb +313 -0
  19. data/lib/service_bus/message_buffer_constants.rb +48 -0
  20. data/lib/service_bus/message_buffer_policy.rb +55 -0
  21. data/lib/service_bus/requests.rb +95 -0
  22. data/test/config/test_config.yml +40 -0
  23. data/test/dot_net_services_environment_test.rb +54 -0
  24. data/test/message_buffer_test.rb +96 -0
  25. data/test/token_test.rb +98 -0
  26. metadata +50 -48
  27. data/lib/dot_net_services/authentication.rb +0 -168
  28. data/lib/dot_net_services/error.rb +0 -4
  29. data/lib/dot_net_services/message_buffer.rb +0 -283
  30. data/lib/dot_net_services/session.rb +0 -308
  31. data/lib/net/http/create_mb.rb +0 -14
  32. data/lib/net/http/retrieve.rb +0 -14
  33. data/lib/net/http/subscribe.rb +0 -14
  34. data/lib/net/http/unsubscribe.rb +0 -14
  35. data/spec/integration/TestService/Service/AnonymousResourceService.cs +0 -9
  36. data/spec/integration/TestService/Service/App.config +0 -32
  37. data/spec/integration/TestService/Service/PlainTextService.cs +0 -37
  38. data/spec/integration/TestService/Service/Program.cs +0 -49
  39. data/spec/integration/TestService/Service/Properties/AssemblyInfo.cs +0 -33
  40. data/spec/integration/TestService/Service/ResourceContract.cs +0 -17
  41. data/spec/integration/TestService/Service/ResourceService.cs +0 -58
  42. data/spec/integration/TestService/Service/Service.csproj +0 -71
  43. data/spec/integration/TestService/TestService.sln +0 -33
  44. data/spec/integration/end_to_end_spec.rb +0 -84
  45. data/spec/integration/vmb_spec.rb +0 -30
  46. data/spec/spec_helper.rb +0 -23
  47. data/spec/unit/dot_net_services/authentication_spec.rb +0 -289
  48. data/spec/unit/dot_net_services/message_buffer_spec.rb +0 -161
  49. data/spec/unit/dot_net_services/session_spec.rb +0 -247
data/LICENSE CHANGED
@@ -1,24 +1,21 @@
1
- Copyright (c) 2008, ThoughtWorks
2
- All rights reserved.
3
-
4
- Redistribution and use in source and binary forms, with or without
5
- modification, are permitted provided that the following conditions are met:
6
- * Redistributions of source code must retain the above copyright
7
- notice, this list of conditions and the following disclaimer.
8
- * Redistributions in binary form must reproduce the above copyright
9
- notice, this list of conditions and the following disclaimer in the
10
- documentation and/or other materials provided with the distribution.
11
- * Neither the name of the ThoughtWorks nor the
12
- names of its contributors may be used to endorse or promote products
13
- derived from this software without specific prior written permission.
14
-
15
- THIS SOFTWARE IS PROVIDED BY ThoughtWorks ''AS IS'' AND ANY
16
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
- DISCLAIMED. IN NO EVENT SHALL THOUGHTWORKS BE LIABLE FOR ANY
19
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1
+ Copyright (c) 2009, Persistent Systems Limited
2
+
3
+ Redistribution and use, with or without modification, are permitted
4
+ provided that the following conditions are met:
5
+ - Redistributions of source code must retain the above copyright notice,
6
+ this list of conditions and the following disclaimer.
7
+ - Neither the name of Persistent Systems Limited nor the names of its contributors
8
+ may be used to endorse or promote products derived from this software
9
+ without specific prior written permission.
10
+
11
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
12
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
13
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
14
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
15
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
16
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
17
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
18
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
19
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
20
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
21
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README CHANGED
@@ -1,16 +1,14 @@
1
- = .NET Services for Ruby
1
+ == .NET Services for Ruby
2
2
 
3
3
  * Project homepage: http://dotnetservicesruby.com
4
4
  * Download: http://rubyforge.org/frs/?group_id=7155
5
- * Demo application: http://dotnetservicesruby.com/billboard
6
5
  * Source code: http://rubyforge.org/frs/?group_id=7155
7
6
  * Documentation: http://dotnetservicesruby.com/documentation/index.html
8
7
 
9
8
  == What's this?
10
9
 
11
10
  .NET Services for Ruby is an open source library that helps Ruby programs communicate with Microsoft's .NET Services
12
- using plain HTTP. It was developed by a small team in ThoughtWorks, while Microsoft provided funding, management and
13
- technical guidance for the project.
11
+ using plain HTTP.
14
12
 
15
13
  == Installation
16
14
 
@@ -20,9 +18,6 @@ The library can be installed as a 'dot_net_services' gem, from RubyForge gem rep
20
18
 
21
19
  or downloaded as an archive from RubyForge [http://rubyforge.org/frs/?group_id=7155].
22
20
 
23
- <i>NOTE: Version number 0.3.0 tells you that the API will have backwards-incompatible changes in future, so
24
- Vendor Everything! [http://errtheblog.com/posts/50-vendor-everything]</i>
25
-
26
21
  == Documentation
27
22
 
28
23
  API: http://dotnetservicesruby.com/documentation/classes/DotNetServices.html
@@ -31,22 +26,37 @@ API: http://dotnetservicesruby.com/documentation/classes/DotNetServices.html
31
26
 
32
27
  == Demo application
33
28
 
34
- To provide an example of our interop API in action, we have implemented a small Rails application called BillBoard.
35
- We were working on the API while building the app, which helped us study the technology and discover the right
36
- abstractions.
37
-
38
- You can see BillBoard in action at http://dotnetservicesruby.com/billboard and download BillBoard source code from
39
- RubyForge [http://rubyforge.org/frs/?group_id=7155].
29
+ A demo application that demonstrates usage of the API (gem) will be added soon.
40
30
 
41
31
  == Contacts
42
32
 
43
33
  Users maillist: http://rubyforge.org/mailman/listinfo/dotnetsrv-ruby-users
44
- ThoughtWorks: info-us@thoughtworks.com
45
34
 
46
35
  == License
47
36
 
48
- BSD license. See [LICENSE].
37
+ See [LICENSE].
49
38
 
50
39
  == Copyright
40
+ Copyright (c) 2009, Persistent Systems Limited
41
+
42
+ Redistribution and use, with or without modification, are permitted
43
+ provided that the following conditions are met:
44
+ - Redistributions of source code must retain the above copyright notice,
45
+ this list of conditions and the following disclaimer.
46
+ - Neither the name of Persistent Systems Limited nor the names of its contributors
47
+ may be used to endorse or promote products derived from this software
48
+ without specific prior written permission.
49
+
50
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
51
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
52
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
53
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
54
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
55
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
56
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
57
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
58
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
59
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
60
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
61
+
51
62
 
52
- (c) ThoughtWorks, Inc 2008
data/Rakefile ADDED
@@ -0,0 +1,65 @@
1
+ # Copyright (c) 2009, Persistent Systems Limited
2
+ #
3
+ # Redistribution and use, with or without modification, are permitted
4
+ # provided that the following conditions are met:
5
+ # - Redistributions of source code must retain the above copyright notice,
6
+ # this list of conditions and the following disclaimer.
7
+ # - Neither the name of Persistent Systems Limited nor the names of its contributors
8
+ # may be used to endorse or promote products derived from this software
9
+ # without specific prior written permission.
10
+ #
11
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
12
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
13
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
14
+ # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
15
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
16
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
17
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS
18
+ # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
19
+ # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
20
+ # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
21
+ # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22
+
23
+ require 'rubygems'
24
+ require 'rake'
25
+ require 'rake/clean'
26
+ require 'rake/gempackagetask'
27
+ require 'rake/rdoctask'
28
+ require 'rake/testtask'
29
+
30
+ spec = Gem::Specification.new do |s|
31
+ s.name = 'dot_net_services'
32
+ s.version = '0.4.0'
33
+ s.has_rdoc = true
34
+ s.extra_rdoc_files = ['README', 'LICENSE']
35
+ s.summary = 'Ruby wrapper for .NET services'
36
+ s.description = s.summary
37
+ s.author = ''
38
+ s.email = ''
39
+ s.files = %w(LICENSE README Rakefile) + Dir.glob("{bin,lib,spec,test}/**/*")
40
+ s.require_path = "lib"
41
+ s.add_dependency(%q<ruby-hmac>, [">= 0.3.1"])
42
+ end
43
+
44
+ #spec.add_runtime_dependency('ruby_hmac', '>= 0.3.1')
45
+
46
+ Rake::GemPackageTask.new(spec) do |p|
47
+ p.gem_spec = spec
48
+ p.need_tar = true
49
+ p.need_zip = true
50
+ end
51
+
52
+ #spec.add_runtime_dependency('ruby_hmac')
53
+
54
+ Rake::RDocTask.new do |rdoc|
55
+ files =['README', 'LICENSE', 'lib/**/*.rb']
56
+ rdoc.rdoc_files.add(files)
57
+ rdoc.main = "README" # page to start on
58
+ rdoc.title = "dot_net_services Docs"
59
+ rdoc.rdoc_dir = 'doc/rdoc' # rdoc output folder
60
+ rdoc.options << '--line-numbers'
61
+ end
62
+
63
+ Rake::TestTask.new do |t|
64
+ t.test_files = FileList['test/**/*.rb']
65
+ end
@@ -0,0 +1,54 @@
1
+ # Copyright (c) 2009, Persistent Systems Limited
2
+ #
3
+ # Redistribution and use, with or without modification, are permitted
4
+ # provided that the following conditions are met:
5
+ # - Redistributions of source code must retain the above copyright notice,
6
+ # this list of conditions and the following disclaimer.
7
+ # - Neither the name of Persistent Systems Limited nor the names of its contributors
8
+ # may be used to endorse or promote products derived from this software
9
+ # without specific prior written permission.
10
+ #
11
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
12
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
13
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
14
+ # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
15
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
16
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
17
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS
18
+ # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
19
+ # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
20
+ # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
21
+ # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22
+
23
+ require 'cgi'
24
+ require "#{__FILE__}/../token_constants"
25
+ require "#{__FILE__}/../token_info"
26
+ require "#{__FILE__}/../token_provider"
27
+ require "#{__FILE__}/../../service_bus/http_proxy"
28
+
29
+ class SamlTokenProvider < TokenProvider
30
+ include DotNetServices::HTTPRequests
31
+ include HTTPProxy
32
+
33
+ attr_reader :saml_token
34
+
35
+ # * issuer_name: Issuer name provided when the service is created
36
+ # * issuer_key: Management key provided when the service is created
37
+ # * proxy: Hash containing http_proxy_server, http_proxy_port and optional http_porxy_username, http_proxy_password
38
+ def initialize(issuer_name, issuer_key, proxy = nil)
39
+ set_http_web_proxy(proxy) if proxy
40
+ @saml_token = TokenProvider.compute_simple_web_token(issuer_name, issuer_key)
41
+ end
42
+
43
+ # Constructs params to sent along with the token reuqest uri and calls issue_token
44
+ # * request_uri: Request url
45
+ # * applies_to: URL the token applies to
46
+ def token(request_uri, applies_to)
47
+ simple_auth_parameter_name = TokenConstants.simple_auth_saml_token
48
+ params = ''
49
+ params = TokenConstants.simple_auth_applies_to + "=" + CGI::escape(applies_to)
50
+ params << TokenConstants.url_parameter_separator
51
+ params << simple_auth_parameter_name + "=" + CGI::escape(@saml_token)
52
+ issue_token(request_uri, params)
53
+ end
54
+ end
@@ -0,0 +1,55 @@
1
+ # Copyright (c) 2009, Persistent Systems Limited
2
+ #
3
+ # Redistribution and use, with or without modification, are permitted
4
+ # provided that the following conditions are met:
5
+ # - Redistributions of source code must retain the above copyright notice,
6
+ # this list of conditions and the following disclaimer.
7
+ # - Neither the name of Persistent Systems Limited nor the names of its contributors
8
+ # may be used to endorse or promote products derived from this software
9
+ # without specific prior written permission.
10
+ #
11
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
12
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
13
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
14
+ # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
15
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
16
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
17
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS
18
+ # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
19
+ # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
20
+ # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
21
+ # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22
+
23
+ require 'cgi'
24
+ require "#{__FILE__}/../token_provider"
25
+ require "#{__FILE__}/../token_constants"
26
+ require "#{__FILE__}/../token_info"
27
+ require "#{__FILE__}/../../service_bus/http_proxy"
28
+
29
+ class SharedSecretTokenProvider < TokenProvider
30
+ attr_reader :issuer_name, :issuer_secret
31
+
32
+ # * issuer_name: Issuer name provided when the service is created
33
+ # * issuer_key: Management key provided when the service is created
34
+ # * proxy: Hash containing http_proxy_server, http_proxy_port and optional http_porxy_username, http_proxy_password
35
+ def initialize(issuer_name, issuer_secret, proxy = nil)
36
+ set_http_web_proxy(proxy) if proxy
37
+ @issuer_name = issuer_name
38
+ @issuer_secret = issuer_secret
39
+ end
40
+
41
+ # Constructs params to sent along with the token reuqest uri and calls issue_token
42
+ # * request_uri: Request url
43
+ # * applies_to: URL the token applies to
44
+ def token(request_uri, applies_to)
45
+ computed_simple_web_token_string = TokenProvider.compute_simple_web_token(@issuer_name, @issuer_secret)
46
+ simple_auth_parameter_name = TokenConstants.simple_auth_simple_web_token
47
+ params = ''
48
+ params = TokenConstants.simple_auth_applies_to + "=" + CGI::escape(applies_to)
49
+ params << TokenConstants.url_parameter_separator
50
+ params << simple_auth_parameter_name + "=" + CGI::escape(computed_simple_web_token_string)
51
+ issue_token(request_uri, params)
52
+ end
53
+ end
54
+
55
+
@@ -0,0 +1,57 @@
1
+ # Copyright (c) 2009, Persistent Systems Limited
2
+ #
3
+ # Redistribution and use, with or without modification, are permitted
4
+ # provided that the following conditions are met:
5
+ # - Redistributions of source code must retain the above copyright notice,
6
+ # this list of conditions and the following disclaimer.
7
+ # - Neither the name of Persistent Systems Limited nor the names of its contributors
8
+ # may be used to endorse or promote products derived from this software
9
+ # without specific prior written permission.
10
+ #
11
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
12
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
13
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
14
+ # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
15
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
16
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
17
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS
18
+ # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
19
+ # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
20
+ # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
21
+ # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22
+
23
+ require 'cgi'
24
+ require "#{__FILE__}/../token_constants"
25
+ require "#{__FILE__}/../token_info"
26
+ require "#{__FILE__}/../token_provider"
27
+ require "#{__FILE__}/../../service_bus/http_proxy"
28
+
29
+ class SimpleApiAuthTokenProvider < TokenProvider
30
+ attr_reader :wrap_name, :wrap_secret
31
+
32
+ # * wrap_name: Scope name provided when the service is created
33
+ # * wrap_password: 'Client Getting Started Issuer key' provided when the service is created
34
+ # * proxy: Hash containing http_web_proxy_server, http_web_proxy_port and optional http_web_proxy_username, http_web_proxy_password
35
+ def initialize(wrap_name, wrap_password, proxy = nil)
36
+ @wrap_name = wrap_name
37
+ @wrap_password = wrap_password
38
+ proxy = {'http_web_proxy_server' => 'itgproxy.redmond.corp.microsoft.com','http_web_proxy_port' => '80'}
39
+ set_http_web_proxy(proxy) if proxy
40
+ end
41
+
42
+ # Constructs params to sent along with the token reuqest uri and calls issue_token
43
+ # * request_uri: Request url
44
+ # * applies_to: URL the token applies to
45
+ def token(request_uri, applies_to)
46
+ params = ''
47
+ params = TokenConstants.simple_auth_applies_to + "=" + CGI::escape(applies_to)
48
+ params << TokenConstants.url_parameter_separator
49
+ params << TokenConstants.simple_auth_name + "=" + CGI::escape(@wrap_name)
50
+ params << TokenConstants.url_parameter_separator
51
+ params << TokenConstants.simple_auth_password + "=" + CGI::escape(@wrap_password)
52
+ issue_token(request_uri, params)
53
+ end
54
+ end
55
+
56
+
57
+
@@ -0,0 +1,54 @@
1
+ # Copyright (c) 2009, Persistent Systems Limited
2
+ #
3
+ # Redistribution and use, with or without modification, are permitted
4
+ # provided that the following conditions are met:
5
+ # - Redistributions of source code must retain the above copyright notice,
6
+ # this list of conditions and the following disclaimer.
7
+ # - Neither the name of Persistent Systems Limited nor the names of its contributors
8
+ # may be used to endorse or promote products derived from this software
9
+ # without specific prior written permission.
10
+ #
11
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
12
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
13
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
14
+ # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
15
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
16
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
17
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS
18
+ # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
19
+ # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
20
+ # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
21
+ # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22
+
23
+ require 'cgi'
24
+ require "#{__FILE__}/../token_constants"
25
+ require "#{__FILE__}/../token_info"
26
+ require "#{__FILE__}/../token_provider"
27
+ require "#{__FILE__}/../../service_bus/http_proxy"
28
+
29
+ class SimpleWebTokenProvider < TokenProvider
30
+ include DotNetServices::HTTPRequests
31
+ include HTTPProxy
32
+
33
+ attr_reader :simple_web_token
34
+
35
+ # * issuer_name: Issuer name provided when the service is created
36
+ # * issuer_key: Management key provided when the service is created
37
+ # * proxy: Hash containing http_proxy_server, http_proxy_port and optional http_porxy_username, http_proxy_password
38
+ def initialize(issuer_name, issuer_key, proxy = nil)
39
+ set_http_web_proxy(proxy) if proxy
40
+ @simple_web_token = TokenProvider.compute_simple_web_token(issuer_name, issuer_key)
41
+ end
42
+
43
+ # Constructs params to sent along with the token request uri and calls issue_token
44
+ # * request_uri: Request url
45
+ # * applies_to: URL the token applies to
46
+ def token(request_uri, applies_to)
47
+ simple_auth_parameter_name = TokenConstants.simple_auth_simple_web_token
48
+ params = ''
49
+ params = TokenConstants.simple_auth_applies_to + "=" + CGI::escape(applies_to)
50
+ params << TokenConstants.url_parameter_separator
51
+ params << simple_auth_parameter_name + "=" + CGI::escape(@simple_web_token)
52
+ issue_token(request_uri, params)
53
+ end
54
+ end
@@ -0,0 +1,112 @@
1
+ # Copyright (c) 2009, Persistent Systems Limited
2
+ #
3
+ # Redistribution and use, with or without modification, are permitted
4
+ # provided that the following conditions are met:
5
+ # - Redistributions of source code must retain the above copyright notice,
6
+ # this list of conditions and the following disclaimer.
7
+ # - Neither the name of Persistent Systems Limited nor the names of its contributors
8
+ # may be used to endorse or promote products derived from this software
9
+ # without specific prior written permission.
10
+ #
11
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
12
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
13
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
14
+ # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
15
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
16
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
17
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS
18
+ # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
19
+ # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
20
+ # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
21
+ # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22
+
23
+ # Holds following constants related to the Tokens along with its accessor methods
24
+ # default_compound_claim_delimiter,
25
+ # http_auth_parameter_separator,
26
+ # http_method_get,
27
+ # http_method_head,
28
+ # http_method_post,
29
+ # http_method_trace,
30
+ # management_issuer_name,
31
+ # output_claim_issuer_id,
32
+ # saml11_confirmation_method_bearertoken,
33
+ # service_bus_issuer_name,
34
+ # simple_auth_accesstoken,
35
+ # simple_auth_applies_to,
36
+ # simple_auth_authentication_type,
37
+ # simple_auth_content_type,
38
+ # simple_auth_name,
39
+ # simple_auth_password,
40
+ # simple_auth_requested_lifetime,
41
+ # simple_auth_saml_token,
42
+ # simple_auth_simple_web_token,
43
+ # simple_authtoken_expires_in,
44
+ # token_audience,
45
+ # token_digest256,
46
+ # token_expires_on,
47
+ # token_issuer,
48
+ # tracking_id_header_name,
49
+ # url_parameter_separator,
50
+ # content_language
51
+ class TokenConstants
52
+ @default_compound_claim_delimiter = ','
53
+ @http_auth_parameter_separator = ','
54
+ @http_method_get = "GET"
55
+ @http_method_head = "HEAD"
56
+ @http_method_post = "POST"
57
+ @http_method_trace = "TRACE"
58
+ @management_issuer_name = "owner"
59
+ @max_issuer_name_size = 0x80
60
+ @max_issuer_secret_size = 0x80
61
+ @output_claim_issuer_id = "ACS"
62
+ @saml11_confirmation_method_bearertoken = "urn:oasis:names:tc:SAML:1.0:cm:bearer"
63
+ @service_bus_issuer_name = "owner"
64
+ @simple_auth_accesstoken = "wrap_token_"
65
+ @simple_auth_applies_to = "applies_to"
66
+ @simple_auth_authentication_type = "WRAPv0.8"
67
+ @simple_auth_content_type = "application/x-www-form-urlencoded"
68
+ @simple_auth_content_types = ["*/*", "application/*", "application/x-www-form-urlencoded"]
69
+ @simple_auth_name = "wrap_name"
70
+ @simple_auth_password = "wrap_password"
71
+ @simple_auth_requested_lifetime = "requested_lifetime"
72
+ @simple_auth_saml_token = "wrap_SAML"
73
+ @simple_auth_simple_web_token = "wrap_SWT"
74
+ @simple_authtoken_expires_in = "wrap_token__expires_in"
75
+ @token_audience = "Audience"
76
+ @token_digest256 = "HMACSHA256"
77
+ @token_expires_on = "ExpiresOn"
78
+ @token_issuer = "Issuer"
79
+ @tracking_id_header_name = "x-ms-request-id"
80
+ @url_parameter_separator = '&'
81
+ @content_language = "en-US"
82
+
83
+ class << self
84
+ attr_accessor :default_compound_claim_delimiter,
85
+ :http_auth_parameter_separator,
86
+ :http_method_get,
87
+ :http_method_head,
88
+ :http_method_post,
89
+ :http_method_trace,
90
+ :management_issuer_name,
91
+ :output_claim_issuer_id,
92
+ :saml11_confirmation_method_bearertoken,
93
+ :service_bus_issuer_name,
94
+ :simple_auth_accesstoken,
95
+ :simple_auth_applies_to,
96
+ :simple_auth_authentication_type,
97
+ :simple_auth_content_type,
98
+ :simple_auth_name,
99
+ :simple_auth_password,
100
+ :simple_auth_requested_lifetime,
101
+ :simple_auth_saml_token,
102
+ :simple_auth_simple_web_token,
103
+ :simple_authtoken_expires_in,
104
+ :token_audience,
105
+ :token_digest256,
106
+ :token_expires_on,
107
+ :token_issuer,
108
+ :tracking_id_header_name,
109
+ :url_parameter_separator,
110
+ :content_language
111
+ end
112
+ end
@@ -0,0 +1,33 @@
1
+ # Copyright (c) 2009, Persistent Systems Limited
2
+ #
3
+ # Redistribution and use, with or without modification, are permitted
4
+ # provided that the following conditions are met:
5
+ # - Redistributions of source code must retain the above copyright notice,
6
+ # this list of conditions and the following disclaimer.
7
+ # - Neither the name of Persistent Systems Limited nor the names of its contributors
8
+ # may be used to endorse or promote products derived from this software
9
+ # without specific prior written permission.
10
+ #
11
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
12
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
13
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
14
+ # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
15
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
16
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
17
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS
18
+ # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
19
+ # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
20
+ # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
21
+ # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22
+
23
+ class TokenInfo
24
+ attr_reader :token, :expires_in
25
+
26
+ # * token: Actual token returned by tge .NET services
27
+ # * expires_in: Token expiration time in seconds
28
+ def initialize(token,expires_in)
29
+ @token = token
30
+ @expires_in = expires_in
31
+ end
32
+
33
+ end
@@ -0,0 +1,74 @@
1
+ # Copyright (c) 2009, Persistent Systems Limited
2
+ #
3
+ # Redistribution and use, with or without modification, are permitted
4
+ # provided that the following conditions are met:
5
+ # - Redistributions of source code must retain the above copyright notice,
6
+ # this list of conditions and the following disclaimer.
7
+ # - Neither the name of Persistent Systems Limited nor the names of its contributors
8
+ # may be used to endorse or promote products derived from this software
9
+ # without specific prior written permission.
10
+ #
11
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
12
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
13
+ # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
14
+ # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
15
+ # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
16
+ # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
17
+ # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS
18
+ # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
19
+ # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
20
+ # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
21
+ # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22
+
23
+ require 'base64'
24
+ require 'rubygems'
25
+ require 'hmac-sha2'
26
+ require "#{__FILE__}/../token_constants"
27
+ require "#{__FILE__}/../../service_bus/requests"
28
+ require "#{__FILE__}/../../service_bus/http_proxy"
29
+
30
+ class TokenProvider
31
+ include DotNetServices::HTTPRequests
32
+ include HTTPProxy
33
+
34
+ # Computes the simple_web_token
35
+ # * issuer_name: Issuer name provided when the service is created
36
+ # * issuer_secret: Management key provided when the service is created
37
+ def self.compute_simple_web_token(issuer_name, issuer_secret)
38
+ @token = TokenConstants.token_issuer + "=" + CGI::unescape(issuer_name)
39
+ @hmcKey = self.token_hmc_key(CGI::unescape(@token), issuer_secret)
40
+ @computedSimpleWebTokenString = @token + "&" + TokenConstants.token_digest256 + "=" + CGI::escape(@hmcKey)
41
+ @computedSimpleWebTokenString
42
+ end
43
+
44
+ # Computes HMAC signature
45
+ # * token: token_issuer + issuer_name
46
+ # * issuer_secret_key: Management key provided when the service is created
47
+ def self.token_hmc_key(token, issuer_secret_key)
48
+ signature = Base64.encode64(HMAC::SHA256.digest(Base64.decode64(issuer_secret_key), token))
49
+ signature = signature.gsub("\n", '')
50
+ return signature
51
+ end
52
+
53
+ # Returns token received from the .NET services
54
+ # * request_uri: Request url
55
+ # * params: Parameter string to be sent as post request data
56
+ def issue_token(request_uri, params)
57
+ options = {}
58
+ header = {
59
+ 'Content-Type' => TokenConstants.simple_auth_content_type,
60
+ 'Content-Length' => params.length.to_s,
61
+ 'Content-Language' => TokenConstants.content_language,
62
+ 'Accept' => '*/*'
63
+ }
64
+ options.store(:header, header)
65
+ options.store(:use_ssl, true)
66
+ response = post(request_uri, params, options)
67
+ token_response = response.body
68
+ token_response.extend ToHash
69
+ the_token = token_response.to_hash['wrap_token']
70
+ token_expires_in = token_response.to_hash['wrap_token_expires_in']
71
+ TokenInfo.new(the_token, token_expires_in)
72
+ end
73
+
74
+ end