adp-connection 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/CODE_OF_CONDUCT.md +49 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +202 -0
  8. data/README.md +56 -0
  9. data/Rakefile +6 -0
  10. data/adp-connection.gemspec +39 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/democlient/Gemfile +16 -0
  14. data/democlient/LICENSE +201 -0
  15. data/democlient/README.md +2 -0
  16. data/democlient/Rakefile +9 -0
  17. data/democlient/adp_connection_ruby.rb +215 -0
  18. data/democlient/config.ru +24 -0
  19. data/democlient/config/authorizationcode_config.yml +15 -0
  20. data/democlient/config/certs/apiclient_iat.key +27 -0
  21. data/democlient/config/certs/apiclient_iat.pem +45 -0
  22. data/democlient/config/certs/apiclient_iat.pfx +0 -0
  23. data/democlient/config/clientcredential_config.yml +11 -0
  24. data/democlient/public/favicon.ico +0 -0
  25. data/democlient/public/images/.gitkeep +0 -0
  26. data/democlient/public/images/ADP_logo_tagline.png +0 -0
  27. data/democlient/public/images/busy.gif +0 -0
  28. data/democlient/public/images/hazel_icon.png +0 -0
  29. data/democlient/public/images/hazel_small.png +0 -0
  30. data/democlient/public/javascripts/.gitkeep +0 -0
  31. data/democlient/public/stylesheets/.gitkeep +0 -0
  32. data/democlient/public/stylesheets/main.css +163 -0
  33. data/democlient/spec/adp_connection_ruby_spec.rb +14 -0
  34. data/democlient/spec/spec_helper.rb +23 -0
  35. data/democlient/views/authorization_code.erb +90 -0
  36. data/democlient/views/client_credentials.erb +76 -0
  37. data/democlient/views/layout.erb +40 -0
  38. data/democlient/views/welcome.erb +34 -0
  39. data/lib/adp/Product/.gitkeep +0 -0
  40. data/lib/adp/Product/dto/.gitkeep +0 -0
  41. data/lib/adp/access_token.rb +44 -0
  42. data/lib/adp/api_connection.rb +153 -0
  43. data/lib/adp/api_connection_factory.rb +32 -0
  44. data/lib/adp/authorization_code_configuration.rb +33 -0
  45. data/lib/adp/authorization_code_connection.rb +97 -0
  46. data/lib/adp/client_credential_configuration.rb +18 -0
  47. data/lib/adp/client_credential_connection.rb +9 -0
  48. data/lib/adp/connection.rb +16 -0
  49. data/lib/adp/connection/version.rb +5 -0
  50. data/lib/adp/connection_configuration.rb +30 -0
  51. data/lib/adp/connection_exception.rb +12 -0
  52. metadata +154 -0
@@ -0,0 +1,14 @@
1
+ require_relative "spec_helper"
2
+ require_relative "../adp_connection_ruby.rb"
3
+
4
+ def app
5
+ AdpConnectionRuby
6
+ end
7
+
8
+ describe AdpConnectionRuby do
9
+ it "responds with a welcome message" do
10
+ get '/'
11
+
12
+ last_response.body.must_include 'Welcome to the Sinatra Template!'
13
+ end
14
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'bundler'
4
+
5
+ Bundler.setup
6
+ Bundler.require
7
+
8
+ ENV["RACK_ENV"] = "test"
9
+
10
+ require 'minitest/pride'
11
+ require 'minitest/autorun'
12
+ require 'minitest/spec'
13
+ require 'rack/test'
14
+
15
+
16
+ require "find"
17
+ %w{./config/initializers ./lib}.each do |load_path|
18
+ Find.find(load_path) { |f| require f if f.match(/\.rb$/) }
19
+ end
20
+
21
+ class MiniTest::Spec
22
+ include Rack::Test::Methods
23
+ end
@@ -0,0 +1,90 @@
1
+ <div>
2
+ <p>
3
+ <strong>Authorization </strong><br/>
4
+ <a href="/client_credentials" style="width:185px;height:32px;display:inline-block;background-color:#ccc;padding:10px 10px 10px 5px;text-align: center;vertical-align: middle;">Client Credential</a> &nbsp; &nbsp;
5
+ <span href="authorization_code" style="width:185px;height:32px;display:inline-block;background-color:#ccc;padding:10px 10px 10px 5px;text-align: center;vertical-align: middle;">Authentication Code</span>
6
+ </p>
7
+ </div>
8
+
9
+ <div class="content">
10
+ <ol>
11
+ <li><b>1.</b>
12
+ <% if session["AuthorizationCode"].nil? %>
13
+ <a href="/authorization_code/login">Login</a>
14
+ <% else %>
15
+ <a>Loged in</a>
16
+ <% end %>
17
+ <br/>
18
+ <code>
19
+ <pre>
20
+ authorizationcode_config = AuthorizationCodeConfiguration.new(config);
21
+ connection = ADPApiConnectionFactory::createConnection(authorizationcode_config)
22
+ authorizationurl = connection.get_authorization_url
23
+ redirect authorizationurl unless authorizationurl.nil?
24
+ </pre>
25
+ </code>
26
+ </li>
27
+ <br/>
28
+ <li><b>2.</b>
29
+ <% if session["AuthorizationCode"].nil? || session["AuthorizationCode"].connection_configuration.authorizationCode.nil? %>
30
+ <a>Get Token</a>
31
+ <% else %>
32
+ <a href="/authorization_code/get_token">Get Token</a>
33
+ <% end %>
34
+ <br/>
35
+ <code>
36
+ <pre>
37
+ #store callback code
38
+ connection.connection_configuration.authorizationCode = params[:code]
39
+ #then connect
40
+ connection.connect()
41
+ </pre>
42
+ </code>
43
+ </li>
44
+
45
+ <% if !(session["AuthorizationCode"].nil? || session["AuthorizationCode"].connection_configuration.authorizationCode.nil?) %>
46
+
47
+ <li><b>4.</b>
48
+ <a href="/authorization_code/logout">Logout</a>
49
+ <code>
50
+
51
+ connection.logout()
52
+
53
+ </code>
54
+ </li>
55
+ <% end %>
56
+
57
+ </ol>
58
+
59
+ </div>
60
+
61
+ <div class="sidebar">
62
+ <h3>Results...</h3>
63
+ <ul>
64
+ <!--
65
+ <li><b>Ruby:</b> <%= RUBY_VERSION %></li>
66
+ <li><b>Environment:</b> <%= ENV["RACK_ENV"] %></li>
67
+ <li><b>Server:</b> <%= @env["SERVER_SOFTWARE"] %></li>
68
+ <li><b>Port:</b> <%= @env["SERVER_PORT"] %></li>
69
+ -->
70
+ <% if session["AuthorizationCode"].nil? %>
71
+ <li><b>Access token:</b> not logged in</li>
72
+ <li>&nbsp;</li>
73
+ <li>&nbsp;</li>
74
+ <li>&nbsp;</li>
75
+ <li>&nbsp;</li>
76
+ <% else %>
77
+ <li><b>Authorization code:</b> <%= session["AuthorizationCode"].connection_configuration.authorizationCode %> </li>
78
+ <% unless session["AuthorizationCode"].access_token.nil? %>
79
+ <li><b>Access token:</b> <%= session["AuthorizationCode"].access_token.token %> </li>
80
+ <li><b>Token type:</b> <%= session["AuthorizationCode"].access_token.token_type %> </li>
81
+ <li><b>Expires in:</b> <%= session["AuthorizationCode"].access_token.expires_in %> </li>
82
+ <li><b>Scope:</b> <%= session["AuthorizationCode"].access_token.scope %> </li>
83
+ <li><b>Expires on:</b> <%= session["AuthorizationCode"].access_token.expires_on %> </li>
84
+ <% end %>
85
+ <% end %>
86
+ </ul>
87
+ <div class="results_footer" style="">
88
+ <a href="https://github.com/adplabs/adp-connection-ruby"><img class="sidebar_logo" src="/images/ADP_logo_tagline.png" alt="Marketplace/Ruby/Library" /></a>
89
+ </div>
90
+ </div>
@@ -0,0 +1,76 @@
1
+ <div>
2
+ <p>
3
+ <strong>Authorization </strong><br/>
4
+ <span href="client_credentials" style="width:185px;height:32px;display:inline-block;background-color:#ccc;padding:10px 10px 10px 5px;text-align: center;vertical-align: middle;">Client Credential</span> &nbsp; &nbsp;
5
+ <a href="/authorization_code" style="width:185px;height:32px;display:inline-block;background-color:#ccc;padding:10px 10px 10px 5px;text-align: center;vertical-align: middle;">Authentication Code</a>
6
+ </p>
7
+ </div>
8
+
9
+ <div class="content">
10
+ <ol>
11
+ <% if session["ClientCredential"].nil? %>
12
+ <li><b>1.</b>
13
+ <a href="/client_credentials/login">Login</a>
14
+ <code>
15
+ <pre>
16
+ clientcredential_config = ClientCredentialConfiguration.new(config);
17
+ connection = ADPApiConnectionFactory::createConnection(clientcredential_config)
18
+ connection.connect();
19
+ </pre>
20
+ </code>
21
+ </li>
22
+ <% end %>
23
+ <% if !session["ClientCredential"].nil? %>
24
+ <li><b>1.</b>
25
+ <a>Logged in</a>
26
+ <code>
27
+ <pre>
28
+ clientcredential_config = ClientCredentialConfiguration.new(config);
29
+ connection = ADPApiConnectionFactory::createConnection(clientcredential_config)
30
+ connection.connect();
31
+ </pre>
32
+ </code>
33
+ </li>
34
+ <br/>
35
+ <li><b>2.</b>
36
+ <a href="/client_credentials/logout">Logout</a>
37
+ <br/>
38
+ <code>
39
+
40
+ connection.logout()
41
+
42
+ </code>
43
+ </li>
44
+ <% end %>
45
+ <br/>
46
+ <!-- <li><b>2.</b> <a>Get Data</a></li> -->
47
+ <br/>
48
+ </ol>
49
+ </div>
50
+
51
+ <div class="sidebar">
52
+ <h3>Results...</h3>
53
+ <ul>
54
+ <!--
55
+ <li><b>Ruby:</b> <%= RUBY_VERSION %></li>
56
+ <li><b>Environment:</b> <%= ENV["RACK_ENV"] %></li>
57
+ <li><b>Server:</b> <%= @env["SERVER_SOFTWARE"] %></li>
58
+ <li><b>Port:</b> <%= @env["SERVER_PORT"] %></li>
59
+ -->
60
+
61
+ <% if session["ClientCredential"].nil? || session["ClientCredential"].access_token.nil? %>
62
+ <li><b>Access token:</b> not logged in</li>
63
+ <% else %>
64
+ <li><b>Access token:</b> <%= session["ClientCredential"].access_token.token %> </li>
65
+ <li><b>Token type:</b> <%= session["ClientCredential"].access_token.token_type %> </li>
66
+ <li><b>Expires in:</b> <%= session["ClientCredential"].access_token.expires_in %> </li>
67
+ <li><b>Scope:</b> <%= session["ClientCredential"].access_token.scope %> </li>
68
+ <li><b>Expires on:</b> <%= session["ClientCredential"].access_token.expires_on %> </li>
69
+ <% end %>
70
+ <li>&nbsp;</li>
71
+ </ul>
72
+
73
+ <div class="results_footer">
74
+ <a href="https://github.com/adplabs/adp-connection-ruby"><img class="sidebar_logo" src="/images/ADP_logo_tagline.png" alt="Marketplace/Ruby/Library" /></a>
75
+ </div>
76
+ </div>
@@ -0,0 +1,40 @@
1
+ <!DOCTYPE html>
2
+ <!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
3
+ <!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
4
+ <!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
5
+ <!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
6
+ <head>
7
+ <meta charset="utf-8" />
8
+ <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1" />
9
+
10
+ <title>Adp Connection API Library (Ruby)</title>
11
+
12
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
13
+
14
+ <link rel="stylesheet" href="/stylesheets/main.css" />
15
+ </head>
16
+ <body>
17
+ <div class="wrapper">
18
+ <header class="branding">
19
+ <h1>Adp Connection API Library (Ruby)</h1>
20
+ </header>
21
+
22
+ <div class="main">
23
+ <%= yield %>
24
+ </div>
25
+
26
+ <footer class="branding error">
27
+ <%= view_bag[:message] %>
28
+ <hr/>
29
+ <small>&copy; <%= Time.now.year %></small>
30
+ <hr/>
31
+ </footer>
32
+ </div>
33
+
34
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
35
+ <!--[if lt IE 7]>
36
+ <script src="//ajax.googleapis.com/ajax/libs/chrome-frame/1.0.2/CFInstall.min.js"></script>
37
+ <script>window.attachEvent("onload",function(){CFInstall.check({mode:"overlay"})})</script>
38
+ <![endif]-->
39
+ </body>
40
+
@@ -0,0 +1,34 @@
1
+ <div>
2
+ <p>
3
+ <strong>Authorization </strong><br/>
4
+ <a href="/client_credentials" style="width:185px;height:32px;display:inline-block;background-color:#ccc;padding:10px 10px 10px 5px;text-align: center;vertical-align: middle;">Client Credential</a> &nbsp; &nbsp;
5
+ <a href="/authorization_code" style="width:185px;height:32px;display:inline-block;background-color:#ccc;padding:10px 10px 10px 5px;text-align: center;vertical-align: middle;">Authentication Code</a>
6
+ </p>
7
+ </div>
8
+
9
+ <div class="content">
10
+ <ol>
11
+ </ol>
12
+ </div>
13
+
14
+ <div class="sidebar">
15
+ <h3>Results...</h3>
16
+ <ul>
17
+ <!--
18
+ <li><b>Ruby:</b> <%= RUBY_VERSION %></li>
19
+ <li><b>Environment:</b> <%= ENV["RACK_ENV"] %></li>
20
+ <li><b>Server:</b> <%= @env["SERVER_SOFTWARE"] %></li>
21
+ <li><b>Port:</b> <%= @env["SERVER_PORT"] %></li>
22
+ -->
23
+
24
+ <li></li>
25
+ <li></li>
26
+ <li></li>
27
+ <li></li>
28
+ <li></li>
29
+ <li></li>
30
+ </ul>
31
+ <div class="results_footer">
32
+ <a href="https://github.com/adplabs/adp-connection-ruby"><img class="sidebar_logo" src="/images/ADP_logo_tagline.png" alt="Marketplace/Ruby/Library" /></a>
33
+ </div>
34
+ </div>
File without changes
File without changes
@@ -0,0 +1,44 @@
1
+ module Adp
2
+ module Connection
3
+
4
+ class AccessToken
5
+ attr_accessor :token
6
+ attr_accessor :token_type
7
+ attr_accessor :scope
8
+ attr_accessor :expires_on
9
+ attr_accessor :token
10
+ attr_accessor :_expires_in
11
+
12
+ # @return [Object]
13
+ def initialize(config = nil)
14
+
15
+ unless config.nil?
16
+ self.token = config["access_token"]
17
+ self.token_type = config["token_type"]
18
+ self.scope = config["scope"]
19
+ self.expires_in = config["expires_in"]
20
+ end
21
+ end
22
+
23
+ # @return [Object]
24
+ def expires_in=(value)
25
+ unless value.nil?
26
+ self._expires_in = value
27
+ self.expires_on = Time.new() + self._expires_in
28
+ end
29
+ self.expires_on
30
+ end
31
+
32
+ # @return [Object]
33
+ def expires_in
34
+ return self._expires_in
35
+ end
36
+
37
+ def is_valid?
38
+ return true;
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+
@@ -0,0 +1,153 @@
1
+ require 'uri'
2
+ require 'net/https'
3
+ require 'base64'
4
+ require 'json'
5
+
6
+ require_relative "connection_configuration"
7
+ require_relative 'access_token'
8
+ require_relative "connection_exception"
9
+ require_relative "api_connection"
10
+ require_relative "client_credential_configuration"
11
+ require_relative "authorization_code_configuration"
12
+
13
+ module Adp
14
+ module Connection
15
+
16
+ class ApiConnection
17
+ attr_accessor :connection_configuration
18
+ attr_accessor :token_expiration
19
+ attr_accessor :state
20
+ attr_accessor :access_token
21
+
22
+ # @param [Object] config
23
+ def initialize( config = nil )
24
+ self.connection_configuration = config;
25
+ end
26
+
27
+ def connect
28
+
29
+ if self.connection_configuration.nil?
30
+ raise ADPConnectionException, "Configuration is empty or not found"
31
+ end
32
+
33
+ self.access_token = get_access_token()
34
+ end
35
+
36
+ def disconnect
37
+ self.access_token = null;
38
+ end
39
+
40
+ # @return [Boolean]
41
+ def is_connected_indicator?
42
+
43
+ is_connected = false;
44
+
45
+ if (!self.access_token.nil?)
46
+ # valid token to check if expired
47
+ is_connected = true if Time.new() < self.access_token.expires_on
48
+ end
49
+
50
+ return is_connected
51
+ end
52
+
53
+ def get_access_token
54
+ token = self.access_token;
55
+ result = nil;
56
+
57
+ if is_connected_indicator?
58
+
59
+ if self.connection_configuration.nil?
60
+ raise ADPConnectionException, "Config error: Configuration is empty or not found"
61
+ end
62
+ if (self.connection_configuration.grantType.nil?)
63
+ raise ADPConnectionException, "Config error: Grant Type is empty or not known"
64
+ end
65
+ if (self.connection_configuration.tokenServerURL.nil?)
66
+ raise ADPConnectionException, "Config error: tokenServerURL is empty or not known"
67
+ end
68
+ if (self.connection_configuration.clientID.nil?)
69
+ raise ADPConnectionException, "Config error: clientID is empty or not known"
70
+ end
71
+ if (self.connection_configuration.clientSecret.nil?)
72
+ raise ADPConnectionException, "Config error: clientSecret is empty or not known"
73
+ end
74
+ end
75
+
76
+ data = {
77
+ "client_id" => self.connection_configuration.clientID,
78
+ "client_secret" => self.connection_configuration.clientSecret,
79
+ "grant_type" => self.connection_configuration.grantType
80
+ };
81
+
82
+ result = send_web_request(self.connection_configuration.tokenServerURL, data );
83
+
84
+ if result["error"].nil? then
85
+ token = AccessToken.new(result)
86
+ else
87
+ raise ADPConnectionException, "Connection error: #{result['error_description']}"
88
+ end
89
+
90
+ token
91
+ end
92
+
93
+ # @return [Object]
94
+ def get_adp_data(product_url)
95
+
96
+ raise ADPConnectionException, "Connection error: can't get data, not connected" if (self.access_token.nil? || !is_connected_indicator?)
97
+
98
+ authorization = "#{self.access_token.token_type} #{self.access_token.token}"
99
+
100
+ data = {
101
+ "client_id" => self.connection_configuration.clientID,
102
+ "client_secret" => self.connection_configuration.clientSecret,
103
+ "grant_type" => self.connection_configuration.grantType,
104
+ "code" => self.connection_configuration.authorizationCode,
105
+ "redirect_uri" => self.connection_configuration.redirectURL
106
+ };
107
+
108
+ data = send_web_request(product_url, data, authorization, 'application/json', 'GET')
109
+
110
+ raise ADPConnectionException, "Connection error: #{data['error']}, #{data['error_description']}" unless data["error"].nil?
111
+
112
+ return data
113
+ end
114
+
115
+ def send_web_request(url, data={}, authorization=nil, content_type=nil, method=nil)
116
+
117
+ data ||= {}
118
+ content_type ||= "application/x-www-form-urlencoded"
119
+ method ||= 'POST'
120
+
121
+ Log.debug("URL: #{url}")
122
+ Log.debug("Client ID: #{data["client_id"]}")
123
+ Log.debug("Client Secret: #{data["client_secret"]}")
124
+ Log.debug("Grant Type: #{data["grant_type"]}")
125
+
126
+ uri = URI.parse( url );
127
+ pem = File.read("#{self.connection_configuration.sslCertPath}");
128
+ key = File.read(self.connection_configuration.sslKeyPath);
129
+ http = Net::HTTP.new(uri.host, uri.port);
130
+ if (!self.connection_configuration.sslCertPath.nil?)
131
+ http.use_ssl = true
132
+ http.cert = OpenSSL::X509::Certificate.new( pem );
133
+ http.key = OpenSSL::PKey::RSA.new(key, self.connection_configuration.sslKeyPass);
134
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
135
+ end
136
+
137
+ if method.eql?('POST')
138
+ request = Net::HTTP::Post.new(uri.request_uri)
139
+ request.set_form_data( data );
140
+ else
141
+ request = Net::HTTP::Get.new(uri.request_uri)
142
+ end
143
+
144
+ request["Content-Type"] = content_type
145
+
146
+ # add credentials if available
147
+ request["Authorization"] = authorization unless authorization.nil?
148
+
149
+ response = JSON.parse(http.request(request).body)
150
+ end
151
+ end
152
+ end
153
+ end