jira-ruby 1.6.0 → 1.7.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5433f708b438c961d0ca07b8aa60ae7733382aecb7374d4cc3ea3af1947f0e7f
4
- data.tar.gz: d6757f05e80e8c005ad0f20461fac98d5509f87f0e0bebaea025e43e7d180d3e
3
+ metadata.gz: 0e2f1a7c44350f6423550154d1dd1929e38f5c2af002ebc463eef3bfa035b404
4
+ data.tar.gz: 4c2eb811cb02e66ff324a062fa27edaed2cf215b87cc89856a42dde1618fb3c5
5
5
  SHA512:
6
- metadata.gz: 25f924c28544baf800585f9243d6d29622b0facab654aa03cf620bf76e4133731334b649c6af725fb0f246c68e3f5aa17bd8623eba5c2dd66303d2f2b2766dd2
7
- data.tar.gz: b15c6540010df98f03acd562a50520dd90705bfa58cb2815070bc0ba3a535aea00d092c61a0f58bd3e3f23345c8ee48cf14e5d602fe324c3f7197b408d64e252
6
+ metadata.gz: 24f0604ca0ad23f7a4204b920f4ec90ec816033c607db5686cde519a0a00668ddf13828f03769f07f0a6cd36bee51186b02164e91ed144cf0892b5cd124d5df8
7
+ data.tar.gz: 2c7866e454e455465103803030f1fb40708d1ff9e04c09975594423884c5f84ceb43afb7ba853209ac26e8c9e12a91d3268b80452f8fb3641eee4a1556a787a8
data/README.md CHANGED
@@ -50,7 +50,7 @@ rake jira:generate_public_cert
50
50
 
51
51
  On Mac OS,
52
52
 
53
- * Follow the instructions under "Mac OSX Installer" here: https://developer.atlassian.com/display/DOCS/Install+the+Atlassian+SDK+on+a+Linux+or+Mac+System
53
+ * Follow the instructions under "Mac OSX Installer" here: https://developer.atlassian.com/server/framework/atlassian-sdk/install-the-atlassian-sdk-on-a-linux-or-mac-system
54
54
  * From within the archive directory, run:
55
55
 
56
56
  ```shell
@@ -153,14 +153,18 @@ require 'jira-ruby'
153
153
  # Consider the use of :use_ssl and :ssl_verify_mode options if running locally
154
154
  # for tests.
155
155
 
156
+ # NOTE basic auth no longer works with Jira, you must generate an API token, to do so you must have jira instance access rights. You can generate a token here: https://id.atlassian.com/manage/api-tokens
157
+
158
+ # You will see JIRA::HTTPError (JIRA::HTTPError) if you attempt to use basic auth with your user's password
159
+
156
160
  username = "myremoteuser"
157
- password = "myuserspassword"
161
+ api_token = "myApiToken"
158
162
 
159
163
  options = {
160
164
  :username => username,
161
- :password => password,
162
- :site => 'http://localhost:8080/',
163
- :context_path => '/myjira',
165
+ :password => api_token,
166
+ :site => 'http://localhost:8080/', # or 'https://<your_subdomain>.atlassian.net'
167
+ :context_path => '/myjira', # often blank
164
168
  :auth_type => :basic,
165
169
  :read_timeout => 120
166
170
  }
@@ -22,6 +22,7 @@ Gem::Specification.new do |s|
22
22
 
23
23
  # Runtime Dependencies
24
24
  s.add_runtime_dependency 'activesupport'
25
+ s.add_runtime_dependency 'atlassian-jwt'
25
26
  s.add_runtime_dependency 'multipart-post'
26
27
  s.add_runtime_dependency 'oauth', '~> 0.5', '>= 0.5.0'
27
28
 
@@ -42,6 +42,7 @@ require 'jira/resource/board'
42
42
  require 'jira/request_client'
43
43
  require 'jira/oauth_client'
44
44
  require 'jira/http_client'
45
+ require 'jira/jwt_client'
45
46
  require 'jira/client'
46
47
 
47
48
  require 'jira/railtie' if defined?(Rails)
@@ -25,7 +25,8 @@ module JIRA
25
25
  # :auth_type => :oauth,
26
26
  # :proxy_address => nil,
27
27
  # :proxy_port => nil,
28
- # :additional_cookies => nil
28
+ # :additional_cookies => nil,
29
+ # :default_headers => {}
29
30
  #
30
31
  # See the JIRA::Base class methods for all of the available methods on these accessor
31
32
  # objects.
@@ -52,7 +53,8 @@ module JIRA
52
53
  use_ssl: true,
53
54
  use_client_cert: false,
54
55
  auth_type: :oauth,
55
- http_debug: false
56
+ http_debug: false,
57
+ default_headers: {}
56
58
  }.freeze
57
59
 
58
60
  def initialize(options = {})
@@ -71,6 +73,8 @@ module JIRA
71
73
  when :oauth, :oauth_2legged
72
74
  @request_client = OauthClient.new(@options)
73
75
  @consumer = @request_client.consumer
76
+ when :jwt
77
+ @request_client = JwtClient.new(@options)
74
78
  when :basic
75
79
  @request_client = HttpClient.new(@options)
76
80
  when :cookie
@@ -241,7 +245,7 @@ module JIRA
241
245
  protected
242
246
 
243
247
  def merge_default_headers(headers)
244
- { 'Accept' => 'application/json' }.merge(headers)
248
+ { 'Accept' => 'application/json' }.merge(@options[:default_headers]).merge(headers)
245
249
  end
246
250
  end
247
251
  end
@@ -0,0 +1,32 @@
1
+ require 'atlassian/jwt'
2
+
3
+ module JIRA
4
+ class JwtClient < HttpClient
5
+ def make_request(http_method, url, body = '', headers = {})
6
+ # When a proxy is enabled, Net::HTTP expects that the request path omits the domain name
7
+ path = request_path(url) + "?jwt=#{jwt_header(http_method, url)}"
8
+
9
+ request = Net::HTTP.const_get(http_method.to_s.capitalize).new(path, headers)
10
+ request.body = body unless body.nil?
11
+
12
+ response = basic_auth_http_conn.request(request)
13
+ @authenticated = response.is_a? Net::HTTPOK
14
+ store_cookies(response) if options[:use_cookies]
15
+ response
16
+ end
17
+
18
+ private
19
+
20
+ def jwt_header(http_method, url)
21
+ claim = Atlassian::Jwt.build_claims \
22
+ @options[:issuer],
23
+ url,
24
+ http_method.to_s,
25
+ @options[:site],
26
+ (Time.now - 60).to_i,
27
+ (Time.now + (86400)).to_i
28
+
29
+ JWT.encode claim, @options[:shared_secret]
30
+ end
31
+ end
32
+ end
@@ -31,7 +31,7 @@ module JIRA
31
31
  end
32
32
 
33
33
  def issues(params = {})
34
- path = path_base(client) + "/board/#{id}/issue?"
34
+ path = path_base(client) + "/board/#{id}/issue"
35
35
  response = client.get(url_with_query_params(path, params))
36
36
  json = self.class.parse_json(response.body)
37
37
  results = json['issues']
@@ -1,3 +1,3 @@
1
1
  module JIRA
2
- VERSION = '1.6.0'.freeze
2
+ VERSION = '1.7.0'.freeze
3
3
  end
@@ -207,6 +207,54 @@ describe JIRA::Client do
207
207
  end
208
208
  end
209
209
 
210
+ context 'with jwt authentication' do
211
+ subject do
212
+ JIRA::Client.new(
213
+ issuer: 'foo',
214
+ base_url: 'https://host.tld',
215
+ shared_secret: 'shared_secret_key',
216
+ auth_type: :jwt
217
+ )
218
+ end
219
+
220
+ before(:each) do
221
+ stub_request(:get, 'https://localhost:2990/jira/rest/api/2/project')
222
+ .with(query: hash_including(:jwt))
223
+ .to_return(status: 200, body: '[]', headers: {})
224
+ end
225
+
226
+ include_examples 'Client Common Tests'
227
+ include_examples 'HttpClient tests'
228
+
229
+ specify { expect(subject.request_client).to be_a JIRA::JwtClient }
230
+
231
+ it 'sets the username and password' do
232
+ expect(subject.options[:shared_secret]).to eq('shared_secret_key')
233
+ end
234
+
235
+ context 'with a incorrect jwt key' do
236
+ before do
237
+ stub_request(:get, 'https://localhost:2990/jira/rest/api/2/project')
238
+ .with(query: hash_including(:jwt))
239
+ .to_return(status: 401, body: '[]', headers: {})
240
+ end
241
+
242
+ it 'is not authenticated' do
243
+ expect(subject.authenticated?).to be_falsey
244
+ end
245
+
246
+ it 'raises a JIRA::HTTPError when trying to fetch projects' do
247
+ expect { subject.Project.all }.to raise_error JIRA::HTTPError
248
+ end
249
+ end
250
+
251
+ it 'only returns a true for #authenticated? once we have requested some data' do
252
+ expect(subject.authenticated?).to be_falsey
253
+ expect(subject.Project.all).to be_empty
254
+ expect(subject.authenticated?).to be_truthy
255
+ end
256
+ end
257
+
210
258
  context 'oauth authentication' do
211
259
  subject { JIRA::Client.new(consumer_key: 'foo', consumer_secret: 'bar') }
212
260
 
@@ -89,7 +89,7 @@ eos
89
89
 
90
90
  allow(issues_response).to receive(:body).and_return(api_json_issues)
91
91
  allow(board).to receive(:id).and_return(84)
92
- expect(client).to receive(:get).with('/rest/agile/1.0/board/84/issue?')
92
+ expect(client).to receive(:get).with('/rest/agile/1.0/board/84/issue')
93
93
  .and_return(issues_response)
94
94
  expect(client).to receive(:Issue).and_return(JIRA::Resource::IssueFactory.new(client))
95
95
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jira-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 1.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - SUMO Heavy Industries
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-09-15 00:00:00.000000000 Z
12
+ date: 2019-07-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -25,6 +25,20 @@ dependencies:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: atlassian-jwt
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
28
42
  - !ruby/object:Gem::Dependency
29
43
  name: multipart-post
30
44
  requirement: !ruby/object:Gem::Requirement
@@ -216,6 +230,7 @@ files:
216
230
  - lib/jira/has_many_proxy.rb
217
231
  - lib/jira/http_client.rb
218
232
  - lib/jira/http_error.rb
233
+ - lib/jira/jwt_client.rb
219
234
  - lib/jira/oauth_client.rb
220
235
  - lib/jira/railtie.rb
221
236
  - lib/jira/request_client.rb
@@ -369,7 +384,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
369
384
  version: '0'
370
385
  requirements: []
371
386
  rubyforge_project: jira-ruby
372
- rubygems_version: 2.7.4
387
+ rubygems_version: 2.7.6
373
388
  signing_key:
374
389
  specification_version: 4
375
390
  summary: Ruby Gem for use with the Atlassian JIRA REST API