dot_net_services 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +21 -24
- data/README +26 -16
- data/Rakefile +65 -0
- data/lib/acs/saml_token_provider.rb +54 -0
- data/lib/acs/shared_secret_token_provider.rb +55 -0
- data/lib/acs/simple_api_auth_token_provider.rb +57 -0
- data/lib/acs/simple_web_token_provider.rb +54 -0
- data/lib/acs/token_constants.rb +112 -0
- data/lib/acs/token_info.rb +33 -0
- data/lib/acs/token_provider.rb +74 -0
- data/lib/acs/token_validator.rb +114 -0
- data/lib/common/dot_net_services_environment.rb +61 -0
- data/lib/common/environment.yml +23 -0
- data/lib/common/host_name_config.yml +45 -0
- data/lib/dot_net_services.rb +31 -144
- data/lib/service_bus/http_proxy.rb +34 -0
- data/lib/service_bus/locked_message_info.rb +34 -0
- data/lib/service_bus/message_buffer.rb +313 -0
- data/lib/service_bus/message_buffer_constants.rb +48 -0
- data/lib/service_bus/message_buffer_policy.rb +55 -0
- data/lib/service_bus/requests.rb +95 -0
- data/test/config/test_config.yml +40 -0
- data/test/dot_net_services_environment_test.rb +54 -0
- data/test/message_buffer_test.rb +96 -0
- data/test/token_test.rb +98 -0
- metadata +50 -48
- data/lib/dot_net_services/authentication.rb +0 -168
- data/lib/dot_net_services/error.rb +0 -4
- data/lib/dot_net_services/message_buffer.rb +0 -283
- data/lib/dot_net_services/session.rb +0 -308
- data/lib/net/http/create_mb.rb +0 -14
- data/lib/net/http/retrieve.rb +0 -14
- data/lib/net/http/subscribe.rb +0 -14
- data/lib/net/http/unsubscribe.rb +0 -14
- data/spec/integration/TestService/Service/AnonymousResourceService.cs +0 -9
- data/spec/integration/TestService/Service/App.config +0 -32
- data/spec/integration/TestService/Service/PlainTextService.cs +0 -37
- data/spec/integration/TestService/Service/Program.cs +0 -49
- data/spec/integration/TestService/Service/Properties/AssemblyInfo.cs +0 -33
- data/spec/integration/TestService/Service/ResourceContract.cs +0 -17
- data/spec/integration/TestService/Service/ResourceService.cs +0 -58
- data/spec/integration/TestService/Service/Service.csproj +0 -71
- data/spec/integration/TestService/TestService.sln +0 -33
- data/spec/integration/end_to_end_spec.rb +0 -84
- data/spec/integration/vmb_spec.rb +0 -30
- data/spec/spec_helper.rb +0 -23
- data/spec/unit/dot_net_services/authentication_spec.rb +0 -289
- data/spec/unit/dot_net_services/message_buffer_spec.rb +0 -161
- data/spec/unit/dot_net_services/session_spec.rb +0 -247
@@ -0,0 +1,114 @@
|
|
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 "base64"
|
25
|
+
require 'rubygems'
|
26
|
+
require 'hmac-sha2'
|
27
|
+
require "#{__FILE__}/../../service_bus/requests"
|
28
|
+
|
29
|
+
class TokenValidator
|
30
|
+
|
31
|
+
attr_reader :claims, :trusted_token_issuer, :trusted_audience, :trusted_signing_key, :token
|
32
|
+
|
33
|
+
# service_name: Defined in the contants file
|
34
|
+
# solution_name: Name of the service created
|
35
|
+
# truste_audience: Applies_to url
|
36
|
+
# trusted_signing_key: Management key provided when the service was created
|
37
|
+
# token: service_name + " " + token received
|
38
|
+
def initialize(service_name, solution_name, trusted_audience, trusted_signing_key, token)
|
39
|
+
token_separator = ' '
|
40
|
+
@issuer_label = "Issuer"
|
41
|
+
@expires_label = "ExpiresOn"
|
42
|
+
@audience_label = "Audience"
|
43
|
+
@hmacSHA256_label = "HMACSHA256"
|
44
|
+
|
45
|
+
@trusted_token_issuer = "https://" + solution_name + "." + DotNetServicesEnvironment.acm_host_name +
|
46
|
+
"/" + service_name
|
47
|
+
@trusted_audience = trusted_audience
|
48
|
+
@trusted_signing_key = trusted_signing_key
|
49
|
+
|
50
|
+
@token = CGI::unescape(token.split(token_separator).last)
|
51
|
+
populate_claims(@token)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Validates the token based on hmac key, expiry, issuer and audience.
|
55
|
+
def validate
|
56
|
+
return false if(@token[0..7] == "WRAPv0.8")
|
57
|
+
return false unless hmac_valid?
|
58
|
+
self.populate_claims(@token)
|
59
|
+
return false if expired?
|
60
|
+
return false unless issuer_trusted?
|
61
|
+
return false unless audience_trusted?
|
62
|
+
return true
|
63
|
+
end
|
64
|
+
|
65
|
+
# Checks the token against hmac key
|
66
|
+
def hmac_valid?
|
67
|
+
@token_signature = @token.split('&' + @hmacSHA256_label + '=')
|
68
|
+
return false if(@token_signature.size != 2)
|
69
|
+
@computed_signature = Base64.encode64(HMAC::SHA256.digest(Base64.decode64(@trusted_signing_key), @token_signature.first))
|
70
|
+
@computed_signature = @computed_signature.gsub("\n", "")
|
71
|
+
return (@computed_signature == (CGI::unescape(@token_signature.last)))
|
72
|
+
end
|
73
|
+
|
74
|
+
# Validates claims received in the tokens with the expected claims
|
75
|
+
# * expected_claims: Hask containing key-value pairs of claims
|
76
|
+
def validate_claims(expected_claims)
|
77
|
+
expected_claim_keys = expected_claims.keys
|
78
|
+
expected_claim_keys.each do |key|
|
79
|
+
return false unless @claims[key]
|
80
|
+
return false unless (expected_claims[key] == @claims[key])
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# Extracts the claims from token
|
85
|
+
# * token_value: Token returned by the .NET services
|
86
|
+
def populate_claims(token_value)
|
87
|
+
token_value.extend DotNetServices::HTTPRequests::ToHash
|
88
|
+
@claims = token_value.to_hash
|
89
|
+
end
|
90
|
+
|
91
|
+
# Checks if the token is expired or not
|
92
|
+
def expired?
|
93
|
+
raise StandardError.new("Claims not defined in the token.") if(@claims.empty?)
|
94
|
+
expires_on_seconds = @claims[@expires_label]
|
95
|
+
expiry_time = Time.at(expires_on_seconds.to_i)
|
96
|
+
current_time = Time.new
|
97
|
+
# Current timestamp must be less than expiration time stamp
|
98
|
+
return (current_time > expiry_time)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Checks if the issuer in the token is the same as the trusted token issuer
|
102
|
+
def issuer_trusted?
|
103
|
+
raise StandardError.new("Claims not defined in the token.") if(@claims.empty?)
|
104
|
+
@issuer = @claims[@issuer_label]
|
105
|
+
return ((@issuer.empty?) || (@issuer.casecmp(@trusted_token_issuer) != 0))
|
106
|
+
end
|
107
|
+
|
108
|
+
# Checks if the audience (applies to) in the token is the same as the trusted token issuer
|
109
|
+
def audience_trusted?
|
110
|
+
raise StandardError.new("Claims not defined in the token.") if(@claims.empty?)
|
111
|
+
audience = @claims[@audience_label]
|
112
|
+
return ((!audience.empty?) || (audience == @trusted_audience))
|
113
|
+
end
|
114
|
+
end
|
@@ -0,0 +1,61 @@
|
|
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 'yaml'
|
24
|
+
# Class that holds Service bus and ACS host names for bvt, int, ppe and prod environment.
|
25
|
+
# The environment can be set in environment.properties file
|
26
|
+
class DotNetServicesEnvironment
|
27
|
+
|
28
|
+
ENV_FILE = File.join(File.dirname(__FILE__), "environment.yml")
|
29
|
+
HOST_NAME_CONFIG_FILE = File.join(File.dirname(__FILE__), "host_name_config.yml")
|
30
|
+
ENCODING = "UTF-8"
|
31
|
+
# Default env is set to bvt during development,
|
32
|
+
# will be changed to prod at the time of release
|
33
|
+
HOST_NAMES = YAML.load(File.open(HOST_NAME_CONFIG_FILE))["environments"]
|
34
|
+
|
35
|
+
class << self
|
36
|
+
# Returns the environment from the environment.yml file
|
37
|
+
def environment
|
38
|
+
environment = YAML.load(File.open(ENV_FILE))
|
39
|
+
(environment && environment['Environment'])
|
40
|
+
end
|
41
|
+
|
42
|
+
def acm_host_name(env = nil)
|
43
|
+
HOST_NAMES[valid_env(env)]['acm']
|
44
|
+
end
|
45
|
+
|
46
|
+
def sts_host_name(env = nil)
|
47
|
+
HOST_NAMES[valid_env(env)]['sts']
|
48
|
+
end
|
49
|
+
|
50
|
+
def service_bus_host_name(env = nil)
|
51
|
+
HOST_NAMES[valid_env(env)]['service_bus']
|
52
|
+
end
|
53
|
+
|
54
|
+
def valid_env(env)
|
55
|
+
env ||= environment
|
56
|
+
HOST_NAMES.keys.include?(env) ? env : 'default'
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,23 @@
|
|
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
|
+
Environment: prod
|
@@ -0,0 +1,45 @@
|
|
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
|
+
environments:
|
24
|
+
bvt: &bvt
|
25
|
+
service_bus: servicebus.windows-bvt.net
|
26
|
+
acm: accesscontrol.windows-bvt.net
|
27
|
+
sts: accesscontrol.windows-bvt.net
|
28
|
+
|
29
|
+
int: &int
|
30
|
+
service_bus: servicebus.int2.windows-int.net
|
31
|
+
acm: accesscontrol.int2.windows-int.net
|
32
|
+
sts: accesscontrol.int2.windows-int.net
|
33
|
+
|
34
|
+
ppe: &ppe
|
35
|
+
service_bus: servicebus.windows-ppe.net
|
36
|
+
acm: accesscontrol.windows-ppe.net
|
37
|
+
sts: accesscontrol.windows-ppe.net
|
38
|
+
|
39
|
+
prod: &prod
|
40
|
+
service_bus: servicebus.windows.net
|
41
|
+
acm: accesscontrol.windows.net
|
42
|
+
sts: accesscontrol.windows.net
|
43
|
+
|
44
|
+
default:
|
45
|
+
<<: *prod
|
data/lib/dot_net_services.rb
CHANGED
@@ -1,145 +1,32 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
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 "#{__FILE__}/../acs/shared_secret_token_provider"
|
24
|
+
require "#{__FILE__}/../acs/simple_api_auth_token_provider"
|
25
|
+
require "#{__FILE__}/../acs/simple_web_token_provider"
|
26
|
+
require "#{__FILE__}/../acs/saml_token_provider"
|
27
|
+
require "#{__FILE__}/../acs/token_constants"
|
28
|
+
require "#{__FILE__}/../acs/token_info"
|
29
|
+
require "#{__FILE__}/../acs/token_provider"
|
30
|
+
require "#{__FILE__}/../acs/token_validator"
|
31
|
+
require "#{__FILE__}/../service_bus/message_buffer"
|
8
32
|
|
9
|
-
# DotNetServices is the top-level namespace of <b>.NET Services for Ruby</b>, Ruby interoperability layer for
|
10
|
-
# .NET Services plain HTTP (REST) API.
|
11
|
-
#
|
12
|
-
# == .NET Services
|
13
|
-
#
|
14
|
-
# Since you are reading this, you probably already know that .NET Services is a Microsoft product, described as the
|
15
|
-
# "Internet Services Bus", a messaging bus in the cloud. Like any other messaging bus, it helps services and consumers
|
16
|
-
# to communicate with each other. Further information on .NET Services can be found on MSDN:
|
17
|
-
# http://go.microsoft.com/fwlink/?LinkID=129428.
|
18
|
-
#
|
19
|
-
# While .NET Services primarily target .NET platform, non-Microsoft software is also catered for,
|
20
|
-
# by providing open protocols for most of the bus functionality, in both SOAP/WS-* and plain HTTP style. The latter
|
21
|
-
# is structured in a way that makes it easy to implement REST interactions over the bus, including both
|
22
|
-
# synchronous and asynchronous semantics. .NET Services bus doesn't force an application to use REST, any
|
23
|
-
# other kind of plain HTTP protocol can be routed through it, too.
|
24
|
-
#
|
25
|
-
#
|
26
|
-
# == Functionality
|
27
|
-
#
|
28
|
-
# This library is a simple Ruby wrapper for .NET Services plain HTPP (REST) APIs. Current version allows Ruby
|
29
|
-
# developers to build consumers of synchronous RESTful services (implemented as .NET WCF services, using
|
30
|
-
# webHttpRelayBinding, provided by the .NET Services SDK). You can also exchange messages between Ruby processes via
|
31
|
-
# Volatile Message Buffers (VMBs), which are .NET Services mechanism for asynchronous communications.
|
32
|
-
#
|
33
|
-
# .NET Services for Ruby looks like Net::HTTP API from the standard library, but deals with authentication,
|
34
|
-
# VMB management and message retrieval.
|
35
|
-
#
|
36
|
-
# Since this is a 0.1.0 version of an interoperability layer for a PDC version of a bus, a few things are missing.
|
37
|
-
#
|
38
|
-
# Most notably, with this version you still can not:
|
39
|
-
# * communicate with WCF services bound by anything other than webHttpRelayBinding.
|
40
|
-
# * communicate with the bus via WS-* protocols.
|
41
|
-
# * communicate with a WCF-based service via a VMB. At least, not until .NET Services SDK adds a WCF binding for
|
42
|
-
# REST via VMB. Once it's available, we should be able to work with it.
|
43
|
-
# * use VMB pub-sub and multicast functionality
|
44
|
-
# * use Workflow Services
|
45
|
-
# * use Identity Service as a dfederated identity provider for end-users
|
46
|
-
#
|
47
|
-
# == Usage examples
|
48
|
-
#
|
49
|
-
# Say, you are a cellphone dealer. You have a Point of Sale web application, written in Rails. It sells cellphones.
|
50
|
-
# The phones you sell are operated by a phone company, which offers a .NET Services solution (group of services in
|
51
|
-
# the .NET Services world), called Dealership. It includes two services, Customer and Provisioning.
|
52
|
-
#
|
53
|
-
# Customer service is a RESTful service endpoint, implemented by WCF service with a webHttpRelayBinding. It's listening
|
54
|
-
# on /Customer URL, and provides the usual CRUD functionality for managing customers.
|
55
|
-
#
|
56
|
-
# Provisioning service endpoint is a VMB. Coincidentally, it's also written in Ruby! :) When a customer buys a new phone,
|
57
|
-
# provisioning application should activate the phohe on the network, so that the customer can actually make calls with it.
|
58
|
-
# Activation can take several minutes, even hours, and we don't want the point of sale terminal to hang until it's over.
|
59
|
-
# Hence the use of a VMB as an asynchronous communication device.
|
60
|
-
#
|
61
|
-
# To create a customer, point of sale app needs to post a URL-encoded form to a webHttpRelayBinding endpoint. That's
|
62
|
-
# where you need to use a DotNetServices::Session class:
|
63
|
-
#
|
64
|
-
# require 'dotnetservices'
|
65
|
-
# session = DotNetServices::Session.open("/Dealership/Customer", :username => 'Dealership', :password => '_password')
|
66
|
-
# session.post :first_name => 'John', :last_name => 'Doe'
|
67
|
-
#
|
68
|
-
# Posting a message to a Provisioning endpoint would actually look the same:
|
69
|
-
#
|
70
|
-
# session = DotNetServices::Session.open("/Dealership/Provisioning", :username => 'Dealership', :password => '_password')
|
71
|
-
# session.post :phone_number => '555 888-8888'
|
72
|
-
#
|
73
|
-
# DotNetServices::MessageBuffer is needed by the Provisioning *service* (and not the client), to register the VMB and
|
74
|
-
# retrieve messages from it. Usage typically looks like this:
|
75
|
-
#
|
76
|
-
# buffer = DotNetServices::MessageBuffer.new("/Dealership/Provisioning",
|
77
|
-
# :username => 'Dealership', :password => '_password')
|
78
|
-
# buffer.open_and_poll do |message|
|
79
|
-
# ... process incoming messages ...
|
80
|
-
# end
|
81
|
-
#
|
82
|
-
# This code will check that the VMB exists, create one if necessary, and continuously poll it for new messages. Whenever
|
83
|
-
# a new message is sent to VMB, MessageBuffer#open_and_poll retrieves it and invokesthe block, passing it a
|
84
|
-
# Net::HTTP::Request instance that looks exactly like what the sender originally sent to the VMB. Nice and easy.
|
85
|
-
#
|
86
|
-
# To understand and use .NET Services for Ruby, you should probably also read the documentation for the two classes
|
87
|
-
# mentioned above: DotNetServices::Session and DotNetServices::MessageBuffer.
|
88
|
-
#
|
89
|
-
# Happy bussing!
|
90
|
-
module DotNetServices
|
91
|
-
|
92
|
-
class << self
|
93
|
-
|
94
|
-
# The name of the host providing DotNetServices relay services.
|
95
|
-
def relay_host
|
96
|
-
"servicebus.windows.net"
|
97
|
-
end
|
98
|
-
|
99
|
-
# The name of the host providing DotNetServices identity services.
|
100
|
-
def identity_host
|
101
|
-
'accesscontrol.windows.net'
|
102
|
-
end
|
103
|
-
|
104
|
-
# The root URL used for exposing services.
|
105
|
-
def root_url
|
106
|
-
# Modified as per changes in enpoint URL naming conventions in
|
107
|
-
# .Net Services March 09 CTP release (M5)
|
108
|
-
"#{relay_host}/"
|
109
|
-
end
|
110
|
-
|
111
|
-
# Host and port of the bus endpoint.
|
112
|
-
def host_port
|
113
|
-
return @host_port if @host_port
|
114
|
-
uri = URI.parse(root_url)
|
115
|
-
@host_port = [uri.host, uri.port]
|
116
|
-
@host_port
|
117
|
-
end
|
118
|
-
|
119
|
-
# Use an HTTP proxy to connect to .NET Services
|
120
|
-
#
|
121
|
-
# If you call this method, all subsequent communications with .NET Services will use an HTTP proxy.
|
122
|
-
# You must given hostname and password #use proxy
|
123
|
-
# DotNetServices.use_proxy()
|
124
|
-
def use_proxy(proxy_host, proxy_port, proxy_user = nil, proxy_password = nil)
|
125
|
-
@proxy = Net::HTTP::Proxy(proxy_host, proxy_port, proxy_user, proxy_password)
|
126
|
-
end
|
127
|
-
|
128
|
-
# An HTTP proxy to connect through.
|
129
|
-
#
|
130
|
-
# Defaults to Net::HTTP (direct connection without proxy). To set a proxy, see #use_proxy.
|
131
|
-
def proxy
|
132
|
-
@proxy || Net::HTTP
|
133
|
-
end
|
134
|
-
|
135
|
-
# TODO implement!
|
136
|
-
def logger
|
137
|
-
if RAILS_ENV
|
138
|
-
nil
|
139
|
-
else
|
140
|
-
@logger ||= nil
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
end
|
145
|
-
end
|
@@ -0,0 +1,34 @@
|
|
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 'net/http'
|
24
|
+
|
25
|
+
module HTTPProxy # :nodoc:
|
26
|
+
|
27
|
+
def set_http_web_proxy(proxy)
|
28
|
+
if proxy['http_web_proxy_server'] && proxy['http_web_proxy_port']
|
29
|
+
@http_web_proxy = Net::HTTP::Proxy(proxy['http_web_proxy_server'], proxy['http_web_proxy_port'], proxy['http_web_proxy_username'], proxy['http_web_proxy_password'])
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
@@ -0,0 +1,34 @@
|
|
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 LockedMessageInfo # :nodoc:
|
24
|
+
|
25
|
+
attr_accessor :lock_id, :lock_uri, :message_uri
|
26
|
+
|
27
|
+
def initialize(lock_id, lock_uri, message_uri)
|
28
|
+
@lock_id = lock_id
|
29
|
+
@lock_uri = lock_uri
|
30
|
+
@message_uri = message_uri
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|